SME: Handle association without own extra IEs
[libeap.git] / wpa_supplicant / sme.c
index 8148375..c66e522 100644 (file)
@@ -160,7 +160,7 @@ void sme_authenticate(struct wpa_supplicant *wpa_s,
        ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
        if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
                md = ie + 2;
-       wpa_sm_set_ft_params(wpa_s->wpa, md, NULL, 0, NULL);
+       wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
        if (md) {
                /* Prepare for the next transition */
                wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
@@ -178,12 +178,13 @@ void sme_authenticate(struct wpa_supplicant *wpa_s,
                        mdie = (struct rsn_mdie *) pos;
                        os_memcpy(mdie->mobility_domain, md,
                                  MOBILITY_DOMAIN_ID_LEN);
-                       mdie->ft_capab = 0;
+                       mdie->ft_capab = md[MOBILITY_DOMAIN_ID_LEN];
                        wpa_s->sme.assoc_req_ie_len += 5;
                }
 
                if (wpa_s->sme.ft_used &&
-                   os_memcmp(md, wpa_s->sme.mobility_domain, 2) == 0) {
+                   os_memcmp(md, wpa_s->sme.mobility_domain, 2) == 0 &&
+                   wpa_sm_has_ptk(wpa_s->wpa)) {
                        wpa_printf(MSG_DEBUG, "SME: Trying to use FT "
                                   "over-the-air");
                        params.auth_alg = WPA_AUTH_ALG_FT;
@@ -323,7 +324,8 @@ void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode,
 
        wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
 
-       if (ieee802_11_parse_elems(params.wpa_ie, params.wpa_ie_len, &elems, 0)
+       if (params.wpa_ie == NULL ||
+           ieee802_11_parse_elems(params.wpa_ie, params.wpa_ie_len, &elems, 0)
            < 0) {
                wpa_printf(MSG_DEBUG, "SME: Could not parse own IEs?!");
                os_memset(&elems, 0, sizeof(elems));