{nl,cfg,mac}80211: Add support of setting non-forwarding entity in Mesh
authorChun-Yeow Yeoh <yeohchunyeow@gmail.com>
Fri, 20 Jan 2012 17:02:16 +0000 (01:02 +0800)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 27 Jan 2012 19:56:56 +0000 (14:56 -0500)
A mesh node that joins the mesh network is by default a forwarding entity. This patch allows
the mesh node to set as non-forwarding entity. Whenever dot11MeshForwarding is set to 0, the
mesh node can prevent itself from forwarding the traffic which is not destined to him.

Signed-off-by: Chun-Yeow Yeoh <yeohchunyeow@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/linux/nl80211.h
include/net/cfg80211.h
net/mac80211/cfg.c
net/mac80211/debugfs_netdev.c
net/mac80211/mesh_hwmp.c
net/wireless/mesh.c
net/wireless/nl80211.c

index 0f5ff37398206d0cb30f866244879be020b99ed5..4f98fae13307072d036f23b16a51698ef5d16641 100644 (file)
@@ -2104,6 +2104,9 @@ enum nl80211_mntr_flags {
  * TUs) during which a mesh STA can send only one Action frame containing a
  * PERR element.
  *
+ * @NL80211_MESHCONF_FORWARDING: set Mesh STA as forwarding or non-forwarding
+ * or forwarding entity (default is TRUE - forwarding entity)
+ *
  * @NL80211_MESHCONF_ATTR_MAX: highest possible mesh configuration attribute
  *
  * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
@@ -2128,6 +2131,7 @@ enum nl80211_meshconf_params {
        NL80211_MESHCONF_HWMP_RANN_INTERVAL,
        NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
        NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
+       NL80211_MESHCONF_FORWARDING,
 
        /* keep last */
        __NL80211_MESHCONF_ATTR_AFTER_LAST,
index 208a7b5f8d491265b0f851c8727d4e805ef8e3db..281899167d2d86a862bc0de23bfd7e3c37ab5ca5 100644 (file)
@@ -798,6 +798,7 @@ struct mesh_config {
         * mesh gate, but not necessarily using the gate announcement protocol.
         * Still keeping the same nomenclature to be in sync with the spec. */
        bool  dot11MeshGateAnnouncementProtocol;
+       bool dot11MeshForwarding;
 };
 
 /**
index 74c9301681e5fbe363a2ba4b0a1d066a931118a6..98460783c2d37abad1caad6ab40cd04b6fb0ea6c 100644 (file)
@@ -1346,6 +1346,8 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
                conf->dot11MeshHWMPRannInterval =
                        nconf->dot11MeshHWMPRannInterval;
        }
+       if (_chg_mesh_attr(NL80211_MESHCONF_FORWARDING, mask))
+               conf->dot11MeshForwarding = nconf->dot11MeshForwarding;
        return 0;
 }
 
index 176c08ffb13c50e5f5fa8c212175a8367f09bb97..81d12e65a23ca6f46b0950db4ffbbafe460b42bc 100644 (file)
@@ -422,6 +422,7 @@ IEEE80211_IF_FILE(dot11MeshGateAnnouncementProtocol,
                u.mesh.mshcfg.dot11MeshGateAnnouncementProtocol, DEC);
 IEEE80211_IF_FILE(dot11MeshHWMPRannInterval,
                u.mesh.mshcfg.dot11MeshHWMPRannInterval, DEC);
+IEEE80211_IF_FILE(dot11MeshForwarding, u.mesh.mshcfg.dot11MeshForwarding, DEC);
 #endif
 
 
index 73abb7524b2cee3ce83d122efe0dcbbda7257f85..cae407136ae08dddce1be623e28f6da1daa3e73c 100644 (file)
@@ -575,7 +575,7 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
                        ifmsh->mshstats.dropped_frames_ttl++;
        }
 
-       if (forward) {
+       if (forward && ifmsh->mshcfg.dot11MeshForwarding) {
                u32 preq_id;
                u8 hopcount, flags;
 
index 8c550df13037c7e0108c692cd080762fafd0ab38..9d3e3b6bfcf4c20f6a0e484dd097319a3a63eefa 100644 (file)
@@ -55,6 +55,7 @@ const struct mesh_config default_mesh_config = {
        .min_discovery_timeout = MESH_MIN_DISCOVERY_TIMEOUT,
        .dot11MeshHWMPRannInterval = MESH_RANN_INTERVAL,
        .dot11MeshGateAnnouncementProtocol = false,
+       .dot11MeshForwarding = true,
 };
 
 const struct mesh_setup default_mesh_setup = {
index 5cefd74ab47d2d73770dde5304f960e4e8fa2597..c42173f947efa149c40eae716cd32c3b25981ca2 100644 (file)
@@ -3258,6 +3258,8 @@ static int nl80211_get_mesh_config(struct sk_buff *skb,
                        cur_params.dot11MeshHWMPRannInterval);
        NLA_PUT_U8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
                        cur_params.dot11MeshGateAnnouncementProtocol);
+       NLA_PUT_U8(msg, NL80211_MESHCONF_FORWARDING,
+                       cur_params.dot11MeshForwarding);
        nla_nest_end(msg, pinfoattr);
        genlmsg_end(msg, hdr);
        return genlmsg_reply(msg, info);
@@ -3289,6 +3291,7 @@ static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_A
        [NL80211_MESHCONF_HWMP_ROOTMODE] = { .type = NLA_U8 },
        [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = { .type = NLA_U16 },
        [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = { .type = NLA_U8 },
+       [NL80211_MESHCONF_FORWARDING] = { .type = NLA_U8 },
 };
 
 static const struct nla_policy
@@ -3378,6 +3381,8 @@ do {\
                        dot11MeshGateAnnouncementProtocol, mask,
                        NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
                        nla_get_u8);
+       FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding,
+                       mask, NL80211_MESHCONF_FORWARDING, nla_get_u8);
        if (mask_out)
                *mask_out = mask;