diff options
author | Stefan Sperling <stsp@cvs.openbsd.org> | 2021-03-17 15:34:22 +0000 |
---|---|---|
committer | Stefan Sperling <stsp@cvs.openbsd.org> | 2021-03-17 15:34:22 +0000 |
commit | 7b448ed4fc5374ae0a6b90a00002d1cba0c2ecec (patch) | |
tree | 89eadf185039bc1d9520983661a94eff90dce9da | |
parent | c504ea0639d258594afd008fd62706ef6bb71b37 (diff) |
Make iwn(4) send block ack request frames with the firmware node
which represents the AP, rather than the firmware's broadcast node.
Fixes a problem where firmware would generate bogus block ack requests
with a wrong starting sequence number, shifting the receiver's block ack
window out of sync with that of the firmware. Traffic would stall until
enough frames were sent to wrap sequence numbers of the block ack window.
ok chris@ kmos@
-rw-r--r-- | sys/dev/pci/if_iwn.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/dev/pci/if_iwn.c b/sys/dev/pci/if_iwn.c index afeb963ef62..db09809c2a1 100644 --- a/sys/dev/pci/if_iwn.c +++ b/sys/dev/pci/if_iwn.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_iwn.c,v 1.245 2021/03/12 16:27:27 stsp Exp $ */ +/* $OpenBSD: if_iwn.c,v 1.246 2021/03/17 15:34:21 stsp Exp $ */ /*- * Copyright (c) 2007-2010 Damien Bergamini <damien.bergamini@free.fr> @@ -3505,7 +3505,10 @@ iwn_tx(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) } } - if (IEEE80211_IS_MULTICAST(wh->i_addr1) || + if (type == IEEE80211_FC0_TYPE_CTL && + subtype == IEEE80211_FC0_SUBTYPE_BAR) + tx->id = wn->id; + else if (IEEE80211_IS_MULTICAST(wh->i_addr1) || type != IEEE80211_FC0_TYPE_DATA) tx->id = sc->broadcast_id; else |