mac802154: add basic support for monitor
authorAlexander Aring <alex.aring@gmail.com>
Wed, 29 Oct 2014 20:34:44 +0000 (21:34 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 29 Oct 2014 22:07:46 +0000 (23:07 +0100)
This patch adds basic support for monitor mode. Also change the open
call that we set the transceiver mac setting on an interface up. Futher
patches will add a better handling while interface up an interface.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/mac802154/ieee802154_i.h
net/mac802154/iface.c

index 7cebc9844c00c24d7dddc3a9af9454800f31f1bd..1086a9d96f8f6d94bc321b579ffe9b4a194dc94e 100644 (file)
@@ -84,6 +84,7 @@ struct ieee802154_sub_if_data {
        __le16 pan_id;
        __le16 short_addr;
        __le64 extended_addr;
+       bool promisuous_mode;
 
        struct ieee802154_mac_params mac_params;
 
index c0bf5f9b99536e83943142782153b92ee97eb731..f7a6f83301e2096d679ccd6a2d65243c2921d591 100644 (file)
@@ -196,6 +196,12 @@ static int mac802154_wpan_open(struct net_device *dev)
 
        mutex_lock(&phy->pib_lock);
 
+       if (local->hw.flags & IEEE802154_HW_PROMISCUOUS) {
+               rc = drv_set_promiscuous_mode(local, sdata->promisuous_mode);
+               if (rc < 0)
+                       goto out;
+       }
+
        if (local->hw.flags & IEEE802154_HW_TXPOWER) {
                rc = drv_set_tx_power(local, sdata->mac_params.transmit_power);
                if (rc < 0)
@@ -382,7 +388,7 @@ static const struct net_device_ops mac802154_wpan_ops = {
 };
 
 static const struct net_device_ops mac802154_monitor_ops = {
-       .ndo_open               = mac802154_slave_open,
+       .ndo_open               = mac802154_wpan_open,
        .ndo_stop               = mac802154_slave_close,
        .ndo_start_xmit         = ieee802154_monitor_start_xmit,
 };
@@ -434,6 +440,8 @@ void mac802154_wpan_setup(struct net_device *dev)
        sdata->pan_id = cpu_to_le16(IEEE802154_PANID_BROADCAST);
        sdata->short_addr = cpu_to_le16(IEEE802154_ADDR_BROADCAST);
 
+       sdata->promisuous_mode = false;
+
        mac802154_llsec_init(&sdata->sec);
 }
 
@@ -453,4 +461,6 @@ void mac802154_monitor_setup(struct net_device *dev)
 
        sdata = IEEE802154_DEV_TO_SUB_IF(dev);
        sdata->type = IEEE802154_DEV_MONITOR;
+
+       sdata->promisuous_mode = true;
 }