aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@gmail.com>2015-06-21 10:45:20 -0400
committerMarcel Holtmann <marcel@holtmann.org>2015-07-23 11:10:48 -0400
commitd77b4852b4d3698a90eef219acf9cddc964b1f3a (patch)
treee6f399f7f906a271dbfeb0533280ab78da8ee36c
parentfac5e5b912bd1b42bad292e0b03956967229b45b (diff)
mac802154: add llsec address update workaround
This patch adds a workaround for using the new nl802154 netlink interface with the old ieee802154 netlink interface togehter. The nl802154 currently supports no access for llsec layer, currently there are users outside which are using both interfaces at the same time. This patch adds a necessary call when addresses are updated. Reported-by: Simon Vincent <simon.vincent@xsilon.com> Suggested-by: Phoebe Buckheister <phoebe.buckheister@itwm.fraunhofer.de> Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
-rw-r--r--net/mac802154/cfg.c9
-rw-r--r--net/mac802154/ieee802154_i.h2
-rw-r--r--net/mac802154/iface.c7
3 files changed, 15 insertions, 3 deletions
diff --git a/net/mac802154/cfg.c b/net/mac802154/cfg.c
index 317c4662e544..44db8613812e 100644
--- a/net/mac802154/cfg.c
+++ b/net/mac802154/cfg.c
@@ -145,13 +145,18 @@ static int
145ieee802154_set_pan_id(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev, 145ieee802154_set_pan_id(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev,
146 __le16 pan_id) 146 __le16 pan_id)
147{ 147{
148 int ret;
149
148 ASSERT_RTNL(); 150 ASSERT_RTNL();
149 151
150 if (wpan_dev->pan_id == pan_id) 152 if (wpan_dev->pan_id == pan_id)
151 return 0; 153 return 0;
152 154
153 wpan_dev->pan_id = pan_id; 155 ret = mac802154_wpan_update_llsec(wpan_dev->netdev);
154 return 0; 156 if (!ret)
157 wpan_dev->pan_id = pan_id;
158
159 return ret;
155} 160}
156 161
157static int 162static int
diff --git a/net/mac802154/ieee802154_i.h b/net/mac802154/ieee802154_i.h
index 34755d5751a4..6d4f3ccc3c1c 100644
--- a/net/mac802154/ieee802154_i.h
+++ b/net/mac802154/ieee802154_i.h
@@ -167,6 +167,8 @@ void mac802154_get_table(struct net_device *dev,
167 struct ieee802154_llsec_table **t); 167 struct ieee802154_llsec_table **t);
168void mac802154_unlock_table(struct net_device *dev); 168void mac802154_unlock_table(struct net_device *dev);
169 169
170int mac802154_wpan_update_llsec(struct net_device *dev);
171
170/* interface handling */ 172/* interface handling */
171int ieee802154_iface_init(void); 173int ieee802154_iface_init(void);
172void ieee802154_iface_exit(void); 174void ieee802154_iface_exit(void);
diff --git a/net/mac802154/iface.c b/net/mac802154/iface.c
index 8b698246a51b..4760368a3493 100644
--- a/net/mac802154/iface.c
+++ b/net/mac802154/iface.c
@@ -30,7 +30,7 @@
30#include "ieee802154_i.h" 30#include "ieee802154_i.h"
31#include "driver-ops.h" 31#include "driver-ops.h"
32 32
33static int mac802154_wpan_update_llsec(struct net_device *dev) 33int mac802154_wpan_update_llsec(struct net_device *dev)
34{ 34{
35 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 35 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
36 struct ieee802154_mlme_ops *ops = ieee802154_mlme_ops(dev); 36 struct ieee802154_mlme_ops *ops = ieee802154_mlme_ops(dev);
@@ -471,6 +471,7 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata,
471 enum nl802154_iftype type) 471 enum nl802154_iftype type)
472{ 472{
473 struct wpan_dev *wpan_dev = &sdata->wpan_dev; 473 struct wpan_dev *wpan_dev = &sdata->wpan_dev;
474 int ret;
474 u8 tmp; 475 u8 tmp;
475 476
476 /* set some type-dependent values */ 477 /* set some type-dependent values */
@@ -505,6 +506,10 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata,
505 mutex_init(&sdata->sec_mtx); 506 mutex_init(&sdata->sec_mtx);
506 507
507 mac802154_llsec_init(&sdata->sec); 508 mac802154_llsec_init(&sdata->sec);
509 ret = mac802154_wpan_update_llsec(sdata->dev);
510 if (ret < 0)
511 return ret;
512
508 break; 513 break;
509 case NL802154_IFTYPE_MONITOR: 514 case NL802154_IFTYPE_MONITOR:
510 sdata->dev->destructor = free_netdev; 515 sdata->dev->destructor = free_netdev;