]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
IBSS RSN: Add a timeout for Authentication frame exchange
authorJouni Malinen <j@w1.fi>
Tue, 27 Aug 2013 13:26:33 +0000 (16:26 +0300)
committerJouni Malinen <j@w1.fi>
Tue, 27 Aug 2013 13:26:33 +0000 (16:26 +0300)
It is possible for the peer device not to support Authentication frame
exchange even though this would be required functionality in the
standard. Furthermore, either Authentication frame may be lost. To
recover from cases where Authentication frame sequence 2 is not
received, start EAPOL Authenticator from one second timeout.

Signed-hostap: Jouni Malinen <j@w1.fi>

wpa_supplicant/ibss_rsn.c

index 55b9ae7a06b90b59be0676b4287d3e292116edcb..3e5d412eeb8c607721f03459d07ea328152e84db 100644 (file)
@@ -10,6 +10,7 @@
 
 #include "common.h"
 #include "common/wpa_ctrl.h"
+#include "utils/eloop.h"
 #include "l2_packet/l2_packet.h"
 #include "rsn_supp/wpa.h"
 #include "rsn_supp/wpa_ie.h"
@@ -20,6 +21,9 @@
 #include "ibss_rsn.h"
 
 
+static void ibss_rsn_auth_timeout(void *eloop_ctx, void *timeout_ctx);
+
+
 static struct ibss_rsn_peer * ibss_rsn_get_peer(struct ibss_rsn *ibss_rsn,
                                                const u8 *addr)
 {
@@ -34,6 +38,7 @@ static struct ibss_rsn_peer * ibss_rsn_get_peer(struct ibss_rsn *ibss_rsn,
 
 static void ibss_rsn_free(struct ibss_rsn_peer *peer)
 {
+       eloop_cancel_timeout(ibss_rsn_auth_timeout, peer, NULL);
        wpa_auth_sta_deinit(peer->auth);
        wpa_sm_deinit(peer->supp);
        os_free(peer);
@@ -543,6 +548,23 @@ ibss_rsn_peer_init(struct ibss_rsn *ibss_rsn, const u8 *addr)
 }
 
 
+static void ibss_rsn_auth_timeout(void *eloop_ctx, void *timeout_ctx)
+{
+       struct ibss_rsn_peer *peer = eloop_ctx;
+
+       /*
+        * Assume peer does not support Authentication exchange or the frame was
+        * lost somewhere - start EAPOL Authenticator.
+        */
+       wpa_printf(MSG_DEBUG,
+                  "RSN: Timeout on waiting Authentication frame response from "
+                  MACSTR " - start authenticator", MAC2STR(peer->addr));
+
+       peer->authentication_status |= IBSS_RSN_AUTH_BY_US;
+       ibss_rsn_auth_init(peer->ibss_rsn, peer);
+}
+
+
 int ibss_rsn_start(struct ibss_rsn *ibss_rsn, const u8 *addr)
 {
        struct ibss_rsn_peer *peer;
@@ -568,6 +590,7 @@ int ibss_rsn_start(struct ibss_rsn *ibss_rsn, const u8 *addr)
                return ibss_rsn_auth_init(ibss_rsn, peer);
        } else {
                os_get_time(&peer->own_auth_tx);
+               eloop_register_timeout(1, 0, ibss_rsn_auth_timeout, peer, NULL);
        }
 
        return 0;
@@ -882,7 +905,8 @@ void ibss_rsn_handle_auth(struct ibss_rsn *ibss_rsn, const u8 *auth_frame,
                }
 
                /* authentication has been completed */
-               wpa_printf(MSG_DEBUG, "RSN: IBSS Auth completed with "MACSTR,
+               eloop_cancel_timeout(ibss_rsn_auth_timeout, peer, NULL);
+               wpa_printf(MSG_DEBUG, "RSN: IBSS Auth completed with " MACSTR,
                           MAC2STR(header->sa));
                ibss_rsn_peer_authenticated(ibss_rsn, peer,
                                            IBSS_RSN_AUTH_BY_US);