aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@gmail.com>2014-11-02 04:18:43 +0100
committerMarcel Holtmann <marcel@holtmann.org>2014-11-02 04:51:07 +0100
commit50c79075019e7b952327cfebf0681548573fd8e5 (patch)
treea2ec43c416cca5bdca81bb0c58d13692b4b647c9
parentmac802154: set short address filter on ifup (diff)
downloadlinux-dev-50c79075019e7b952327cfebf0681548573fd8e5.tar.xz
linux-dev-50c79075019e7b952327cfebf0681548573fd8e5.zip
mac802154: set panid address filter on ifup
This patch moves the setting of hardware panid address filtering inside of interface up instead doing it it directly inside of netlink interface. The netlink call which can only be called when netif isn't running sets only the necessary panid value in sdata. After an interface up the address filter will be set with this value. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
-rw-r--r--net/mac802154/iface.c4
-rw-r--r--net/mac802154/mib.c51
2 files changed, 4 insertions, 51 deletions
diff --git a/net/mac802154/iface.c b/net/mac802154/iface.c
index 1bae29dff082..5f94c70478f9 100644
--- a/net/mac802154/iface.c
+++ b/net/mac802154/iface.c
@@ -205,6 +205,10 @@ static int mac802154_wpan_open(struct net_device *dev)
}
if (local->hw.flags & IEEE802154_HW_AFILT) {
+ rc = drv_set_pan_id(local, sdata->pan_id);
+ if (rc < 0)
+ goto out;
+
rc = drv_set_extended_addr(local, sdata->extended_addr);
if (rc < 0)
goto out;
diff --git a/net/mac802154/mib.c b/net/mac802154/mib.c
index 755befde6a17..6fa749154baf 100644
--- a/net/mac802154/mib.c
+++ b/net/mac802154/mib.c
@@ -26,51 +26,6 @@
#include "ieee802154_i.h"
#include "driver-ops.h"
-struct hw_addr_filt_notify_work {
- struct work_struct work;
- struct net_device *dev;
- unsigned long changed;
-};
-
-static struct ieee802154_local *mac802154_slave_get_priv(struct net_device *dev)
-{
- struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
-
- BUG_ON(dev->type != ARPHRD_IEEE802154);
-
- return sdata->local;
-}
-
-static void hw_addr_notify(struct work_struct *work)
-{
- struct hw_addr_filt_notify_work *nw = container_of(work,
- struct hw_addr_filt_notify_work, work);
- struct ieee802154_local *local = mac802154_slave_get_priv(nw->dev);
- int res;
-
- res = local->ops->set_hw_addr_filt(&local->hw, &local->hw.hw_filt,
- nw->changed);
- if (res)
- pr_debug("failed changed mask %lx\n", nw->changed);
-
- kfree(nw);
-}
-
-static void set_hw_addr_filt(struct net_device *dev, unsigned long changed)
-{
- struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
- struct hw_addr_filt_notify_work *work;
-
- work = kzalloc(sizeof(*work), GFP_ATOMIC);
- if (!work)
- return;
-
- INIT_WORK(&work->work, hw_addr_notify);
- work->dev = dev;
- work->changed = changed;
- queue_work(sdata->local->workqueue, &work->work);
-}
-
void mac802154_dev_set_short_addr(struct net_device *dev, __le16 val)
{
struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
@@ -119,12 +74,6 @@ void mac802154_dev_set_pan_id(struct net_device *dev, __le16 val)
spin_lock_bh(&sdata->mib_lock);
sdata->pan_id = val;
spin_unlock_bh(&sdata->mib_lock);
-
- if ((sdata->local->ops->set_hw_addr_filt) &&
- (sdata->local->hw.hw_filt.pan_id != sdata->pan_id)) {
- sdata->local->hw.hw_filt.pan_id = sdata->pan_id;
- set_hw_addr_filt(dev, IEEE802154_AFILT_PANID_CHANGED);
- }
}
u8 mac802154_dev_get_dsn(const struct net_device *dev)