diff options
author | Eyal Shapira <eyal@wizery.com> | 2012-01-24 18:24:15 +0200 |
---|---|---|
committer | Arik Nemtsov <arik@wizery.com> | 2012-08-02 13:01:43 +0300 |
commit | 237c5f798c43589792704b16fe3f03f857808cae (patch) | |
tree | b3e4e8bde51c7b9a6dd4d449a69aa2e7e36614d8 /wpa_supplicant | |
parent | 590300aec44dec0c6b5261954c859135517abaf6 (diff) | |
download | external_wpa_supplicant_8_ti-237c5f798c43589792704b16fe3f03f857808cae.zip external_wpa_supplicant_8_ti-237c5f798c43589792704b16fe3f03f857808cae.tar.gz external_wpa_supplicant_8_ti-237c5f798c43589792704b16fe3f03f857808cae.tar.bz2 |
wpa_s: Disable bgscan and roaming when driver support is limited
Some drivers are limited in certain conditions (e.g. wl12xx
on multi role with a single channel) and would like wpa_s
to disable bgscan and roaming attempts in these situations.
Signed-off-by: Eyal Shapira <eyal@wizery.com>
Diffstat (limited to 'wpa_supplicant')
-rw-r--r-- | wpa_supplicant/events.c | 23 | ||||
-rw-r--r-- | wpa_supplicant/wpa_supplicant.c | 6 | ||||
-rw-r--r-- | wpa_supplicant/wpa_supplicant_i.h | 3 |
3 files changed, 29 insertions, 3 deletions
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index c1f2364..14cf0ac 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -935,6 +935,11 @@ static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s, return 1; /* we are not associated; continue */ if (wpa_s->current_ssid == NULL) return 1; /* unknown current SSID */ + if (wpa_s->roaming_disabled) { + wpa_dbg(wpa_s, MSG_DEBUG, "Skip roam - " + "driver doesn't allow roaming now"); + return 0; + } if (wpa_s->current_ssid != ssid) return 1; /* different network block */ @@ -2660,6 +2665,24 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, data->signal_change.current_noise, data->signal_change.current_txrate); break; + + + case EVENT_ROAMING_ENABLED: +#ifdef CONFIG_BGSCAN + if (wpa_s->roaming_disabled && + wpa_s->wpa_state == WPA_COMPLETED) + wpa_supplicant_start_bgscan(wpa_s); +#endif /* CONFIG_BGSCAN */ + wpa_s->roaming_disabled = 0; + break; + + case EVENT_ROAMING_DISABLED: + wpa_s->roaming_disabled = 1; +#ifdef CONFIG_BGSCAN + wpa_supplicant_stop_bgscan(wpa_s); +#endif /* CONFIG_BGSCAN */ + break; + case EVENT_INTERFACE_ENABLED: wpa_dbg(wpa_s, MSG_DEBUG, "Interface was enabled"); if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 3bb3b18..a9fa9e9 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -537,7 +537,7 @@ const char * wpa_supplicant_state_txt(enum wpa_states state) #ifdef CONFIG_BGSCAN -static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s) +void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s) { if (wpas_driver_bss_selection(wpa_s)) return; @@ -565,7 +565,7 @@ static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s) } -static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s) +void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s) { if (wpa_s->bgscan_ssid != NULL) { bgscan_deinit(wpa_s); @@ -653,7 +653,7 @@ void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, wpa_s->wpa_state = state; #ifdef CONFIG_BGSCAN - if (state == WPA_COMPLETED) + if (state == WPA_COMPLETED && !wpa_s->roaming_disabled) wpa_supplicant_start_bgscan(wpa_s); else wpa_supplicant_stop_bgscan(wpa_s); diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index f879990..b675a63 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -538,6 +538,7 @@ struct wpa_supplicant { struct wpa_ssid *bgscan_ssid; const struct bgscan_ops *bgscan; void *bgscan_priv; + int roaming_disabled; const struct autoscan_ops *autoscan; struct wpa_driver_scan_params *autoscan_params; @@ -605,6 +606,8 @@ void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s, void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s); void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, enum wpa_states state); +void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s); +void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s); struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s); const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s); void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s); |