aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@gmail.com>2015-05-22 11:43:54 -0400
committerMarcel Holtmann <marcel@holtmann.org>2015-05-23 11:57:08 -0400
commitc947f7e1e31a708f5a4ea8c1a627bec578cd9223 (patch)
tree2b00d3be6c911ec0f8a133499994e4bb185ecb76
parent344f8c119df742f2bf7098cf8fc326351f583249 (diff)
mac802154: remove mib lock
This patch removes the mib lock. The new locking mechanism is to protect the mib values with the rtnl lock. Note that this isn't always necessary if we have an interface up the most mib values are readonly (e.g. address settings). With this behaviour we can remove locking in hotpath like frame parsing completely. It depends on context if we need to hold the rtnl lock or not, this makes the callbacks of ieee802154_mlme_ops unnecessary because these callbacks hols always the locks. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Reviewed-by: Stefan Schmidt <stefan@osg.samsung.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
-rw-r--r--include/net/ieee802154_netdev.h9
-rw-r--r--net/ieee802154/6lowpan/core.c20
-rw-r--r--net/ieee802154/6lowpan/tx.c2
-rw-r--r--net/ieee802154/nl-mac.c14
-rw-r--r--net/ieee802154/socket.c12
-rw-r--r--net/mac802154/ieee802154_i.h6
-rw-r--r--net/mac802154/iface.c8
-rw-r--r--net/mac802154/mac_cmd.c6
-rw-r--r--net/mac802154/mib.c50
-rw-r--r--net/mac802154/rx.c5
10 files changed, 18 insertions, 114 deletions
diff --git a/include/net/ieee802154_netdev.h b/include/net/ieee802154_netdev.h
index 144fefb4d619..84a72a1382a8 100644
--- a/include/net/ieee802154_netdev.h
+++ b/include/net/ieee802154_netdev.h
@@ -422,15 +422,6 @@ struct ieee802154_mlme_ops {
422 struct ieee802154_mac_params *params); 422 struct ieee802154_mac_params *params);
423 423
424 struct ieee802154_llsec_ops *llsec; 424 struct ieee802154_llsec_ops *llsec;
425
426 /* The fields below are required. */
427
428 /*
429 * FIXME: these should become the part of PIB/MIB interface.
430 * However we still don't have IB interface of any kind
431 */
432 __le16 (*get_pan_id)(const struct net_device *dev);
433 __le16 (*get_short_addr)(const struct net_device *dev);
434}; 425};
435 426
436static inline struct ieee802154_mlme_ops * 427static inline struct ieee802154_mlme_ops *
diff --git a/net/ieee802154/6lowpan/core.c b/net/ieee802154/6lowpan/core.c
index 2e77fada7e54..f20a387a1011 100644
--- a/net/ieee802154/6lowpan/core.c
+++ b/net/ieee802154/6lowpan/core.c
@@ -55,20 +55,6 @@
55LIST_HEAD(lowpan_devices); 55LIST_HEAD(lowpan_devices);
56static int lowpan_open_count; 56static int lowpan_open_count;
57 57
58static __le16 lowpan_get_pan_id(const struct net_device *dev)
59{
60 struct net_device *real_dev = lowpan_dev_info(dev)->real_dev;
61
62 return ieee802154_mlme_ops(real_dev)->get_pan_id(real_dev);
63}
64
65static __le16 lowpan_get_short_addr(const struct net_device *dev)
66{
67 struct net_device *real_dev = lowpan_dev_info(dev)->real_dev;
68
69 return ieee802154_mlme_ops(real_dev)->get_short_addr(real_dev);
70}
71
72static struct header_ops lowpan_header_ops = { 58static struct header_ops lowpan_header_ops = {
73 .create = lowpan_header_create, 59 .create = lowpan_header_create,
74}; 60};
@@ -96,11 +82,6 @@ static const struct net_device_ops lowpan_netdev_ops = {
96 .ndo_start_xmit = lowpan_xmit, 82 .ndo_start_xmit = lowpan_xmit,
97}; 83};
98 84
99static struct ieee802154_mlme_ops lowpan_mlme = {
100 .get_pan_id = lowpan_get_pan_id,
101 .get_short_addr = lowpan_get_short_addr,
102};
103
104static void lowpan_setup(struct net_device *dev) 85static void lowpan_setup(struct net_device *dev)
105{ 86{
106 dev->addr_len = IEEE802154_ADDR_LEN; 87 dev->addr_len = IEEE802154_ADDR_LEN;
@@ -116,7 +97,6 @@ static void lowpan_setup(struct net_device *dev)
116 97
117 dev->netdev_ops = &lowpan_netdev_ops; 98 dev->netdev_ops = &lowpan_netdev_ops;
118 dev->header_ops = &lowpan_header_ops; 99 dev->header_ops = &lowpan_header_ops;
119 dev->ml_priv = &lowpan_mlme;
120 dev->destructor = free_netdev; 100 dev->destructor = free_netdev;
121 dev->features |= NETIF_F_NETNS_LOCAL; 101 dev->features |= NETIF_F_NETNS_LOCAL;
122} 102}
diff --git a/net/ieee802154/6lowpan/tx.c b/net/ieee802154/6lowpan/tx.c
index 2349070bd534..98acf7319754 100644
--- a/net/ieee802154/6lowpan/tx.c
+++ b/net/ieee802154/6lowpan/tx.c
@@ -207,7 +207,7 @@ static int lowpan_header(struct sk_buff *skb, struct net_device *dev)
207 207
208 /* prepare wpan address data */ 208 /* prepare wpan address data */
209 sa.mode = IEEE802154_ADDR_LONG; 209 sa.mode = IEEE802154_ADDR_LONG;
210 sa.pan_id = ieee802154_mlme_ops(dev)->get_pan_id(dev); 210 sa.pan_id = lowpan_dev_info(dev)->real_dev->ieee802154_ptr->pan_id;
211 sa.extended_addr = ieee802154_devaddr_from_raw(saddr); 211 sa.extended_addr = ieee802154_devaddr_from_raw(saddr);
212 212
213 /* intra-PAN communications */ 213 /* intra-PAN communications */
diff --git a/net/ieee802154/nl-mac.c b/net/ieee802154/nl-mac.c
index cdc1cc3543f6..ada58a81b753 100644
--- a/net/ieee802154/nl-mac.c
+++ b/net/ieee802154/nl-mac.c
@@ -97,8 +97,10 @@ static int ieee802154_nl_fill_iface(struct sk_buff *msg, u32 portid,
97 BUG_ON(!phy); 97 BUG_ON(!phy);
98 get_device(&phy->dev); 98 get_device(&phy->dev);
99 99
100 short_addr = ops->get_short_addr(dev); 100 rtnl_lock();
101 pan_id = ops->get_pan_id(dev); 101 short_addr = dev->ieee802154_ptr->short_addr;
102 pan_id = dev->ieee802154_ptr->pan_id;
103 rtnl_unlock();
102 104
103 if (nla_put_string(msg, IEEE802154_ATTR_DEV_NAME, dev->name) || 105 if (nla_put_string(msg, IEEE802154_ATTR_DEV_NAME, dev->name) ||
104 nla_put_string(msg, IEEE802154_ATTR_PHY_NAME, wpan_phy_name(phy)) || 106 nla_put_string(msg, IEEE802154_ATTR_PHY_NAME, wpan_phy_name(phy)) ||
@@ -244,7 +246,9 @@ int ieee802154_associate_resp(struct sk_buff *skb, struct genl_info *info)
244 addr.mode = IEEE802154_ADDR_LONG; 246 addr.mode = IEEE802154_ADDR_LONG;
245 addr.extended_addr = nla_get_hwaddr( 247 addr.extended_addr = nla_get_hwaddr(
246 info->attrs[IEEE802154_ATTR_DEST_HW_ADDR]); 248 info->attrs[IEEE802154_ATTR_DEST_HW_ADDR]);
247 addr.pan_id = ieee802154_mlme_ops(dev)->get_pan_id(dev); 249 rtnl_lock();
250 addr.pan_id = dev->ieee802154_ptr->pan_id;
251 rtnl_unlock();
248 252
249 ret = ieee802154_mlme_ops(dev)->assoc_resp(dev, &addr, 253 ret = ieee802154_mlme_ops(dev)->assoc_resp(dev, &addr,
250 nla_get_shortaddr(info->attrs[IEEE802154_ATTR_DEST_SHORT_ADDR]), 254 nla_get_shortaddr(info->attrs[IEEE802154_ATTR_DEST_SHORT_ADDR]),
@@ -281,7 +285,9 @@ int ieee802154_disassociate_req(struct sk_buff *skb, struct genl_info *info)
281 addr.short_addr = nla_get_shortaddr( 285 addr.short_addr = nla_get_shortaddr(
282 info->attrs[IEEE802154_ATTR_DEST_SHORT_ADDR]); 286 info->attrs[IEEE802154_ATTR_DEST_SHORT_ADDR]);
283 } 287 }
284 addr.pan_id = ieee802154_mlme_ops(dev)->get_pan_id(dev); 288 rtnl_lock();
289 addr.pan_id = dev->ieee802154_ptr->pan_id;
290 rtnl_unlock();
285 291
286 ret = ieee802154_mlme_ops(dev)->disassoc_req(dev, &addr, 292 ret = ieee802154_mlme_ops(dev)->disassoc_req(dev, &addr,
287 nla_get_u8(info->attrs[IEEE802154_ATTR_REASON])); 293 nla_get_u8(info->attrs[IEEE802154_ATTR_REASON]));
diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c
index 7aaaf967df58..e5cc2537c2a3 100644
--- a/net/ieee802154/socket.c
+++ b/net/ieee802154/socket.c
@@ -64,10 +64,8 @@ ieee802154_get_dev(struct net *net, const struct ieee802154_addr *addr)
64 if (tmp->type != ARPHRD_IEEE802154) 64 if (tmp->type != ARPHRD_IEEE802154)
65 continue; 65 continue;
66 66
67 pan_id = ieee802154_mlme_ops(tmp)->get_pan_id(tmp); 67 pan_id = tmp->ieee802154_ptr->pan_id;
68 short_addr = 68 short_addr = tmp->ieee802154_ptr->short_addr;
69 ieee802154_mlme_ops(tmp)->get_short_addr(tmp);
70
71 if (pan_id == addr->pan_id && 69 if (pan_id == addr->pan_id &&
72 short_addr == addr->short_addr) { 70 short_addr == addr->short_addr) {
73 dev = tmp; 71 dev = tmp;
@@ -797,9 +795,9 @@ static int ieee802154_dgram_deliver(struct net_device *dev, struct sk_buff *skb)
797 /* Data frame processing */ 795 /* Data frame processing */
798 BUG_ON(dev->type != ARPHRD_IEEE802154); 796 BUG_ON(dev->type != ARPHRD_IEEE802154);
799 797
800 pan_id = ieee802154_mlme_ops(dev)->get_pan_id(dev); 798 pan_id = dev->ieee802154_ptr->pan_id;
801 short_addr = ieee802154_mlme_ops(dev)->get_short_addr(dev); 799 short_addr = dev->ieee802154_ptr->short_addr;
802 hw_addr = ieee802154_devaddr_from_raw(dev->dev_addr); 800 hw_addr = dev->ieee802154_ptr->extended_addr;
803 801
804 read_lock(&dgram_lock); 802 read_lock(&dgram_lock);
805 sk_for_each(sk, &dgram_head) { 803 sk_for_each(sk, &dgram_head) {
diff --git a/net/mac802154/ieee802154_i.h b/net/mac802154/ieee802154_i.h
index 56b3847466e9..eec668f3637f 100644
--- a/net/mac802154/ieee802154_i.h
+++ b/net/mac802154/ieee802154_i.h
@@ -86,8 +86,6 @@ struct ieee802154_sub_if_data {
86 unsigned long state; 86 unsigned long state;
87 char name[IFNAMSIZ]; 87 char name[IFNAMSIZ];
88 88
89 spinlock_t mib_lock;
90
91 /* protects sec from concurrent access by netlink. access by 89 /* protects sec from concurrent access by netlink. access by
92 * encrypt/decrypt/header_create safe without additional protection. 90 * encrypt/decrypt/header_create safe without additional protection.
93 */ 91 */
@@ -136,10 +134,6 @@ ieee802154_subif_start_xmit(struct sk_buff *skb, struct net_device *dev);
136enum hrtimer_restart ieee802154_xmit_ifs_timer(struct hrtimer *timer); 134enum hrtimer_restart ieee802154_xmit_ifs_timer(struct hrtimer *timer);
137 135
138/* MIB callbacks */ 136/* MIB callbacks */
139void mac802154_dev_set_short_addr(struct net_device *dev, __le16 val);
140__le16 mac802154_dev_get_short_addr(const struct net_device *dev);
141__le16 mac802154_dev_get_pan_id(const struct net_device *dev);
142void mac802154_dev_set_pan_id(struct net_device *dev, __le16 val);
143void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan); 137void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan);
144 138
145int mac802154_get_params(struct net_device *dev, 139int mac802154_get_params(struct net_device *dev,
diff --git a/net/mac802154/iface.c b/net/mac802154/iface.c
index 0ec7bc402e29..f30788d2702f 100644
--- a/net/mac802154/iface.c
+++ b/net/mac802154/iface.c
@@ -63,7 +63,6 @@ mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
63 int err = -ENOIOCTLCMD; 63 int err = -ENOIOCTLCMD;
64 64
65 rtnl_lock(); 65 rtnl_lock();
66 spin_lock_bh(&sdata->mib_lock);
67 66
68 switch (cmd) { 67 switch (cmd) {
69 case SIOCGIFADDR: 68 case SIOCGIFADDR:
@@ -88,7 +87,6 @@ mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
88 } 87 }
89 case SIOCSIFADDR: 88 case SIOCSIFADDR:
90 if (netif_running(dev)) { 89 if (netif_running(dev)) {
91 spin_unlock_bh(&sdata->mib_lock);
92 rtnl_unlock(); 90 rtnl_unlock();
93 return -EBUSY; 91 return -EBUSY;
94 } 92 }
@@ -111,7 +109,6 @@ mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
111 break; 109 break;
112 } 110 }
113 111
114 spin_unlock_bh(&sdata->mib_lock);
115 rtnl_unlock(); 112 rtnl_unlock();
116 return err; 113 return err;
117} 114}
@@ -374,8 +371,6 @@ static int mac802154_header_create(struct sk_buff *skb,
374 return -EINVAL; 371 return -EINVAL;
375 372
376 if (!saddr) { 373 if (!saddr) {
377 spin_lock_bh(&sdata->mib_lock);
378
379 if (wpan_dev->short_addr == cpu_to_le16(IEEE802154_ADDR_BROADCAST) || 374 if (wpan_dev->short_addr == cpu_to_le16(IEEE802154_ADDR_BROADCAST) ||
380 wpan_dev->short_addr == cpu_to_le16(IEEE802154_ADDR_UNDEF) || 375 wpan_dev->short_addr == cpu_to_le16(IEEE802154_ADDR_UNDEF) ||
381 wpan_dev->pan_id == cpu_to_le16(IEEE802154_PANID_BROADCAST)) { 376 wpan_dev->pan_id == cpu_to_le16(IEEE802154_PANID_BROADCAST)) {
@@ -387,8 +382,6 @@ static int mac802154_header_create(struct sk_buff *skb,
387 } 382 }
388 383
389 hdr.source.pan_id = wpan_dev->pan_id; 384 hdr.source.pan_id = wpan_dev->pan_id;
390
391 spin_unlock_bh(&sdata->mib_lock);
392 } else { 385 } else {
393 hdr.source = *(const struct ieee802154_addr *)saddr; 386 hdr.source = *(const struct ieee802154_addr *)saddr;
394 } 387 }
@@ -500,7 +493,6 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata,
500 sdata->dev->ml_priv = &mac802154_mlme_wpan; 493 sdata->dev->ml_priv = &mac802154_mlme_wpan;
501 wpan_dev->promiscuous_mode = false; 494 wpan_dev->promiscuous_mode = false;
502 495
503 spin_lock_init(&sdata->mib_lock);
504 mutex_init(&sdata->sec_mtx); 496 mutex_init(&sdata->sec_mtx);
505 497
506 mac802154_llsec_init(&sdata->sec); 498 mac802154_llsec_init(&sdata->sec);
diff --git a/net/mac802154/mac_cmd.c b/net/mac802154/mac_cmd.c
index 3b347d4d3d4c..5220c2b2735b 100644
--- a/net/mac802154/mac_cmd.c
+++ b/net/mac802154/mac_cmd.c
@@ -43,8 +43,8 @@ static int mac802154_mlme_start_req(struct net_device *dev,
43 43
44 BUG_ON(addr->mode != IEEE802154_ADDR_SHORT); 44 BUG_ON(addr->mode != IEEE802154_ADDR_SHORT);
45 45
46 mac802154_dev_set_pan_id(dev, addr->pan_id); 46 dev->ieee802154_ptr->pan_id = addr->pan_id;
47 mac802154_dev_set_short_addr(dev, addr->short_addr); 47 dev->ieee802154_ptr->short_addr = addr->short_addr;
48 mac802154_dev_set_page_channel(dev, page, channel); 48 mac802154_dev_set_page_channel(dev, page, channel);
49 49
50 if (ops->llsec) { 50 if (ops->llsec) {
@@ -151,8 +151,6 @@ static struct ieee802154_llsec_ops mac802154_llsec_ops = {
151 151
152struct ieee802154_mlme_ops mac802154_mlme_wpan = { 152struct ieee802154_mlme_ops mac802154_mlme_wpan = {
153 .start_req = mac802154_mlme_start_req, 153 .start_req = mac802154_mlme_start_req,
154 .get_pan_id = mac802154_dev_get_pan_id,
155 .get_short_addr = mac802154_dev_get_short_addr,
156 154
157 .llsec = &mac802154_llsec_ops, 155 .llsec = &mac802154_llsec_ops,
158 156
diff --git a/net/mac802154/mib.c b/net/mac802154/mib.c
index 00a62de9cc23..73f94fbf8785 100644
--- a/net/mac802154/mib.c
+++ b/net/mac802154/mib.c
@@ -26,56 +26,6 @@
26#include "ieee802154_i.h" 26#include "ieee802154_i.h"
27#include "driver-ops.h" 27#include "driver-ops.h"
28 28
29void mac802154_dev_set_short_addr(struct net_device *dev, __le16 val)
30{
31 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
32
33 BUG_ON(dev->type != ARPHRD_IEEE802154);
34
35 spin_lock_bh(&sdata->mib_lock);
36 sdata->wpan_dev.short_addr = val;
37 spin_unlock_bh(&sdata->mib_lock);
38}
39
40__le16 mac802154_dev_get_short_addr(const struct net_device *dev)
41{
42 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
43 __le16 ret;
44
45 BUG_ON(dev->type != ARPHRD_IEEE802154);
46
47 spin_lock_bh(&sdata->mib_lock);
48 ret = sdata->wpan_dev.short_addr;
49 spin_unlock_bh(&sdata->mib_lock);
50
51 return ret;
52}
53
54__le16 mac802154_dev_get_pan_id(const struct net_device *dev)
55{
56 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
57 __le16 ret;
58
59 BUG_ON(dev->type != ARPHRD_IEEE802154);
60
61 spin_lock_bh(&sdata->mib_lock);
62 ret = sdata->wpan_dev.pan_id;
63 spin_unlock_bh(&sdata->mib_lock);
64
65 return ret;
66}
67
68void mac802154_dev_set_pan_id(struct net_device *dev, __le16 val)
69{
70 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
71
72 BUG_ON(dev->type != ARPHRD_IEEE802154);
73
74 spin_lock_bh(&sdata->mib_lock);
75 sdata->wpan_dev.pan_id = val;
76 spin_unlock_bh(&sdata->mib_lock);
77}
78
79void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan) 29void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan)
80{ 30{
81 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 31 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
diff --git a/net/mac802154/rx.c b/net/mac802154/rx.c
index c0d67b2b4132..e0f10063cac3 100644
--- a/net/mac802154/rx.c
+++ b/net/mac802154/rx.c
@@ -47,8 +47,6 @@ ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata,
47 47
48 pr_debug("getting packet via slave interface %s\n", sdata->dev->name); 48 pr_debug("getting packet via slave interface %s\n", sdata->dev->name);
49 49
50 spin_lock_bh(&sdata->mib_lock);
51
52 span = wpan_dev->pan_id; 50 span = wpan_dev->pan_id;
53 sshort = wpan_dev->short_addr; 51 sshort = wpan_dev->short_addr;
54 52
@@ -83,13 +81,10 @@ ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata,
83 skb->pkt_type = PACKET_OTHERHOST; 81 skb->pkt_type = PACKET_OTHERHOST;
84 break; 82 break;
85 default: 83 default:
86 spin_unlock_bh(&sdata->mib_lock);
87 pr_debug("invalid dest mode\n"); 84 pr_debug("invalid dest mode\n");
88 goto fail; 85 goto fail;
89 } 86 }
90 87
91 spin_unlock_bh(&sdata->mib_lock);
92
93 skb->dev = sdata->dev; 88 skb->dev = sdata->dev;
94 89
95 rc = mac802154_llsec_decrypt(&sdata->sec, skb); 90 rc = mac802154_llsec_decrypt(&sdata->sec, skb);