]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
mka: Send MKPDUs forever if mode is PSK
authorBadrish Adiga H R <badrish.adigahr@gmail.com>
Tue, 7 Feb 2017 08:58:31 +0000 (14:28 +0530)
committerJouni Malinen <j@w1.fi>
Fri, 10 Feb 2017 17:48:12 +0000 (19:48 +0200)
Issue: When 2 peers are running MACsec in PSK mode with CA
established, if the interface goes down and comes up after
time > 10 seconds, CA does not get re-established.

Root cause: This is because retry_count of both the peers
would have reached MAX_RETRY_CNT and stays idle for other to
respond. This is clear deadlock situation where peer A waits
for MKA packets from peer B to wake up and vice-versa.

Fix: If MACsec is running in PSK mode, we should send MKPDUs
forever for every 2 seconds.

Signed-off-by: Badrish Adiga H R <badrish.adigahr@gmail.com>
src/pae/ieee802_1x_kay.c
src/pae/ieee802_1x_kay_i.h

index 92fd7ba2618f8d2febccfab3b32704d324916140..e420fc13eaf93b0d0a0caf657b03e24981e7ea0c 100644 (file)
@@ -2428,7 +2428,8 @@ static void ieee802_1x_participant_timer(void *eloop_ctx, void *timeout_ctx)
                participant->new_sak = FALSE;
        }
 
-       if (participant->retry_count < MAX_RETRY_CNT) {
+       if (participant->retry_count < MAX_RETRY_CNT ||
+           participant->mode == PSK) {
                ieee802_1x_participant_send_mkpdu(participant);
                participant->retry_count++;
        }
@@ -2828,7 +2829,7 @@ int ieee802_1x_kay_enable_new_info(struct ieee802_1x_kay *kay)
        if (!principal)
                return -1;
 
-       if (principal->retry_count < MAX_RETRY_CNT) {
+       if (principal->retry_count < MAX_RETRY_CNT || principal->mode == PSK) {
                ieee802_1x_participant_send_mkpdu(principal);
                principal->retry_count++;
        }
@@ -3368,6 +3369,7 @@ ieee802_1x_kay_create_mka(struct ieee802_1x_kay *kay, struct mka_key_name *ckn,
                participant->mka_life = MKA_LIFE_TIME / 1000 + time(NULL) +
                        usecs / 1000000;
        }
+       participant->mode = mode;
 
        return participant;
 
index 0c4bb8e8a7905789fa3bcb06ac982594bbfe452a..bc522d89852bf6c77a025ce80680fb3d0e3befbd 100644 (file)
@@ -93,6 +93,7 @@ struct ieee802_1x_mka_participant {
        Boolean active;
        Boolean participant;
        Boolean retain;
+       enum mka_created_mode mode;
 
        enum { DEFAULT, DISABLED, ON_OPER_UP, ALWAYS } activate;