diff options
author | sam <sam@FreeBSD.org> | 2009-06-09 16:32:07 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2009-06-09 16:32:07 +0000 |
commit | 61418971f4dc85a3632054e202ccf76013a93e36 (patch) | |
tree | 0cfaff84cbdaf337d6e9b77890834939c8a50988 | |
parent | af60635fabd4377e14bc00ac6a5d6723f01308ed (diff) | |
download | FreeBSD-src-61418971f4dc85a3632054e202ccf76013a93e36.zip FreeBSD-src-61418971f4dc85a3632054e202ccf76013a93e36.tar.gz |
Correct ieee80211_gettid:
o don't increment extracted tid, this was a vestige of IEEE80211_NONQOS_TID
being defined as 0 (w/ real tid's +1)
o handle 4-address frames (add IEEE80211_IS_DSTODS to check if an 802.11
header is DSTODS)
Submitted by: cbzimmer
Reviewed by: avatar
-rw-r--r-- | sys/net80211/ieee80211.h | 3 | ||||
-rw-r--r-- | sys/net80211/ieee80211_crypto_ccmp.c | 5 | ||||
-rw-r--r-- | sys/net80211/ieee80211_ht.c | 2 | ||||
-rw-r--r-- | sys/net80211/ieee80211_proto.h | 11 |
4 files changed, 12 insertions, 9 deletions
diff --git a/sys/net80211/ieee80211.h b/sys/net80211/ieee80211.h index e93be50..d1c7658 100644 --- a/sys/net80211/ieee80211.h +++ b/sys/net80211/ieee80211.h @@ -158,6 +158,9 @@ struct ieee80211_qosframe_addr4 { #define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */ #define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */ +#define IEEE80211_IS_DSTODS(wh) \ + (((wh)->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS) + #define IEEE80211_FC1_MORE_FRAG 0x04 #define IEEE80211_FC1_RETRY 0x08 #define IEEE80211_FC1_PWR_MGT 0x10 diff --git a/sys/net80211/ieee80211_crypto_ccmp.c b/sys/net80211/ieee80211_crypto_ccmp.c index c969dae..79df266 100644 --- a/sys/net80211/ieee80211_crypto_ccmp.c +++ b/sys/net80211/ieee80211_crypto_ccmp.c @@ -298,8 +298,6 @@ ccmp_init_blocks(rijndael_ctx *ctx, struct ieee80211_frame *wh, uint8_t b0[AES_BLOCK_LEN], uint8_t aad[2 * AES_BLOCK_LEN], uint8_t auth[AES_BLOCK_LEN], uint8_t s0[AES_BLOCK_LEN]) { -#define IS_4ADDRESS(wh) \ - ((wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS) #define IS_QOS_DATA(wh) IEEE80211_QOS_HAS_SEQ(wh) /* CCM Initial Block: @@ -344,7 +342,7 @@ ccmp_init_blocks(rijndael_ctx *ctx, struct ieee80211_frame *wh, * initial block as we know whether or not we have * a QOS frame. */ - if (IS_4ADDRESS(wh)) { + if (IEEE80211_IS_DSTODS(wh)) { IEEE80211_ADDR_COPY(aad + 24, ((struct ieee80211_frame_addr4 *)wh)->i_addr4); if (IS_QOS_DATA(wh)) { @@ -386,7 +384,6 @@ ccmp_init_blocks(rijndael_ctx *ctx, struct ieee80211_frame *wh, b0[14] = b0[15] = 0; rijndael_encrypt(ctx, b0, s0); #undef IS_QOS_DATA -#undef IS_4ADDRESS } #define CCMP_ENCRYPT(_i, _b, _b0, _pos, _e, _len) do { \ diff --git a/sys/net80211/ieee80211_ht.c b/sys/net80211/ieee80211_ht.c index 713c900..182d052 100644 --- a/sys/net80211/ieee80211_ht.c +++ b/sys/net80211/ieee80211_ht.c @@ -567,7 +567,7 @@ ieee80211_ampdu_reorder(struct ieee80211_node *ni, struct mbuf *m) */ return PROCESS; } - if ((wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS) + if (IEEE80211_IS_DSTODS(wh)) tid = ((struct ieee80211_qosframe_addr4 *)wh)->i_qos[0]; else tid = wh->i_qos[0]; diff --git a/sys/net80211/ieee80211_proto.h b/sys/net80211/ieee80211_proto.h index e55fde9..de043c3 100644 --- a/sys/net80211/ieee80211_proto.h +++ b/sys/net80211/ieee80211_proto.h @@ -122,7 +122,7 @@ ieee80211_hdrsize(const void *data) /* NB: we don't handle control frames */ KASSERT((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_CTL, ("%s: control frame", __func__)); - if ((wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS) + if (IEEE80211_IS_DSTODS(wh)) size += IEEE80211_ADDR_LEN; if (IEEE80211_QOS_HAS_SEQ(wh)) size += sizeof(uint16_t); @@ -255,9 +255,12 @@ ieee80211_gettid(const struct ieee80211_frame *wh) uint8_t tid; if (IEEE80211_QOS_HAS_SEQ(wh)) { - tid = ((const struct ieee80211_qosframe *)wh)-> - i_qos[0] & IEEE80211_QOS_TID; - tid++; + if (IEEE80211_IS_DSTODS(wh)) + tid = ((const struct ieee80211_qosframe_addr4 *)wh)-> + i_qos[0]; + else + tid = ((const struct ieee80211_qosframe *)wh)->i_qos[0]; + tid &= IEEE80211_QOS_TID; } else tid = IEEE80211_NONQOS_TID; return tid; |