summaryrefslogtreecommitdiffstats
path: root/sys/net80211/ieee80211_ht.c
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2008-09-06 17:31:55 +0000
committersam <sam@FreeBSD.org>2008-09-06 17:31:55 +0000
commitd4815d5b74898f2e2ef33619904820b04687d0b9 (patch)
tree0c3343733ffb750bcd823fe5c5602f758186a99c /sys/net80211/ieee80211_ht.c
parent5379b08ec2c65ff99f5f94d2dde0686755a93b0d (diff)
downloadFreeBSD-src-d4815d5b74898f2e2ef33619904820b04687d0b9.zip
FreeBSD-src-d4815d5b74898f2e2ef33619904820b04687d0b9.tar.gz
don't do ampdu reordering of fragments; they should never happen
Diffstat (limited to 'sys/net80211/ieee80211_ht.c')
-rw-r--r--sys/net80211/ieee80211_ht.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/sys/net80211/ieee80211_ht.c b/sys/net80211/ieee80211_ht.c
index acbb0a7..d91e6a0 100644
--- a/sys/net80211/ieee80211_ht.c
+++ b/sys/net80211/ieee80211_ht.c
@@ -535,7 +535,21 @@ ieee80211_ampdu_reorder(struct ieee80211_node *ni, struct mbuf *m)
*/
return PROCESS;
}
- rxseq = le16toh(*(uint16_t *)wh->i_seq) >> IEEE80211_SEQ_SEQ_SHIFT;
+ rxseq = le16toh(*(uint16_t *)wh->i_seq);
+ if ((rxseq & IEEE80211_SEQ_FRAG_MASK) != 0) {
+ /*
+ * Fragments are not allowed; toss.
+ */
+ IEEE80211_DISCARD_MAC(vap,
+ IEEE80211_MSG_INPUT | IEEE80211_MSG_11N, ni->ni_macaddr,
+ "A-MPDU", "fragment, rxseq 0x%x tid %u%s", rxseq, tid,
+ wh->i_fc[1] & IEEE80211_FC1_RETRY ? " (retransmit)" : "");
+ vap->iv_stats.is_ampdu_rx_drop++;
+ IEEE80211_NODE_STAT(ni, rx_drop);
+ m_freem(m);
+ return CONSUMED;
+ }
+ rxseq >>= IEEE80211_SEQ_SEQ_SHIFT;
rap->rxa_nframes++;
again:
if (rxseq == rap->rxa_start) {
OpenPOWER on IntegriCloud