1ff66a890SHiten Pandya.\" 2*05ac2d0dSSascha Wildner.\" Copyright (c) 2009 Sam Leffler, Errno Consulting 3ff66a890SHiten Pandya.\" All rights reserved. 4ff66a890SHiten Pandya.\" 5ff66a890SHiten Pandya.\" Redistribution and use in source and binary forms, with or without 6ff66a890SHiten Pandya.\" modification, are permitted provided that the following conditions 7ff66a890SHiten Pandya.\" are met: 8ff66a890SHiten Pandya.\" 1. Redistributions of source code must retain the above copyright 9ff66a890SHiten Pandya.\" notice, this list of conditions and the following disclaimer. 10ff66a890SHiten Pandya.\" 2. Redistributions in binary form must reproduce the above copyright 11ff66a890SHiten Pandya.\" notice, this list of conditions and the following disclaimer in the 12ff66a890SHiten Pandya.\" documentation and/or other materials provided with the distribution. 13ff66a890SHiten Pandya.\" 14ff66a890SHiten Pandya.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15ff66a890SHiten Pandya.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16ff66a890SHiten Pandya.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17ff66a890SHiten Pandya.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18ff66a890SHiten Pandya.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19ff66a890SHiten Pandya.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20ff66a890SHiten Pandya.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21ff66a890SHiten Pandya.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22ff66a890SHiten Pandya.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23ff66a890SHiten Pandya.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24ff66a890SHiten Pandya.\" SUCH DAMAGE. 25ff66a890SHiten Pandya.\" 26*05ac2d0dSSascha Wildner.\" $FreeBSD: src/share/man/man9/ieee80211_proto.9,v 1.5 2009/09/18 00:33:47 brueffer Exp $ 27ff66a890SHiten Pandya.\" 28*05ac2d0dSSascha Wildner.Dd April 28, 2010 29ff66a890SHiten Pandya.Dt IEEE80211_PROTO 9 30ff66a890SHiten Pandya.Os 31ff66a890SHiten Pandya.Sh NAME 32*05ac2d0dSSascha Wildner.Nm ieee80211_proto 33*05ac2d0dSSascha Wildner.Nd 802.11 state machine support 34ff66a890SHiten Pandya.Sh SYNOPSIS 35*05ac2d0dSSascha Wildner.In net80211/ieee80211_var.h 36*05ac2d0dSSascha Wildner.Pp 37ff66a890SHiten Pandya.Ft void 38*05ac2d0dSSascha Wildner.Fn ieee80211_start_all "struct ieee80211com *" 39ff66a890SHiten Pandya.Ft void 40*05ac2d0dSSascha Wildner.Fn ieee80211_stop_all "struct ieee80211com *" 41ff66a890SHiten Pandya.Ft void 42*05ac2d0dSSascha Wildner.Fn ieee80211_suspend_all "struct ieee80211com *" 43ff66a890SHiten Pandya.Ft void 44*05ac2d0dSSascha Wildner.Fn ieee80211_resume_all "struct ieee80211com *" 45*05ac2d0dSSascha Wildner.Pp 46*05ac2d0dSSascha Wildner.Dv enum ieee80211_state ; 47ff66a890SHiten Pandya.Ft int 48*05ac2d0dSSascha Wildner.Fn ieee80211_new_state "struct ieee80211vap *" "enum ieee80211_state" "int" 49*05ac2d0dSSascha Wildner.Pp 50*05ac2d0dSSascha Wildner.Ft void 51*05ac2d0dSSascha Wildner.Fn ieee80211_wait_for_parent "struct ieee80211com *" 52ff66a890SHiten Pandya.Sh DESCRIPTION 53ff66a890SHiten PandyaThe 54*05ac2d0dSSascha Wildner.Nm net80211 55*05ac2d0dSSascha Wildnerlayer that supports 802.11 device drivers uses a state machine 56*05ac2d0dSSascha Wildnerto control operation of vaps. 57*05ac2d0dSSascha WildnerThese state machines vary according to the vap operating mode. 58*05ac2d0dSSascha WildnerStation mode state machines follow the 802.11 MLME states 59*05ac2d0dSSascha Wildnerin the protocol specification. 60*05ac2d0dSSascha WildnerOther state machines are simpler and reflect operational work 61*05ac2d0dSSascha Wildnersuch as scanning for a BSS or automatically selecting a channel to 62*05ac2d0dSSascha Wildneroperate on. 63*05ac2d0dSSascha WildnerWhen multiple vaps are operational the state machines are used to 64*05ac2d0dSSascha Wildnercoordinate operation such as choosing a channel. 65*05ac2d0dSSascha WildnerThe state machine mechanism also serves to bind the 66*05ac2d0dSSascha Wildner.Nm net80211 67*05ac2d0dSSascha Wildnerlayer to a driver; this is described more below. 68*05ac2d0dSSascha Wildner.Pp 69*05ac2d0dSSascha WildnerThe following states are defined for state machines: 70*05ac2d0dSSascha Wildner.Bl -tag -width IEEE80211_S_ASSOC 71*05ac2d0dSSascha Wildner.It Dv IEEE80211_S_INIT 72*05ac2d0dSSascha WildnerDefault/initial state. 73*05ac2d0dSSascha WildnerA vap in this state should not hold any dynamic state (e.g. entries 74*05ac2d0dSSascha Wildnerfor associated stations in the node table). 75*05ac2d0dSSascha WildnerThe driver must quiesce the hardware; e.g. there should be no 76*05ac2d0dSSascha Wildnerinterrupts firing. 77*05ac2d0dSSascha Wildner.It Dv IEEE80211_S_SCAN 78*05ac2d0dSSascha WildnerScanning for a BSS or choosing a channel to operate on. 79*05ac2d0dSSascha WildnerNote that scanning can also take place in other states (e.g. when 80*05ac2d0dSSascha Wildnerbackground scanning is active); this state is entered when 81*05ac2d0dSSascha Wildnerinitially bringing a vap to an operational state or after an 82*05ac2d0dSSascha Wildnerevent such as a beacon miss (in station mode). 83*05ac2d0dSSascha Wildner.It Dv IEEE80211_S_AUTH 84*05ac2d0dSSascha WildnerAuthenticating to an access point (in station mode). 85*05ac2d0dSSascha WildnerThis state is normally reached from 86*05ac2d0dSSascha Wildner.Dv IEEE80211_S_SCAN 87*05ac2d0dSSascha Wildnerafter selecting a BSS, but may also be reached from 88*05ac2d0dSSascha Wildner.Dv IEEE80211_S_ASSOC 89*05ac2d0dSSascha Wildneror 90*05ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 91*05ac2d0dSSascha Wildnerif the authentication handshake fails. 92*05ac2d0dSSascha Wildner.It Dv IEEE80211_S_ASSOC 93*05ac2d0dSSascha WildnerAssociating to an access point (in station mode). 94*05ac2d0dSSascha WildnerThis state is reached from 95*05ac2d0dSSascha Wildner.Dv IEEE80211_S_AUTH 96*05ac2d0dSSascha Wildnerafter successfully authenticating or from 97*05ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 98*05ac2d0dSSascha Wildnerif a DisAssoc frame is received. 99*05ac2d0dSSascha Wildner.It Dv IEEE80211_S_CAC 100*05ac2d0dSSascha WildnerDoing Channel Availability Check (CAC). 101*05ac2d0dSSascha WildnerThis state is entered only when DFS is enabled and the channel selected 102*05ac2d0dSSascha Wildnerfor operation requires CAC. 103*05ac2d0dSSascha Wildner.It Dv IEEE80211_S_RUN 104*05ac2d0dSSascha WildnerOperational. 105*05ac2d0dSSascha WildnerIn this state a vap can transmit data frames, accept requests for 106*05ac2d0dSSascha Wildnerstations associating, etc. 107*05ac2d0dSSascha WildnerBeware that data traffic is also gated by whether the associated 108*05ac2d0dSSascha Wildner.Dq port 109*05ac2d0dSSascha Wildneris authorized. 110*05ac2d0dSSascha WildnerWhen WPA/802.11i/802.1x is operational authorization may happen separately; 111*05ac2d0dSSascha Wildnere.g. in station mode 112*05ac2d0dSSascha Wildner.Xr wpa_supplicant 8 113*05ac2d0dSSascha Wildnermust complete the handshakes and plumb the necessary keys before a port 114*05ac2d0dSSascha Wildneris authorized. 115*05ac2d0dSSascha WildnerIn this state a BSS is operational and associated state is valid and may 116*05ac2d0dSSascha Wildnerbe used; e.g. 117*05ac2d0dSSascha Wildner.Vt ic_bss 118ff66a890SHiten Pandyaand 119*05ac2d0dSSascha Wildner.Vt ic_bsschan 120*05ac2d0dSSascha Wildnerare guaranteed to be usable. 121*05ac2d0dSSascha Wildner.It Dv IEEE80211_S_CSA 122*05ac2d0dSSascha WildnerChannel Switch Announcement (CSA) is pending. 123*05ac2d0dSSascha WildnerThis state is reached only from 124*05ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 125*05ac2d0dSSascha Wildnerwhen either a CSA is received from an access point (in station mode) 126*05ac2d0dSSascha Wildneror the local station is preparing to change channel. 127*05ac2d0dSSascha WildnerIn this state traffic may be muted depending on the Mute setting in the CSA. 128*05ac2d0dSSascha Wildner.It Dv IEEE80211_S_SLEEP 129*05ac2d0dSSascha WildnerAsleep to save power (in station mode). 130*05ac2d0dSSascha WildnerThis state is reached only from 131*05ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 132*05ac2d0dSSascha Wildnerwhen power save operation is enabled and the local station is deemed 133*05ac2d0dSSascha Wildnersufficiently idle to enter low power mode. 134*05ac2d0dSSascha Wildner.El 135*05ac2d0dSSascha Wildner.Pp 136*05ac2d0dSSascha WildnerNote that states are ordered (as shown above); 137*05ac2d0dSSascha Wildnere.g. a vap must be in the 138*05ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 139*05ac2d0dSSascha Wildneror 140*05ac2d0dSSascha Wildner.Dq greater 141*05ac2d0dSSascha Wildnerbefore it can transmit frames. 142*05ac2d0dSSascha WildnerCertain 143*05ac2d0dSSascha Wildner.Nm net80211 144*05ac2d0dSSascha Wildnerdata are valid only in certain states; e.g. the 145*05ac2d0dSSascha Wildner.Vt iv_bsschan 146*05ac2d0dSSascha Wildnerthat specifies the channel for the operating BSS should never be used 147*05ac2d0dSSascha Wildnerexcept in 148*05ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 149*05ac2d0dSSascha Wildneror greater. 150*05ac2d0dSSascha Wildner.Sh STATE CHANGES 151*05ac2d0dSSascha WildnerState machine changes are typically handled internal to the 152*05ac2d0dSSascha Wildner.Nm net80211 153*05ac2d0dSSascha Wildnerlayer in response to 154*05ac2d0dSSascha Wildner.Xr ioctl 2 155*05ac2d0dSSascha Wildnerrequests, received frames, or external events such as a beacon miss. 156*05ac2d0dSSascha WildnerThe 157*05ac2d0dSSascha Wildner.Fn ieee80211_new_state 158*05ac2d0dSSascha Wildnerfunction is used to initiate a state machine change on a vap. 159*05ac2d0dSSascha WildnerThe new state and an optional argument are supplied. 160*05ac2d0dSSascha WildnerThe request is initially processed to handle coordination of multiple vaps. 161*05ac2d0dSSascha WildnerFor example, only one vap at a time can be scanning, if multiple vaps 162*05ac2d0dSSascha Wildnerrequest a change to 163*05ac2d0dSSascha Wildner.Dv IEEE80211_S_SCAN 164*05ac2d0dSSascha Wildnerthe first will be permitted to run and the others will be 165*05ac2d0dSSascha Wildner.Em deferred 166*05ac2d0dSSascha Wildneruntil the scan operation completes at which time the selected channel 167*05ac2d0dSSascha Wildnerwill be adopted. 168*05ac2d0dSSascha WildnerSimilarly 169*05ac2d0dSSascha Wildner.Nm net80211 170*05ac2d0dSSascha Wildnerhandles coordination of combinations of vaps such as an AP and station vap 171*05ac2d0dSSascha Wildnerwhere the station may need to roam to follow the AP it is associated to 172*05ac2d0dSSascha Wildner(dragging along the AP vap to the new channel). 173*05ac2d0dSSascha WildnerAnother important coordination is the handling of 174*05ac2d0dSSascha Wildner.Dv IEEE80211_S_CAC 175*05ac2d0dSSascha Wildnerand 176*05ac2d0dSSascha Wildner.Dv IEEE80211_S_CSA . 177*05ac2d0dSSascha WildnerNo more than one vap can ever be actively changing state at a time. 178*05ac2d0dSSascha WildnerIn fact 179*05ac2d0dSSascha Wildner.Nm net80211 180*05ac2d0dSSascha Wildnersingle-threads the state machine logic in a dedicated 181*05ac2d0dSSascha Wildner.Xr taskqueue 9 182*05ac2d0dSSascha Wildnerthread that is also used to synchronize work such as scanning and 183*05ac2d0dSSascha Wildnerbeacon miss handling. 184*05ac2d0dSSascha Wildner.Pp 185*05ac2d0dSSascha WildnerAfter multi-vap scheduling/coordination is done the per-vap 186*05ac2d0dSSascha Wildner.Vt iv_newstate 187*05ac2d0dSSascha Wildnermethod is called to carry out the state change work. 188*05ac2d0dSSascha WildnerDrivers use this entry to setup private state and then dispatch 189*05ac2d0dSSascha Wildnerthe call to the 190*05ac2d0dSSascha Wildner.Nm net80211 191*05ac2d0dSSascha Wildnerlayer using the previously defined method pointer (in OOP-parlance they 192*05ac2d0dSSascha Wildnercall the 193*05ac2d0dSSascha Wildner.Dq super method 194*05ac2d0dSSascha Wildner). 195*05ac2d0dSSascha Wildner.Pp 196*05ac2d0dSSascha Wildner.Nm net80211 197*05ac2d0dSSascha Wildnerhandles two state changes specially. 198*05ac2d0dSSascha WildnerOn transition to 199*05ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 200*05ac2d0dSSascha Wildnerthe 201*05ac2d0dSSascha Wildner.Dv IFF_DRV_OACTIVE 202*05ac2d0dSSascha Wildnerbit on the vap's transmit queue is cleared so traffic can flow. 203*05ac2d0dSSascha WildnerOn transition to 204*05ac2d0dSSascha Wildner.Dv IEEE80211_S_INIT 205*05ac2d0dSSascha Wildnerany state in the scan cache associated with the vap is flushed 206*05ac2d0dSSascha Wildnerand any frames pending on the transmit queue are flushed. 207*05ac2d0dSSascha Wildner.Sh DRIVER INTEGRATION 208*05ac2d0dSSascha WildnerDrivers are expected to override the 209*05ac2d0dSSascha Wildner.Vt iv_newstate 210*05ac2d0dSSascha Wildnermethod to interpose their own code and handle setup work required 211*05ac2d0dSSascha Wildnerby state changes. 212*05ac2d0dSSascha WildnerOtherwise drivers must call 213*05ac2d0dSSascha Wildner.Fn ieee80211_start_all 214*05ac2d0dSSascha Wildnerin response to being marked up through an 215*05ac2d0dSSascha Wildner.Dv SIOCSIFFLAGS 216*05ac2d0dSSascha Wildnerioctl request and they should use 217*05ac2d0dSSascha Wildner.Fn ieee80211_suspend_all 218*05ac2d0dSSascha Wildnerand 219*05ac2d0dSSascha Wildner.Fn ieee80211_resume_all 220*05ac2d0dSSascha Wildnerto implement suspend/resume support. 221*05ac2d0dSSascha Wildner.Pp 222*05ac2d0dSSascha WildnerThere is also an 223*05ac2d0dSSascha Wildner.Fn ieee80211_stop_all 224*05ac2d0dSSascha Wildnercall to force all vaps to an 225*05ac2d0dSSascha Wildner.Dv IEEE80211_S_INIT 226*05ac2d0dSSascha Wildnerstate but this should not be needed by a driver; control is usually 227*05ac2d0dSSascha Wildnerhandled by 228*05ac2d0dSSascha Wildner.Nm net80211 229*05ac2d0dSSascha Wildneror, in the case of card eject or vap destroy, 230*05ac2d0dSSascha Wildnerwork will be initiated outside the driver. 231*05ac2d0dSSascha Wildner.Sh SEE ALSO 232*05ac2d0dSSascha Wildner.Xr ioctl 2 , 233*05ac2d0dSSascha Wildner.Xr wpa_supplicant 8 , 234*05ac2d0dSSascha Wildner.Xr ieee80211 9 , 235*05ac2d0dSSascha Wildner.Xr ifnet 9 , 236*05ac2d0dSSascha Wildner.Xr taskqueue 9 237*05ac2d0dSSascha Wildner.Sh HISTORY 238*05ac2d0dSSascha WildnerThe state machine concept was part of the original 239*05ac2d0dSSascha Wildner.Nm ieee80211 240*05ac2d0dSSascha Wildnercode base that first appeared in 241*05ac2d0dSSascha Wildner.Nx 1.5 , 242