Frequent background scans are known to cause packet loss with
some types of APs (e.g. old Apple APs and some Android phones).

There is already a heuristic to make bgscans less frequent if we
keep choosing the same AP. However, the current backoff interval 
keeps increasing in tiny steps of 500ms, so problems caused by
background scans remain noticable for some time after association
to a problematic AP.

This diff increases the hgscan backoff timer such that the interval
keeps doubling each time we choose the same AP again. I hope this will
help in situations where a single AP is used and frequent bgscans are
causing trouble.
 
diff e17574f85785da4fa4073c8b9a00d8d738f3298f 
c6d97512c3c477464b2407c31d85add72ed1df9f
blob - 313d7249f09646a2eeabc21e9e760c9debcdf790
blob + dde43eda321beaa949255c143b249339c39f027c
--- sys/net80211/ieee80211_node.c
+++ sys/net80211/ieee80211_node.c
@@ -1421,8 +1421,12 @@ ieee80211_end_scan(struct ifnet *ifp)
                 * and make background scans less frequent.
                 */
                if (selbs == curbs) {
-                       if (ic->ic_bgscan_fail < IEEE80211_BGSCAN_FAIL_MAX)
-                               ic->ic_bgscan_fail++;
+                       if (ic->ic_bgscan_fail < IEEE80211_BGSCAN_FAIL_MAX) {
+                               if (ic->ic_bgscan_fail <= 0)
+                                       ic->ic_bgscan_fail = 1;
+                               else
+                                       ic->ic_bgscan_fail *= 2;
+                       }
                        ic->ic_flags &= ~IEEE80211_F_BGSCAN;
                        return;
                }
blob - 0f2072288232ac276c2979b799b03c37e0ca8032
blob + b475001b14ddb11c5c1713d072358ef2b9e2736d
--- sys/net80211/ieee80211_var.h
+++ sys/net80211/ieee80211_var.h
@@ -62,7 +62,7 @@
 #define IEEE80211_RSSI_THRES_RATIO_2GHZ                60      /* in percent */
 #define IEEE80211_RSSI_THRES_RATIO_5GHZ                50      /* in percent */
 
-#define IEEE80211_BGSCAN_FAIL_MAX              360     /* units of 500 msec */
+#define IEEE80211_BGSCAN_FAIL_MAX              512     /* units of 500 msec */
 
 enum ieee80211_phytype {
        IEEE80211_T_DS,                 /* direct sequence spread spectrum */

Reply via email to