Commit a85e1d55 authored by Paul Stewart's avatar Paul Stewart Committed by John W. Linville

cfg80211: Return beacon loss count in station

If station info contains a beacon loss count, return
it to userspace.
Signed-off-by: default avatarPaul Stewart <pstew@chromium.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 84381b4e
...@@ -1655,6 +1655,7 @@ enum nl80211_sta_bss_param { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 { ...@@ -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 { ...@@ -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, ...@@ -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)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment