summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorstsp <stsp@openbsd.org>2016-01-04 12:32:06 +0000
committerstsp <stsp@openbsd.org>2016-01-04 12:32:06 +0000
commit58178d1c3d9397ff6a0ba4e6457926c5fa5837db (patch)
tree1c3fb1a64d8df7bf434a03298bd186e2bef2bba8
parentFix manual scan while associated in 11a mode. It would only show APs on 5GHz. (diff)
downloadwireguard-openbsd-58178d1c3d9397ff6a0ba4e6457926c5fa5837db.tar.xz
wireguard-openbsd-58178d1c3d9397ff6a0ba4e6457926c5fa5837db.zip
ADDBA frames have a parameter set which we check against our own capabilities
but we were checking bits in these parameters with the wrong set of bitmasks. Negotiating A-MPDUs with some APs failed because of this bug. ok kettenis@
-rw-r--r--sys/net80211/ieee80211.h12
-rw-r--r--sys/net80211/ieee80211_input.c4
-rw-r--r--sys/net80211/ieee80211_output.c8
3 files changed, 19 insertions, 5 deletions
diff --git a/sys/net80211/ieee80211.h b/sys/net80211/ieee80211.h
index 7157a40fc21..ef15fda8c45 100644
--- a/sys/net80211/ieee80211.h
+++ b/sys/net80211/ieee80211.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ieee80211.h,v 1.54 2015/11/15 01:05:25 stsp Exp $ */
+/* $OpenBSD: ieee80211.h,v 1.55 2016/01/04 12:32:06 stsp Exp $ */
/* $NetBSD: ieee80211.h,v 1.6 2004/04/30 23:51:53 dyoung Exp $ */
/*-
@@ -516,6 +516,16 @@ enum {
#define IEEE80211_BA_TID_INFO_SHIFT 12
/*
+ * ADDBA Parameter Set field (see 802.11-2012 8.4.1.14 Figure 8-48).
+ */
+#define IEEE80211_ADDBA_AMSDU 0x0001 /* A-MSDU in A-MPDU supported */
+#define IEEE80211_ADDBA_BA_POLICY 0x0002 /* 1=immediate BA 0=delayed BA */
+#define IEEE80211_ADDBA_TID_MASK 0x003c
+#define IEEE80211_ADDBA_TID_SHIFT 2
+#define IEEE80211_ADDBA_BUFSZ_MASK 0xffc0
+#define IEEE80211_ADDBA_BUFSZ_SHIFT 6
+
+/*
* DELBA Parameter Set field (see 802.11-2012 8.4.1.16 Figure 8-50).
*/
#define IEEE80211_DELBA_INITIATOR 0x0800
diff --git a/sys/net80211/ieee80211_input.c b/sys/net80211/ieee80211_input.c
index 22e532ef99a..4aecf1667d9 100644
--- a/sys/net80211/ieee80211_input.c
+++ b/sys/net80211/ieee80211_input.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ieee80211_input.c,v 1.147 2016/01/04 12:25:46 stsp Exp $ */
+/* $OpenBSD: ieee80211_input.c,v 1.148 2016/01/04 12:32:06 stsp Exp $ */
/*-
* Copyright (c) 2001 Atsushi Onoe
@@ -2459,7 +2459,7 @@ ieee80211_recv_addba_req(struct ieee80211com *ic, struct mbuf *m,
}
/* check that we support the requested Block Ack Policy */
if (!(ic->ic_htcaps & IEEE80211_HTCAP_DELAYEDBA) &&
- !(params & IEEE80211_BA_ACK_POLICY)) {
+ !(params & IEEE80211_ADDBA_BA_POLICY)) {
status = IEEE80211_STATUS_INVALID_PARAM;
goto resp;
}
diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c
index 4a2195aae31..55c1f655627 100644
--- a/sys/net80211/ieee80211_output.c
+++ b/sys/net80211/ieee80211_output.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ieee80211_output.c,v 1.102 2015/12/12 11:31:48 stsp Exp $ */
+/* $OpenBSD: ieee80211_output.c,v 1.103 2016/01/04 12:32:06 stsp Exp $ */
/* $NetBSD: ieee80211_output.c,v 1.13 2004/05/31 11:02:55 dyoung Exp $ */
/*-
@@ -1455,7 +1455,11 @@ ieee80211_get_addba_req(struct ieee80211com *ic, struct ieee80211_node *ni,
*frm++ = IEEE80211_CATEG_BA;
*frm++ = IEEE80211_ACTION_ADDBA_REQ;
*frm++ = ba->ba_token;
- params = ba->ba_winsize << 6 | tid << 2 | IEEE80211_BA_ACK_POLICY;
+ params = ba->ba_winsize << IEEE80211_ADDBA_BUFSZ_SHIFT |
+ tid << IEEE80211_ADDBA_TID_SHIFT |
+ IEEE80211_ADDBA_AMSDU;
+ if ((ic->ic_htcaps & IEEE80211_HTCAP_DELAYEDBA) == 0)
+ params |= IEEE80211_ADDBA_BA_POLICY; /* use immediate BA */
LE_WRITE_2(frm, params); frm += 2;
LE_WRITE_2(frm, ba->ba_timeout_val); frm += 2;
LE_WRITE_2(frm, ba->ba_winstart); frm += 2;