mac80211: support beacon statistics
authorJohannes Berg <johannes.berg@intel.com>
Wed, 21 Jan 2015 20:09:02 +0000 (21:09 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 23 Jan 2015 14:51:38 +0000 (15:51 +0100)
For drivers without beacon filtering, support beacon statistics
entirely, i.e. report the number of beacons and average signal.

For drivers with beacon filtering, give them the number of beacons
received by mac80211 -- in case the device reports only the number
of filtered beacons then driver doesn't have to count all beacons
again as mac80211 already does.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/sta_info.c

index 79383ef0c26405eeff3dff62e48ffe364ff16646..00ca8dcc2bcf2d924fb24ed0d4ee674295086aff 100644 (file)
@@ -1764,6 +1764,13 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
 
        sinfo->generation = sdata->local->sta_generation;
 
+       /* do before driver, so beacon filtering drivers have a
+        * chance to e.g. just add the number of filtered beacons
+        * (or just modify the value entirely, of course)
+        */
+       if (sdata->vif.type == NL80211_IFTYPE_STATION)
+               sinfo->rx_beacon = sdata->u.mgd.count_beacon_signal;
+
        drv_sta_statistics(local, sdata, &sta->sta, sinfo);
 
        sinfo->filled |= BIT(NL80211_STA_INFO_INACTIVE_TIME) |
@@ -1816,6 +1823,13 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
        sinfo->rx_dropped_misc = sta->rx_dropped;
        sinfo->beacon_loss_count = sta->beacon_loss_count;
 
+       if (sdata->vif.type == NL80211_IFTYPE_STATION &&
+           !(sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER)) {
+               sinfo->filled |= BIT(NL80211_STA_INFO_BEACON_RX) |
+                                BIT(NL80211_STA_INFO_BEACON_SIGNAL_AVG);
+               sinfo->rx_beacon_signal_avg = ieee80211_ave_rssi(&sdata->vif);
+       }
+
        if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
            (sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) {
                if (!(sinfo->filled & BIT(NL80211_STA_INFO_SIGNAL))) {