diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2008-07-12 22:24:45 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2008-07-12 22:24:45 +0000 |
commit | 75760cfbe94c67352d65f18fc2b307e5035b1f88 (patch) | |
tree | 79781c85f21d5cf4e0055ca8dbb9c93fd64903c9 | |
parent | a0c3d0fe7c58c4ba580deba4347758bd8ce25cb3 (diff) |
madwifi: add an optional threshold for low-rssi disconnection. This can be useful when letting wpa_supplicant control roaming.
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@11799 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r-- | package/madwifi/patches/362-rssithr.patch | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/package/madwifi/patches/362-rssithr.patch b/package/madwifi/patches/362-rssithr.patch new file mode 100644 index 000000000..137e64ad5 --- /dev/null +++ b/package/madwifi/patches/362-rssithr.patch @@ -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 */ |