{nl,mac}80211: add dot11MeshConnectedToMeshGate to meshconf
authorBob Copeland <me@bobcopeland.com>
Thu, 25 Oct 2018 21:36:34 +0000 (17:36 -0400)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 9 Nov 2018 10:39:44 +0000 (11:39 +0100)
When userspace is controlling mesh routing, it may have better
knowledge about whether a mesh STA is connected to a mesh
gate than the kernel mpath table.  Add dot11MeshConnectedToMeshGate
to the mesh config so that such applications can explicitly
signal that a mesh STA is connected to a gate, which will then
be advertised in the beacon.

Signed-off-by: Bob Copeland <bobcopeland@fb.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/mac80211/cfg.c
net/mac80211/debugfs_netdev.c
net/mac80211/mesh.c
net/wireless/nl80211.c

index 24d2db8..16d595b 100644 (file)
@@ -1562,6 +1562,10 @@ struct bss_parameters {
  * @plink_timeout: If no tx activity is seen from a STA we've established
  *     peering with for longer than this time (in seconds), then remove it
  *     from the STA's list of peers.  Default is 30 minutes.
+ * @dot11MeshConnectedToMeshGate: if set to true, advertise that this STA is
+ *      connected to a mesh gate in mesh formation info.  If false, the
+ *      value in mesh formation is determined by the presence of root paths
+ *      in the mesh path table
  */
 struct mesh_config {
        u16 dot11MeshRetryTimeout;
@@ -1581,6 +1585,7 @@ struct mesh_config {
        u16 dot11MeshHWMPperrMinInterval;
        u16 dot11MeshHWMPnetDiameterTraversalTime;
        u8 dot11MeshHWMPRootMode;
+       bool dot11MeshConnectedToMeshGate;
        u16 dot11MeshHWMPRannInterval;
        bool dot11MeshGateAnnouncementProtocol;
        bool dot11MeshForwarding;
index ff6005e..51bd85b 100644 (file)
@@ -3117,7 +3117,7 @@ enum nl80211_sta_bss_param {
  *     some packets with an FCS error due to TA corruption. Hence this counter
  *     might not be fully accurate.
  * @NL80211_STA_INFO_CONNECTED_TO_GATE: set to true if STA has a path to a
- *     mesh gate
+ *     mesh gate (u8, 0 or 1)
  * @__NL80211_STA_INFO_AFTER_LAST: internal
  * @NL80211_STA_INFO_MAX: highest possible station info attribute
  */
@@ -3940,6 +3940,11 @@ enum nl80211_mesh_power_mode {
  *     remove it from the STA's list of peers. You may set this to 0 to disable
  *     the removal of the STA. Default is 30 minutes.
  *
+ * @NL80211_MESHCONF_CONNECTED_TO_GATE: If set to true then this mesh STA
+ *     will advertise that it is connected to a gate in the mesh formation
+ *     field.  If left unset then the mesh formation field will only
+ *     advertise such if there is an active root mesh path.
+ *
  * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
  */
 enum nl80211_meshconf_params {
@@ -3972,6 +3977,7 @@ enum nl80211_meshconf_params {
        NL80211_MESHCONF_POWER_MODE,
        NL80211_MESHCONF_AWAKE_WINDOW,
        NL80211_MESHCONF_PLINK_TIMEOUT,
+       NL80211_MESHCONF_CONNECTED_TO_GATE,
 
        /* keep last */
        __NL80211_MESHCONF_ATTR_AFTER_LAST,
index 2fccccf..cf8f946 100644 (file)
@@ -2028,6 +2028,9 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
                        nconf->dot11MeshAwakeWindowDuration;
        if (_chg_mesh_attr(NL80211_MESHCONF_PLINK_TIMEOUT, mask))
                conf->plink_timeout = nconf->plink_timeout;
+       if (_chg_mesh_attr(NL80211_MESHCONF_CONNECTED_TO_GATE, mask))
+               conf->dot11MeshConnectedToMeshGate =
+                       nconf->dot11MeshConnectedToMeshGate;
        ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON);
        return 0;
 }
index c813207..cff0fb3 100644 (file)
@@ -641,6 +641,8 @@ IEEE80211_IF_FILE(dot11MeshHWMPconfirmationInterval,
 IEEE80211_IF_FILE(power_mode, u.mesh.mshcfg.power_mode, DEC);
 IEEE80211_IF_FILE(dot11MeshAwakeWindowDuration,
                  u.mesh.mshcfg.dot11MeshAwakeWindowDuration, DEC);
+IEEE80211_IF_FILE(dot11MeshConnectedToMeshGate,
+                 u.mesh.mshcfg.dot11MeshConnectedToMeshGate, DEC);
 #endif
 
 #define DEBUGFS_ADD_MODE(name, mode) \
@@ -762,6 +764,7 @@ static void add_mesh_config(struct ieee80211_sub_if_data *sdata)
        MESHPARAMS_ADD(dot11MeshHWMPconfirmationInterval);
        MESHPARAMS_ADD(power_mode);
        MESHPARAMS_ADD(dot11MeshAwakeWindowDuration);
+       MESHPARAMS_ADD(dot11MeshConnectedToMeshGate);
 #undef MESHPARAMS_ADD
 }
 #endif
index 19205c8..4869280 100644 (file)
@@ -255,7 +255,8 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata,
        u8 *pos, neighbors;
        u8 meshconf_len = sizeof(struct ieee80211_meshconf_ie);
        bool is_connected_to_gate = ifmsh->num_gates > 0 ||
-               ifmsh->mshcfg.dot11MeshGateAnnouncementProtocol;
+               ifmsh->mshcfg.dot11MeshGateAnnouncementProtocol ||
+               ifmsh->mshcfg.dot11MeshConnectedToMeshGate;
 
        if (skb_tailroom(skb) < 2 + meshconf_len)
                return -ENOMEM;
index f231059..d5f0ffd 100644 (file)
@@ -6275,7 +6275,9 @@ static int nl80211_get_mesh_config(struct sk_buff *skb,
            nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW,
                        cur_params.dot11MeshAwakeWindowDuration) ||
            nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT,
-                       cur_params.plink_timeout))
+                       cur_params.plink_timeout) ||
+           nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE,
+                      cur_params.dot11MeshConnectedToMeshGate))
                goto nla_put_failure;
        nla_nest_end(msg, pinfoattr);
        genlmsg_end(msg, hdr);
@@ -6332,6 +6334,7 @@ nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = {
                                 NL80211_MESH_POWER_MAX),
        [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 },
        [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 },
+       [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
 };
 
 static const struct nla_policy
@@ -6443,6 +6446,9 @@ do {                                                                      \
        FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask,
                                  NL80211_MESHCONF_RSSI_THRESHOLD,
                                  nla_get_s32);
+       FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask,
+                                 NL80211_MESHCONF_CONNECTED_TO_GATE,
+                                 nla_get_u8);
        /*
         * Check HT operation mode based on
         * IEEE 802.11-2016 9.4.2.57 HT Operation element.