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
This commit is contained in:
parent
af60635fab
commit
61418971f4
@ -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
|
||||
|
@ -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 { \
|
||||
|
@ -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];
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user