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; |