aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJouni Malinen <j@w1.fi>2010-08-27 17:29:02 (GMT)
committerJouni Malinen <j@w1.fi>2010-09-05 14:33:47 (GMT)
commitdf1a5d1df9bd83dbc5feaeca14c0e4f848377335 (patch)
tree72d089919981fb9823b0d07ec49854fb32c7140b
parente28f7f44f37f841ca119c8c68a8666e4b2f0afff (diff)
downloadhostap-07-df1a5d1df9bd83dbc5feaeca14c0e4f848377335.zip
hostap-07-df1a5d1df9bd83dbc5feaeca14c0e4f848377335.tar.gz
hostap-07-df1a5d1df9bd83dbc5feaeca14c0e4f848377335.tar.bz2
bgscan simple: Skip immediate scan on initial signal event
The driver is likely to indicate an immediate signal event when the threshold value is configured. Since we do this immediately after association, there is not much point in requesting a new scan to be started based on this event. (cherry picked from commit 1e6ef6455cd4c4213c269fa843ab53d9b392baf4)
-rw-r--r--wpa_supplicant/bgscan_simple.c39
1 files changed, 25 insertions, 14 deletions
diff --git a/wpa_supplicant/bgscan_simple.c b/wpa_supplicant/bgscan_simple.c
index a932553..8e80b12 100644
--- a/wpa_supplicant/bgscan_simple.c
+++ b/wpa_supplicant/bgscan_simple.c
@@ -124,6 +124,15 @@ static void * bgscan_simple_init(struct wpa_supplicant *wpa_s,
data->scan_interval = data->short_interval;
eloop_register_timeout(data->scan_interval, 0, bgscan_simple_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;
}
@@ -169,6 +178,8 @@ static void bgscan_simple_notify_beacon_loss(void *priv)
static void bgscan_simple_notify_signal_change(void *priv, int above)
{
struct bgscan_simple_data *data = priv;
+ int scan = 0;
+ struct os_time now;
if (data->short_interval == data->long_interval ||
data->signal_threshold == 0)
@@ -177,12 +188,12 @@ static void bgscan_simple_notify_signal_change(void *priv, int above)
wpa_printf(MSG_DEBUG, "bgscan simple: signal level changed "
"(above=%d)", above);
if (data->scan_interval == data->long_interval && !above) {
- wpa_printf(MSG_DEBUG, "bgscan simple: Trigger immediate scan "
- "and start using short bgscan interval");
+ wpa_printf(MSG_DEBUG, "bgscan simple: Start using short "
+ "bgscan interval");
data->scan_interval = data->short_interval;
- eloop_cancel_timeout(bgscan_simple_timeout, data, NULL);
- eloop_register_timeout(0, 0, bgscan_simple_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 simple: Start using long bgscan "
"interval");
@@ -191,20 +202,20 @@ static void bgscan_simple_notify_signal_change(void *priv, int above)
eloop_register_timeout(data->scan_interval, 0,
bgscan_simple_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 simple: Trigger "
- "immediate scan");
- eloop_cancel_timeout(bgscan_simple_timeout, data,
- NULL);
- eloop_register_timeout(0, 0, bgscan_simple_timeout,
- data, NULL);
- }
+ if (now.sec > data->last_bgscan.sec + 10)
+ scan = 1;
+ }
+
+ if (scan) {
+ wpa_printf(MSG_DEBUG, "bgscan simple: Trigger immediate scan");
+ eloop_cancel_timeout(bgscan_simple_timeout, data, NULL);
+ eloop_register_timeout(0, 0, bgscan_simple_timeout, data,
+ NULL);
}
}