madwifi: add an optional threshold for low-rssi disconnection. This can be useful when letting wpa_supplicant control roaming.
SVN-Revision: 11799
This commit is contained in:
parent
09bcffddf1
commit
899a187d65
1 changed files with 91 additions and 0 deletions
91
package/madwifi/patches/362-rssithr.patch
Normal file
91
package/madwifi/patches/362-rssithr.patch
Normal file
|
@ -0,0 +1,91 @@
|
|||
Add an optional threshold for low-rssi disconnection. This can be useful
|
||||
when letting wpa_supplicant control roaming.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
|
||||
--- a/net80211/ieee80211_ioctl.h
|
||||
+++ b/net80211/ieee80211_ioctl.h
|
||||
@@ -647,6 +647,8 @@
|
||||
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 */
|
||||
+ IEEE80211_PARAM_RSSI_DIS_THR = 80, /* rssi threshold for disconnection */
|
||||
+ IEEE80211_PARAM_RSSI_DIS_COUNT = 81, /* counter for rssi threshold */
|
||||
};
|
||||
|
||||
#define SIOCG80211STATS (SIOCDEVPRIVATE+2)
|
||||
--- a/net80211/ieee80211_wireless.c
|
||||
+++ b/net80211/ieee80211_wireless.c
|
||||
@@ -2798,6 +2798,12 @@
|
||||
case IEEE80211_PARAM_ROAM_RATE_11G:
|
||||
vap->iv_roam.rate11b = value;
|
||||
break;
|
||||
+ case IEEE80211_PARAM_RSSI_DIS_THR:
|
||||
+ vap->iv_rssi_dis_thr = value;
|
||||
+ break;
|
||||
+ case IEEE80211_PARAM_RSSI_DIS_COUNT:
|
||||
+ vap->iv_rssi_dis_max = value;
|
||||
+ break;
|
||||
case IEEE80211_PARAM_UAPSDINFO:
|
||||
if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
|
||||
if (ic->ic_caps & IEEE80211_C_UAPSD) {
|
||||
@@ -3183,6 +3189,12 @@
|
||||
case IEEE80211_PARAM_ROAM_RATE_11G:
|
||||
param[0] = vap->iv_roam.rate11b;
|
||||
break;
|
||||
+ case IEEE80211_PARAM_RSSI_DIS_THR:
|
||||
+ param[0] = vap->iv_rssi_dis_thr;
|
||||
+ break;
|
||||
+ case IEEE80211_PARAM_RSSI_DIS_COUNT:
|
||||
+ param[0] = vap->iv_rssi_dis_max;
|
||||
+ break;
|
||||
case IEEE80211_PARAM_UAPSDINFO:
|
||||
if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
|
||||
if (IEEE80211_VAP_UAPSD_ENABLED(vap))
|
||||
@@ -5732,6 +5744,14 @@
|
||||
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rate11g" },
|
||||
{ IEEE80211_PARAM_ROAM_RATE_11G,
|
||||
0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_rate11g" },
|
||||
+ { IEEE80211_PARAM_RSSI_DIS_THR,
|
||||
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rssi_disthr" },
|
||||
+ { IEEE80211_PARAM_RSSI_DIS_THR,
|
||||
+ 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_rssi_disthr" },
|
||||
+ { IEEE80211_PARAM_RSSI_DIS_COUNT,
|
||||
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rssi_discnt" },
|
||||
+ { IEEE80211_PARAM_RSSI_DIS_COUNT,
|
||||
+ 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_rssi_discnt" },
|
||||
{ IEEE80211_PARAM_UAPSDINFO,
|
||||
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "uapsd" },
|
||||
{ IEEE80211_PARAM_UAPSDINFO,
|
||||
--- a/net80211/ieee80211_input.c
|
||||
+++ b/net80211/ieee80211_input.c
|
||||
@@ -3263,6 +3263,17 @@
|
||||
|
||||
/* When rssi is low, start doing bgscans more frequently to allow
|
||||
* the supplicant to make a better switching decision */
|
||||
+ if ((vap->iv_rssi_dis_thr > 0) && (vap->iv_rssi_dis_max > 0)) {
|
||||
+ if ((rssi > 0) && (rssi < vap->iv_rssi_dis_thr)) {
|
||||
+ if (++vap->iv_rssi_dis_trig > vap->iv_rssi_dis_max) {
|
||||
+ vap->iv_rssi_dis_trig = 0;
|
||||
+ ieee80211_node_leave(ni);
|
||||
+ return;
|
||||
+ }
|
||||
+ } else {
|
||||
+ vap->iv_rssi_dis_trig = 0;
|
||||
+ }
|
||||
+ }
|
||||
if ((rssi < vap->iv_bgscanthr) &&
|
||||
(!vap->iv_bgscanthr_next ||
|
||||
!time_before(jiffies, vap->iv_bgscanthr_next)) &&
|
||||
--- a/net80211/ieee80211_var.h
|
||||
+++ b/net80211/ieee80211_var.h
|
||||
@@ -223,6 +223,9 @@
|
||||
u_int iv_bgscanintvl; /* bg scan min interval */
|
||||
u_int iv_bgscanthr; /* bg scan rssi threshold */
|
||||
u_int iv_bgscantrintvl; /* bg scan trigger interval */
|
||||
+ u_int iv_rssi_dis_thr; /* rssi disassoc threshold */
|
||||
+ u_int iv_rssi_dis_max; /* max beacons below disconnect threshold */
|
||||
+ u_int iv_rssi_dis_trig; /* rssi disassoc trigger count */
|
||||
unsigned long iv_bgscanthr_next; /* last trigger for bgscan */
|
||||
u_int iv_scanvalid; /* scan cache valid threshold */
|
||||
struct ieee80211_roam iv_roam; /* sta-mode roaming state */
|
Loading…
Reference in a new issue