mac80211: update sta connection monitor regression fix

Reset the connection monitor on all acked frames

Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Felix Fietkau 2020-09-22 13:16:18 +02:00
parent 0cfdc7d446
commit 4bd7689d85

View File

@ -2,25 +2,37 @@ From: Felix Fietkau <nbd@nbd.name>
Date: Mon, 21 Sep 2020 17:43:06 +0200 Date: Mon, 21 Sep 2020 17:43:06 +0200
Subject: [PATCH] mac80211: fix regression in sta connection monitor Subject: [PATCH] mac80211: fix regression in sta connection monitor
When the nulldata frame was acked, the probe send count needs to be reset, When a frame was acked and probe frames were sent, the connection monitoring
otherwise it will keep increasing until the connection is considered dead, needs to be reset, otherwise it will keep probing until the connection is
even though it fine. considered dead, even though frames have been acked in the mean time.
Fixes: 9abf4e49830d ("mac80211: optimize station connection monitor") Fixes: 9abf4e49830d ("mac80211: optimize station connection monitor")
Reported-by: Georgi Valkov <gvalkov@abv.bg> Reported-by: Georgi Valkov <gvalkov@abv.bg>
Signed-off-by: Felix Fietkau <nbd@nbd.name> Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- ---
--- a/net/mac80211/mlme.c --- a/net/mac80211/status.c
+++ b/net/mac80211/mlme.c +++ b/net/mac80211/status.c
@@ -2508,7 +2508,9 @@ void ieee80211_sta_tx_notify(struct ieee @@ -1129,6 +1129,8 @@ void ieee80211_tx_status_ext(struct ieee
!sdata->u.mgd.probe_send_count) noack_success = !!(info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED);
return;
- if (!ack) if (pubsta) {
+ if (ack) + struct ieee80211_sub_if_data *sdata = sta->sdata;
+ sdata->u.mgd.probe_send_count = 0; +
+ else if (!acked && !noack_success)
sdata->u.mgd.nullfunc_failed = true; sta->status_stats.retry_failed++;
ieee80211_queue_work(&sdata->local->hw, &sdata->work); sta->status_stats.retry_count += retry_count;
} @@ -1143,6 +1145,13 @@ void ieee80211_tx_status_ext(struct ieee
/* Track when last packet was ACKed */
sta->status_stats.last_pkt_time = jiffies;
+ /* Reset connection monitor */
+ if (sdata->vif.type == NL80211_IFTYPE_STATION &&
+ unlikely(sdata->u.mgd.probe_send_count > 0)) {
+ sdata->u.mgd.probe_send_count = 0;
+ ieee80211_queue_work(&local->hw, &sdata->work);
+ }
+
if (info->status.is_valid_ack_signal) {
sta->status_stats.last_ack_signal =
(s8)info->status.ack_signal;