Fix SELECT_NETWORK freq parameter

This functionality was originally added in commit
204c9ac4ee ('Extend select_network command
with freq= to reduce scan time') re-using wpa_s->manual_scan_freqs and
MANUAL_SCAN_REQ. That got broken when commit
35d403096e ('Set NORMAL_SCAN_REQ on
SELECT_NETWORK/ENABLE_NETWORK') started overriding wpa_s->scan_req for
SELECT_NETWORK.

Fix this by adding a new scan frequency list specifically for
SELECT_NETWORK so that this does not need to depend on any specific
wpa_s->scan_req value.

Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2017-02-25 19:15:24 +02:00
parent d02989f2e4
commit 88a447556e
4 changed files with 14 additions and 3 deletions

View file

@ -2984,9 +2984,8 @@ static int wpa_supplicant_ctrl_iface_select_network(
if (pos) { if (pos) {
int *freqs = freq_range_to_channel_list(wpa_s, pos + 6); int *freqs = freq_range_to_channel_list(wpa_s, pos + 6);
if (freqs) { if (freqs) {
wpa_s->scan_req = MANUAL_SCAN_REQ; os_free(wpa_s->select_network_scan_freqs);
os_free(wpa_s->manual_scan_freqs); wpa_s->select_network_scan_freqs = freqs;
wpa_s->manual_scan_freqs = freqs;
} }
} }
@ -7601,6 +7600,8 @@ static void wpa_supplicant_ctrl_iface_flush(struct wpa_supplicant *wpa_s)
wpa_s->disconnected = 0; wpa_s->disconnected = 0;
os_free(wpa_s->next_scan_freqs); os_free(wpa_s->next_scan_freqs);
wpa_s->next_scan_freqs = NULL; wpa_s->next_scan_freqs = NULL;
os_free(wpa_s->select_network_scan_freqs);
wpa_s->select_network_scan_freqs = NULL;
wpa_bss_flush(wpa_s); wpa_bss_flush(wpa_s);
if (!dl_list_empty(&wpa_s->bss)) { if (!dl_list_empty(&wpa_s->bss)) {

View file

@ -1018,6 +1018,13 @@ ssid_list_set:
wpa_s->manual_scan_freqs = NULL; wpa_s->manual_scan_freqs = NULL;
} }
if (params.freqs == NULL && wpa_s->select_network_scan_freqs) {
wpa_dbg(wpa_s, MSG_DEBUG,
"Limit select_network scan to specified channels");
params.freqs = wpa_s->select_network_scan_freqs;
wpa_s->select_network_scan_freqs = NULL;
}
if (params.freqs == NULL && wpa_s->next_scan_freqs) { if (params.freqs == NULL && wpa_s->next_scan_freqs) {
wpa_dbg(wpa_s, MSG_DEBUG, "Optimize scan based on previously " wpa_dbg(wpa_s, MSG_DEBUG, "Optimize scan based on previously "
"generated frequency list"); "generated frequency list");

View file

@ -526,6 +526,8 @@ static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
os_free(wpa_s->manual_scan_freqs); os_free(wpa_s->manual_scan_freqs);
wpa_s->manual_scan_freqs = NULL; wpa_s->manual_scan_freqs = NULL;
os_free(wpa_s->select_network_scan_freqs);
wpa_s->select_network_scan_freqs = NULL;
os_free(wpa_s->manual_sched_scan_freqs); os_free(wpa_s->manual_sched_scan_freqs);
wpa_s->manual_sched_scan_freqs = NULL; wpa_s->manual_sched_scan_freqs = NULL;

View file

@ -665,6 +665,7 @@ struct wpa_supplicant {
struct os_reltime scan_min_time; struct os_reltime scan_min_time;
int scan_runs; /* number of scan runs since WPS was started */ int scan_runs; /* number of scan runs since WPS was started */
int *next_scan_freqs; int *next_scan_freqs;
int *select_network_scan_freqs;
int *manual_scan_freqs; int *manual_scan_freqs;
int *manual_sched_scan_freqs; int *manual_sched_scan_freqs;
unsigned int manual_scan_passive:1; unsigned int manual_scan_passive:1;