aboutsummaryrefslogtreecommitdiffstats
path: root/wpa_supplicant/bgscan_learn.c
diff options
context:
space:
mode:
Diffstat (limited to 'wpa_supplicant/bgscan_learn.c')
-rw-r--r--wpa_supplicant/bgscan_learn.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/wpa_supplicant/bgscan_learn.c b/wpa_supplicant/bgscan_learn.c
index 865347b..273124f 100644
--- a/wpa_supplicant/bgscan_learn.c
+++ b/wpa_supplicant/bgscan_learn.c
@@ -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);
}
}