nl80211/mac80211: mesh: add mesh path change count to mpath info
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>
This commit is contained in:
parent
cc24163690
commit
540bbcb930
@ -1439,7 +1439,8 @@ enum mpath_info_flags {
|
|||||||
MPATH_INFO_DISCOVERY_TIMEOUT = BIT(4),
|
MPATH_INFO_DISCOVERY_TIMEOUT = BIT(4),
|
||||||
MPATH_INFO_DISCOVERY_RETRIES = BIT(5),
|
MPATH_INFO_DISCOVERY_RETRIES = BIT(5),
|
||||||
MPATH_INFO_FLAGS = BIT(6),
|
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
|
* changes, i.e. when a station is added or removed, so that
|
||||||
* userspace can tell whether it got a consistent snapshot.
|
* userspace can tell whether it got a consistent snapshot.
|
||||||
* @hop_count: hops to destination
|
* @hop_count: hops to destination
|
||||||
|
* @path_change_count: total number of path changes to destination
|
||||||
*/
|
*/
|
||||||
struct mpath_info {
|
struct mpath_info {
|
||||||
u32 filled;
|
u32 filled;
|
||||||
@ -1471,6 +1473,7 @@ struct mpath_info {
|
|||||||
u8 discovery_retries;
|
u8 discovery_retries;
|
||||||
u8 flags;
|
u8 flags;
|
||||||
u8 hop_count;
|
u8 hop_count;
|
||||||
|
u32 path_change_count;
|
||||||
|
|
||||||
int generation;
|
int generation;
|
||||||
};
|
};
|
||||||
|
@ -3288,8 +3288,9 @@ enum nl80211_mpath_flags {
|
|||||||
* @NL80211_MPATH_INFO_DISCOVERY_TIMEOUT: total path discovery timeout, in msec
|
* @NL80211_MPATH_INFO_DISCOVERY_TIMEOUT: total path discovery timeout, in msec
|
||||||
* @NL80211_MPATH_INFO_DISCOVERY_RETRIES: mesh path discovery retries
|
* @NL80211_MPATH_INFO_DISCOVERY_RETRIES: mesh path discovery retries
|
||||||
* @NL80211_MPATH_INFO_HOP_COUNT: hop count to destination
|
* @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
|
* @NL80211_MPATH_INFO_MAX: highest mesh path information attribute number
|
||||||
* currently defind
|
* currently defined
|
||||||
* @__NL80211_MPATH_INFO_AFTER_LAST: internal use
|
* @__NL80211_MPATH_INFO_AFTER_LAST: internal use
|
||||||
*/
|
*/
|
||||||
enum nl80211_mpath_info {
|
enum nl80211_mpath_info {
|
||||||
@ -3302,6 +3303,7 @@ enum nl80211_mpath_info {
|
|||||||
NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
|
NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
|
||||||
NL80211_MPATH_INFO_DISCOVERY_RETRIES,
|
NL80211_MPATH_INFO_DISCOVERY_RETRIES,
|
||||||
NL80211_MPATH_INFO_HOP_COUNT,
|
NL80211_MPATH_INFO_HOP_COUNT,
|
||||||
|
NL80211_MPATH_INFO_PATH_CHANGE,
|
||||||
|
|
||||||
/* keep last */
|
/* keep last */
|
||||||
__NL80211_MPATH_INFO_AFTER_LAST,
|
__NL80211_MPATH_INFO_AFTER_LAST,
|
||||||
|
@ -1746,7 +1746,8 @@ static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
|
|||||||
MPATH_INFO_DISCOVERY_TIMEOUT |
|
MPATH_INFO_DISCOVERY_TIMEOUT |
|
||||||
MPATH_INFO_DISCOVERY_RETRIES |
|
MPATH_INFO_DISCOVERY_RETRIES |
|
||||||
MPATH_INFO_FLAGS |
|
MPATH_INFO_FLAGS |
|
||||||
MPATH_INFO_HOP_COUNT;
|
MPATH_INFO_HOP_COUNT |
|
||||||
|
MPATH_INFO_PATH_CHANGE;
|
||||||
|
|
||||||
pinfo->frame_qlen = mpath->frame_queue.qlen;
|
pinfo->frame_qlen = mpath->frame_queue.qlen;
|
||||||
pinfo->sn = mpath->sn;
|
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)
|
if (mpath->flags & MESH_PATH_RESOLVED)
|
||||||
pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED;
|
pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED;
|
||||||
pinfo->hop_count = mpath->hop_count;
|
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,
|
static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
|
||||||
|
@ -94,6 +94,7 @@ enum mesh_deferred_task_flags {
|
|||||||
* @last_preq_to_root: Timestamp of last PREQ sent to root
|
* @last_preq_to_root: Timestamp of last PREQ sent to root
|
||||||
* @is_root: the destination station of this path is a root node
|
* @is_root: the destination station of this path is a root node
|
||||||
* @is_gate: the destination station of this path is a mesh gate
|
* @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
|
* 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;
|
unsigned long last_preq_to_root;
|
||||||
bool is_root;
|
bool is_root;
|
||||||
bool is_gate;
|
bool is_gate;
|
||||||
|
u32 path_change_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -479,6 +479,8 @@ static u32 hwmp_route_info_get(struct ieee80211_sub_if_data *sdata,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fresh_info) {
|
if (fresh_info) {
|
||||||
|
if (rcu_access_pointer(mpath->next_hop) != sta)
|
||||||
|
mpath->path_change_count++;
|
||||||
mesh_path_assign_nexthop(mpath, sta);
|
mesh_path_assign_nexthop(mpath, sta);
|
||||||
mpath->flags |= MESH_PATH_SN_VALID;
|
mpath->flags |= MESH_PATH_SN_VALID;
|
||||||
mpath->metric = new_metric;
|
mpath->metric = new_metric;
|
||||||
@ -523,6 +525,8 @@ static u32 hwmp_route_info_get(struct ieee80211_sub_if_data *sdata,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fresh_info) {
|
if (fresh_info) {
|
||||||
|
if (rcu_access_pointer(mpath->next_hop) != sta)
|
||||||
|
mpath->path_change_count++;
|
||||||
mesh_path_assign_nexthop(mpath, sta);
|
mesh_path_assign_nexthop(mpath, sta);
|
||||||
mpath->metric = last_hop_metric;
|
mpath->metric = last_hop_metric;
|
||||||
mpath->exp_time = time_after(mpath->exp_time, exp_time)
|
mpath->exp_time = time_after(mpath->exp_time, exp_time)
|
||||||
|
@ -5830,7 +5830,10 @@ static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq,
|
|||||||
pinfo->discovery_retries)) ||
|
pinfo->discovery_retries)) ||
|
||||||
((pinfo->filled & MPATH_INFO_HOP_COUNT) &&
|
((pinfo->filled & MPATH_INFO_HOP_COUNT) &&
|
||||||
nla_put_u8(msg, NL80211_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;
|
goto nla_put_failure;
|
||||||
|
|
||||||
nla_nest_end(msg, pinfoattr);
|
nla_nest_end(msg, pinfoattr);
|
||||||
|
Loading…
Reference in New Issue
Block a user