table of contents
IEEE80211_PROTO(9) | Kernel Developer's Manual | IEEE80211_PROTO(9) |
NAME¶
ieee80211_proto
—
802.11 state machine support
SYNOPSIS¶
#include
<net80211/ieee80211_var.h>
void
ieee80211_start_all
(struct
ieee80211com *);
void
ieee80211_stop_all
(struct
ieee80211com *);
void
ieee80211_suspend_all
(struct
ieee80211com *);
void
ieee80211_resume_all
(struct
ieee80211com *);
enum ieee80211_state
;
int
ieee80211_new_state
(struct
ieee80211vap *,
enum
ieee80211_state,
int);
void
ieee80211_wait_for_parent
(struct
ieee80211com *);
DESCRIPTION¶
Thenet80211
layer that supports 802.11
device drivers uses a state machine to control operation of vaps. These state
machines vary according to the vap operating mode. Station mode state machines
follow the 802.11 MLME states in the protocol specification. Other state
machines are simpler and reflect operational work such as scanning for a BSS
or automatically selecting a channel to operate on. When multiple vaps are
operational the state machines are used to coordinate operation such as
choosing a channel. The state machine mechanism also serves to bind the
net80211
layer to a driver; this is
described more below.
The following states are defined for state machines:
IEEE80211_S_INIT
- Default/initial state. A vap in this state should not hold any dynamic state (e.g. entries for associated stations in the node table). The driver must quiesce the hardware; e.g. there should be no interrupts firing.
IEEE80211_S_SCAN
- Scanning for a BSS or choosing a channel to operate on. Note that scanning can also take place in other states (e.g. when background scanning is active); this state is entered when initially bringing a vap to an operational state or after an event such as a beacon miss (in station mode).
IEEE80211_S_AUTH
- Authenticating to an access point (in station mode). This state is
normally reached from
IEEE80211_S_SCAN
after selecting a BSS, but may also be reached fromIEEE80211_S_ASSOC
orIEEE80211_S_RUN
if the authentication handshake fails. IEEE80211_S_ASSOC
- Associating to an access point (in station mode). This state is reached
from
IEEE80211_S_AUTH
after successfully authenticating or fromIEEE80211_S_RUN
if a DisAssoc frame is received. IEEE80211_S_CAC
- Doing Channel Availability Check (CAC). This state is entered only when DFS is enabled and the channel selected for operation requires CAC.
IEEE80211_S_RUN
- Operational. In this state a vap can transmit data frames, accept requests for stations associating, etc. Beware that data traffic is also gated by whether the associated “port” is authorized. When WPA/802.11i/802.1x is operational authorization may happen separately; e.g. in station mode wpa_supplicant(8) must complete the handshakes and plumb the necessary keys before a port is authorized. In this state a BSS is operational and associated state is valid and may be used; e.g. ic_bss and ic_bsschan are guaranteed to be usable.
IEEE80211_S_CSA
- Channel Switch Announcement (CSA) is pending. This state is reached only
from
IEEE80211_S_RUN
when either a CSA is received from an access point (in station mode) or the local station is preparing to change channel. In this state traffic may be muted depending on the Mute setting in the CSA. IEEE80211_S_SLEEP
- Asleep to save power (in station mode). This state is reached only from
IEEE80211_S_RUN
when power save operation is enabled and the local station is deemed sufficiently idle to enter low power mode.
IEEE80211_S_RUN
or “greater”
before it can transmit frames. Certain
net80211
data are valid only in certain
states; e.g. the iv_bsschan that specifies
the channel for the operating BSS should never be used except in
IEEE80211_S_RUN
or greater.
STATE CHANGES¶
State machine changes are typically handled internal to thenet80211
layer in response to
ioctl(2) requests, received frames, or external
events such as a beacon miss. The
ieee80211_new_state
() function is used to
initiate a state machine change on a vap. The new state and an optional
argument are supplied. The request is initially processed to handle
coordination of multiple vaps. For example, only one vap at a time can be
scanning, if multiple vaps request a change to
IEEE80211_S_SCAN
the first will be
permitted to run and the others will be deferred
until the scan operation completes at which time the selected channel will be
adopted. Similarly net80211
handles
coordination of combinations of vaps such as an AP and station vap where the
station may need to roam to follow the AP it is associated to (dragging along
the AP vap to the new channel). Another important coordination is the handling
of IEEE80211_S_CAC
and
IEEE80211_S_CSA
. No more than one vap can
ever be actively changing state at a time. In fact
net80211
single-threads the state machine
logic in a dedicated taskqueue(9) thread that is
also used to synchronize work such as scanning and beacon miss handling.
After multi-vap scheduling/coordination is done the per-vap
iv_newstate method is called to carry out the
state change work. Drivers use this entry to setup private state and then
dispatch the call to the net80211
layer
using the previously defined method pointer (in OOP-parlance they call the
“super method” ).
net80211
handles two state changes specially.
On transition to IEEE80211_S_RUN
the
IFF_DRV_OACTIVE
bit on the vap's transmit
queue is cleared so traffic can flow. On transition to
IEEE80211_S_INIT
any state in the scan
cache associated with the vap is flushed and any frames pending on the
transmit queue are flushed.
DRIVER INTEGRATION¶
Drivers are expected to override the iv_newstate method to interpose their own code and handle setup work required by state changes. Otherwise drivers must callieee80211_start_all
() in response to
being marked up through an SIOCSIFFLAGS
ioctl request and they should use
ieee80211_suspend_all
() and
ieee80211_resume_all
() to implement
suspend/resume support.
There is also an ieee80211_stop_all
() call to
force all vaps to an IEEE80211_S_INIT
state
but this should not be needed by a driver; control is usually handled by
net80211
or, in the case of card eject or
vap destroy, work will be initiated outside the driver.
SEE ALSO¶
ioctl(2), wpa_supplicant(8), ieee80211(9), ifnet(9), taskqueue(9)HISTORY¶
The state machine concept was part of the originalieee80211
code base that first appeared in
NetBSD 1.5.August 4, 2009 | Debian |