@@ -31,6 +31,7 @@ struct bgscan_simple_data {
int max_short_scans; /* maximum times we short-scan before back-off */
int short_interval; /* use if signal < threshold */
int long_interval; /* use if signal > threshold */
+ bool use_incremental_scan;
struct os_reltime last_bgscan;
};
@@ -106,8 +107,11 @@ static void bgscan_simple_timeout(void
*eloop_ctx, void *timeout_ctx)
bgscan_simple_timeout, data, NULL);
} else {
scan_ok:
- if (data->scan_interval == data->short_interval) {
+ if (data->scan_interval == data->short_interval ||
+ data->scan_interval < data->long_interval) {
data->short_scan_count++;
+ if (data->use_incremental_scan && data->short_scan_count > 1)
+ data->scan_interval = data->short_interval *
data->short_scan_count;
if (data->short_scan_count >= data->max_short_scans) {
data->scan_interval = data->long_interval;
wpa_printf(MSG_DEBUG, "bgscan simple: Backing "
@@ -133,6 +137,7 @@ static int bgscan_simple_get_params(struct
bgscan_simple_data *data,
const char *pos;
data->use_btm_query = 0;
+ data->use_incremental_scan = 0;
data->short_interval = atoi(params);
@@ -151,8 +156,22 @@ static int bgscan_simple_get_params(struct
bgscan_simple_data *data,
data->long_interval = atoi(pos);
pos = os_strchr(pos, ':');
if (pos) {
+ const char *pos_tmp;
pos++;
- data->use_btm_query = atoi(pos);
+ pos_tmp = pos;
+ pos = os_strchr(pos, 'i');
+
+ if (pos)
+ data->use_incremental_scan = 1;
+ if (!pos || pos_tmp != pos) {
+ data->use_btm_query = atoi(pos_tmp);
+ } else {
+ pos = os_strchr(pos_tmp, ':');
+ if (pos) {
+ pos++;
+ data->use_btm_query = atoi(pos);
+ }
+ }
}
return 0;
b/wpa_supplicant/wpa_supplicant.conf
@@ -1066,10 +1066,14 @@ fast_reauth=1
# Following bgscan modules are available:
# simple - Periodic background scans based on signal strength
# send_btm_query > 0 means do this many BTM queries before attempting a scan.
+# incremental_short_scan - i means do incremental short scan if no valid AP is
+# found when RSSI falls below threshold.
# bgscan="simple:<short bgscan interval in seconds>:<signal strength
threshold>:
-# <long interval>[:<send_btm_query>]"
+# <long interval>[:<send_btm_query>][:<incremental_short_scan>]"
# bgscan="simple:30:-45:300"
# bgscan="simple:30:-45:300:3"
+# bgscan="simple:30:-45:300:i"
+# bgscan="simple:30:-45:300:3:i"
# learn - Learn channels used by the network and try to avoid bgscans on other
# channels (experimental)