Receiving an AUTH event means that we successfully authenticated, thus
authorpatrick <patrick@openbsd.org>
Thu, 4 Jan 2018 23:34:06 +0000 (23:34 +0000)
committerpatrick <patrick@openbsd.org>
Thu, 4 Jan 2018 23:34:06 +0000 (23:34 +0000)
we have to move to the "trying to" ASSOC state.  When association has
finished we will receive an ASSOC event, so that we can move into the
RUN state.  After that point we will receive ethernet packets and the
WPA2 handshake can occur.  The SET_SSID event will now only be used to
bring us back into SCAN when it notes an error, as it often completes
after we have already done the WPA2 handshake and can not be used to
switch between the different states.

sys/dev/ic/bwfm.c

index c610fd5..400f064 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bwfm.c,v 1.24 2018/01/03 21:01:16 patrick Exp $ */
+/* $OpenBSD: bwfm.c,v 1.25 2018/01/04 23:34:06 patrick Exp $ */
 /*
  * Copyright (c) 2010-2016 Broadcom Corporation
  * Copyright (c) 2016,2017 Patrick Wildt <patrick@blueri.se>
@@ -344,6 +344,7 @@ bwfm_init(struct ifnet *ifp)
        }
        evmask[BWFM_E_IF / 8] |= 1 << (BWFM_E_IF % 8);
        evmask[BWFM_E_LINK / 8] |= 1 << (BWFM_E_LINK % 8);
+       evmask[BWFM_E_AUTH / 8] |= 1 << (BWFM_E_AUTH % 8);
        evmask[BWFM_E_ASSOC / 8] |= 1 << (BWFM_E_ASSOC % 8);
        evmask[BWFM_E_SET_SSID / 8] |= 1 << (BWFM_E_SET_SSID % 8);
        evmask[BWFM_E_ESCAN_RESULT / 8] |= 1 << (BWFM_E_ESCAN_RESULT % 8);
@@ -1467,14 +1468,18 @@ bwfm_rx_event(struct bwfm_softc *sc, char *buf, size_t len)
                break;
                }
        case BWFM_E_SET_SSID:
+               if (ntohl(e->msg.status) != BWFM_E_STATUS_SUCCESS)
+                       ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
+               break;
+       case BWFM_E_AUTH:
                if (ntohl(e->msg.status) == BWFM_E_STATUS_SUCCESS)
-                       ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
+                       ieee80211_new_state(ic, IEEE80211_S_ASSOC, -1);
                else
                        ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
                break;
        case BWFM_E_ASSOC:
                if (ntohl(e->msg.status) == BWFM_E_STATUS_SUCCESS)
-                       ieee80211_new_state(ic, IEEE80211_S_ASSOC, -1);
+                       ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
                else
                        ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
                break;