| Index: wpa_supplicant/bgscan_delta.c
|
| diff --git a/wpa_supplicant/bgscan_delta.c b/wpa_supplicant/bgscan_delta.c
|
| index a2f2402966f700ec90592da442a24f6c73f7696c..08ed10ddd67426f50779995bebcaf89c761a9d97 100644
|
| --- a/wpa_supplicant/bgscan_delta.c
|
| +++ b/wpa_supplicant/bgscan_delta.c
|
| @@ -29,6 +29,7 @@ struct bgscan_delta_data {
|
| const struct wpa_ssid *ssid;
|
| int scan_interval;
|
| int signal_threshold;
|
| + int short_scan_count; /* counter for scans using short scan interval */
|
| int short_interval; /* use if signal < threshold */
|
| int long_interval; /* use if signal > threshold */
|
| struct os_time last_bgscan;
|
| @@ -59,8 +60,23 @@ static void bgscan_delta_timeout(void *eloop_ctx, void *timeout_ctx)
|
| wpa_printf(MSG_DEBUG, "bgscan delta: Failed to trigger scan");
|
| eloop_register_timeout(data->scan_interval, 0,
|
| bgscan_delta_timeout, data, NULL);
|
| - } else
|
| + } else {
|
| os_get_time(&data->last_bgscan);
|
| + if (data->scan_interval == data->short_interval) {
|
| + data->short_scan_count++;
|
| + /*
|
| + * Spend at most the duration of a long scan interval
|
| + * scanning at the short scan interval. After that,
|
| + * revert to the long scan interval.
|
| + */
|
| + if (data->short_scan_count >
|
| + data->long_interval / data->short_interval + 1) {
|
| + data->scan_interval = data->long_interval;
|
| + wpa_printf(MSG_DEBUG, "bgscan delta: backing "
|
| + "off to long scan interval");
|
| + }
|
| + }
|
| + }
|
| }
|
|
|
|
|
| @@ -226,6 +242,7 @@ static void bgscan_delta_notify_connection_change(void *priv,
|
| wpa_printf(MSG_DEBUG, "bgscan delta: Start using short "
|
| "bgscan interval");
|
| data->scan_interval = data->short_interval;
|
| + data->short_scan_count = 0;
|
| os_get_time(&now);
|
| if (now.sec > data->last_bgscan.sec + 1)
|
| scan = 1;
|
|
|