From 3139270903af6f0fc4e2d26ab4125071eae45af9 Mon Sep 17 00:00:00 2001 From: Haim Dreyfuss Date: Sun, 3 Nov 2013 15:19:59 +0200 Subject: [PATCH] bgscan: Add global bgscan configuration This option can be used to globally configure bgscan parameters for all the network blocks. Note that this configuration will not override a network block specific bgscan settings, but will only be used in case that the network block does not have a valid bgscan configuration. Signed-hostap: Haim Dreyfuss --- wpa_supplicant/bgscan.c | 6 +++--- wpa_supplicant/bgscan.h | 5 +++-- wpa_supplicant/config.c | 19 +++++++++++++++++++ wpa_supplicant/config.h | 12 ++++++++++++ wpa_supplicant/wpa_supplicant.c | 12 ++++++++++-- wpa_supplicant/wpa_supplicant.conf | 4 ++++ 6 files changed, 51 insertions(+), 7 deletions(-) diff --git a/wpa_supplicant/bgscan.c b/wpa_supplicant/bgscan.c index 9a9bd5207..f74cdbf24 100644 --- a/wpa_supplicant/bgscan.c +++ b/wpa_supplicant/bgscan.c @@ -31,9 +31,9 @@ static const struct bgscan_ops * bgscan_modules[] = { }; -int bgscan_init(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) +int bgscan_init(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, + const char *name) { - const char *name = ssid->bgscan; const char *params; size_t nlen; int i; @@ -41,7 +41,7 @@ int bgscan_init(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) bgscan_deinit(wpa_s); if (name == NULL) - return 0; + return -1; params = os_strchr(name, ':'); if (params == NULL) { diff --git a/wpa_supplicant/bgscan.h b/wpa_supplicant/bgscan.h index e9d15fc5c..9131e4ecd 100644 --- a/wpa_supplicant/bgscan.h +++ b/wpa_supplicant/bgscan.h @@ -29,7 +29,8 @@ struct bgscan_ops { #ifdef CONFIG_BGSCAN -int bgscan_init(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid); +int bgscan_init(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, + const char *name); void bgscan_deinit(struct wpa_supplicant *wpa_s); int bgscan_notify_scan(struct wpa_supplicant *wpa_s, struct wpa_scan_results *scan_res); @@ -41,7 +42,7 @@ void bgscan_notify_signal_change(struct wpa_supplicant *wpa_s, int above, #else /* CONFIG_BGSCAN */ static inline int bgscan_init(struct wpa_supplicant *wpa_s, - struct wpa_ssid *ssid) + struct wpa_ssid *ssid, const char name) { return 0; } diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c index 08d2ecdd9..19bcecebd 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -2848,6 +2848,24 @@ static int wpa_global_config_parse_str(const struct global_parse_data *data, } +static int wpa_config_process_bgscan(const struct global_parse_data *data, + struct wpa_config *config, int line, + const char *pos) +{ + size_t len; + char *tmp; + + tmp = wpa_config_parse_string(pos, &len); + if (tmp == NULL) { + wpa_printf(MSG_ERROR, "Line %d: failed to parse %s", + line, data->name); + return -1; + } + + return wpa_global_config_parse_str(data, config, line, tmp); +} + + static int wpa_global_config_parse_bin(const struct global_parse_data *data, struct wpa_config *config, int line, const char *pos) @@ -3209,6 +3227,7 @@ static const struct global_parse_data global_fields[] = { #endif /* CONFIG_CTRL_IFACE */ { INT_RANGE(eapol_version, 1, 2), 0 }, { INT(ap_scan), 0 }, + { FUNC(bgscan), 0 }, { INT(disable_scan_offload), 0 }, { INT(fast_reauth), 0 }, { STR(opensc_engine_path), 0 }, diff --git a/wpa_supplicant/config.h b/wpa_supplicant/config.h index 8cbeb6286..55a2d62ed 100644 --- a/wpa_supplicant/config.h +++ b/wpa_supplicant/config.h @@ -328,6 +328,18 @@ struct wpa_config { */ int ap_scan; + /** + * bgscan - Background scan and roaming parameters or %NULL if none + * + * This is an optional set of parameters for background scanning and + * roaming within a network (ESS). For more detailed information see + * ssid block documentation. + * + * The variable defines default bgscan behavior for all BSS station + * networks except for those which have their own bgscan configuration. + */ + char *bgscan; + /** * disable_scan_offload - Disable automatic offloading of scan requests * diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 255c712a2..3abe460d6 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -570,14 +570,22 @@ const char * wpa_supplicant_state_txt(enum wpa_states state) static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s) { + const char *name; + + if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan) + name = wpa_s->current_ssid->bgscan; + else + name = wpa_s->conf->bgscan; + if (name == NULL) + return; if (wpas_driver_bss_selection(wpa_s)) return; if (wpa_s->current_ssid == wpa_s->bgscan_ssid) return; bgscan_deinit(wpa_s); - if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan) { - if (bgscan_init(wpa_s, wpa_s->current_ssid)) { + if (wpa_s->current_ssid) { + if (bgscan_init(wpa_s, wpa_s->current_ssid, name)) { wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize " "bgscan"); /* diff --git a/wpa_supplicant/wpa_supplicant.conf b/wpa_supplicant/wpa_supplicant.conf index 11be8dd51..0ecfaa68b 100644 --- a/wpa_supplicant/wpa_supplicant.conf +++ b/wpa_supplicant/wpa_supplicant.conf @@ -550,6 +550,10 @@ fast_reauth=1 # [:]" # bgscan="learn:30:-45:300:/etc/wpa_supplicant/network1.bgscan" # +# This option can also be set outside of all network blocks for the bgscan +# parameter to apply for all the networks that have no specific bgscan +# parameter. +# # proto: list of accepted protocols # WPA = WPA/IEEE 802.11i/D3.0 # RSN = WPA2/IEEE 802.11i (also WPA2 can be used as an alias for RSN)