diff --git a/wpa_supplicant/bgscan_learn.c b/wpa_supplicant/bgscan_learn.c index 865347b31..273124f2b 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); } }