]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Add option to delay start of schedule scan plans
authorPurushottam Kushwaha <pkushwah@qti.qualcomm.com>
Mon, 6 Mar 2017 07:53:10 +0000 (13:23 +0530)
committerJouni Malinen <j@w1.fi>
Thu, 9 Mar 2017 13:44:26 +0000 (15:44 +0200)
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>
src/drivers/driver.h
src/drivers/driver_nl80211_scan.c
wpa_supplicant/config.c
wpa_supplicant/config.h
wpa_supplicant/config_file.c
wpa_supplicant/scan.c
wpa_supplicant/wpa_cli.c

index 1d2dff9f2d245ba1fd200ebc85bff214fadc9ba0..9018c083c7474e0bda081e37611fd6ce962aa58e 100644 (file)
@@ -482,6 +482,15 @@ struct wpa_driver_scan_params {
         */
         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
         *
index 4417721e63bf3b48c162ee8eea31da126eda1578..10517e4030cdc6f879fa26aba968f1057e943e99 100644 (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);
 
        /* TODO: if we get an error here, we should fall back to normal scan */
index 00c5ff0dbfdd3e2d8b40a96b6511e0a5b76ada95..e3ce6bc1dace653ac4678b9d6feeede6a71dee3c 100644 (file)
@@ -4432,6 +4432,7 @@ static const struct global_parse_data global_fields[] = {
        { FUNC(freq_list), 0 },
        { INT(scan_cur_freq), 0 },
        { INT(sched_scan_interval), 0 },
+       { INT(sched_scan_start_delay), 0 },
        { INT(tdls_external_control), 0},
        { STR(osu_dir), 0 },
        { STR(wowlan_triggers), 0 },
index 3f84b0e1c502cb5018283c5013b736e2c159f41f..a7b043561a6061f2733d11beb8c4fb9946725a0c 100644 (file)
@@ -1096,6 +1096,15 @@ struct wpa_config {
         */
        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
         *
index 160a5da2cfca3d3699f868cb6a1b17687e671a61..2b46fed4f5ed8ededa7abe37b49186d07473b08b 100644 (file)
@@ -1320,6 +1320,10 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
                fprintf(f, "sched_scan_interval=%u\n",
                        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)
                fprintf(f, "external_sim=%d\n", config->external_sim);
 
index d19531a3db66bf74e72c646d8c85931657bd9c45..413abf63ef482b8b2994cc66bae7f69f78ee98c4 100644 (file)
@@ -1512,13 +1512,18 @@ scan:
                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) {
                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,
                        wpa_s->sched_scan_timeout);
        } 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);
@@ -2588,6 +2593,8 @@ int wpas_start_pno(struct wpa_supplicant *wpa_s)
                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) {
                wpa_dbg(wpa_s, MSG_DEBUG, "Limit sched scan to specified channels");
                params.freqs = wpa_s->manual_sched_scan_freqs;
index 964311c55773b810b2d9103e922d25cf6e97750f..4598cf222ee8cef87b706ce4a8b3615016b109b8 100644 (file)
@@ -578,6 +578,7 @@ static char ** wpa_cli_complete_get(const char *str, int pos)
                "p2p_go_max_inactivity", "auto_interworking", "okc", "pmf",
                "dtim_period", "beacon_int", "ignore_old_scan_res",
                "scan_cur_freq", "sched_scan_interval",
+               "sched_scan_start_delay",
                "tdls_external_control", "osu_dir", "wowlan_triggers",
                "p2p_search_delay", "mac_addr", "rand_addr_lifetime",
                "preassoc_mac_addr", "key_mgmt_offload", "passive_scan",