OSDN Git Service

nl80211/mac80211: mesh: add mesh path change count to mpath info
authorJulan Hsu <julanhsu@google.com>
Tue, 15 Jan 2019 23:28:43 +0000 (15:28 -0800)
committerJohannes Berg <johannes.berg@intel.com>
Sat, 19 Jan 2019 08:55:20 +0000 (09:55 +0100)
Expose path change count to destination in mpath info

Signed-off-by: Julan Hsu <julanhsu@google.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/mesh.h
net/mac80211/mesh_hwmp.c
net/wireless/nl80211.c

index 3781678..9c1d797 100644 (file)
@@ -1439,7 +1439,8 @@ enum mpath_info_flags {
        MPATH_INFO_DISCOVERY_TIMEOUT    = BIT(4),
        MPATH_INFO_DISCOVERY_RETRIES    = BIT(5),
        MPATH_INFO_FLAGS                = BIT(6),
-       MPATH_INFO_HOP_COUNT            = BIT(7)
+       MPATH_INFO_HOP_COUNT            = BIT(7),
+       MPATH_INFO_PATH_CHANGE          = BIT(8),
 };
 
 /**
@@ -1460,6 +1461,7 @@ enum mpath_info_flags {
  *     changes, i.e. when a station is added or removed, so that
  *     userspace can tell whether it got a consistent snapshot.
  * @hop_count: hops to destination
+ * @path_change_count: total number of path changes to destination
  */
 struct mpath_info {
        u32 filled;
@@ -1471,6 +1473,7 @@ struct mpath_info {
        u8 discovery_retries;
        u8 flags;
        u8 hop_count;
+       u32 path_change_count;
 
        int generation;
 };
index 213a1d7..426db4d 100644 (file)
@@ -3288,8 +3288,9 @@ enum nl80211_mpath_flags {
  * @NL80211_MPATH_INFO_DISCOVERY_TIMEOUT: total path discovery timeout, in msec
  * @NL80211_MPATH_INFO_DISCOVERY_RETRIES: mesh path discovery retries
  * @NL80211_MPATH_INFO_HOP_COUNT: hop count to destination
+ * @NL80211_MPATH_INFO_PATH_CHANGE: total number of path changes to destination
  * @NL80211_MPATH_INFO_MAX: highest mesh path information attribute number
- *     currently defind
+ *     currently defined
  * @__NL80211_MPATH_INFO_AFTER_LAST: internal use
  */
 enum nl80211_mpath_info {
@@ -3302,6 +3303,7 @@ enum nl80211_mpath_info {
        NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
        NL80211_MPATH_INFO_DISCOVERY_RETRIES,
        NL80211_MPATH_INFO_HOP_COUNT,
+       NL80211_MPATH_INFO_PATH_CHANGE,
 
        /* keep last */
        __NL80211_MPATH_INFO_AFTER_LAST,
index 52cbaaf..e5e0f10 100644 (file)
@@ -1746,7 +1746,8 @@ static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
                        MPATH_INFO_DISCOVERY_TIMEOUT |
                        MPATH_INFO_DISCOVERY_RETRIES |
                        MPATH_INFO_FLAGS |
-                       MPATH_INFO_HOP_COUNT;
+                       MPATH_INFO_HOP_COUNT |
+                       MPATH_INFO_PATH_CHANGE;
 
        pinfo->frame_qlen = mpath->frame_queue.qlen;
        pinfo->sn = mpath->sn;
@@ -1767,6 +1768,7 @@ static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
        if (mpath->flags & MESH_PATH_RESOLVED)
                pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED;
        pinfo->hop_count = mpath->hop_count;
+       pinfo->path_change_count = mpath->path_change_count;
 }
 
 static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
index cad6592..8b26858 100644 (file)
@@ -94,6 +94,7 @@ enum mesh_deferred_task_flags {
  * @last_preq_to_root: Timestamp of last PREQ sent to root
  * @is_root: the destination station of this path is a root node
  * @is_gate: the destination station of this path is a mesh gate
+ * @path_change_count: the number of path changes to destination
  *
  *
  * The dst address is unique in the mesh path table. Since the mesh_path is
@@ -124,6 +125,7 @@ struct mesh_path {
        unsigned long last_preq_to_root;
        bool is_root;
        bool is_gate;
+       u32 path_change_count;
 };
 
 /**
index 6d1190b..a0aebf4 100644 (file)
@@ -479,6 +479,8 @@ static u32 hwmp_route_info_get(struct ieee80211_sub_if_data *sdata,
                }
 
                if (fresh_info) {
+                       if (rcu_access_pointer(mpath->next_hop) != sta)
+                               mpath->path_change_count++;
                        mesh_path_assign_nexthop(mpath, sta);
                        mpath->flags |= MESH_PATH_SN_VALID;
                        mpath->metric = new_metric;
@@ -523,6 +525,8 @@ static u32 hwmp_route_info_get(struct ieee80211_sub_if_data *sdata,
                }
 
                if (fresh_info) {
+                       if (rcu_access_pointer(mpath->next_hop) != sta)
+                               mpath->path_change_count++;
                        mesh_path_assign_nexthop(mpath, sta);
                        mpath->metric = last_hop_metric;
                        mpath->exp_time = time_after(mpath->exp_time, exp_time)
index 159125e..e5f9c9c 100644 (file)
@@ -5830,7 +5830,10 @@ static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq,
                        pinfo->discovery_retries)) ||
            ((pinfo->filled & MPATH_INFO_HOP_COUNT) &&
             nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT,
-                       pinfo->hop_count)))
+                       pinfo->hop_count)) ||
+           ((pinfo->filled & MPATH_INFO_PATH_CHANGE) &&
+            nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE,
+                        pinfo->path_change_count)))
                goto nla_put_failure;
 
        nla_nest_end(msg, pinfoattr);