Provided by: freebsd-manpages_12.2-1_all bug

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

       The net80211 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   from
                          IEEE80211_S_ASSOC or IEEE80211_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  from  IEEE80211_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.

       Note that states are ordered (as shown above); e.g. a vap must be in  the  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 the net80211 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 call ieee80211_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 original ieee80211 code base that first appeared in NetBSD 1.5.

Debian                                           August 4, 2009                               IEEE80211_PROTO(9)