huge madwifi update (work in progress, disabled by default, compiles but breaks at...
[openwrt.git] / package / madwifi / patches-r3776 / 327-rssi_disconnect.patch
1 Add an optional threshold for low-rssi disconnection. This can be useful
2 when letting wpa_supplicant control roaming.
3
4 Signed-off-by: Felix Fietkau <nbd@openwrt.org>
5
6 Index: madwifi-trunk-r3776/net80211/ieee80211_ioctl.h
7 ===================================================================
8 --- madwifi-trunk-r3776.orig/net80211/ieee80211_ioctl.h 2008-07-17 04:03:30.000000000 +0200
9 +++ madwifi-trunk-r3776/net80211/ieee80211_ioctl.h      2008-07-17 04:07:29.000000000 +0200
10 @@ -656,6 +656,8 @@
11         IEEE80211_PARAM_PROTMODE_RSSI           = 85,   /* RSSI Threshold for enabling protection mode */
12         IEEE80211_PARAM_PROTMODE_TIMEOUT        = 86,   /* Timeout for expiring protection mode */
13         IEEE80211_PARAM_BGSCAN_THRESH           = 87,   /* bg scan rssi threshold */
14 +       IEEE80211_PARAM_RSSI_DIS_THR    = 88,   /* rssi threshold for disconnection */
15 +       IEEE80211_PARAM_RSSI_DIS_COUNT  = 89,   /* counter for rssi threshold */
16  };
17  
18  #define        SIOCG80211STATS                 (SIOCDEVPRIVATE+2)
19 Index: madwifi-trunk-r3776/net80211/ieee80211_wireless.c
20 ===================================================================
21 --- madwifi-trunk-r3776.orig/net80211/ieee80211_wireless.c      2008-07-17 04:03:07.000000000 +0200
22 +++ madwifi-trunk-r3776/net80211/ieee80211_wireless.c   2008-07-17 04:07:56.000000000 +0200
23 @@ -2832,6 +2832,12 @@
24         case IEEE80211_PARAM_ROAM_RATE_11G:
25                 vap->iv_roam.rate11g = value;
26                 break;
27 +       case IEEE80211_PARAM_RSSI_DIS_THR:
28 +               vap->iv_rssi_dis_thr = value;
29 +               break;
30 +       case IEEE80211_PARAM_RSSI_DIS_COUNT:
31 +               vap->iv_rssi_dis_max = value;
32 +               break;
33         case IEEE80211_PARAM_UAPSDINFO:
34                 if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
35                         if (ic->ic_caps & IEEE80211_C_UAPSD) {
36 @@ -3220,6 +3226,12 @@
37         case IEEE80211_PARAM_ROAM_RATE_11G:
38                 param[0] = vap->iv_roam.rate11g;
39                 break;
40 +       case IEEE80211_PARAM_RSSI_DIS_THR:
41 +               param[0] = vap->iv_rssi_dis_thr;
42 +               break;
43 +       case IEEE80211_PARAM_RSSI_DIS_COUNT:
44 +               param[0] = vap->iv_rssi_dis_max;
45 +               break;
46         case IEEE80211_PARAM_UAPSDINFO:
47                 if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
48                         if (IEEE80211_VAP_UAPSD_ENABLED(vap))
49 @@ -5770,6 +5782,14 @@
50           IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rate11g_x2" },
51         { IEEE80211_PARAM_ROAM_RATE_11G,
52           0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_rate11g_x2" },
53 +       { IEEE80211_PARAM_RSSI_DIS_THR,
54 +         IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rssi_disthr" },
55 +       { IEEE80211_PARAM_RSSI_DIS_THR,
56 +         0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_rssi_disthr" },
57 +       { IEEE80211_PARAM_RSSI_DIS_COUNT,
58 +         IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rssi_discnt" },
59 +       { IEEE80211_PARAM_RSSI_DIS_COUNT,
60 +         0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_rssi_discnt" },
61         { IEEE80211_PARAM_UAPSDINFO,
62           IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "uapsd" },
63         { IEEE80211_PARAM_UAPSDINFO,
64 Index: madwifi-trunk-r3776/net80211/ieee80211_input.c
65 ===================================================================
66 --- madwifi-trunk-r3776.orig/net80211/ieee80211_input.c 2008-07-17 04:07:08.000000000 +0200
67 +++ madwifi-trunk-r3776/net80211/ieee80211_input.c      2008-07-17 04:09:03.000000000 +0200
68 @@ -3234,6 +3234,17 @@
69  
70                         /* When rssi is low, start doing bgscans more frequently to allow
71                          * the supplicant to make a better switching decision */
72 +                       if ((vap->iv_rssi_dis_thr > 0) && (vap->iv_rssi_dis_max > 0)) {
73 +                               if ((rssi > 0) && (rssi < vap->iv_rssi_dis_thr)) {
74 +                                       if (++vap->iv_rssi_dis_trig > vap->iv_rssi_dis_max) {
75 +                                               vap->iv_rssi_dis_trig = 0;
76 +                                               ieee80211_node_leave(ni);
77 +                                               return 0;
78 +                                       }
79 +                               } else {
80 +                                       vap->iv_rssi_dis_trig = 0;
81 +                               }
82 +                       }
83                         if ((rssi < vap->iv_bgscanthr) &&
84                                         (!vap->iv_bgscanthr_next ||
85                                                 !time_before(jiffies, vap->iv_bgscanthr_next)) &&
86 Index: madwifi-trunk-r3776/net80211/ieee80211_var.h
87 ===================================================================
88 --- madwifi-trunk-r3776.orig/net80211/ieee80211_var.h   2008-07-17 04:07:08.000000000 +0200
89 +++ madwifi-trunk-r3776/net80211/ieee80211_var.h        2008-07-17 04:07:10.000000000 +0200
90 @@ -233,6 +233,9 @@
91         u_int iv_bgscanintvl;                           /* bg scan min interval */
92         u_int iv_bgscanthr;                                     /* bg scan rssi threshold */
93         u_int iv_bgscantrintvl;                         /* bg scan trigger interval */
94 +       u_int iv_rssi_dis_thr;                          /* rssi disassoc threshold */
95 +       u_int iv_rssi_dis_max;                          /* max beacons below disconnect threshold */
96 +       u_int iv_rssi_dis_trig;                         /* rssi disassoc trigger count */
97         unsigned long iv_bgscanthr_next;                /* last trigger for bgscan */
98         u_int iv_scanvalid;                             /* scan cache valid threshold */
99         struct ieee80211_roam iv_roam;                  /* sta-mode roaming state */