huge madwifi update (work in progress, disabled by default, compiles but breaks at...
[librecmc/librecmc.git] / package / madwifi / patches-r3776 / 321-bgscan_rssi_thresh.patch
1 Add an optional background scanning threshold triggered by low rssi
2 (useful for passing updated scan results to the supplicant ahead of
3 time, before losing connectivity entirely)
4
5 Signed-off-by: Felix Fietkau <nbd@openwrt.org>
6
7 Index: madwifi-trunk-r3776/net80211/ieee80211_ioctl.h
8 ===================================================================
9 --- madwifi-trunk-r3776.orig/net80211/ieee80211_ioctl.h 2008-07-17 03:07:53.000000000 +0200
10 +++ madwifi-trunk-r3776/net80211/ieee80211_ioctl.h      2008-07-17 04:03:30.000000000 +0200
11 @@ -655,6 +655,7 @@
12         IEEE80211_PARAM_MINRATE                 = 84,   /* Minimum rate (by table index) */
13         IEEE80211_PARAM_PROTMODE_RSSI           = 85,   /* RSSI Threshold for enabling protection mode */
14         IEEE80211_PARAM_PROTMODE_TIMEOUT        = 86,   /* Timeout for expiring protection mode */
15 +       IEEE80211_PARAM_BGSCAN_THRESH           = 87,   /* bg scan rssi threshold */
16  };
17  
18  #define        SIOCG80211STATS                 (SIOCDEVPRIVATE+2)
19 Index: madwifi-trunk-r3776/net80211/ieee80211_var.h
20 ===================================================================
21 --- madwifi-trunk-r3776.orig/net80211/ieee80211_var.h   2008-07-17 02:56:18.000000000 +0200
22 +++ madwifi-trunk-r3776/net80211/ieee80211_var.h        2008-07-17 04:03:07.000000000 +0200
23 @@ -92,6 +92,8 @@
24  #define        IEEE80211_BGSCAN_IDLE_MIN       100     /* min idle time (ms) */
25  #define        IEEE80211_BGSCAN_IDLE_DEFAULT   250     /* default idle time (ms) */
26  
27 +#define IEEE80211_BGSCAN_TRIGGER_INTVL 20 /* min trigger interval for thresh based bgscan (secs) */
28 +
29  #define IEEE80211_COVERAGE_CLASS_MAX   31      /* max coverage class */
30  #define IEEE80211_REGCLASSIDS_MAX      10      /* max regclass id list */
31  
32 @@ -229,6 +231,9 @@
33         u_int8_t iv_nickname[IEEE80211_NWID_LEN];
34         u_int iv_bgscanidle;                            /* bg scan idle threshold */
35         u_int iv_bgscanintvl;                           /* bg scan min interval */
36 +       u_int iv_bgscanthr;                                     /* bg scan rssi threshold */
37 +       u_int iv_bgscantrintvl;                         /* bg scan trigger interval */
38 +       unsigned long iv_bgscanthr_next;                /* last trigger for bgscan */
39         u_int iv_scanvalid;                             /* scan cache valid threshold */
40         struct ieee80211_roam iv_roam;                  /* sta-mode roaming state */
41  
42 @@ -612,6 +617,7 @@
43  #define IEEE80211_FEXT_SWBMISS         0x00000400      /* CONF: use software beacon timer */
44  #define IEEE80211_FEXT_DROPUNENC_EAPOL 0x00000800      /* CONF: drop unencrypted eapol frames */
45  #define IEEE80211_FEXT_APPIE_UPDATE    0x00001000      /* STATE: beacon APP IE updated */
46 +#define IEEE80211_FEXT_BGSCAN_THR      0x00002000      /* bgscan due to low rssi */
47  
48  #define IEEE80211_COM_UAPSD_ENABLE(_ic)                ((_ic)->ic_flags_ext |= IEEE80211_FEXT_UAPSD)
49  #define IEEE80211_COM_UAPSD_DISABLE(_ic)       ((_ic)->ic_flags_ext &= ~IEEE80211_FEXT_UAPSD)
50 Index: madwifi-trunk-r3776/net80211/ieee80211_wireless.c
51 ===================================================================
52 --- madwifi-trunk-r3776.orig/net80211/ieee80211_wireless.c      2008-07-17 03:08:16.000000000 +0200
53 +++ madwifi-trunk-r3776/net80211/ieee80211_wireless.c   2008-07-17 04:03:07.000000000 +0200
54 @@ -2778,6 +2778,9 @@
55                 else
56                         retv = EINVAL;
57                 break;
58 +       case IEEE80211_PARAM_BGSCAN_THRESH:
59 +               vap->iv_bgscanthr = value;
60 +               break;
61         case IEEE80211_PARAM_MCAST_RATE:
62                 /* units are in KILObits per second */
63                 if (value >= 256 && value <= 54000)
64 @@ -3181,6 +3184,9 @@
65         case IEEE80211_PARAM_BGSCAN_INTERVAL:
66                 param[0] = vap->iv_bgscanintvl / HZ;    /* seconds */
67                 break;
68 +       case IEEE80211_PARAM_BGSCAN_THRESH:
69 +               param[0] = vap->iv_bgscanthr;   /* rssi */
70 +               break;
71         case IEEE80211_PARAM_MCAST_RATE:
72                 param[0] = vap->iv_mcast_rate;  /* seconds */
73                 break;
74 @@ -5704,6 +5710,10 @@
75           IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "bgscanintvl" },
76         { IEEE80211_PARAM_BGSCAN_INTERVAL,
77           0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_bgscanintvl" },
78 +       { IEEE80211_PARAM_BGSCAN_THRESH,
79 +         IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "bgscanthr" },
80 +       { IEEE80211_PARAM_BGSCAN_THRESH,
81 +         0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_bgscanthr" },
82         { IEEE80211_PARAM_MCAST_RATE,
83           IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "mcast_rate" },
84         { IEEE80211_PARAM_MCAST_RATE,
85 Index: madwifi-trunk-r3776/net80211/ieee80211_input.c
86 ===================================================================
87 --- madwifi-trunk-r3776.orig/net80211/ieee80211_input.c 2008-07-17 02:56:18.000000000 +0200
88 +++ madwifi-trunk-r3776/net80211/ieee80211_input.c      2008-07-17 04:03:07.000000000 +0200
89 @@ -2984,8 +2984,10 @@
90  {
91         struct ieee80211com *ic = vap->iv_ic;
92  
93 +       vap->iv_bgscantrintvl = (vap->iv_bgscantrintvl + 1) % 4;
94         return ((ic->ic_flags_ext & IEEE80211_FEXT_BGSCAN) &&
95 -               time_after(jiffies, ic->ic_lastdata + vap->iv_bgscanidle));
96 +               (((ic->ic_flags_ext & IEEE80211_FEXT_BGSCAN_THR) && !vap->iv_bgscantrintvl) ||
97 +                       time_after(jiffies, ic->ic_lastdata + vap->iv_bgscanidle)));
98  }
99  
100  static __inline int
101 @@ -3229,6 +3231,23 @@
102                         /* record tsf of last beacon */
103                         memcpy(ni->ni_tstamp.data, scan.tstamp,
104                                 sizeof(ni->ni_tstamp));
105 +
106 +                       /* When rssi is low, start doing bgscans more frequently to allow
107 +                        * the supplicant to make a better switching decision */
108 +                       if ((rssi < vap->iv_bgscanthr) &&
109 +                                       (!vap->iv_bgscanthr_next ||
110 +                                               !time_before(jiffies, vap->iv_bgscanthr_next)) &&
111 +                                       !(ic->ic_flags & IEEE80211_F_SCAN)) {
112 +                               int ret;
113 +
114 +                               ic->ic_lastdata = 0;
115 +                               ic->ic_lastscan = 0;
116 +                               ic->ic_flags_ext |= IEEE80211_FEXT_BGSCAN_THR;
117 +                               ret = ieee80211_bg_scan(vap);
118 +                               if (ret)
119 +                                       vap->iv_bgscanthr_next = jiffies + msecs_to_jiffies(IEEE80211_BGSCAN_TRIGGER_INTVL * 1000);
120 +                       }
121 +
122                         if (ni->ni_intval != scan.bintval) {
123                                 IEEE80211_NOTE(vap, IEEE80211_MSG_ASSOC, ni,
124                                                 "beacon interval divergence: "
125 Index: madwifi-trunk-r3776/net80211/ieee80211_scan.c
126 ===================================================================
127 --- madwifi-trunk-r3776.orig/net80211/ieee80211_scan.c  2008-07-17 03:07:53.000000000 +0200
128 +++ madwifi-trunk-r3776/net80211/ieee80211_scan.c       2008-07-17 04:03:07.000000000 +0200
129 @@ -793,7 +793,7 @@
130                                 ieee80211_sta_pwrsave(vap, 0);
131                                 if (ss->ss_next >= ss->ss_last) {
132                                         ieee80211_notify_scan_done(vap);
133 -                                       ic->ic_flags_ext &= ~IEEE80211_FEXT_BGSCAN;
134 +                                       ic->ic_flags_ext &= ~(IEEE80211_FEXT_BGSCAN|IEEE80211_FEXT_BGSCAN_THR);
135                                 }
136                         }
137                         SCAN_PRIVATE(ss)->ss_iflags &= ~ISCAN_CANCEL;