summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Sperling <stsp@cvs.openbsd.org>2021-03-17 15:34:22 +0000
committerStefan Sperling <stsp@cvs.openbsd.org>2021-03-17 15:34:22 +0000
commit7b448ed4fc5374ae0a6b90a00002d1cba0c2ecec (patch)
tree89eadf185039bc1d9520983661a94eff90dce9da
parentc504ea0639d258594afd008fd62706ef6bb71b37 (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.c7
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