nl80211: Add option to delay start of schedule scan plans

The userspace may want to delay the the first scheduled scan.
This enhances sched_scan to add initial delay (in seconds) before
starting first scan cycle. The driver may optionally choose to
ignore this parameter and start immediately (or at any other time).

This uses NL80211_ATTR_SCHED_SCAN_DELAY to add this via user
global configurable option: sched_scan_start_delay.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Purushottam Kushwaha 2017-03-06 13:23:10 +05:30 committed by Jouni Malinen
parent b696f791ac
commit d0330d57f3
7 changed files with 38 additions and 2 deletions

View file

@ -482,6 +482,15 @@ struct wpa_driver_scan_params {
*/ */
unsigned int sched_scan_plans_num; unsigned int sched_scan_plans_num;
/**
* sched_scan_start_delay - Delay to use before starting the first scan
*
* Delay (in seconds) before scheduling first scan plan cycle. The
* driver may ignore this parameter and start immediately (or at any
* other time), if this feature is not supported.
*/
u32 sched_scan_start_delay;
/** /**
* bssid - Specific BSSID to scan for * bssid - Specific BSSID to scan for
* *

View file

@ -595,6 +595,11 @@ int wpa_driver_nl80211_sched_scan(void *priv,
} }
} }
if (params->sched_scan_start_delay &&
nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY,
params->sched_scan_start_delay))
goto fail;
ret = send_and_recv_msgs(drv, msg, NULL, NULL); ret = send_and_recv_msgs(drv, msg, NULL, NULL);
/* TODO: if we get an error here, we should fall back to normal scan */ /* TODO: if we get an error here, we should fall back to normal scan */

View file

@ -4432,6 +4432,7 @@ static const struct global_parse_data global_fields[] = {
{ FUNC(freq_list), 0 }, { FUNC(freq_list), 0 },
{ INT(scan_cur_freq), 0 }, { INT(scan_cur_freq), 0 },
{ INT(sched_scan_interval), 0 }, { INT(sched_scan_interval), 0 },
{ INT(sched_scan_start_delay), 0 },
{ INT(tdls_external_control), 0}, { INT(tdls_external_control), 0},
{ STR(osu_dir), 0 }, { STR(osu_dir), 0 },
{ STR(wowlan_triggers), 0 }, { STR(wowlan_triggers), 0 },

View file

@ -1096,6 +1096,15 @@ struct wpa_config {
*/ */
unsigned int sched_scan_interval; unsigned int sched_scan_interval;
/**
* sched_scan_start_delay - Schedule scan start delay before first scan
*
* Delay (in seconds) before scheduling first scan plan cycle. The
* driver may ignore this parameter and start immediately (or at any
* other time), if this feature is not supported.
*/
unsigned int sched_scan_start_delay;
/** /**
* tdls_external_control - External control for TDLS setup requests * tdls_external_control - External control for TDLS setup requests
* *

View file

@ -1320,6 +1320,10 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
fprintf(f, "sched_scan_interval=%u\n", fprintf(f, "sched_scan_interval=%u\n",
config->sched_scan_interval); config->sched_scan_interval);
if (config->sched_scan_start_delay)
fprintf(f, "sched_scan_start_delay=%u\n",
config->sched_scan_start_delay);
if (config->external_sim) if (config->external_sim)
fprintf(f, "external_sim=%d\n", config->external_sim); fprintf(f, "external_sim=%d\n", config->external_sim);

View file

@ -1512,13 +1512,18 @@ scan:
params.sched_scan_plans_num = 1; params.sched_scan_plans_num = 1;
} }
params.sched_scan_start_delay = wpa_s->conf->sched_scan_start_delay;
if (ssid || !wpa_s->first_sched_scan) { if (ssid || !wpa_s->first_sched_scan) {
wpa_dbg(wpa_s, MSG_DEBUG, wpa_dbg(wpa_s, MSG_DEBUG,
"Starting sched scan: interval %u timeout %d", "Starting sched scan after %u seconds: interval %u timeout %d",
params.sched_scan_start_delay,
params.sched_scan_plans[0].interval, params.sched_scan_plans[0].interval,
wpa_s->sched_scan_timeout); wpa_s->sched_scan_timeout);
} else { } else {
wpa_dbg(wpa_s, MSG_DEBUG, "Starting sched scan (no timeout)"); wpa_dbg(wpa_s, MSG_DEBUG,
"Starting sched scan after %u seconds (no timeout)",
params.sched_scan_start_delay);
} }
wpa_setband_scan_freqs(wpa_s, scan_params); wpa_setband_scan_freqs(wpa_s, scan_params);
@ -2588,6 +2593,8 @@ int wpas_start_pno(struct wpa_supplicant *wpa_s)
params.sched_scan_plans_num = 1; params.sched_scan_plans_num = 1;
} }
params.sched_scan_start_delay = wpa_s->conf->sched_scan_start_delay;
if (params.freqs == NULL && wpa_s->manual_sched_scan_freqs) { if (params.freqs == NULL && wpa_s->manual_sched_scan_freqs) {
wpa_dbg(wpa_s, MSG_DEBUG, "Limit sched scan to specified channels"); wpa_dbg(wpa_s, MSG_DEBUG, "Limit sched scan to specified channels");
params.freqs = wpa_s->manual_sched_scan_freqs; params.freqs = wpa_s->manual_sched_scan_freqs;

View file

@ -578,6 +578,7 @@ static char ** wpa_cli_complete_get(const char *str, int pos)
"p2p_go_max_inactivity", "auto_interworking", "okc", "pmf", "p2p_go_max_inactivity", "auto_interworking", "okc", "pmf",
"dtim_period", "beacon_int", "ignore_old_scan_res", "dtim_period", "beacon_int", "ignore_old_scan_res",
"scan_cur_freq", "sched_scan_interval", "scan_cur_freq", "sched_scan_interval",
"sched_scan_start_delay",
"tdls_external_control", "osu_dir", "wowlan_triggers", "tdls_external_control", "osu_dir", "wowlan_triggers",
"p2p_search_delay", "mac_addr", "rand_addr_lifetime", "p2p_search_delay", "mac_addr", "rand_addr_lifetime",
"preassoc_mac_addr", "key_mgmt_offload", "passive_scan", "preassoc_mac_addr", "key_mgmt_offload", "passive_scan",