@@ -567,6 +567,9 @@ struct wpa_driver_scan_params {
*/
s8 relative_adjust_rssi;
+ /* number of seconds to wait for a scan completed event before giving up */
+ unsigned int scan_timeout;
+
/*
* NOTE: Whenever adding new parameters here, please make sure
* wpa_scan_clone_params() and wpa_scan_free_params() get updated with
b/src/drivers/driver_nl80211_scan.c
@@ -388,6 +388,11 @@ int wpa_driver_nl80211_scan(struct i802_bss *bss,
*/
timeout = 30;
}
+ /* if we're passed a timeout in params, use that. */
+ if (params->scan_timeout) {
+ timeout = params->scan_timeout;
+ }
+
wpa_printf(MSG_DEBUG, "Scan requested (ret=%d) - scan timeout %d "
"seconds", ret, timeout);
eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx);
@@ -4606,6 +4606,7 @@ static const struct global_parse_data global_fields[] = {
{ INT_RANGE(ignore_old_scan_res, 0, 1), 0 },
{ FUNC(freq_list), 0 },
{ INT(scan_cur_freq), 0 },
+ { INT(scan_timeout), 0 },
{ INT(sched_scan_interval), 0 },
{ INT(sched_scan_start_delay), 0 },
{ INT(tdls_external_control), 0},
@@ -859,6 +859,14 @@ struct wpa_config {
int scan_cur_freq;
/**
+ * scan_timeout - value in seconds to wait for a scan survey to finish.
+ *
+ * Not all drivers generate "scan completed" wireless event, so try to
+ * read results after a timeout.
+ */
+ unsigned int scan_timeout;
+
+ /**
* changed_parameters - Bitmap of changed parameters since last update
*/
unsigned int changed_parameters;
@@ -1372,6 +1372,9 @@ static void wpa_config_write_global(FILE *f,
struct wpa_config *config)
if (config->scan_cur_freq != DEFAULT_SCAN_CUR_FREQ)
fprintf(f, "scan_cur_freq=%d\n", config->scan_cur_freq);
+ if (config->scan_timeout)
+ fprintf(f, "scan_timeout=%d\n", config->scan_timeout);
+
if (config->sched_scan_interval)
fprintf(f, "sched_scan_interval=%u\n",
config->sched_scan_interval);
@@ -1059,6 +1059,14 @@ ssid_list_set:
int_array_concat(¶ms.freqs, wpa_s->conf->freq_list);
}
+ /* if user specified a scan timeout, add that */
+ if (wpa_s->conf->scan_timeout) {
+ wpa_dbg(wpa_s, MSG_DEBUG,
+ "timeout the scan after %d seconds if driver doesn't send event",
+ wpa_s->conf->scan_timeout);
+ params.scan_timeout = wpa_s->conf->scan_timeout;
+ }
+
/* Use current associated channel? */
if (wpa_s->conf->scan_cur_freq && !params.freqs) {
unsigned int num = wpa_s->num_multichan_concurrent;
@@ -1485,6 +1493,14 @@ int wpa_supplicant_req_sched_scan(struct
wpa_supplicant *wpa_s)
"Optimize scan based on conf->freq_list");
int_array_concat(¶ms.freqs, wpa_s->conf->freq_list);
}
+ /* if user specified a scan timeout, add that */
+ if (wpa_s->conf->scan_timeout) {
+ wpa_dbg(wpa_s, MSG_DEBUG,
+ "timeout the scan after %d seconds if driver doesn't send event",
+ wpa_s->conf->scan_timeout);
+ params.scan_timeout = wpa_s->conf->scan_timeout;
+ }
+
scan_params = ¶ms;
@@ -2444,6 +2460,7 @@ wpa_scan_clone_params(const struct
wpa_driver_scan_params *src)
params->relative_rssi = src->relative_rssi;
params->relative_adjust_band = src->relative_adjust_band;
params->relative_adjust_rssi = src->relative_adjust_rssi;
+ params->scan_timeout = src->scan_timeout;
return params;
failed:
@@ -486,7 +486,7 @@ static char ** wpa_cli_complete_set(const char
*str, int pos)
"p2p_go_max_inactivity", "auto_interworking", "okc", "pmf",
"sae_groups", "dtim_period", "beacon_int",
"ap_vendor_elements", "ignore_old_scan_res", "freq_list",
- "scan_cur_freq", "sched_scan_interval",
+ "scan_cur_freq", "scan_timeout", "sched_scan_interval",
"tdls_external_control", "osu_dir", "wowlan_triggers",
"p2p_search_delay", "mac_addr", "rand_addr_lifetime",