mac80211: average ack rssi support for data frames
authorBalaji Pothunoori <bpothuno@codeaurora.org>
Mon, 16 Apr 2018 14:48:41 +0000 (20:18 +0530)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 7 May 2018 19:41:16 +0000 (21:41 +0200)
The driver will process the RSSI if available and send it to mac80211.
mac80211 will compute the weighted average of ack RSSI for stations.

Signed-off-by: Balaji Pothunoori <bpothuno@codeaurora.org>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/sta_info.c
net/mac80211/sta_info.h
net/mac80211/status.c

index 2d5ffb0a16f66e7f736e56d9ae9d867cc2c8aa24..f83e6e2ad5abf4c403b8a07d319fb4d302b7d9d6 100644 (file)
@@ -358,6 +358,7 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
 
        sta->last_connected = ktime_get_seconds();
        ewma_signal_init(&sta->rx_stats_avg.signal);
+       ewma_avg_signal_init(&sta->status_stats.avg_ack_signal);
        for (i = 0; i < ARRAY_SIZE(sta->rx_stats_avg.chain_signal); i++)
                ewma_signal_init(&sta->rx_stats_avg.chain_signal[i]);
 
@@ -2294,6 +2295,15 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
                sinfo->ack_signal = sta->status_stats.last_ack_signal;
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL);
        }
+
+       if (ieee80211_hw_check(&sta->local->hw, REPORTS_TX_ACK_STATUS) &&
+           !(sinfo->filled & BIT_ULL(NL80211_STA_INFO_DATA_ACK_SIGNAL_AVG))) {
+               sinfo->avg_ack_signal =
+                       -(s8)ewma_avg_signal_read(
+                               &sta->status_stats.avg_ack_signal);
+               sinfo->filled |=
+                       BIT_ULL(NL80211_STA_INFO_DATA_ACK_SIGNAL_AVG);
+       }
 }
 
 u32 sta_get_expected_throughput(struct sta_info *sta)
index f64eb86ca64b03b24ec8f9dd145e795336dc3e2e..d79bd6eeb5496c8cf47793a87d76f2576745d559 100644 (file)
@@ -119,6 +119,7 @@ enum ieee80211_sta_info_flags {
 #define HT_AGG_STATE_START_CB          6
 #define HT_AGG_STATE_STOP_CB           7
 
+DECLARE_EWMA(avg_signal, 10, 8)
 enum ieee80211_agg_stop_reason {
        AGG_STOP_DECLINED,
        AGG_STOP_LOCAL_REQUEST,
@@ -550,6 +551,7 @@ struct sta_info {
                unsigned long last_ack;
                s8 last_ack_signal;
                bool ack_signal_filled;
+               struct ewma_avg_signal avg_ack_signal;
        } status_stats;
 
        /* Updated from TX path only, no locking requirements */
index 743e89c5926c4694ba31c212270b5ddb27b48789..9a6d7208bf4f809b8cb78856e688c19730ee097e 100644 (file)
@@ -195,6 +195,8 @@ static void ieee80211_frame_acked(struct sta_info *sta, struct sk_buff *skb)
                        sta->status_stats.last_ack_signal =
                                         (s8)txinfo->status.ack_signal;
                        sta->status_stats.ack_signal_filled = true;
+                       ewma_avg_signal_add(&sta->status_stats.avg_ack_signal,
+                                           -txinfo->status.ack_signal);
                }
        }