Blame view
net/mac802154/mac_cmd.c
3.84 KB
1802d0bee
|
1 |
// SPDX-License-Identifier: GPL-2.0-only |
6e2128d42
|
2 3 4 5 6 |
/* * MAC commands interface * * Copyright 2007-2012 Siemens AG * |
6e2128d42
|
7 8 9 10 11 12 13 14 |
* Written by: * Sergey Lapin <slapin@ossfans.org> * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> * Alexander Smirnov <alex.bluesman.smirnov@gmail.com> */ #include <linux/skbuff.h> #include <linux/if_arp.h> |
4ca24aca5
|
15 |
#include <linux/ieee802154.h> |
6e2128d42
|
16 17 |
#include <net/ieee802154_netdev.h> |
5ad60d369
|
18 |
#include <net/cfg802154.h> |
6e2128d42
|
19 |
#include <net/mac802154.h> |
0f1556bc2
|
20 |
#include "ieee802154_i.h" |
f59f419d3
|
21 |
#include "driver-ops.h" |
6e2128d42
|
22 |
|
5265f4671
|
23 |
static int mac802154_mlme_start_req(struct net_device *dev, |
ae531b947
|
24 |
struct ieee802154_addr *addr, |
5265f4671
|
25 26 27 28 29 |
u8 channel, u8 page, u8 bcn_ord, u8 sf_ord, u8 pan_coord, u8 blx, u8 coord_realign) { |
641459ca3
|
30 31 |
struct ieee802154_llsec_params params; int changed = 0; |
9b0bb4a83
|
32 |
|
7bea1ea7b
|
33 |
ASSERT_RTNL(); |
ae531b947
|
34 |
BUG_ON(addr->mode != IEEE802154_ADDR_SHORT); |
5265f4671
|
35 |
|
c947f7e1e
|
36 37 |
dev->ieee802154_ptr->pan_id = addr->pan_id; dev->ieee802154_ptr->short_addr = addr->short_addr; |
5265f4671
|
38 |
mac802154_dev_set_page_channel(dev, page, channel); |
641459ca3
|
39 40 |
params.pan_id = addr->pan_id; changed |= IEEE802154_LLSEC_PARAM_PAN_ID; |
9b0bb4a83
|
41 |
|
641459ca3
|
42 43 |
params.hwaddr = ieee802154_devaddr_from_raw(dev->dev_addr); changed |= IEEE802154_LLSEC_PARAM_HWADDR; |
9b0bb4a83
|
44 |
|
641459ca3
|
45 46 |
params.coord_hwaddr = params.hwaddr; changed |= IEEE802154_LLSEC_PARAM_COORD_HWADDR; |
9b0bb4a83
|
47 |
|
641459ca3
|
48 49 |
params.coord_shortaddr = addr->short_addr; changed |= IEEE802154_LLSEC_PARAM_COORD_SHORTADDR; |
9b0bb4a83
|
50 |
|
641459ca3
|
51 |
return mac802154_set_params(dev, ¶ms, changed); |
5265f4671
|
52 |
} |
c7420c367
|
53 54 55 56 |
static int mac802154_set_mac_params(struct net_device *dev, const struct ieee802154_mac_params *params) { struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); |
f59f419d3
|
57 |
struct ieee802154_local *local = sdata->local; |
5fb3f026a
|
58 |
struct wpan_dev *wpan_dev = &sdata->wpan_dev; |
f59f419d3
|
59 |
int ret; |
c7420c367
|
60 |
|
7bea1ea7b
|
61 |
ASSERT_RTNL(); |
5fb3f026a
|
62 63 |
/* PHY */ wpan_dev->wpan_phy->transmit_power = params->transmit_power; |
7fe9a3882
|
64 |
wpan_dev->wpan_phy->cca = params->cca; |
5fb3f026a
|
65 66 67 68 69 70 71 72 |
wpan_dev->wpan_phy->cca_ed_level = params->cca_ed_level; /* MAC */ wpan_dev->min_be = params->min_be; wpan_dev->max_be = params->max_be; wpan_dev->csma_retries = params->csma_retries; wpan_dev->frame_retries = params->frame_retries; wpan_dev->lbt = params->lbt; |
c7420c367
|
73 |
|
edea8f7c7
|
74 |
if (local->hw.phy->flags & WPAN_PHY_FLAG_TXPOWER) { |
f59f419d3
|
75 76 77 78 |
ret = drv_set_tx_power(local, params->transmit_power); if (ret < 0) return ret; } |
edea8f7c7
|
79 |
if (local->hw.phy->flags & WPAN_PHY_FLAG_CCA_MODE) { |
7fe9a3882
|
80 |
ret = drv_set_cca_mode(local, ¶ms->cca); |
f59f419d3
|
81 82 83 |
if (ret < 0) return ret; } |
edea8f7c7
|
84 |
if (local->hw.phy->flags & WPAN_PHY_FLAG_CCA_ED_LEVEL) { |
f59f419d3
|
85 86 87 88 |
ret = drv_set_cca_ed_level(local, params->cca_ed_level); if (ret < 0) return ret; } |
c7420c367
|
89 90 91 92 93 94 95 |
return 0; } static void mac802154_get_mac_params(struct net_device *dev, struct ieee802154_mac_params *params) { struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); |
5fb3f026a
|
96 |
struct wpan_dev *wpan_dev = &sdata->wpan_dev; |
c7420c367
|
97 |
|
7bea1ea7b
|
98 |
ASSERT_RTNL(); |
5fb3f026a
|
99 100 |
/* PHY */ params->transmit_power = wpan_dev->wpan_phy->transmit_power; |
7fe9a3882
|
101 |
params->cca = wpan_dev->wpan_phy->cca; |
5fb3f026a
|
102 103 104 105 106 107 108 109 |
params->cca_ed_level = wpan_dev->wpan_phy->cca_ed_level; /* MAC */ params->min_be = wpan_dev->min_be; params->max_be = wpan_dev->max_be; params->csma_retries = wpan_dev->csma_retries; params->frame_retries = wpan_dev->frame_retries; params->lbt = wpan_dev->lbt; |
c7420c367
|
110 |
} |
29663b0cc
|
111 |
static const struct ieee802154_llsec_ops mac802154_llsec_ops = { |
29e023746
|
112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
.get_params = mac802154_get_params, .set_params = mac802154_set_params, .add_key = mac802154_add_key, .del_key = mac802154_del_key, .add_dev = mac802154_add_dev, .del_dev = mac802154_del_dev, .add_devkey = mac802154_add_devkey, .del_devkey = mac802154_del_devkey, .add_seclevel = mac802154_add_seclevel, .del_seclevel = mac802154_del_seclevel, .lock_table = mac802154_lock_table, .get_table = mac802154_get_table, .unlock_table = mac802154_unlock_table, }; |
32bad7e30
|
126 |
struct ieee802154_mlme_ops mac802154_mlme_wpan = { |
5265f4671
|
127 |
.start_req = mac802154_mlme_start_req, |
e462ded69
|
128 |
|
29e023746
|
129 |
.llsec = &mac802154_llsec_ops, |
e462ded69
|
130 131 |
.set_mac_params = mac802154_set_mac_params, .get_mac_params = mac802154_get_mac_params, |
32bad7e30
|
132 |
}; |