1ff66a890SHiten Pandya.\" 205ac2d0dSSascha 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*e4c06619SSascha Wildner.\" $FreeBSD: head/share/man/man9/ieee80211_proto.9 235693 2012-05-20 16:43:47Z gjb $ 27ff66a890SHiten Pandya.\" 28*e4c06619SSascha Wildner.Dd May 25, 2016 29ff66a890SHiten Pandya.Dt IEEE80211_PROTO 9 30ff66a890SHiten Pandya.Os 31ff66a890SHiten Pandya.Sh NAME 3205ac2d0dSSascha Wildner.Nm ieee80211_proto 3305ac2d0dSSascha Wildner.Nd 802.11 state machine support 34ff66a890SHiten Pandya.Sh SYNOPSIS 357d9c9280SSascha Wildner.In net/if.h 367d9c9280SSascha Wildner.In net/if_media.h 37737edb20SSascha Wildner.In netproto/802_11/ieee80211_var.h 3805ac2d0dSSascha Wildner.Pp 39ff66a890SHiten Pandya.Ft void 4005ac2d0dSSascha Wildner.Fn ieee80211_start_all "struct ieee80211com *" 41ff66a890SHiten Pandya.Ft void 4205ac2d0dSSascha Wildner.Fn ieee80211_stop_all "struct ieee80211com *" 43ff66a890SHiten Pandya.Ft void 4405ac2d0dSSascha Wildner.Fn ieee80211_suspend_all "struct ieee80211com *" 45ff66a890SHiten Pandya.Ft void 4605ac2d0dSSascha Wildner.Fn ieee80211_resume_all "struct ieee80211com *" 4705ac2d0dSSascha Wildner.Pp 4805ac2d0dSSascha Wildner.Dv enum ieee80211_state ; 49ff66a890SHiten Pandya.Ft int 5005ac2d0dSSascha Wildner.Fn ieee80211_new_state "struct ieee80211vap *" "enum ieee80211_state" "int" 5105ac2d0dSSascha Wildner.Pp 5205ac2d0dSSascha Wildner.Ft void 53d3085371SSascha Wildner.Fn ieee80211_waitfor_parent "struct ieee80211com *" 54ff66a890SHiten Pandya.Sh DESCRIPTION 55ff66a890SHiten PandyaThe 5605ac2d0dSSascha Wildner.Nm net80211 5705ac2d0dSSascha Wildnerlayer that supports 802.11 device drivers uses a state machine 5805ac2d0dSSascha Wildnerto control operation of vaps. 5905ac2d0dSSascha WildnerThese state machines vary according to the vap operating mode. 6005ac2d0dSSascha WildnerStation mode state machines follow the 802.11 MLME states 6105ac2d0dSSascha Wildnerin the protocol specification. 6205ac2d0dSSascha WildnerOther state machines are simpler and reflect operational work 6305ac2d0dSSascha Wildnersuch as scanning for a BSS or automatically selecting a channel to 6405ac2d0dSSascha Wildneroperate on. 6505ac2d0dSSascha WildnerWhen multiple vaps are operational the state machines are used to 6605ac2d0dSSascha Wildnercoordinate operation such as choosing a channel. 6705ac2d0dSSascha WildnerThe state machine mechanism also serves to bind the 6805ac2d0dSSascha Wildner.Nm net80211 6905ac2d0dSSascha Wildnerlayer to a driver; this is described more below. 7005ac2d0dSSascha Wildner.Pp 7105ac2d0dSSascha WildnerThe following states are defined for state machines: 7205ac2d0dSSascha Wildner.Bl -tag -width IEEE80211_S_ASSOC 7305ac2d0dSSascha Wildner.It Dv IEEE80211_S_INIT 7405ac2d0dSSascha WildnerDefault/initial state. 7505ac2d0dSSascha WildnerA vap in this state should not hold any dynamic state (e.g. entries 7605ac2d0dSSascha Wildnerfor associated stations in the node table). 7705ac2d0dSSascha WildnerThe driver must quiesce the hardware; e.g. there should be no 7805ac2d0dSSascha Wildnerinterrupts firing. 7905ac2d0dSSascha Wildner.It Dv IEEE80211_S_SCAN 8005ac2d0dSSascha WildnerScanning for a BSS or choosing a channel to operate on. 8105ac2d0dSSascha WildnerNote that scanning can also take place in other states (e.g. when 8205ac2d0dSSascha Wildnerbackground scanning is active); this state is entered when 8305ac2d0dSSascha Wildnerinitially bringing a vap to an operational state or after an 8405ac2d0dSSascha Wildnerevent such as a beacon miss (in station mode). 8505ac2d0dSSascha Wildner.It Dv IEEE80211_S_AUTH 8605ac2d0dSSascha WildnerAuthenticating to an access point (in station mode). 8705ac2d0dSSascha WildnerThis state is normally reached from 8805ac2d0dSSascha Wildner.Dv IEEE80211_S_SCAN 8905ac2d0dSSascha Wildnerafter selecting a BSS, but may also be reached from 9005ac2d0dSSascha Wildner.Dv IEEE80211_S_ASSOC 9105ac2d0dSSascha Wildneror 9205ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 9305ac2d0dSSascha Wildnerif the authentication handshake fails. 9405ac2d0dSSascha Wildner.It Dv IEEE80211_S_ASSOC 9505ac2d0dSSascha WildnerAssociating to an access point (in station mode). 9605ac2d0dSSascha WildnerThis state is reached from 9705ac2d0dSSascha Wildner.Dv IEEE80211_S_AUTH 9805ac2d0dSSascha Wildnerafter successfully authenticating or from 9905ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 10005ac2d0dSSascha Wildnerif a DisAssoc frame is received. 10105ac2d0dSSascha Wildner.It Dv IEEE80211_S_CAC 10205ac2d0dSSascha WildnerDoing Channel Availability Check (CAC). 10305ac2d0dSSascha WildnerThis state is entered only when DFS is enabled and the channel selected 10405ac2d0dSSascha Wildnerfor operation requires CAC. 10505ac2d0dSSascha Wildner.It Dv IEEE80211_S_RUN 10605ac2d0dSSascha WildnerOperational. 10705ac2d0dSSascha WildnerIn this state a vap can transmit data frames, accept requests for 10805ac2d0dSSascha Wildnerstations associating, etc. 10905ac2d0dSSascha WildnerBeware that data traffic is also gated by whether the associated 11005ac2d0dSSascha Wildner.Dq port 11105ac2d0dSSascha Wildneris authorized. 11205ac2d0dSSascha WildnerWhen WPA/802.11i/802.1x is operational authorization may happen separately; 11305ac2d0dSSascha Wildnere.g. in station mode 11405ac2d0dSSascha Wildner.Xr wpa_supplicant 8 11505ac2d0dSSascha Wildnermust complete the handshakes and plumb the necessary keys before a port 11605ac2d0dSSascha Wildneris authorized. 11705ac2d0dSSascha WildnerIn this state a BSS is operational and associated state is valid and may 11805ac2d0dSSascha Wildnerbe used; e.g. 11905ac2d0dSSascha Wildner.Vt ic_bss 120ff66a890SHiten Pandyaand 12105ac2d0dSSascha Wildner.Vt ic_bsschan 12205ac2d0dSSascha Wildnerare guaranteed to be usable. 12305ac2d0dSSascha Wildner.It Dv IEEE80211_S_CSA 12405ac2d0dSSascha WildnerChannel Switch Announcement (CSA) is pending. 12505ac2d0dSSascha WildnerThis state is reached only from 12605ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 12705ac2d0dSSascha Wildnerwhen either a CSA is received from an access point (in station mode) 12805ac2d0dSSascha Wildneror the local station is preparing to change channel. 12905ac2d0dSSascha WildnerIn this state traffic may be muted depending on the Mute setting in the CSA. 13005ac2d0dSSascha Wildner.It Dv IEEE80211_S_SLEEP 13105ac2d0dSSascha WildnerAsleep to save power (in station mode). 13205ac2d0dSSascha WildnerThis state is reached only from 13305ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 13405ac2d0dSSascha Wildnerwhen power save operation is enabled and the local station is deemed 13505ac2d0dSSascha Wildnersufficiently idle to enter low power mode. 13605ac2d0dSSascha Wildner.El 13705ac2d0dSSascha Wildner.Pp 13805ac2d0dSSascha WildnerNote that states are ordered (as shown above); 13905ac2d0dSSascha Wildnere.g. a vap must be in the 14005ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 14105ac2d0dSSascha Wildneror 14205ac2d0dSSascha Wildner.Dq greater 14305ac2d0dSSascha Wildnerbefore it can transmit frames. 14405ac2d0dSSascha WildnerCertain 14505ac2d0dSSascha Wildner.Nm net80211 14605ac2d0dSSascha Wildnerdata are valid only in certain states; e.g. the 14705ac2d0dSSascha Wildner.Vt iv_bsschan 14805ac2d0dSSascha Wildnerthat specifies the channel for the operating BSS should never be used 14905ac2d0dSSascha Wildnerexcept in 15005ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 15105ac2d0dSSascha Wildneror greater. 15205ac2d0dSSascha Wildner.Sh STATE CHANGES 15305ac2d0dSSascha WildnerState machine changes are typically handled internal to the 15405ac2d0dSSascha Wildner.Nm net80211 15505ac2d0dSSascha Wildnerlayer in response to 15605ac2d0dSSascha Wildner.Xr ioctl 2 15705ac2d0dSSascha Wildnerrequests, received frames, or external events such as a beacon miss. 15805ac2d0dSSascha WildnerThe 15905ac2d0dSSascha Wildner.Fn ieee80211_new_state 16005ac2d0dSSascha Wildnerfunction is used to initiate a state machine change on a vap. 16105ac2d0dSSascha WildnerThe new state and an optional argument are supplied. 16205ac2d0dSSascha WildnerThe request is initially processed to handle coordination of multiple vaps. 16305ac2d0dSSascha WildnerFor example, only one vap at a time can be scanning, if multiple vaps 16405ac2d0dSSascha Wildnerrequest a change to 16505ac2d0dSSascha Wildner.Dv IEEE80211_S_SCAN 16605ac2d0dSSascha Wildnerthe first will be permitted to run and the others will be 16705ac2d0dSSascha Wildner.Em deferred 16805ac2d0dSSascha Wildneruntil the scan operation completes at which time the selected channel 16905ac2d0dSSascha Wildnerwill be adopted. 17005ac2d0dSSascha WildnerSimilarly 17105ac2d0dSSascha Wildner.Nm net80211 17205ac2d0dSSascha Wildnerhandles coordination of combinations of vaps such as an AP and station vap 17305ac2d0dSSascha Wildnerwhere the station may need to roam to follow the AP it is associated to 17405ac2d0dSSascha Wildner(dragging along the AP vap to the new channel). 17505ac2d0dSSascha WildnerAnother important coordination is the handling of 17605ac2d0dSSascha Wildner.Dv IEEE80211_S_CAC 17705ac2d0dSSascha Wildnerand 17805ac2d0dSSascha Wildner.Dv IEEE80211_S_CSA . 17905ac2d0dSSascha WildnerNo more than one vap can ever be actively changing state at a time. 18005ac2d0dSSascha WildnerIn fact 18105ac2d0dSSascha Wildner.Nm net80211 18205ac2d0dSSascha Wildnersingle-threads the state machine logic in a dedicated 18305ac2d0dSSascha Wildner.Xr taskqueue 9 18405ac2d0dSSascha Wildnerthread that is also used to synchronize work such as scanning and 18505ac2d0dSSascha Wildnerbeacon miss handling. 18605ac2d0dSSascha Wildner.Pp 18705ac2d0dSSascha WildnerAfter multi-vap scheduling/coordination is done the per-vap 18805ac2d0dSSascha Wildner.Vt iv_newstate 18905ac2d0dSSascha Wildnermethod is called to carry out the state change work. 19005ac2d0dSSascha WildnerDrivers use this entry to setup private state and then dispatch 19105ac2d0dSSascha Wildnerthe call to the 19205ac2d0dSSascha Wildner.Nm net80211 19305ac2d0dSSascha Wildnerlayer using the previously defined method pointer (in OOP-parlance they 19405ac2d0dSSascha Wildnercall the 19505ac2d0dSSascha Wildner.Dq super method 19605ac2d0dSSascha Wildner). 19705ac2d0dSSascha Wildner.Pp 19805ac2d0dSSascha Wildner.Nm net80211 19905ac2d0dSSascha Wildnerhandles two state changes specially. 20005ac2d0dSSascha WildnerOn transition to 20105ac2d0dSSascha Wildner.Dv IEEE80211_S_RUN 20205ac2d0dSSascha Wildnerthe 20305ac2d0dSSascha Wildner.Dv IFF_DRV_OACTIVE 20405ac2d0dSSascha Wildnerbit on the vap's transmit queue is cleared so traffic can flow. 20505ac2d0dSSascha WildnerOn transition to 20605ac2d0dSSascha Wildner.Dv IEEE80211_S_INIT 20705ac2d0dSSascha Wildnerany state in the scan cache associated with the vap is flushed 20805ac2d0dSSascha Wildnerand any frames pending on the transmit queue are flushed. 20905ac2d0dSSascha Wildner.Sh DRIVER INTEGRATION 21005ac2d0dSSascha WildnerDrivers are expected to override the 21105ac2d0dSSascha Wildner.Vt iv_newstate 21205ac2d0dSSascha Wildnermethod to interpose their own code and handle setup work required 21305ac2d0dSSascha Wildnerby state changes. 21405ac2d0dSSascha WildnerOtherwise drivers must call 21505ac2d0dSSascha Wildner.Fn ieee80211_start_all 21605ac2d0dSSascha Wildnerin response to being marked up through an 21705ac2d0dSSascha Wildner.Dv SIOCSIFFLAGS 21805ac2d0dSSascha Wildnerioctl request and they should use 21905ac2d0dSSascha Wildner.Fn ieee80211_suspend_all 22005ac2d0dSSascha Wildnerand 22105ac2d0dSSascha Wildner.Fn ieee80211_resume_all 22205ac2d0dSSascha Wildnerto implement suspend/resume support. 22305ac2d0dSSascha Wildner.Pp 22405ac2d0dSSascha WildnerThere is also an 22505ac2d0dSSascha Wildner.Fn ieee80211_stop_all 22605ac2d0dSSascha Wildnercall to force all vaps to an 22705ac2d0dSSascha Wildner.Dv IEEE80211_S_INIT 22805ac2d0dSSascha Wildnerstate but this should not be needed by a driver; control is usually 22905ac2d0dSSascha Wildnerhandled by 23005ac2d0dSSascha Wildner.Nm net80211 23105ac2d0dSSascha Wildneror, in the case of card eject or vap destroy, 23205ac2d0dSSascha Wildnerwork will be initiated outside the driver. 23305ac2d0dSSascha Wildner.Sh SEE ALSO 23405ac2d0dSSascha Wildner.Xr ioctl 2 , 23505ac2d0dSSascha Wildner.Xr wpa_supplicant 8 , 23605ac2d0dSSascha Wildner.Xr ieee80211 9 , 23705ac2d0dSSascha Wildner.Xr ifnet 9 , 23805ac2d0dSSascha Wildner.Xr taskqueue 9 23905ac2d0dSSascha Wildner.Sh HISTORY 24005ac2d0dSSascha WildnerThe state machine concept was part of the original 24105ac2d0dSSascha Wildner.Nm ieee80211 24205ac2d0dSSascha Wildnercode base that first appeared in 243*e4c06619SSascha Wildner.Nx 1.5 . 244