cfg80211: Return beacon loss count in station
If station info contains a beacon loss count, return it to userspace. Signed-off-by: Paul Stewart <pstew@chromium.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
84381b4ed5
commit
a85e1d5597
|
@ -1655,6 +1655,7 @@ enum nl80211_sta_bss_param {
|
||||||
* containing info as possible, see &enum nl80211_sta_bss_param
|
* containing info as possible, see &enum nl80211_sta_bss_param
|
||||||
* @NL80211_STA_INFO_CONNECTED_TIME: time since the station is last connected
|
* @NL80211_STA_INFO_CONNECTED_TIME: time since the station is last connected
|
||||||
* @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update.
|
* @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update.
|
||||||
|
* @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32)
|
||||||
* @__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
|
||||||
*/
|
*/
|
||||||
|
@ -1677,6 +1678,7 @@ enum nl80211_sta_info {
|
||||||
NL80211_STA_INFO_BSS_PARAM,
|
NL80211_STA_INFO_BSS_PARAM,
|
||||||
NL80211_STA_INFO_CONNECTED_TIME,
|
NL80211_STA_INFO_CONNECTED_TIME,
|
||||||
NL80211_STA_INFO_STA_FLAGS,
|
NL80211_STA_INFO_STA_FLAGS,
|
||||||
|
NL80211_STA_INFO_BEACON_LOSS,
|
||||||
|
|
||||||
/* keep last */
|
/* keep last */
|
||||||
__NL80211_STA_INFO_AFTER_LAST,
|
__NL80211_STA_INFO_AFTER_LAST,
|
||||||
|
|
|
@ -505,6 +505,7 @@ struct station_parameters {
|
||||||
* @STATION_INFO_CONNECTED_TIME: @connected_time filled
|
* @STATION_INFO_CONNECTED_TIME: @connected_time filled
|
||||||
* @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled
|
* @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled
|
||||||
* @STATION_INFO_STA_FLAGS: @sta_flags filled
|
* @STATION_INFO_STA_FLAGS: @sta_flags filled
|
||||||
|
* @STATION_INFO_BEACON_LOSS_COUNT: @beacon_loss_count filled
|
||||||
*/
|
*/
|
||||||
enum station_info_flags {
|
enum station_info_flags {
|
||||||
STATION_INFO_INACTIVE_TIME = 1<<0,
|
STATION_INFO_INACTIVE_TIME = 1<<0,
|
||||||
|
@ -525,7 +526,8 @@ enum station_info_flags {
|
||||||
STATION_INFO_BSS_PARAM = 1<<15,
|
STATION_INFO_BSS_PARAM = 1<<15,
|
||||||
STATION_INFO_CONNECTED_TIME = 1<<16,
|
STATION_INFO_CONNECTED_TIME = 1<<16,
|
||||||
STATION_INFO_ASSOC_REQ_IES = 1<<17,
|
STATION_INFO_ASSOC_REQ_IES = 1<<17,
|
||||||
STATION_INFO_STA_FLAGS = 1<<18
|
STATION_INFO_STA_FLAGS = 1<<18,
|
||||||
|
STATION_INFO_BEACON_LOSS_COUNT = 1<<19
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -623,6 +625,7 @@ struct sta_bss_parameters {
|
||||||
* the cfg80211_new_sta() calls to notify user space of the IEs.
|
* the cfg80211_new_sta() calls to notify user space of the IEs.
|
||||||
* @assoc_req_ies_len: Length of assoc_req_ies buffer in octets.
|
* @assoc_req_ies_len: Length of assoc_req_ies buffer in octets.
|
||||||
* @sta_flags: station flags mask & values
|
* @sta_flags: station flags mask & values
|
||||||
|
* @beacon_loss_count: Number of times beacon loss event has triggered.
|
||||||
*/
|
*/
|
||||||
struct station_info {
|
struct station_info {
|
||||||
u32 filled;
|
u32 filled;
|
||||||
|
@ -650,6 +653,8 @@ struct station_info {
|
||||||
const u8 *assoc_req_ies;
|
const u8 *assoc_req_ies;
|
||||||
size_t assoc_req_ies_len;
|
size_t assoc_req_ies_len;
|
||||||
|
|
||||||
|
u32 beacon_loss_count;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note: Add a new enum station_info_flags value for each new field and
|
* Note: Add a new enum station_info_flags value for each new field and
|
||||||
* use it to check which fields are initialized.
|
* use it to check which fields are initialized.
|
||||||
|
|
|
@ -355,7 +355,8 @@ static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
|
||||||
STATION_INFO_RX_DROP_MISC |
|
STATION_INFO_RX_DROP_MISC |
|
||||||
STATION_INFO_BSS_PARAM |
|
STATION_INFO_BSS_PARAM |
|
||||||
STATION_INFO_CONNECTED_TIME |
|
STATION_INFO_CONNECTED_TIME |
|
||||||
STATION_INFO_STA_FLAGS;
|
STATION_INFO_STA_FLAGS |
|
||||||
|
STATION_INFO_BEACON_LOSS_COUNT;
|
||||||
|
|
||||||
do_posix_clock_monotonic_gettime(&uptime);
|
do_posix_clock_monotonic_gettime(&uptime);
|
||||||
sinfo->connected_time = uptime.tv_sec - sta->last_connected;
|
sinfo->connected_time = uptime.tv_sec - sta->last_connected;
|
||||||
|
@ -368,6 +369,7 @@ static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
|
||||||
sinfo->tx_retries = sta->tx_retry_count;
|
sinfo->tx_retries = sta->tx_retry_count;
|
||||||
sinfo->tx_failed = sta->tx_retry_failed;
|
sinfo->tx_failed = sta->tx_retry_failed;
|
||||||
sinfo->rx_dropped_misc = sta->rx_dropped;
|
sinfo->rx_dropped_misc = sta->rx_dropped;
|
||||||
|
sinfo->beacon_loss_count = sta->beacon_loss_count;
|
||||||
|
|
||||||
if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
|
if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
|
||||||
(sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) {
|
(sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) {
|
||||||
|
|
|
@ -1381,6 +1381,14 @@ void ieee80211_beacon_connection_loss_work(struct work_struct *work)
|
||||||
struct ieee80211_sub_if_data *sdata =
|
struct ieee80211_sub_if_data *sdata =
|
||||||
container_of(work, struct ieee80211_sub_if_data,
|
container_of(work, struct ieee80211_sub_if_data,
|
||||||
u.mgd.beacon_connection_loss_work);
|
u.mgd.beacon_connection_loss_work);
|
||||||
|
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||||
|
struct sta_info *sta;
|
||||||
|
|
||||||
|
if (ifmgd->associated) {
|
||||||
|
sta = sta_info_get(sdata, ifmgd->bssid);
|
||||||
|
if (sta)
|
||||||
|
sta->beacon_loss_count++;
|
||||||
|
}
|
||||||
|
|
||||||
if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
|
if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
|
||||||
__ieee80211_connection_loss(sdata);
|
__ieee80211_connection_loss(sdata);
|
||||||
|
|
|
@ -275,6 +275,7 @@ struct sta_ampdu_mlme {
|
||||||
* EAP frames before association
|
* EAP frames before association
|
||||||
* @sta: station information we share with the driver
|
* @sta: station information we share with the driver
|
||||||
* @sta_state: duplicates information about station state (for debug)
|
* @sta_state: duplicates information about station state (for debug)
|
||||||
|
* @beacon_loss_count: number of times beacon loss has triggered
|
||||||
*/
|
*/
|
||||||
struct sta_info {
|
struct sta_info {
|
||||||
/* General information, mostly static */
|
/* General information, mostly static */
|
||||||
|
@ -367,6 +368,7 @@ struct sta_info {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned int lost_packets;
|
unsigned int lost_packets;
|
||||||
|
unsigned int beacon_loss_count;
|
||||||
|
|
||||||
/* should be right in front of sta to be in the same cache line */
|
/* should be right in front of sta to be in the same cache line */
|
||||||
bool dummy;
|
bool dummy;
|
||||||
|
|
|
@ -2390,6 +2390,9 @@ static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
|
||||||
if (sinfo->filled & STATION_INFO_TX_FAILED)
|
if (sinfo->filled & STATION_INFO_TX_FAILED)
|
||||||
NLA_PUT_U32(msg, NL80211_STA_INFO_TX_FAILED,
|
NLA_PUT_U32(msg, NL80211_STA_INFO_TX_FAILED,
|
||||||
sinfo->tx_failed);
|
sinfo->tx_failed);
|
||||||
|
if (sinfo->filled & STATION_INFO_BEACON_LOSS_COUNT)
|
||||||
|
NLA_PUT_U32(msg, NL80211_STA_INFO_BEACON_LOSS,
|
||||||
|
sinfo->beacon_loss_count);
|
||||||
if (sinfo->filled & STATION_INFO_BSS_PARAM) {
|
if (sinfo->filled & STATION_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);
|
||||||
if (!bss_param)
|
if (!bss_param)
|
||||||
|
|
Loading…
Reference in New Issue