diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index d725f9285..1a7f2f79c 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -2513,10 +2513,6 @@ retry: wpa_hexdump(MSG_DEBUG, " * IEs", params->ie, params->ie_len); if (params->ie) NLA_PUT(msg, NL80211_ATTR_IE, params->ie_len, params->ie); - /* - * TODO: if multiple auth_alg options enabled, try them one by one if - * the AP rejects authentication due to unknown auth alg - */ if (params->auth_alg & WPA_AUTH_ALG_OPEN) type = NL80211_AUTHTYPE_OPEN_SYSTEM; else if (params->auth_alg & WPA_AUTH_ALG_SHARED) diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c index b5927c50c..7cf3cc139 100644 --- a/wpa_supplicant/sme.c +++ b/wpa_supplicant/sme.c @@ -274,7 +274,33 @@ void sme_event_auth(struct wpa_supplicant *wpa_s, union wpa_event_data *data) if (data->auth.status_code != WLAN_STATUS_SUCCESS) { wpa_printf(MSG_DEBUG, "SME: Authentication failed (status " "code %d)", data->auth.status_code); - return; + + if (data->auth.status_code != + WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG || + wpa_s->sme.auth_alg == data->auth.auth_type || + wpa_s->current_ssid->auth_alg == WPA_AUTH_ALG_LEAP) + return; + + switch (data->auth.auth_type) { + case WLAN_AUTH_OPEN: + wpa_s->current_ssid->auth_alg = WPA_AUTH_ALG_SHARED; + + wpa_printf(MSG_DEBUG, "SME: Trying SHARED auth"); + wpa_supplicant_associate(wpa_s, wpa_s->current_bss, + wpa_s->current_ssid); + return; + + case WLAN_AUTH_SHARED_KEY: + wpa_s->current_ssid->auth_alg = WPA_AUTH_ALG_LEAP; + + wpa_printf(MSG_DEBUG, "SME: Trying LEAP auth"); + wpa_supplicant_associate(wpa_s, wpa_s->current_bss, + wpa_s->current_ssid); + return; + + default: + return; + } } #ifdef CONFIG_IEEE80211R