Lines Matching +full:scan +full:- +full:count
2 * WPA Supplicant - background scan and roaming module: learn
3 * Copyright (c) 2009-2010, Jouni Malinen <j@w1.fi>
19 #include "scan.h"
47 os_free(bss->neigh); in bss_free()
73 if (ether_addr_equal(bss->bssid, bssid)) in bgscan_learn_add_neighbor()
75 if (bssid_in_array(bss->neigh, bss->num_neigh, bssid)) in bgscan_learn_add_neighbor()
78 n = os_realloc_array(bss->neigh, bss->num_neigh + 1, ETH_ALEN); in bgscan_learn_add_neighbor()
82 os_memcpy(n + bss->num_neigh * ETH_ALEN, bssid, ETH_ALEN); in bgscan_learn_add_neighbor()
83 bss->neigh = n; in bgscan_learn_add_neighbor()
84 bss->num_neigh++; in bgscan_learn_add_neighbor()
93 dl_list_for_each(bss, &data->bss, struct bgscan_learn_bss, list) { in bgscan_learn_get_bss()
94 if (ether_addr_equal(bss->bssid, bssid)) in bgscan_learn_get_bss()
107 if (data->fname == NULL) in bgscan_learn_load()
110 f = fopen(data->fname, "r"); in bgscan_learn_load()
115 data->fname); in bgscan_learn_load()
118 os_strncmp(buf, "wpa_supplicant-bgscan-learn\n", 28) != 0) { in bgscan_learn_load()
120 data->fname); in bgscan_learn_load()
122 return -1; in bgscan_learn_load()
130 if (hwaddr_aton(buf + 4, bss->bssid) < 0) { in bgscan_learn_load()
134 bss->freq = atoi(buf + 4 + 18); in bgscan_learn_load()
135 dl_list_add(&data->bss, &bss->list); in bgscan_learn_load()
138 MAC2STR(bss->bssid), bss->freq); in bgscan_learn_load()
166 if (data->fname == NULL) in bgscan_learn_save()
170 data->fname); in bgscan_learn_save()
172 f = fopen(data->fname, "w"); in bgscan_learn_save()
175 fprintf(f, "wpa_supplicant-bgscan-learn\n"); in bgscan_learn_save()
177 dl_list_for_each(bss, &data->bss, struct bgscan_learn_bss, list) { in bgscan_learn_save()
179 MAC2STR(bss->bssid), bss->freq); in bgscan_learn_save()
182 dl_list_for_each(bss, &data->bss, struct bgscan_learn_bss, list) { in bgscan_learn_save()
184 for (i = 0; i < bss->num_neigh; i++) { in bgscan_learn_save()
186 MAC2STR(bss->bssid), in bgscan_learn_save()
187 MAC2STR(bss->neigh + i * ETH_ALEN)); in bgscan_learn_save()
212 size_t *count) in bgscan_learn_get_freqs() argument
217 *count = 0; in bgscan_learn_get_freqs()
219 dl_list_for_each(bss, &data->bss, struct bgscan_learn_bss, list) { in bgscan_learn_get_freqs()
220 if (in_array(freqs, bss->freq)) in bgscan_learn_get_freqs()
222 n = os_realloc_array(freqs, *count + 2, sizeof(int)); in bgscan_learn_get_freqs()
226 freqs[*count] = bss->freq; in bgscan_learn_get_freqs()
227 (*count)++; in bgscan_learn_get_freqs()
228 freqs[*count] = 0; in bgscan_learn_get_freqs()
236 int *freqs, size_t count) in bgscan_learn_get_probe_freq() argument
240 if (data->supp_freqs == NULL) in bgscan_learn_get_probe_freq()
243 idx = data->probe_idx; in bgscan_learn_get_probe_freq()
245 if (!in_array(freqs, data->supp_freqs[idx])) { in bgscan_learn_get_probe_freq()
247 "%u", data->supp_freqs[idx]); in bgscan_learn_get_probe_freq()
248 data->probe_idx = idx + 1; in bgscan_learn_get_probe_freq()
249 if (data->supp_freqs[data->probe_idx] == 0) in bgscan_learn_get_probe_freq()
250 data->probe_idx = 0; in bgscan_learn_get_probe_freq()
251 n = os_realloc_array(freqs, count + 2, sizeof(int)); in bgscan_learn_get_probe_freq()
255 freqs[count] = data->supp_freqs[idx]; in bgscan_learn_get_probe_freq()
256 count++; in bgscan_learn_get_probe_freq()
257 freqs[count] = 0; in bgscan_learn_get_probe_freq()
262 if (data->supp_freqs[idx] == 0) in bgscan_learn_get_probe_freq()
264 } while (idx != data->probe_idx); in bgscan_learn_get_probe_freq()
273 struct wpa_supplicant *wpa_s = data->wpa_s; in bgscan_learn_timeout()
276 size_t count, i; in bgscan_learn_timeout() local
281 params.ssids[0].ssid = data->ssid->ssid; in bgscan_learn_timeout()
282 params.ssids[0].ssid_len = data->ssid->ssid_len; in bgscan_learn_timeout()
283 if (data->ssid->scan_freq) in bgscan_learn_timeout()
284 params.freqs = data->ssid->scan_freq; in bgscan_learn_timeout()
286 freqs = bgscan_learn_get_freqs(data, &count); in bgscan_learn_timeout()
288 "been seen on %u channels", (unsigned int) count); in bgscan_learn_timeout()
289 freqs = bgscan_learn_get_probe_freq(data, freqs, count); in bgscan_learn_timeout()
295 ret = os_snprintf(pos, msg + sizeof(msg) - pos, " %d", in bgscan_learn_timeout()
297 if (os_snprintf_error(msg + sizeof(msg) - pos, ret)) in bgscan_learn_timeout()
307 wpa_printf(MSG_DEBUG, "bgscan learn: Request a background scan"); in bgscan_learn_timeout()
309 wpa_printf(MSG_DEBUG, "bgscan learn: Failed to trigger scan"); in bgscan_learn_timeout()
310 eloop_register_timeout(data->scan_interval, 0, in bgscan_learn_timeout()
313 os_get_reltime(&data->last_bgscan); in bgscan_learn_timeout()
323 data->short_interval = atoi(params); in bgscan_learn_get_params()
329 data->signal_threshold = atoi(pos); in bgscan_learn_get_params()
332 wpa_printf(MSG_ERROR, "bgscan learn: Missing scan interval " in bgscan_learn_get_params()
334 return -1; in bgscan_learn_get_params()
337 data->long_interval = atoi(pos); in bgscan_learn_get_params()
341 data->fname = os_strdup(pos); in bgscan_learn_get_params()
352 size_t count = 0; in bgscan_learn_get_supp_freqs() local
354 modes = wpa_s->hw.modes; in bgscan_learn_get_supp_freqs()
358 for (i = 0; i < wpa_s->hw.num_modes; i++) { in bgscan_learn_get_supp_freqs()
365 n = os_realloc_array(freqs, count + 2, sizeof(int)); in bgscan_learn_get_supp_freqs()
370 freqs[count] = modes[i].channels[j].freq; in bgscan_learn_get_supp_freqs()
371 count++; in bgscan_learn_get_supp_freqs()
372 freqs[count] = 0; in bgscan_learn_get_supp_freqs()
389 dl_list_init(&data->bss); in bgscan_learn_init()
390 data->wpa_s = wpa_s; in bgscan_learn_init()
391 data->ssid = ssid; in bgscan_learn_init()
393 os_free(data->fname); in bgscan_learn_init()
397 if (data->short_interval <= 0) in bgscan_learn_init()
398 data->short_interval = 30; in bgscan_learn_init()
399 if (data->long_interval <= 0) in bgscan_learn_init()
400 data->long_interval = 30; in bgscan_learn_init()
403 os_free(data->fname); in bgscan_learn_init()
410 data->signal_threshold, data->short_interval, in bgscan_learn_init()
411 data->long_interval); in bgscan_learn_init()
413 if (data->signal_threshold && in bgscan_learn_init()
414 wpa_drv_signal_monitor(wpa_s, data->signal_threshold, 4) < 0) { in bgscan_learn_init()
419 data->supp_freqs = bgscan_learn_get_supp_freqs(wpa_s); in bgscan_learn_init()
420 data->scan_interval = data->short_interval; in bgscan_learn_init()
421 if (data->signal_threshold) { in bgscan_learn_init()
422 /* Poll for signal info to set initial scan interval */ in bgscan_learn_init()
425 siginfo.data.signal >= data->signal_threshold) in bgscan_learn_init()
426 data->scan_interval = data->long_interval; in bgscan_learn_init()
429 eloop_register_timeout(data->scan_interval, 0, bgscan_learn_timeout, in bgscan_learn_init()
434 * reasonable to assume that a scan was completed recently. This makes in bgscan_learn_init()
435 * us skip an immediate new scan in cases where the current signal in bgscan_learn_init()
438 os_get_reltime(&data->last_bgscan); in bgscan_learn_init()
451 if (data->signal_threshold) in bgscan_learn_deinit()
452 wpa_drv_signal_monitor(data->wpa_s, 0, 0); in bgscan_learn_deinit()
453 os_free(data->fname); in bgscan_learn_deinit()
454 dl_list_for_each_safe(bss, n, &data->bss, struct bgscan_learn_bss, in bgscan_learn_deinit()
456 dl_list_del(&bss->list); in bgscan_learn_deinit()
459 os_free(data->supp_freqs); in bgscan_learn_deinit()
473 if (data->ssid->ssid_len != ie[1] || in bgscan_learn_bss_match()
474 os_memcmp(data->ssid->ssid, ie + 2, ie[1]) != 0) in bgscan_learn_bss_match()
490 wpa_printf(MSG_DEBUG, "bgscan learn: scan result notification"); in bgscan_learn_notify_scan()
493 eloop_register_timeout(data->scan_interval, 0, bgscan_learn_timeout, in bgscan_learn_notify_scan()
496 for (i = 0; i < scan_res->num; i++) { in bgscan_learn_notify_scan()
497 struct wpa_scan_res *res = scan_res->res[i]; in bgscan_learn_notify_scan()
502 os_memcpy(bssid + num_bssid * ETH_ALEN, res->bssid, in bgscan_learn_notify_scan()
507 wpa_printf(MSG_DEBUG, "bgscan learn: %u matching BSSes in scan " in bgscan_learn_notify_scan()
510 for (i = 0; i < scan_res->num; i++) { in bgscan_learn_notify_scan()
511 struct wpa_scan_res *res = scan_res->res[i]; in bgscan_learn_notify_scan()
517 bss = bgscan_learn_get_bss(data, res->bssid); in bgscan_learn_notify_scan()
518 if (bss && bss->freq != res->freq) { in bgscan_learn_notify_scan()
520 MACSTR " freq %d -> %d", in bgscan_learn_notify_scan()
521 MAC2STR(res->bssid), bss->freq, res->freq); in bgscan_learn_notify_scan()
522 bss->freq = res->freq; in bgscan_learn_notify_scan()
525 " freq=%d", MAC2STR(res->bssid), res->freq); in bgscan_learn_notify_scan()
529 os_memcpy(bss->bssid, res->bssid, ETH_ALEN); in bgscan_learn_notify_scan()
530 bss->freq = res->freq; in bgscan_learn_notify_scan()
531 dl_list_add(&data->bss, &bss->list); in bgscan_learn_notify_scan()
541 * A more advanced bgscan could process scan results internally, select in bgscan_learn_notify_scan()
564 int scan = 0; in bgscan_learn_notify_signal_change() local
567 if (data->short_interval == data->long_interval || in bgscan_learn_notify_signal_change()
568 data->signal_threshold == 0) in bgscan_learn_notify_signal_change()
575 if (data->scan_interval == data->long_interval && !above) { in bgscan_learn_notify_signal_change()
578 data->scan_interval = data->short_interval; in bgscan_learn_notify_signal_change()
580 if (now.sec > data->last_bgscan.sec + 1) in bgscan_learn_notify_signal_change()
581 scan = 1; in bgscan_learn_notify_signal_change()
582 } else if (data->scan_interval == data->short_interval && above) { in bgscan_learn_notify_signal_change()
585 data->scan_interval = data->long_interval; in bgscan_learn_notify_signal_change()
587 eloop_register_timeout(data->scan_interval, 0, in bgscan_learn_notify_signal_change()
591 * Signal dropped further 4 dB. Request a new scan if we have in bgscan_learn_notify_signal_change()
595 if (now.sec > data->last_bgscan.sec + 10) in bgscan_learn_notify_signal_change()
596 scan = 1; in bgscan_learn_notify_signal_change()
599 if (scan) { in bgscan_learn_notify_signal_change()
600 wpa_printf(MSG_DEBUG, "bgscan learn: Trigger immediate scan"); in bgscan_learn_notify_signal_change()