aboutsummaryrefslogtreecommitdiffstats
path: root/wpa_supplicant
diff options
context:
space:
mode:
authorEyal Shapira <eyal@wizery.com>2012-01-24 18:24:15 +0200
committerArik Nemtsov <arik@wizery.com>2012-08-02 13:01:43 +0300
commit237c5f798c43589792704b16fe3f03f857808cae (patch)
treeb3e4e8bde51c7b9a6dd4d449a69aa2e7e36614d8 /wpa_supplicant
parent590300aec44dec0c6b5261954c859135517abaf6 (diff)
downloadexternal_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.c23
-rw-r--r--wpa_supplicant/wpa_supplicant.c6
-rw-r--r--wpa_supplicant/wpa_supplicant_i.h3
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);