|
@@ -428,6 +428,15 @@ static void * bgscan_learn_init(struct wpa_supplicant *wpa_s,
|
|
|
data->scan_interval = data->short_interval;
|
|
|
eloop_register_timeout(data->scan_interval, 0, bgscan_learn_timeout,
|
|
|
data, NULL);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * This function is called immediately after an association, so it is
|
|
|
+ * reasonable to assume that a scan was completed recently. This makes
|
|
|
+ * us skip an immediate new scan in cases where the current signal
|
|
|
+ * level is below the bgscan threshold.
|
|
|
+ */
|
|
|
+ os_get_time(&data->last_bgscan);
|
|
|
+
|
|
|
return data;
|
|
|
}
|
|
|
|
|
@@ -550,6 +559,7 @@ static void bgscan_learn_notify_signal_change(void *priv, int above,
|
|
|
int current_signal)
|
|
|
{
|
|
|
struct bgscan_learn_data *data = priv;
|
|
|
+ struct os_time now;
|
|
|
|
|
|
if (data->short_interval == data->long_interval ||
|
|
|
data->signal_threshold == 0)
|
|
@@ -558,12 +568,12 @@ static void bgscan_learn_notify_signal_change(void *priv, int above,
|
|
|
wpa_printf(MSG_DEBUG, "bgscan learn: signal level changed "
|
|
|
"(above=%d current_signal=%d)", above, current_signal);
|
|
|
if (data->scan_interval == data->long_interval && !above) {
|
|
|
- wpa_printf(MSG_DEBUG, "bgscan learn: Trigger immediate scan "
|
|
|
- "and start using short bgscan interval");
|
|
|
+ wpa_printf(MSG_DEBUG, "bgscan learn: Start using short bgscan "
|
|
|
+ "interval");
|
|
|
data->scan_interval = data->short_interval;
|
|
|
- eloop_cancel_timeout(bgscan_learn_timeout, data, NULL);
|
|
|
- eloop_register_timeout(0, 0, bgscan_learn_timeout, data,
|
|
|
- NULL);
|
|
|
+ os_get_time(&now);
|
|
|
+ if (now.sec > data->last_bgscan.sec + 1)
|
|
|
+ scan = 1;
|
|
|
} else if (data->scan_interval == data->short_interval && above) {
|
|
|
wpa_printf(MSG_DEBUG, "bgscan learn: Start using long bgscan "
|
|
|
"interval");
|
|
@@ -572,20 +582,19 @@ static void bgscan_learn_notify_signal_change(void *priv, int above,
|
|
|
eloop_register_timeout(data->scan_interval, 0,
|
|
|
bgscan_learn_timeout, data, NULL);
|
|
|
} else if (!above) {
|
|
|
- struct os_time now;
|
|
|
/*
|
|
|
* Signal dropped further 4 dB. Request a new scan if we have
|
|
|
* not yet scanned in a while.
|
|
|
*/
|
|
|
os_get_time(&now);
|
|
|
- if (now.sec > data->last_bgscan.sec + 10) {
|
|
|
- wpa_printf(MSG_DEBUG, "bgscan learn: Trigger "
|
|
|
- "immediate scan");
|
|
|
- eloop_cancel_timeout(bgscan_learn_timeout, data,
|
|
|
- NULL);
|
|
|
- eloop_register_timeout(0, 0, bgscan_learn_timeout,
|
|
|
- data, NULL);
|
|
|
- }
|
|
|
+ if (now.sec > data->last_bgscan.sec + 10)
|
|
|
+ scan = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (scan) {
|
|
|
+ wpa_printf(MSG_DEBUG, "bgscan learn: Trigger immediate scan");
|
|
|
+ eloop_cancel_timeout(bgscan_learn_timeout, data, NULL);
|
|
|
+ eloop_register_timeout(0, 0, bgscan_learn_timeout, data, NULL);
|
|
|
}
|
|
|
}
|
|
|
|