Allow AUTH->AUTH state transitions in the iwm(4) and iwx(4) drivers again.
authorstsp <stsp@openbsd.org>
Wed, 6 Oct 2021 13:36:47 +0000 (13:36 +0000)
committerstsp <stsp@openbsd.org>
Wed, 6 Oct 2021 13:36:47 +0000 (13:36 +0000)
AUTH->AUTH state transitions happen if the access point uses band-steering.
This was originally implemented to fix interop with some Aruba APs, and
was probably broken by my recent CVS commit XeKkqPoaUCklmgtC ("prevent
attempts to transition towards the same state").

ok mpi@

sys/dev/pci/if_iwm.c
sys/dev/pci/if_iwx.c

index 462b119..112de43 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_iwm.c,v 1.372 2021/10/06 13:35:55 stsp Exp $       */
+/*     $OpenBSD: if_iwm.c,v 1.373 2021/10/06 13:36:47 stsp Exp $       */
 
 /*
  * Copyright (c) 2014, 2016 genua gmbh <info@genua.de>
@@ -9008,9 +9008,11 @@ iwm_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
        /*
         * Prevent attemps to transition towards the same state, unless
         * we are scanning in which case a SCAN -> SCAN transition
-        * triggers another scan iteration.
+        * triggers another scan iteration. And AUTH -> AUTH is needed
+        * to support band-steering.
         */
-       if (sc->ns_nstate == nstate && nstate != IEEE80211_S_SCAN)
+       if (sc->ns_nstate == nstate && nstate != IEEE80211_S_SCAN &&
+           nstate != IEEE80211_S_AUTH)
                return 0;
 
        if (ic->ic_state == IEEE80211_S_RUN) {
index 692f125..55d0375 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_iwx.c,v 1.114 2021/10/02 07:48:20 stsp Exp $       */
+/*     $OpenBSD: if_iwx.c,v 1.115 2021/10/06 13:36:47 stsp Exp $       */
 
 /*
  * Copyright (c) 2014, 2016 genua gmbh <info@genua.de>
@@ -7874,9 +7874,11 @@ iwx_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
        /*
         * Prevent attemps to transition towards the same state, unless
         * we are scanning in which case a SCAN -> SCAN transition
-        * triggers another scan iteration.
+        * triggers another scan iteration. And AUTH -> AUTH is needed
+        * to support band-steering.
         */
-       if (sc->ns_nstate == nstate && nstate != IEEE80211_S_SCAN)
+       if (sc->ns_nstate == nstate && nstate != IEEE80211_S_SCAN &&
+           nstate != IEEE80211_S_AUTH)
                return 0;
 
        if (ic->ic_state == IEEE80211_S_RUN) {