Introduce an optional driver-specific bgscan_done() handler which
authorstsp <stsp@openbsd.org>
Fri, 3 Dec 2021 12:41:36 +0000 (12:41 +0000)
committerstsp <stsp@openbsd.org>
Fri, 3 Dec 2021 12:41:36 +0000 (12:41 +0000)
commitde9c1173bfeaddf7453b5a592a644cb1cbf052c7
tree84659cd9d14dbb3fdc933b33435d15e0eb0b7c41
parent66df67e635a11eed972fa07dee327b244b938521
Introduce an optional driver-specific bgscan_done() handler which
allows the driver to take control of the roaming teardown sequence.
This handler allows drivers to ensure that race conditions between
firmware state and net80211 state are avoided, and will be used by
the iwm(4) and iwx(4) drivers soon.

Split the existing roaming teardown sequence into two steps, one step
for tearing down Tx block ack sessions which sends a DELBA frame, and a
second step for flushing Tx rings followed by sending a DEAUTH frame.
We used to queue both frames, expecting to switch APs once both were sent.
Now we effectively expect everything to be sent before we queue a final
DEAUTH frame, and wait for just this frame to be sent before switching.
This already made issues on iwm/iwx less frequent but by itself this was
not enough to close all races for those drivers. It should however help
when adding background scan support to a non-firmware device driver.

Tested, with driver patches:
iwm 8265: Aaron Poffenberger, stsp
iwm 9260: florian
iwm 9560: sthen
iwx ax200: jmc, stsp
sys/net80211/ieee80211_node.c
sys/net80211/ieee80211_node.h
sys/net80211/ieee80211_proto.c
sys/net80211/ieee80211_var.h