Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mac80211: average ack rssi support for data frames

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>

authored by

Balaji Pothunoori and committed by
Johannes Berg
cc60dbbf 81d5439d

+14
+10
net/mac80211/sta_info.c
··· 358 358 359 359 sta->last_connected = ktime_get_seconds(); 360 360 ewma_signal_init(&sta->rx_stats_avg.signal); 361 + ewma_avg_signal_init(&sta->status_stats.avg_ack_signal); 361 362 for (i = 0; i < ARRAY_SIZE(sta->rx_stats_avg.chain_signal); i++) 362 363 ewma_signal_init(&sta->rx_stats_avg.chain_signal[i]); 363 364 ··· 2294 2293 sta->status_stats.ack_signal_filled) { 2295 2294 sinfo->ack_signal = sta->status_stats.last_ack_signal; 2296 2295 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL); 2296 + } 2297 + 2298 + if (ieee80211_hw_check(&sta->local->hw, REPORTS_TX_ACK_STATUS) && 2299 + !(sinfo->filled & BIT_ULL(NL80211_STA_INFO_DATA_ACK_SIGNAL_AVG))) { 2300 + sinfo->avg_ack_signal = 2301 + -(s8)ewma_avg_signal_read( 2302 + &sta->status_stats.avg_ack_signal); 2303 + sinfo->filled |= 2304 + BIT_ULL(NL80211_STA_INFO_DATA_ACK_SIGNAL_AVG); 2297 2305 } 2298 2306 } 2299 2307
+2
net/mac80211/sta_info.h
··· 119 119 #define HT_AGG_STATE_START_CB 6 120 120 #define HT_AGG_STATE_STOP_CB 7 121 121 122 + DECLARE_EWMA(avg_signal, 10, 8) 122 123 enum ieee80211_agg_stop_reason { 123 124 AGG_STOP_DECLINED, 124 125 AGG_STOP_LOCAL_REQUEST, ··· 551 550 unsigned long last_ack; 552 551 s8 last_ack_signal; 553 552 bool ack_signal_filled; 553 + struct ewma_avg_signal avg_ack_signal; 554 554 } status_stats; 555 555 556 556 /* Updated from TX path only, no locking requirements */
+2
net/mac80211/status.c
··· 195 195 sta->status_stats.last_ack_signal = 196 196 (s8)txinfo->status.ack_signal; 197 197 sta->status_stats.ack_signal_filled = true; 198 + ewma_avg_signal_add(&sta->status_stats.avg_ack_signal, 199 + -txinfo->status.ack_signal); 198 200 } 199 201 } 200 202