forked from Minki/linux
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
|
||||
* @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_BEACON_LOSS: count of times beacon loss was detected (u32)
|
||||
* @__NL80211_STA_INFO_AFTER_LAST: internal
|
||||
* @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_CONNECTED_TIME,
|
||||
NL80211_STA_INFO_STA_FLAGS,
|
||||
NL80211_STA_INFO_BEACON_LOSS,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_STA_INFO_AFTER_LAST,
|
||||
|
@ -505,6 +505,7 @@ struct station_parameters {
|
||||
* @STATION_INFO_CONNECTED_TIME: @connected_time filled
|
||||
* @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled
|
||||
* @STATION_INFO_STA_FLAGS: @sta_flags filled
|
||||
* @STATION_INFO_BEACON_LOSS_COUNT: @beacon_loss_count filled
|
||||
*/
|
||||
enum station_info_flags {
|
||||
STATION_INFO_INACTIVE_TIME = 1<<0,
|
||||
@ -525,7 +526,8 @@ enum station_info_flags {
|
||||
STATION_INFO_BSS_PARAM = 1<<15,
|
||||
STATION_INFO_CONNECTED_TIME = 1<<16,
|
||||
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.
|
||||
* @assoc_req_ies_len: Length of assoc_req_ies buffer in octets.
|
||||
* @sta_flags: station flags mask & values
|
||||
* @beacon_loss_count: Number of times beacon loss event has triggered.
|
||||
*/
|
||||
struct station_info {
|
||||
u32 filled;
|
||||
@ -650,6 +653,8 @@ struct station_info {
|
||||
const u8 *assoc_req_ies;
|
||||
size_t assoc_req_ies_len;
|
||||
|
||||
u32 beacon_loss_count;
|
||||
|
||||
/*
|
||||
* Note: Add a new enum station_info_flags value for each new field and
|
||||
* 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_BSS_PARAM |
|
||||
STATION_INFO_CONNECTED_TIME |
|
||||
STATION_INFO_STA_FLAGS;
|
||||
STATION_INFO_STA_FLAGS |
|
||||
STATION_INFO_BEACON_LOSS_COUNT;
|
||||
|
||||
do_posix_clock_monotonic_gettime(&uptime);
|
||||
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_failed = sta->tx_retry_failed;
|
||||
sinfo->rx_dropped_misc = sta->rx_dropped;
|
||||
sinfo->beacon_loss_count = sta->beacon_loss_count;
|
||||
|
||||
if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
|
||||
(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 =
|
||||
container_of(work, struct ieee80211_sub_if_data,
|
||||
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)
|
||||
__ieee80211_connection_loss(sdata);
|
||||
|
@ -275,6 +275,7 @@ struct sta_ampdu_mlme {
|
||||
* EAP frames before association
|
||||
* @sta: station information we share with the driver
|
||||
* @sta_state: duplicates information about station state (for debug)
|
||||
* @beacon_loss_count: number of times beacon loss has triggered
|
||||
*/
|
||||
struct sta_info {
|
||||
/* General information, mostly static */
|
||||
@ -367,6 +368,7 @@ struct sta_info {
|
||||
#endif
|
||||
|
||||
unsigned int lost_packets;
|
||||
unsigned int beacon_loss_count;
|
||||
|
||||
/* should be right in front of sta to be in the same cache line */
|
||||
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)
|
||||
NLA_PUT_U32(msg, NL80211_STA_INFO_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) {
|
||||
bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM);
|
||||
if (!bss_param)
|
||||
|
Loading…
Reference in New Issue
Block a user