Teach the net80211 stack to remove corresponding frames from ic_pwrsaveq
authorstsp <stsp@openbsd.org>
Tue, 7 Dec 2021 20:06:38 +0000 (20:06 +0000)
committerstsp <stsp@openbsd.org>
Tue, 7 Dec 2021 20:06:38 +0000 (20:06 +0000)
commita6224a8bfd916580a78c4412ad835884a962e158
tree9924e92b1f30ec50ae6a89b5399020957e587424
parent6e53bd0b54f9f13ec9b1770497488cfdb9e51ec8
Teach the net80211 stack to remove corresponding frames from ic_pwrsaveq
when a power-saving client decides to leave our hostap interface.

Prevents a "key unset for sw crypto" panic as we try to send a frame
to a node which is in COLLECT state with its WPA keys already cleared.

We were already clearing the queue which buffers power-saved frames for
the client node. This queue is stored within the node structure itself.
However, the interface has another global queue for frames which need to
be transmitted by the driver to a set of nodes during the next DTIM.
We missed removing frames for a departing node from this global queue.

While here, add missing node refcount adjustments as frames get purged.

Problem reported by Mikolaj Kucharski, who tested this fix for more
than a week with athn(4), with no further panics observed.
sys/net80211/ieee80211_node.c