mac80211: Fixed a bug: STA disconnects frequently
Georgi Valkov
gvalkov at abv.bg
Mon Sep 21 04:45:56 EDT 2020
Hi Felix!
Please revise your patch:
package/kernel/mac80211/patches/subsys/321-mac80211-optimize-station-connection-monitor.patch
net/mac80211/mlme.c
Function ieee80211_sta_tx_notify should check and reset sdata->u.mgd.probe_send_count = 0, when ack is true, before calling ieee80211_queue_work.
Otherwise the counter accumulates over time and the STA will eventually disconnect periodically.
Test conditions:
STA (WDS): TL-WR1043ND v4 - fixing the STA firmware resolves the issue
AP (WDS): WRT3200ACM - AP is not affected
PC wired to AP: ping -t sta-ip-address - indicate lost packets
Log:
[ 1516.144323] br-lan: port 3(wifi) entered disabled state
[ 1516.149836] br-lan: topology change detected, propagating
[ 1517.097423] wifi: authenticate with 60:38:e0:xx:xx:xx
[ 1517.116774] wifi: send auth to 60:38:e0:xx:xx:xx (try 1/3)
[ 1517.159748] wifi: authenticated
[ 1517.167704] wifi: associate with 60:38:e0:xx:xx:xx (try 1/3)
[ 1517.191637] wifi: RX AssocResp from 60:38:e0:xx:xx:xx (capab=0x431 status=0 aid=1)
[ 1517.199819] wifi: associated
[ 1517.213115] br-lan: port 3(wifi) entered blocking state
[ 1517.218579] br-lan: port 3(wifi) entered listening state
[ 1519.121477] br-lan: port 3(wifi) entered disabled state
[ 1519.126978] br-lan: topology change detected, propagating
[ 1520.075548] wifi: authenticate with 60:38:e0:xx:xx:xx
[ 1520.094883] wifi: send auth to 60:38:e0:xx:xx:xx (try 1/3)
[ 1520.128702] wifi: authenticated
[ 1520.133053] wifi: associate with 60:38:e0:xx:xx:xx (try 1/3)
[ 1520.157807] wifi: RX AssocResp from 60:38:e0:xx:xx:xx (capab=0x431 status=0 aid=1)
[ 1520.165962] wifi: associated
[ 1520.176668] br-lan: port 3(wifi) entered blocking state
[ 1520.182136] br-lan: port 3(wifi) entered listening state
[ 1522.217602] br-lan: port 3(wifi) entered learning state
Pull request with fix:
https://github.com/openwrt/openwrt/pull/3443
Please grant me write access to OpenWRT, so I can contribute other important fixes in the future, such as:
https://github.com/openwrt/openwrt/pull/3391
From 174bc62cf9157e06f6625ca68bb562c8c0a9ad32 Mon Sep 17 00:00:00 2001
From: Georgi Valkov <gvalkov at abv.bg>
Date: Sun, 20 Sep 2020 18:55:56 +0300
Subject: [PATCH] mac80211: Fixed a bug: STA disconnects frequently, because
probe_send_count was not reset when ACK is received. Introduced in
317-mac80211-optimize-station-connection-monitor.patch
Signed-off-by: Georgi Valkov <gvalkov at abv.bg>
---
...-optimize-station-connection-monitor.patch | 31 +++++++++----------
1 file changed, 14 insertions(+), 17 deletions(-)
diff --git a/package/kernel/mac80211/patches/subsys/321-mac80211-optimize-station-connection-monitor.patch b/package/kernel/mac80211/patches/subsys/321-mac80211-optimize-station-connection-monitor.patch
index ed9efb2b0d..bbf5ed0d35 100644
--- a/package/kernel/mac80211/patches/subsys/321-mac80211-optimize-station-connection-monitor.patch
+++ b/package/kernel/mac80211/patches/subsys/321-mac80211-optimize-station-connection-monitor.patch
@@ -46,34 +46,31 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
{
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
-@@ -2521,21 +2504,13 @@ void ieee80211_sta_tx_notify(struct ieee
+@@ -2521,13 +2504,10 @@ void ieee80211_sta_tx_notify(struct ieee
{
ieee80211_sta_tx_wmm_ac_notify(sdata, hdr, tx_time);
- if (!ieee80211_is_data(hdr->frame_control))
- return;
-
-- if (ieee80211_is_any_nullfunc(hdr->frame_control) &&
-- sdata->u.mgd.probe_send_count > 0) {
-- if (ack)
+ if (ieee80211_is_any_nullfunc(hdr->frame_control) &&
+ sdata->u.mgd.probe_send_count > 0) {
+ if (ack)
- ieee80211_sta_reset_conn_monitor(sdata);
-- else
-- sdata->u.mgd.nullfunc_failed = true;
-- ieee80211_queue_work(&sdata->local->hw, &sdata->work);
-+ if (!ieee80211_is_any_nullfunc(hdr->frame_control) ||
-+ !sdata->u.mgd.probe_send_count)
- return;
-- }
++ sdata->u.mgd.probe_send_count = 0;
+ else
+ sdata->u.mgd.nullfunc_failed = true;
+ ieee80211_queue_work(&sdata->local->hw, &sdata->work);
+@@ -2535,7 +2515,7 @@ void ieee80211_sta_tx_notify(struct ieee
+ }
-- if (ack)
+ if (ack)
- ieee80211_sta_reset_conn_monitor(sdata);
-+ if (!ack)
-+ sdata->u.mgd.nullfunc_failed = true;
-+ ieee80211_queue_work(&sdata->local->hw, &sdata->work);
++ sdata->u.mgd.probe_send_count = 0;
}
static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata,
-@@ -3600,8 +3575,8 @@ static bool ieee80211_assoc_success(stru
+@@ -3600,8 +3580,8 @@ static bool ieee80211_assoc_success(stru
* Start timer to probe the connection to the AP now.
* Also start the timer that will detect beacon loss.
*/
@@ -83,7 +80,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
ret = true;
out:
-@@ -4569,10 +4544,26 @@ static void ieee80211_sta_conn_mon_timer
+@@ -4569,10 +4549,26 @@ static void ieee80211_sta_conn_mon_timer
from_timer(sdata, t, u.mgd.conn_mon_timer);
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
struct ieee80211_local *local = sdata->local;
--
2.24.3 (Apple Git-128)
More information about the openwrt-devel
mailing list