aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac802154
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 /net/mac802154
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>
Diffstat (limited to 'net/mac802154')
-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
5 files changed, 2 insertions, 73 deletions
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);