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 <gval...@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 <gval...@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 <n...@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 <n...@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)



_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to