|  | # | 
|  | # This outlines the Linux authentication/association and | 
|  | # deauthentication/disassociation flows. | 
|  | # | 
|  | # This can be converted into a diagram using the service | 
|  | # at http://www.websequencediagrams.com/ | 
|  | # | 
|  |  | 
|  | participant userspace | 
|  | participant mac80211 | 
|  | participant driver | 
|  |  | 
|  | alt authentication needed (not FT) | 
|  | userspace->mac80211: authenticate | 
|  |  | 
|  | alt authenticated/authenticating already | 
|  | mac80211->driver: sta_state(AP, not-exists) | 
|  | mac80211->driver: bss_info_changed(clear BSSID) | 
|  | else associated | 
|  | note over mac80211,driver | 
|  | like deauth/disassoc, without sending the | 
|  | BA session stop & deauth/disassoc frames | 
|  | end note | 
|  | end | 
|  |  | 
|  | mac80211->driver: config(channel, non-HT) | 
|  | mac80211->driver: bss_info_changed(set BSSID, basic rate bitmap) | 
|  | mac80211->driver: sta_state(AP, exists) | 
|  |  | 
|  | alt no probe request data known | 
|  | mac80211->driver: TX directed probe request | 
|  | driver->mac80211: RX probe response | 
|  | end | 
|  |  | 
|  | mac80211->driver: TX auth frame | 
|  | driver->mac80211: RX auth frame | 
|  |  | 
|  | alt WEP shared key auth | 
|  | mac80211->driver: TX auth frame | 
|  | driver->mac80211: RX auth frame | 
|  | end | 
|  |  | 
|  | mac80211->driver: sta_state(AP, authenticated) | 
|  | mac80211->userspace: RX auth frame | 
|  |  | 
|  | end | 
|  |  | 
|  | userspace->mac80211: associate | 
|  | alt authenticated or associated | 
|  | note over mac80211,driver: cleanup like for authenticate | 
|  | end | 
|  |  | 
|  | alt not previously authenticated (FT) | 
|  | mac80211->driver: config(channel, non-HT) | 
|  | mac80211->driver: bss_info_changed(set BSSID, basic rate bitmap) | 
|  | mac80211->driver: sta_state(AP, exists) | 
|  | mac80211->driver: sta_state(AP, authenticated) | 
|  | end | 
|  | mac80211->driver: TX assoc | 
|  | driver->mac80211: RX assoc response | 
|  | note over mac80211: init rate control | 
|  | mac80211->driver: sta_state(AP, associated) | 
|  |  | 
|  | alt not using WPA | 
|  | mac80211->driver: sta_state(AP, authorized) | 
|  | end | 
|  |  | 
|  | mac80211->driver: set up QoS parameters | 
|  |  | 
|  | alt is HT channel | 
|  | mac80211->driver: config(channel, HT params) | 
|  | end | 
|  |  | 
|  | mac80211->driver: bss_info_changed(QoS, HT, associated with AID) | 
|  | mac80211->userspace: associated | 
|  |  | 
|  | note left of userspace: associated now | 
|  |  | 
|  | alt using WPA | 
|  | note over userspace | 
|  | do 4-way-handshake | 
|  | (data frames) | 
|  | end note | 
|  | userspace->mac80211: authorized | 
|  | mac80211->driver: sta_state(AP, authorized) | 
|  | end | 
|  |  | 
|  | userspace->mac80211: deauthenticate/disassociate | 
|  | mac80211->driver: stop BA sessions | 
|  | mac80211->driver: TX deauth/disassoc | 
|  | mac80211->driver: flush frames | 
|  | mac80211->driver: sta_state(AP,associated) | 
|  | mac80211->driver: sta_state(AP,authenticated) | 
|  | mac80211->driver: sta_state(AP,exists) | 
|  | mac80211->driver: sta_state(AP,not-exists) | 
|  | mac80211->driver: turn off powersave | 
|  | mac80211->driver: bss_info_changed(clear BSSID, not associated, no QoS, ...) | 
|  | mac80211->driver: config(non-HT channel type) | 
|  | mac80211->userspace: disconnected |