Updated to hostap_2_6
[mech_eap.git] / libeap / src / rsn_supp / tdls.c
index 722c20a..e424168 100644 (file)
@@ -627,9 +627,15 @@ static void wpa_tdls_tpk_timeout(void *eloop_ctx, void *timeout_ctx)
         */
 
        if (peer->initiator) {
+               u8 addr[ETH_ALEN];
+
                wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime expired for " MACSTR
                           " - try to renew", MAC2STR(peer->addr));
-               wpa_tdls_start(sm, peer->addr);
+               /* cache the peer address before do_teardown */
+               os_memcpy(addr, peer->addr, ETH_ALEN);
+               wpa_tdls_do_teardown(sm, peer,
+                                    WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
+               wpa_tdls_start(sm, addr);
        } else {
                wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime expired for " MACSTR
                           " - tear down", MAC2STR(peer->addr));
@@ -2170,6 +2176,14 @@ static int wpa_tdls_process_tpk_m2(struct wpa_sm *sm, const u8 *src_addr,
                           "ignore TPK M2 from " MACSTR, MAC2STR(src_addr));
                return -1;
        }
+
+       if (peer->tpk_success) {
+               wpa_printf(MSG_INFO, "TDLS: Ignore incoming TPK M2 retry, from "
+                          MACSTR " as TPK M3 was already sent",
+                          MAC2STR(src_addr));
+               return 0;
+       }
+
        wpa_tdls_tpk_retry_timeout_cancel(sm, peer, WLAN_TDLS_SETUP_REQUEST);
 
        if (len < 3 + 2 + 1) {
@@ -2325,7 +2339,7 @@ static int wpa_tdls_process_tpk_m2(struct wpa_sm *sm, const u8 *src_addr,
                    kde.ftie, sizeof(*ftie));
        ftie = (struct wpa_tdls_ftie *) kde.ftie;
 
-       if (!os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) == 0) {
+       if (os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) != 0) {
                wpa_printf(MSG_INFO, "TDLS: FTIE SNonce in TPK M2 does "
                           "not match with FTIE SNonce used in TPK M1");
                /* Silently discard the frame */
@@ -2386,7 +2400,7 @@ skip_rsn:
        wpa_printf(MSG_DEBUG, "TDLS: Sending TDLS Setup Confirm / "
                   "TPK Handshake Message 3");
        if (wpa_tdls_send_tpk_m3(sm, src_addr, dtoken, lnkid, peer) < 0)
-               goto error;
+               goto error_no_msg;
 
        if (!peer->tpk_success) {
                /*
@@ -2407,6 +2421,7 @@ skip_rsn:
 error:
        wpa_tdls_send_error(sm, src_addr, WLAN_TDLS_SETUP_CONFIRM, dtoken, 1,
                            status);
+error_no_msg:
        wpa_tdls_disable_peer_link(sm, peer);
        return -1;
 }
@@ -2503,13 +2518,13 @@ static int wpa_tdls_process_tpk_m3(struct wpa_sm *sm, const u8 *src_addr,
                goto error;
        }
 
-       if (!os_memcmp(peer->rnonce, ftie->Anonce, WPA_NONCE_LEN) == 0) {
+       if (os_memcmp(peer->rnonce, ftie->Anonce, WPA_NONCE_LEN) != 0) {
                wpa_printf(MSG_INFO, "TDLS: FTIE ANonce in TPK M3 does "
                           "not match with FTIE ANonce used in TPK M2");
                goto error;
        }
 
-       if (!os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) == 0) {
+       if (os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) != 0) {
                wpa_printf(MSG_INFO, "TDLS: FTIE SNonce in TPK M3 does not "
                           "match with FTIE SNonce used in TPK M1");
                goto error;