Fix a corner case bug in Rx block ack window gap-wait timeout handling.
authorstsp <stsp@openbsd.org>
Tue, 23 Mar 2021 12:03:44 +0000 (12:03 +0000)
committerstsp <stsp@openbsd.org>
Tue, 23 Mar 2021 12:03:44 +0000 (12:03 +0000)
commit8d36f12dbf9ce28c23b5e1c40158c943a0cc961e
treeff7f1ca491a84fee5b181608267f430401414149
parent04b94a2b6c8c78d979dee3d6a5797f9f7fc2fa84
Fix a corner case bug in Rx block ack window gap-wait timeout handling.

If ieee80211_input_ba_flush() was called when there was nothing to flush,
the (already pending) gap wait timeout was re-armed.
This is only correct if we flush at least one packet. Otherwise packets
that arrive at a constant rate of about 4-5 packets per second would
extend the gap-wait timeout until the block ack window fills up.
In extreme cases this can result in packets being queued for almost 20s.

Fix this by returning immediately from ieee80211_input_ba_flush() if
the first packet in the reordering buffer is missing.
This prevents the timeout from being re-armed.

Patch by Christian Ehrhardt. Tested by me on iwm(4) 7265.
sys/net80211/ieee80211_input.c