{nl,mac}80211: report gate connectivity in station info
Capture the current state of gate connectivity from the mesh formation field in mesh config whenever we receive a beacon, and report that via GET_STATION. This allows applications doing mesh peering in userspace to make peering decisions based on peers' current upstream connectivity. Signed-off-by: Bob Copeland <bobcopeland@fb.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
4a6ecd35f9
commit
dbdaee7aa6
|
@ -812,6 +812,8 @@ enum mesh_config_capab_flags {
|
||||||
IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL = 0x40,
|
IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL = 0x40,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define IEEE80211_MESHCONF_FORM_CONNECTED_TO_GATE 0x1
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mesh channel switch parameters element's flag indicator
|
* mesh channel switch parameters element's flag indicator
|
||||||
*
|
*
|
||||||
|
|
|
@ -1296,6 +1296,7 @@ struct cfg80211_tid_stats {
|
||||||
* @rx_beacon: number of beacons received from this peer
|
* @rx_beacon: number of beacons received from this peer
|
||||||
* @rx_beacon_signal_avg: signal strength average (in dBm) for beacons received
|
* @rx_beacon_signal_avg: signal strength average (in dBm) for beacons received
|
||||||
* from this peer
|
* from this peer
|
||||||
|
* @connected_to_gate: true if mesh STA has a path to mesh gate
|
||||||
* @rx_duration: aggregate PPDU duration(usecs) for all the frames from a peer
|
* @rx_duration: aggregate PPDU duration(usecs) for all the frames from a peer
|
||||||
* @pertid: per-TID statistics, see &struct cfg80211_tid_stats, using the last
|
* @pertid: per-TID statistics, see &struct cfg80211_tid_stats, using the last
|
||||||
* (IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs.
|
* (IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs.
|
||||||
|
@ -1350,6 +1351,8 @@ struct station_info {
|
||||||
u64 rx_beacon;
|
u64 rx_beacon;
|
||||||
u64 rx_duration;
|
u64 rx_duration;
|
||||||
u8 rx_beacon_signal_avg;
|
u8 rx_beacon_signal_avg;
|
||||||
|
u8 connected_to_gate;
|
||||||
|
|
||||||
struct cfg80211_tid_stats *pertid;
|
struct cfg80211_tid_stats *pertid;
|
||||||
s8 ack_signal;
|
s8 ack_signal;
|
||||||
s8 avg_ack_signal;
|
s8 avg_ack_signal;
|
||||||
|
|
|
@ -3116,6 +3116,8 @@ enum nl80211_sta_bss_param {
|
||||||
* with an FCS error (u32, from this station). This count may not include
|
* with an FCS error (u32, from this station). This count may not include
|
||||||
* some packets with an FCS error due to TA corruption. Hence this counter
|
* some packets with an FCS error due to TA corruption. Hence this counter
|
||||||
* might not be fully accurate.
|
* might not be fully accurate.
|
||||||
|
* @NL80211_STA_INFO_CONNECTED_TO_GATE: set to true if STA has a path to a
|
||||||
|
* mesh gate
|
||||||
* @__NL80211_STA_INFO_AFTER_LAST: internal
|
* @__NL80211_STA_INFO_AFTER_LAST: internal
|
||||||
* @NL80211_STA_INFO_MAX: highest possible station info attribute
|
* @NL80211_STA_INFO_MAX: highest possible station info attribute
|
||||||
*/
|
*/
|
||||||
|
@ -3158,6 +3160,7 @@ enum nl80211_sta_info {
|
||||||
NL80211_STA_INFO_ACK_SIGNAL_AVG,
|
NL80211_STA_INFO_ACK_SIGNAL_AVG,
|
||||||
NL80211_STA_INFO_RX_MPDUS,
|
NL80211_STA_INFO_RX_MPDUS,
|
||||||
NL80211_STA_INFO_FCS_ERROR_COUNT,
|
NL80211_STA_INFO_FCS_ERROR_COUNT,
|
||||||
|
NL80211_STA_INFO_CONNECTED_TO_GATE,
|
||||||
|
|
||||||
/* keep last */
|
/* keep last */
|
||||||
__NL80211_STA_INFO_AFTER_LAST,
|
__NL80211_STA_INFO_AFTER_LAST,
|
||||||
|
|
|
@ -590,6 +590,9 @@ void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata,
|
||||||
if (!sta)
|
if (!sta)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
sta->mesh->connected_to_gate = elems->mesh_config->meshconf_form &
|
||||||
|
IEEE80211_MESHCONF_FORM_CONNECTED_TO_GATE;
|
||||||
|
|
||||||
if (mesh_peer_accepts_plinks(elems) &&
|
if (mesh_peer_accepts_plinks(elems) &&
|
||||||
sta->mesh->plink_state == NL80211_PLINK_LISTEN &&
|
sta->mesh->plink_state == NL80211_PLINK_LISTEN &&
|
||||||
sdata->u.mesh.accepting_plinks &&
|
sdata->u.mesh.accepting_plinks &&
|
||||||
|
|
|
@ -2264,7 +2264,8 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
|
||||||
BIT_ULL(NL80211_STA_INFO_PLINK_STATE) |
|
BIT_ULL(NL80211_STA_INFO_PLINK_STATE) |
|
||||||
BIT_ULL(NL80211_STA_INFO_LOCAL_PM) |
|
BIT_ULL(NL80211_STA_INFO_LOCAL_PM) |
|
||||||
BIT_ULL(NL80211_STA_INFO_PEER_PM) |
|
BIT_ULL(NL80211_STA_INFO_PEER_PM) |
|
||||||
BIT_ULL(NL80211_STA_INFO_NONPEER_PM);
|
BIT_ULL(NL80211_STA_INFO_NONPEER_PM) |
|
||||||
|
BIT_ULL(NL80211_STA_INFO_CONNECTED_TO_GATE);
|
||||||
|
|
||||||
sinfo->llid = sta->mesh->llid;
|
sinfo->llid = sta->mesh->llid;
|
||||||
sinfo->plid = sta->mesh->plid;
|
sinfo->plid = sta->mesh->plid;
|
||||||
|
@ -2276,6 +2277,7 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
|
||||||
sinfo->local_pm = sta->mesh->local_pm;
|
sinfo->local_pm = sta->mesh->local_pm;
|
||||||
sinfo->peer_pm = sta->mesh->peer_pm;
|
sinfo->peer_pm = sta->mesh->peer_pm;
|
||||||
sinfo->nonpeer_pm = sta->mesh->nonpeer_pm;
|
sinfo->nonpeer_pm = sta->mesh->nonpeer_pm;
|
||||||
|
sinfo->connected_to_gate = sta->mesh->connected_to_gate;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -364,6 +364,7 @@ DECLARE_EWMA(mesh_fail_avg, 20, 8)
|
||||||
* @nonpeer_pm: STA power save mode towards non-peer neighbors
|
* @nonpeer_pm: STA power save mode towards non-peer neighbors
|
||||||
* @processed_beacon: set to true after peer rates and capabilities are
|
* @processed_beacon: set to true after peer rates and capabilities are
|
||||||
* processed
|
* processed
|
||||||
|
* @connected_to_gate: true if mesh STA has a path to a mesh gate
|
||||||
* @fail_avg: moving percentage of failed MSDUs
|
* @fail_avg: moving percentage of failed MSDUs
|
||||||
*/
|
*/
|
||||||
struct mesh_sta {
|
struct mesh_sta {
|
||||||
|
@ -381,6 +382,7 @@ struct mesh_sta {
|
||||||
u8 plink_retries;
|
u8 plink_retries;
|
||||||
|
|
||||||
bool processed_beacon;
|
bool processed_beacon;
|
||||||
|
bool connected_to_gate;
|
||||||
|
|
||||||
enum nl80211_plink_state plink_state;
|
enum nl80211_plink_state plink_state;
|
||||||
u32 plink_timeout;
|
u32 plink_timeout;
|
||||||
|
|
|
@ -4883,6 +4883,7 @@ static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
|
||||||
PUT_SINFO(LOCAL_PM, local_pm, u32);
|
PUT_SINFO(LOCAL_PM, local_pm, u32);
|
||||||
PUT_SINFO(PEER_PM, peer_pm, u32);
|
PUT_SINFO(PEER_PM, peer_pm, u32);
|
||||||
PUT_SINFO(NONPEER_PM, nonpeer_pm, u32);
|
PUT_SINFO(NONPEER_PM, nonpeer_pm, u32);
|
||||||
|
PUT_SINFO(CONNECTED_TO_GATE, connected_to_gate, u8);
|
||||||
|
|
||||||
if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) {
|
if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) {
|
||||||
bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM);
|
bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM);
|
||||||
|
|
Loading…
Reference in New Issue