mac802154: add support for promiscuous mode
authorAlexander Aring <alex.aring@gmail.com>
Wed, 29 Oct 2014 20:34:32 +0000 (21:34 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 29 Oct 2014 22:07:45 +0000 (23:07 +0100)
This patch adds a new driver operation to bring the transceiver into
promiscuous mode.

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

index 2f523fc1bf805dc1100d2aa4cfd1f5f13bdd66db..166ef6c52180497197761a65e4d5305ce6fe27a5 100644 (file)
@@ -92,6 +92,8 @@ struct ieee802154_hw {
 #define IEEE802154_HW_FRAME_RETRIES    0x00000080
 /* Indicates that transceiver will support hardware address filter setting. */
 #define IEEE802154_HW_AFILT            0x00000100
+/* Indicates that transceiver will support promiscuous mode setting. */
+#define IEEE802154_HW_PROMISCUOUS      0x00000200
 
 /* This groups the most common CSMA support fields into one. */
 #define IEEE802154_HW_CSMA             (IEEE802154_HW_CCA_MODE | \
@@ -173,6 +175,9 @@ struct ieee802154_hw {
  * set_frame_retries
  *       Sets the retransmission attempt limit. Called with pib_lock held.
  *       Returns either zero, or negative errno.
+ *
+ * set_promiscuous_mode
+ *       Enables or disable promiscuous mode.
  */
 struct ieee802154_ops {
        struct module   *owner;
@@ -197,6 +202,8 @@ struct ieee802154_ops {
                                           u8 min_be, u8 max_be, u8 retries);
        int             (*set_frame_retries)(struct ieee802154_hw *hw,
                                             s8 retries);
+       int             (*set_promiscuous_mode)(struct ieee802154_hw *hw,
+                                               const bool on);
 };
 
 /* Basic interface to register ieee802154 hwice */
index 4b820cfeb538dac69ec1c3f493163b30578b267b..dfd29ffb8fee392074bb1d84b5e1861adfd71798 100644 (file)
@@ -210,4 +210,17 @@ static inline int drv_set_max_frame_retries(struct ieee802154_local *local,
        return local->ops->set_frame_retries(&local->hw, max_frame_retries);
 }
 
+static inline int drv_set_promiscuous_mode(struct ieee802154_local *local,
+                                          const bool on)
+{
+       might_sleep();
+
+       if (!local->ops->set_promiscuous_mode) {
+               WARN_ON(1);
+               return -EOPNOTSUPP;
+       }
+
+       return local->ops->set_promiscuous_mode(&local->hw, on);
+}
+
 #endif /* __MAC802154_DRVIER_OPS */