diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2013-11-21 01:42:07 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2013-11-21 01:42:07 -0800 |
| commit | d6c622bb35667127535d394688b762f5d6691fc4 (patch) | |
| tree | 513f325b888f8f8cb56570d03e0ff79e5468b5b7 | |
| parent | 698bb5f4c8d430965251ab342c2403a9f815e614 (diff) | |
| parent | e14feed81d12a0130e605c2815a30271fd9aa4e3 (diff) | |
| download | android_external_wpa_supplicant_8-d6c622bb35667127535d394688b762f5d6691fc4.tar.gz android_external_wpa_supplicant_8-d6c622bb35667127535d394688b762f5d6691fc4.tar.bz2 android_external_wpa_supplicant_8-d6c622bb35667127535d394688b762f5d6691fc4.zip | |
Merge "Interworking: Do not reconnect if already connected"
| -rw-r--r-- | src/common/wpa_ctrl.h | 1 | ||||
| -rw-r--r-- | wpa_supplicant/interworking.c | 39 |
2 files changed, 40 insertions, 0 deletions
diff --git a/src/common/wpa_ctrl.h b/src/common/wpa_ctrl.h index fd7f686c..1156043f 100644 --- a/src/common/wpa_ctrl.h +++ b/src/common/wpa_ctrl.h @@ -149,6 +149,7 @@ extern "C" { #define INTERWORKING_AP "INTERWORKING-AP " #define INTERWORKING_NO_MATCH "INTERWORKING-NO-MATCH " +#define INTERWORKING_ALREADY_CONNECTED "INTERWORKING-ALREADY-CONNECTED " #define GAS_RESPONSE_INFO "GAS-RESPONSE-INFO " diff --git a/wpa_supplicant/interworking.c b/wpa_supplicant/interworking.c index 4c699378..a9af8b42 100644 --- a/wpa_supplicant/interworking.c +++ b/wpa_supplicant/interworking.c @@ -748,6 +748,26 @@ static int set_root_nai(struct wpa_ssid *ssid, const char *imsi, char prefix) #endif /* INTERWORKING_3GPP */ +static int already_connected(struct wpa_supplicant *wpa_s, + struct wpa_cred *cred, struct wpa_bss *bss) +{ + struct wpa_ssid *ssid; + + if (wpa_s->wpa_state < WPA_ASSOCIATED || wpa_s->current_ssid == NULL) + return 0; + + ssid = wpa_s->current_ssid; + if (ssid->parent_cred != cred) + return 0; + + if (ssid->ssid_len != bss->ssid_len || + os_memcmp(ssid->ssid, bss->ssid, bss->ssid_len) != 0) + return 0; + + return 1; +} + + static int interworking_set_hs20_params(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) { @@ -783,6 +803,12 @@ static int interworking_connect_3gpp(struct wpa_supplicant *wpa_s, wpa_printf(MSG_DEBUG, "Interworking: Connect with " MACSTR " (3GPP)", MAC2STR(bss->bssid)); + if (already_connected(wpa_s, cred, bss)) { + wpa_msg(wpa_s, MSG_INFO, INTERWORKING_ALREADY_CONNECTED MACSTR, + MAC2STR(bss->bssid)); + return 0; + } + ssid = wpa_config_add_network(wpa_s->conf); if (ssid == NULL) return -1; @@ -1114,6 +1140,12 @@ static int interworking_connect_roaming_consortium( wpa_printf(MSG_DEBUG, "Interworking: Connect with " MACSTR " based on " "roaming consortium match", MAC2STR(bss->bssid)); + if (already_connected(wpa_s, cred, bss)) { + wpa_msg(wpa_s, MSG_INFO, INTERWORKING_ALREADY_CONNECTED MACSTR, + MAC2STR(bss->bssid)); + return 0; + } + ssid = wpa_config_add_network(wpa_s->conf); if (ssid == NULL) return -1; @@ -1249,6 +1281,13 @@ int interworking_connect(struct wpa_supplicant *wpa_s, struct wpa_bss *bss) wpa_printf(MSG_DEBUG, "Interworking: Connect with " MACSTR, MAC2STR(bss->bssid)); + if (already_connected(wpa_s, cred, bss)) { + wpa_msg(wpa_s, MSG_INFO, INTERWORKING_ALREADY_CONNECTED MACSTR, + MAC2STR(bss->bssid)); + nai_realm_free(realm, count); + return 0; + } + ssid = wpa_config_add_network(wpa_s->conf); if (ssid == NULL) { nai_realm_free(realm, count); |
