Lines Matching +full:scan +full:- +full:interval

2  * WPA Supplicant - background scan and roaming module: simple
3 * Copyright (c) 2009-2010, Jouni Malinen <j@w1.fi>
17 #include "scan.h"
30 int short_scan_count; /* counter for scans using short scan interval */
31 int max_short_scans; /* maximum times we short-scan before back-off */
46 if (!data->use_btm_query || wpa_s->conf->disable_btm || in bgscan_simple_btm_query()
47 !wpa_s->current_bss || in bgscan_simple_btm_query()
48 !wpa_bss_ext_capab(wpa_s->current_bss, in bgscan_simple_btm_query()
52 /* Try BTM x times, scan on x + 1 */ in bgscan_simple_btm_query()
53 data->scan_action_count++; in bgscan_simple_btm_query()
54 mod = data->scan_action_count % (data->use_btm_query + 1); in bgscan_simple_btm_query()
55 if (mod >= data->use_btm_query) in bgscan_simple_btm_query()
60 mod, data->use_btm_query); in bgscan_simple_btm_query()
65 /* Fall through and do regular scan */ in bgscan_simple_btm_query()
69 /* Start a new timeout for the next one. We don't have scan callback to in bgscan_simple_btm_query()
71 eloop_register_timeout(data->scan_interval, 0, in bgscan_simple_btm_query()
80 struct wpa_supplicant *wpa_s = data->wpa_s; in bgscan_simple_timeout()
88 params.ssids[0].ssid = data->ssid->ssid; in bgscan_simple_timeout()
89 params.ssids[0].ssid_len = data->ssid->ssid_len; in bgscan_simple_timeout()
90 params.freqs = data->ssid->scan_freq; in bgscan_simple_timeout()
98 wpa_printf(MSG_DEBUG, "bgscan simple: Request a background scan"); in bgscan_simple_timeout()
100 wpa_printf(MSG_DEBUG, "bgscan simple: Failed to trigger scan"); in bgscan_simple_timeout()
101 eloop_register_timeout(data->scan_interval, 0, in bgscan_simple_timeout()
105 if (data->scan_interval == data->short_interval) { in bgscan_simple_timeout()
106 data->short_scan_count++; in bgscan_simple_timeout()
107 if (data->short_scan_count >= data->max_short_scans) { in bgscan_simple_timeout()
108 data->scan_interval = data->long_interval; in bgscan_simple_timeout()
110 "off to long scan interval"); in bgscan_simple_timeout()
112 } else if (data->short_scan_count > 0) { in bgscan_simple_timeout()
114 * If we lasted a long scan interval without any in bgscan_simple_timeout()
115 * CQM triggers, decrease the short-scan count, in bgscan_simple_timeout()
116 * which allows 1 more short-scan interval to in bgscan_simple_timeout()
119 data->short_scan_count--; in bgscan_simple_timeout()
121 os_get_reltime(&data->last_bgscan); in bgscan_simple_timeout()
131 data->use_btm_query = 0; in bgscan_simple_get_params()
133 data->short_interval = atoi(params); in bgscan_simple_get_params()
139 data->signal_threshold = atoi(pos); in bgscan_simple_get_params()
142 wpa_printf(MSG_ERROR, "bgscan simple: Missing scan interval " in bgscan_simple_get_params()
144 return -1; in bgscan_simple_get_params()
147 data->long_interval = atoi(pos); in bgscan_simple_get_params()
151 data->use_btm_query = atoi(pos); in bgscan_simple_get_params()
167 data->wpa_s = wpa_s; in bgscan_simple_init()
168 data->ssid = ssid; in bgscan_simple_init()
173 if (data->short_interval <= 0) in bgscan_simple_init()
174 data->short_interval = 30; in bgscan_simple_init()
175 if (data->long_interval <= 0) in bgscan_simple_init()
176 data->long_interval = 30; in bgscan_simple_init()
179 "Short bgscan interval %d Long bgscan interval %d", in bgscan_simple_init()
180 data->signal_threshold, data->short_interval, in bgscan_simple_init()
181 data->long_interval); in bgscan_simple_init()
183 if (data->signal_threshold && in bgscan_simple_init()
184 wpa_drv_signal_monitor(wpa_s, data->signal_threshold, 4) < 0) { in bgscan_simple_init()
189 data->scan_interval = data->short_interval; in bgscan_simple_init()
190 data->max_short_scans = data->long_interval / data->short_interval + 1; in bgscan_simple_init()
191 if (data->signal_threshold) { in bgscan_simple_init()
192 wpa_s->signal_threshold = data->signal_threshold; in bgscan_simple_init()
193 /* Poll for signal info to set initial scan interval */ in bgscan_simple_init()
196 siginfo.data.signal >= data->signal_threshold) in bgscan_simple_init()
197 data->scan_interval = data->long_interval; in bgscan_simple_init()
199 wpa_printf(MSG_DEBUG, "bgscan simple: Init scan interval: %d", in bgscan_simple_init()
200 data->scan_interval); in bgscan_simple_init()
201 eloop_register_timeout(data->scan_interval, 0, bgscan_simple_timeout, in bgscan_simple_init()
206 * reasonable to assume that a scan was completed recently. This makes in bgscan_simple_init()
207 * us skip an immediate new scan in cases where the current signal in bgscan_simple_init()
210 os_get_reltime(&data->last_bgscan); in bgscan_simple_init()
220 if (data->signal_threshold) { in bgscan_simple_deinit()
221 data->wpa_s->signal_threshold = 0; in bgscan_simple_deinit()
222 wpa_drv_signal_monitor(data->wpa_s, 0, 0); in bgscan_simple_deinit()
233 wpa_printf(MSG_DEBUG, "bgscan simple: scan result notification"); in bgscan_simple_notify_scan()
236 eloop_register_timeout(data->scan_interval, 0, bgscan_simple_timeout, in bgscan_simple_notify_scan()
240 * A more advanced bgscan could process scan results internally, select in bgscan_simple_notify_scan()
263 int scan = 0; in bgscan_simple_notify_signal_change() local
266 if (data->short_interval == data->long_interval || in bgscan_simple_notify_signal_change()
267 data->signal_threshold == 0) in bgscan_simple_notify_signal_change()
274 if (data->scan_interval == data->long_interval && !above) { in bgscan_simple_notify_signal_change()
276 "bgscan interval"); in bgscan_simple_notify_signal_change()
277 data->scan_interval = data->short_interval; in bgscan_simple_notify_signal_change()
279 if (now.sec > data->last_bgscan.sec + 1 && in bgscan_simple_notify_signal_change()
280 data->short_scan_count <= data->max_short_scans) in bgscan_simple_notify_signal_change()
283 * performed a scan, and we haven't depleted our in bgscan_simple_notify_signal_change()
284 * budget for short-scans, perform a scan in bgscan_simple_notify_signal_change()
287 scan = 1; in bgscan_simple_notify_signal_change()
288 else if (data->last_bgscan.sec + data->long_interval > in bgscan_simple_notify_signal_change()
289 now.sec + data->scan_interval) { in bgscan_simple_notify_signal_change()
291 * Restart scan interval timer if currently scheduled in bgscan_simple_notify_signal_change()
292 * scan is too far in the future. in bgscan_simple_notify_signal_change()
296 eloop_register_timeout(data->scan_interval, 0, in bgscan_simple_notify_signal_change()
300 } else if (data->scan_interval == data->short_interval && above) { in bgscan_simple_notify_signal_change()
302 "interval"); in bgscan_simple_notify_signal_change()
303 data->scan_interval = data->long_interval; in bgscan_simple_notify_signal_change()
305 eloop_register_timeout(data->scan_interval, 0, in bgscan_simple_notify_signal_change()
309 * Signal dropped further 4 dB. Request a new scan if we have in bgscan_simple_notify_signal_change()
313 if (now.sec > data->last_bgscan.sec + 10) in bgscan_simple_notify_signal_change()
314 scan = 1; in bgscan_simple_notify_signal_change()
317 if (scan) { in bgscan_simple_notify_signal_change()
318 wpa_printf(MSG_DEBUG, "bgscan simple: Trigger immediate scan"); in bgscan_simple_notify_signal_change()