aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac802154
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@gmail.com>2014-11-09 02:36:45 -0500
committerMarcel Holtmann <marcel@holtmann.org>2014-11-09 13:50:27 -0500
commit863e88f255dac0657e57d5f1a1f95ee8733f8c13 (patch)
treed1b5c0e373969cdd11c55e1fce9ba398cb05ae54 /net/mac802154
parentb0c42cd7b210efc74aa4bfc3e39a2814dfaa9b89 (diff)
mac802154: move mac pib attributes into wpan_dev
This patch moves all mac pib attributes into the wpan_dev struct. Furthermore we can easier access these attributes over the netdev 802154_ptr pointer. Currently this is only possible over a complicated callback structure in mac802154 because subif data structure is accessable inside mac802154 only. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/mac802154')
-rw-r--r--net/mac802154/ieee802154_i.h10
-rw-r--r--net/mac802154/iface.c55
-rw-r--r--net/mac802154/mib.c10
-rw-r--r--net/mac802154/rx.c7
4 files changed, 40 insertions, 42 deletions
diff --git a/net/mac802154/ieee802154_i.h b/net/mac802154/ieee802154_i.h
index 4acacea0d371..803f529e2c45 100644
--- a/net/mac802154/ieee802154_i.h
+++ b/net/mac802154/ieee802154_i.h
@@ -84,18 +84,8 @@ struct ieee802154_sub_if_data {
84 84
85 spinlock_t mib_lock; 85 spinlock_t mib_lock;
86 86
87 __le16 pan_id;
88 __le16 short_addr;
89 __le64 extended_addr;
90 bool promiscuous_mode;
91
92 struct ieee802154_mac_params mac_params; 87 struct ieee802154_mac_params mac_params;
93 88
94 /* MAC BSN field */
95 u8 bsn;
96 /* MAC DSN field */
97 u8 dsn;
98
99 /* protects sec from concurrent access by netlink. access by 89 /* protects sec from concurrent access by netlink. access by
100 * encrypt/decrypt/header_create safe without additional protection. 90 * encrypt/decrypt/header_create safe without additional protection.
101 */ 91 */
diff --git a/net/mac802154/iface.c b/net/mac802154/iface.c
index 384f4bb3c99b..6669da7446f2 100644
--- a/net/mac802154/iface.c
+++ b/net/mac802154/iface.c
@@ -35,16 +35,17 @@ static int mac802154_wpan_update_llsec(struct net_device *dev)
35{ 35{
36 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 36 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
37 struct ieee802154_mlme_ops *ops = ieee802154_mlme_ops(dev); 37 struct ieee802154_mlme_ops *ops = ieee802154_mlme_ops(dev);
38 struct wpan_dev *wpan_dev = &sdata->wpan_dev;
38 int rc = 0; 39 int rc = 0;
39 40
40 if (ops->llsec) { 41 if (ops->llsec) {
41 struct ieee802154_llsec_params params; 42 struct ieee802154_llsec_params params;
42 int changed = 0; 43 int changed = 0;
43 44
44 params.pan_id = sdata->pan_id; 45 params.pan_id = wpan_dev->pan_id;
45 changed |= IEEE802154_LLSEC_PARAM_PAN_ID; 46 changed |= IEEE802154_LLSEC_PARAM_PAN_ID;
46 47
47 params.hwaddr = sdata->extended_addr; 48 params.hwaddr = wpan_dev->extended_addr;
48 changed |= IEEE802154_LLSEC_PARAM_HWADDR; 49 changed |= IEEE802154_LLSEC_PARAM_HWADDR;
49 50
50 rc = ops->llsec->set_params(dev, &params, changed); 51 rc = ops->llsec->set_params(dev, &params, changed);
@@ -57,6 +58,7 @@ static int
57mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 58mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
58{ 59{
59 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 60 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
61 struct wpan_dev *wpan_dev = &sdata->wpan_dev;
60 struct sockaddr_ieee802154 *sa = 62 struct sockaddr_ieee802154 *sa =
61 (struct sockaddr_ieee802154 *)&ifr->ifr_addr; 63 (struct sockaddr_ieee802154 *)&ifr->ifr_addr;
62 int err = -ENOIOCTLCMD; 64 int err = -ENOIOCTLCMD;
@@ -68,8 +70,8 @@ mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
68 { 70 {
69 u16 pan_id, short_addr; 71 u16 pan_id, short_addr;
70 72
71 pan_id = le16_to_cpu(sdata->pan_id); 73 pan_id = le16_to_cpu(wpan_dev->pan_id);
72 short_addr = le16_to_cpu(sdata->short_addr); 74 short_addr = le16_to_cpu(wpan_dev->short_addr);
73 if (pan_id == IEEE802154_PANID_BROADCAST || 75 if (pan_id == IEEE802154_PANID_BROADCAST ||
74 short_addr == IEEE802154_ADDR_BROADCAST) { 76 short_addr == IEEE802154_ADDR_BROADCAST) {
75 err = -EADDRNOTAVAIL; 77 err = -EADDRNOTAVAIL;
@@ -96,8 +98,8 @@ mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
96 break; 98 break;
97 } 99 }
98 100
99 sdata->pan_id = cpu_to_le16(sa->addr.pan_id); 101 wpan_dev->pan_id = cpu_to_le16(sa->addr.pan_id);
100 sdata->short_addr = cpu_to_le16(sa->addr.short_addr); 102 wpan_dev->short_addr = cpu_to_le16(sa->addr.short_addr);
101 103
102 err = mac802154_wpan_update_llsec(dev); 104 err = mac802154_wpan_update_llsec(dev);
103 break; 105 break;
@@ -121,7 +123,7 @@ static int mac802154_wpan_mac_addr(struct net_device *dev, void *p)
121 return -EINVAL; 123 return -EINVAL;
122 124
123 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); 125 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
124 sdata->extended_addr = extended_addr; 126 sdata->wpan_dev.extended_addr = extended_addr;
125 127
126 return mac802154_wpan_update_llsec(dev); 128 return mac802154_wpan_update_llsec(dev);
127} 129}
@@ -172,6 +174,7 @@ static int mac802154_wpan_open(struct net_device *dev)
172 int rc; 174 int rc;
173 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 175 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
174 struct ieee802154_local *local = sdata->local; 176 struct ieee802154_local *local = sdata->local;
177 struct wpan_dev *wpan_dev = &sdata->wpan_dev;
175 struct wpan_phy *phy = sdata->local->phy; 178 struct wpan_phy *phy = sdata->local->phy;
176 179
177 rc = mac802154_slave_open(dev); 180 rc = mac802154_slave_open(dev);
@@ -181,21 +184,22 @@ static int mac802154_wpan_open(struct net_device *dev)
181 mutex_lock(&phy->pib_lock); 184 mutex_lock(&phy->pib_lock);
182 185
183 if (local->hw.flags & IEEE802154_HW_PROMISCUOUS) { 186 if (local->hw.flags & IEEE802154_HW_PROMISCUOUS) {
184 rc = drv_set_promiscuous_mode(local, sdata->promiscuous_mode); 187 rc = drv_set_promiscuous_mode(local,
188 wpan_dev->promiscuous_mode);
185 if (rc < 0) 189 if (rc < 0)
186 goto out; 190 goto out;
187 } 191 }
188 192
189 if (local->hw.flags & IEEE802154_HW_AFILT) { 193 if (local->hw.flags & IEEE802154_HW_AFILT) {
190 rc = drv_set_pan_id(local, sdata->pan_id); 194 rc = drv_set_pan_id(local, wpan_dev->pan_id);
191 if (rc < 0) 195 if (rc < 0)
192 goto out; 196 goto out;
193 197
194 rc = drv_set_extended_addr(local, sdata->extended_addr); 198 rc = drv_set_extended_addr(local, wpan_dev->extended_addr);
195 if (rc < 0) 199 if (rc < 0)
196 goto out; 200 goto out;
197 201
198 rc = drv_set_short_addr(local, sdata->short_addr); 202 rc = drv_set_short_addr(local, wpan_dev->short_addr);
199 if (rc < 0) 203 if (rc < 0)
200 goto out; 204 goto out;
201 } 205 }
@@ -288,6 +292,7 @@ static int mac802154_header_create(struct sk_buff *skb,
288{ 292{
289 struct ieee802154_hdr hdr; 293 struct ieee802154_hdr hdr;
290 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 294 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
295 struct wpan_dev *wpan_dev = &sdata->wpan_dev;
291 struct ieee802154_mac_cb *cb = mac_cb(skb); 296 struct ieee802154_mac_cb *cb = mac_cb(skb);
292 int hlen; 297 int hlen;
293 298
@@ -306,17 +311,17 @@ static int mac802154_header_create(struct sk_buff *skb,
306 if (!saddr) { 311 if (!saddr) {
307 spin_lock_bh(&sdata->mib_lock); 312 spin_lock_bh(&sdata->mib_lock);
308 313
309 if (sdata->short_addr == cpu_to_le16(IEEE802154_ADDR_BROADCAST) || 314 if (wpan_dev->short_addr == cpu_to_le16(IEEE802154_ADDR_BROADCAST) ||
310 sdata->short_addr == cpu_to_le16(IEEE802154_ADDR_UNDEF) || 315 wpan_dev->short_addr == cpu_to_le16(IEEE802154_ADDR_UNDEF) ||
311 sdata->pan_id == cpu_to_le16(IEEE802154_PANID_BROADCAST)) { 316 wpan_dev->pan_id == cpu_to_le16(IEEE802154_PANID_BROADCAST)) {
312 hdr.source.mode = IEEE802154_ADDR_LONG; 317 hdr.source.mode = IEEE802154_ADDR_LONG;
313 hdr.source.extended_addr = sdata->extended_addr; 318 hdr.source.extended_addr = wpan_dev->extended_addr;
314 } else { 319 } else {
315 hdr.source.mode = IEEE802154_ADDR_SHORT; 320 hdr.source.mode = IEEE802154_ADDR_SHORT;
316 hdr.source.short_addr = sdata->short_addr; 321 hdr.source.short_addr = wpan_dev->short_addr;
317 } 322 }
318 323
319 hdr.source.pan_id = sdata->pan_id; 324 hdr.source.pan_id = wpan_dev->pan_id;
320 325
321 spin_unlock_bh(&sdata->mib_lock); 326 spin_unlock_bh(&sdata->mib_lock);
322 } else { 327 } else {
@@ -396,11 +401,13 @@ static void ieee802154_if_setup(struct net_device *dev)
396static int 401static int
397ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type) 402ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type)
398{ 403{
404 struct wpan_dev *wpan_dev = &sdata->wpan_dev;
405
399 /* set some type-dependent values */ 406 /* set some type-dependent values */
400 sdata->vif.type = type; 407 sdata->vif.type = type;
401 408
402 get_random_bytes(&sdata->bsn, 1); 409 get_random_bytes(&wpan_dev->bsn, 1);
403 get_random_bytes(&sdata->dsn, 1); 410 get_random_bytes(&wpan_dev->dsn, 1);
404 411
405 /* defaults per 802.15.4-2011 */ 412 /* defaults per 802.15.4-2011 */
406 sdata->mac_params.min_be = 3; 413 sdata->mac_params.min_be = 3;
@@ -409,9 +416,9 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type)
409 /* for compatibility, actual default is 3 */ 416 /* for compatibility, actual default is 3 */
410 sdata->mac_params.frame_retries = -1; 417 sdata->mac_params.frame_retries = -1;
411 418
412 ieee802154_be64_to_le64(&sdata->extended_addr, sdata->dev->dev_addr); 419 ieee802154_be64_to_le64(&wpan_dev->extended_addr, sdata->dev->dev_addr);
413 sdata->pan_id = cpu_to_le16(IEEE802154_PANID_BROADCAST); 420 wpan_dev->pan_id = cpu_to_le16(IEEE802154_PANID_BROADCAST);
414 sdata->short_addr = cpu_to_le16(IEEE802154_ADDR_BROADCAST); 421 wpan_dev->short_addr = cpu_to_le16(IEEE802154_ADDR_BROADCAST);
415 422
416 switch (type) { 423 switch (type) {
417 case IEEE802154_DEV_WPAN: 424 case IEEE802154_DEV_WPAN:
@@ -419,7 +426,7 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type)
419 sdata->dev->destructor = mac802154_wpan_free; 426 sdata->dev->destructor = mac802154_wpan_free;
420 sdata->dev->netdev_ops = &mac802154_wpan_ops; 427 sdata->dev->netdev_ops = &mac802154_wpan_ops;
421 sdata->dev->ml_priv = &mac802154_mlme_wpan; 428 sdata->dev->ml_priv = &mac802154_mlme_wpan;
422 sdata->promiscuous_mode = false; 429 wpan_dev->promiscuous_mode = false;
423 430
424 spin_lock_init(&sdata->mib_lock); 431 spin_lock_init(&sdata->mib_lock);
425 mutex_init(&sdata->sec_mtx); 432 mutex_init(&sdata->sec_mtx);
@@ -429,7 +436,7 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type)
429 case IEEE802154_DEV_MONITOR: 436 case IEEE802154_DEV_MONITOR:
430 sdata->dev->destructor = free_netdev; 437 sdata->dev->destructor = free_netdev;
431 sdata->dev->netdev_ops = &mac802154_monitor_ops; 438 sdata->dev->netdev_ops = &mac802154_monitor_ops;
432 sdata->promiscuous_mode = true; 439 wpan_dev->promiscuous_mode = true;
433 break; 440 break;
434 default: 441 default:
435 BUG(); 442 BUG();
diff --git a/net/mac802154/mib.c b/net/mac802154/mib.c
index 6fa749154baf..3596b29ead6b 100644
--- a/net/mac802154/mib.c
+++ b/net/mac802154/mib.c
@@ -33,7 +33,7 @@ void mac802154_dev_set_short_addr(struct net_device *dev, __le16 val)
33 BUG_ON(dev->type != ARPHRD_IEEE802154); 33 BUG_ON(dev->type != ARPHRD_IEEE802154);
34 34
35 spin_lock_bh(&sdata->mib_lock); 35 spin_lock_bh(&sdata->mib_lock);
36 sdata->short_addr = val; 36 sdata->wpan_dev.short_addr = val;
37 spin_unlock_bh(&sdata->mib_lock); 37 spin_unlock_bh(&sdata->mib_lock);
38} 38}
39 39
@@ -45,7 +45,7 @@ __le16 mac802154_dev_get_short_addr(const struct net_device *dev)
45 BUG_ON(dev->type != ARPHRD_IEEE802154); 45 BUG_ON(dev->type != ARPHRD_IEEE802154);
46 46
47 spin_lock_bh(&sdata->mib_lock); 47 spin_lock_bh(&sdata->mib_lock);
48 ret = sdata->short_addr; 48 ret = sdata->wpan_dev.short_addr;
49 spin_unlock_bh(&sdata->mib_lock); 49 spin_unlock_bh(&sdata->mib_lock);
50 50
51 return ret; 51 return ret;
@@ -59,7 +59,7 @@ __le16 mac802154_dev_get_pan_id(const struct net_device *dev)
59 BUG_ON(dev->type != ARPHRD_IEEE802154); 59 BUG_ON(dev->type != ARPHRD_IEEE802154);
60 60
61 spin_lock_bh(&sdata->mib_lock); 61 spin_lock_bh(&sdata->mib_lock);
62 ret = sdata->pan_id; 62 ret = sdata->wpan_dev.pan_id;
63 spin_unlock_bh(&sdata->mib_lock); 63 spin_unlock_bh(&sdata->mib_lock);
64 64
65 return ret; 65 return ret;
@@ -72,7 +72,7 @@ void mac802154_dev_set_pan_id(struct net_device *dev, __le16 val)
72 BUG_ON(dev->type != ARPHRD_IEEE802154); 72 BUG_ON(dev->type != ARPHRD_IEEE802154);
73 73
74 spin_lock_bh(&sdata->mib_lock); 74 spin_lock_bh(&sdata->mib_lock);
75 sdata->pan_id = val; 75 sdata->wpan_dev.pan_id = val;
76 spin_unlock_bh(&sdata->mib_lock); 76 spin_unlock_bh(&sdata->mib_lock);
77} 77}
78 78
@@ -82,7 +82,7 @@ u8 mac802154_dev_get_dsn(const struct net_device *dev)
82 82
83 BUG_ON(dev->type != ARPHRD_IEEE802154); 83 BUG_ON(dev->type != ARPHRD_IEEE802154);
84 84
85 return sdata->dsn++; 85 return sdata->wpan_dev.dsn++;
86} 86}
87 87
88void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan) 88void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan)
diff --git a/net/mac802154/rx.c b/net/mac802154/rx.c
index 4b54cf33e562..b18e755c38ce 100644
--- a/net/mac802154/rx.c
+++ b/net/mac802154/rx.c
@@ -42,6 +42,7 @@ static int
42ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata, 42ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata,
43 struct sk_buff *skb, const struct ieee802154_hdr *hdr) 43 struct sk_buff *skb, const struct ieee802154_hdr *hdr)
44{ 44{
45 struct wpan_dev *wpan_dev = &sdata->wpan_dev;
45 __le16 span, sshort; 46 __le16 span, sshort;
46 int rc; 47 int rc;
47 48
@@ -49,8 +50,8 @@ ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata,
49 50
50 spin_lock_bh(&sdata->mib_lock); 51 spin_lock_bh(&sdata->mib_lock);
51 52
52 span = sdata->pan_id; 53 span = wpan_dev->pan_id;
53 sshort = sdata->short_addr; 54 sshort = wpan_dev->short_addr;
54 55
55 switch (mac_cb(skb)->dest.mode) { 56 switch (mac_cb(skb)->dest.mode) {
56 case IEEE802154_ADDR_NONE: 57 case IEEE802154_ADDR_NONE:
@@ -65,7 +66,7 @@ ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata,
65 if (mac_cb(skb)->dest.pan_id != span && 66 if (mac_cb(skb)->dest.pan_id != span &&
66 mac_cb(skb)->dest.pan_id != cpu_to_le16(IEEE802154_PANID_BROADCAST)) 67 mac_cb(skb)->dest.pan_id != cpu_to_le16(IEEE802154_PANID_BROADCAST))
67 skb->pkt_type = PACKET_OTHERHOST; 68 skb->pkt_type = PACKET_OTHERHOST;
68 else if (mac_cb(skb)->dest.extended_addr == sdata->extended_addr) 69 else if (mac_cb(skb)->dest.extended_addr == wpan_dev->extended_addr)
69 skb->pkt_type = PACKET_HOST; 70 skb->pkt_type = PACKET_HOST;
70 else 71 else
71 skb->pkt_type = PACKET_OTHERHOST; 72 skb->pkt_type = PACKET_OTHERHOST;