diff options
author | 2016-01-04 12:32:06 +0000 | |
---|---|---|
committer | 2016-01-04 12:32:06 +0000 | |
commit | 58178d1c3d9397ff6a0ba4e6457926c5fa5837db (patch) | |
tree | 1c3fb1a64d8df7bf434a03298bd186e2bef2bba8 | |
parent | Fix manual scan while associated in 11a mode. It would only show APs on 5GHz. (diff) | |
download | wireguard-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.h | 12 | ||||
-rw-r--r-- | sys/net80211/ieee80211_input.c | 4 | ||||
-rw-r--r-- | sys/net80211/ieee80211_output.c | 8 |
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; |