X-Git-Url: http://git.rohieb.name/openwrt.git/blobdiff_plain/617671d795b62a2fe7f6a0e252adc3537d240035..31a40f97ef54e10e2b3dc3cacb9cff436657c586:/package/madwifi/patches/357-bgscan_thresh.patch diff --git a/package/madwifi/patches/357-bgscan_thresh.patch b/package/madwifi/patches/357-bgscan_thresh.patch index e0d5752b3..bf3483776 100644 --- a/package/madwifi/patches/357-bgscan_thresh.patch +++ b/package/madwifi/patches/357-bgscan_thresh.patch @@ -6,8 +6,8 @@ Signed-off-by: Felix Fietkau --- a/net80211/ieee80211_ioctl.h +++ b/net80211/ieee80211_ioctl.h -@@ -646,6 +646,7 @@ - IEEE80211_PARAM_MINRATE = 76, /* Maximum rate (by table index) */ +@@ -646,6 +646,7 @@ enum { + IEEE80211_PARAM_MINRATE = 76, /* Minimum rate (by table index) */ IEEE80211_PARAM_PROTMODE_RSSI = 77, /* RSSI Threshold for enabling protection mode */ IEEE80211_PARAM_PROTMODE_TIMEOUT = 78, /* Timeout for expiring protection mode */ + IEEE80211_PARAM_BGSCAN_THRESH = 79, /* bg scan rssi threshold */ @@ -25,17 +25,18 @@ Signed-off-by: Felix Fietkau #define IEEE80211_COVERAGE_CLASS_MAX 31 /* max coverage class */ #define IEEE80211_REGCLASSIDS_MAX 10 /* max regclass id list */ -@@ -219,6 +221,9 @@ +@@ -219,6 +221,10 @@ struct ieee80211vap { u_int8_t iv_nickname[IEEE80211_NWID_LEN]; u_int iv_bgscanidle; /* bg scan idle threshold */ u_int iv_bgscanintvl; /* bg scan min interval */ + u_int iv_bgscanthr; /* bg scan rssi threshold */ + u_int iv_bgscantrintvl; /* bg scan trigger interval */ + unsigned long iv_bgscanthr_next; /* last trigger for bgscan */ ++ unsigned long iv_lastconnect; /* time of last connect attempt */ u_int iv_scanvalid; /* scan cache valid threshold */ struct ieee80211_roam iv_roam; /* sta-mode roaming state */ -@@ -608,6 +613,7 @@ +@@ -608,6 +614,7 @@ MALLOC_DECLARE(M_80211_VAP); #define IEEE80211_FEXT_SWBMISS 0x00000400 /* CONF: use software beacon timer */ #define IEEE80211_FEXT_DROPUNENC_EAPOL 0x00000800 /* CONF: drop unencrypted eapol frames */ #define IEEE80211_FEXT_APPIE_UPDATE 0x00001000 /* STATE: beacon APP IE updated */ @@ -45,7 +46,7 @@ Signed-off-by: Felix Fietkau #define IEEE80211_COM_UAPSD_DISABLE(_ic) ((_ic)->ic_flags_ext &= ~IEEE80211_FEXT_UAPSD) --- a/net80211/ieee80211_wireless.c +++ b/net80211/ieee80211_wireless.c -@@ -2744,6 +2744,9 @@ +@@ -2744,6 +2744,9 @@ ieee80211_ioctl_setparam(struct net_devi else retv = EINVAL; break; @@ -55,7 +56,7 @@ Signed-off-by: Felix Fietkau case IEEE80211_PARAM_MCAST_RATE: /* units are in KILObits per second */ if (value >= 256 && value <= 54000) -@@ -3144,6 +3147,9 @@ +@@ -3144,6 +3147,9 @@ ieee80211_ioctl_getparam(struct net_devi case IEEE80211_PARAM_BGSCAN_INTERVAL: param[0] = vap->iv_bgscanintvl / HZ; /* seconds */ break; @@ -65,7 +66,7 @@ Signed-off-by: Felix Fietkau case IEEE80211_PARAM_MCAST_RATE: param[0] = vap->iv_mcast_rate; /* seconds */ break; -@@ -5666,6 +5672,10 @@ +@@ -5666,6 +5672,10 @@ static const struct iw_priv_args ieee802 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "bgscanintvl" }, { IEEE80211_PARAM_BGSCAN_INTERVAL, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_bgscanintvl" }, @@ -78,7 +79,7 @@ Signed-off-by: Felix Fietkau { IEEE80211_PARAM_MCAST_RATE, --- a/net80211/ieee80211_input.c +++ b/net80211/ieee80211_input.c -@@ -3013,8 +3013,10 @@ +@@ -3013,8 +3013,10 @@ contbgscan(struct ieee80211vap *vap) { struct ieee80211com *ic = vap->iv_ic; @@ -90,17 +91,19 @@ Signed-off-by: Felix Fietkau } static __inline int -@@ -3258,6 +3260,23 @@ +@@ -3258,6 +3260,25 @@ ieee80211_recv_mgmt(struct ieee80211vap /* record tsf of last beacon */ memcpy(ni->ni_tstamp.data, scan.tstamp, sizeof(ni->ni_tstamp)); + + /* When rssi is low, start doing bgscans more frequently to allow + * the supplicant to make a better switching decision */ -+ if ((rssi < vap->iv_bgscanthr) && ++ if (!(ic->ic_flags & IEEE80211_F_SCAN) && (rssi < vap->iv_bgscanthr) && + (!vap->iv_bgscanthr_next || + !time_before(jiffies, vap->iv_bgscanthr_next)) && -+ !(ic->ic_flags & IEEE80211_F_SCAN)) { ++ (vap->iv_state == IEEE80211_S_RUN) && ++ time_after(jiffies, vap->iv_lastconnect + ++ msecs_to_jiffies(IEEE80211_BGSCAN_INTVAL_MIN * 1000))) { + int ret; + + ic->ic_lastdata = 0; @@ -116,7 +119,15 @@ Signed-off-by: Felix Fietkau "beacon interval divergence: " --- a/net80211/ieee80211_scan.c +++ b/net80211/ieee80211_scan.c -@@ -782,7 +782,7 @@ +@@ -616,6 +616,7 @@ ieee80211_cancel_scan(struct ieee80211va + + /* clear bg scan NOPICK and mark cancel request */ + ss->ss_flags &= ~IEEE80211_SCAN_NOPICK; ++ ic->ic_flags_ext &= ~IEEE80211_FEXT_BGSCAN_THR; + SCAN_PRIVATE(ss)->ss_iflags |= ISCAN_CANCEL; + ss->ss_ops->scan_cancel(ss, vap); + /* force it to fire asap */ +@@ -782,7 +783,7 @@ again: ieee80211_sta_pwrsave(vap, 0); if (ss->ss_next >= ss->ss_last) { ieee80211_notify_scan_done(vap); @@ -125,3 +136,25 @@ Signed-off-by: Felix Fietkau } } SCAN_PRIVATE(ss)->ss_iflags &= ~ISCAN_CANCEL; +--- a/net80211/ieee80211_proto.c ++++ b/net80211/ieee80211_proto.c +@@ -1450,6 +1450,7 @@ __ieee80211_newstate(struct ieee80211vap + } + break; + case IEEE80211_S_AUTH: ++ vap->iv_lastconnect = jiffies; + /* auth frames are possible between IBSS nodes, + * see 802.11-1999, chapter 5.7.6 */ + KASSERT(vap->iv_opmode == IEEE80211_M_STA || +--- a/net80211/ieee80211_output.c ++++ b/net80211/ieee80211_output.c +@@ -238,7 +238,8 @@ ieee80211_hardstart(struct sk_buff *skb, + } + + /* Cancel any running BG scan */ +- ieee80211_cancel_scan(vap); ++ if (!(ic->ic_flags_ext & IEEE80211_FEXT_BGSCAN_THR) && (vap->iv_state == IEEE80211_S_RUN)) ++ ieee80211_cancel_scan(vap); + + /* + * Find the node for the destination so we can do