|
@@ -936,8 +936,14 @@ ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
|
|
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
|
|
|
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
|
|
|
|
|
|
- /* Drop duplicate 802.11 retransmissions (IEEE 802.11 Chap. 9.2.9) */
|
|
|
- if (rx->sta && !is_multicast_ether_addr(hdr->addr1)) {
|
|
|
+ /*
|
|
|
+ * Drop duplicate 802.11 retransmissions
|
|
|
+ * (IEEE 802.11-2012: 9.3.2.10 "Duplicate detection and recovery")
|
|
|
+ */
|
|
|
+ if (rx->skb->len >= 24 && rx->sta &&
|
|
|
+ !ieee80211_is_ctl(hdr->frame_control) &&
|
|
|
+ !ieee80211_is_qos_nullfunc(hdr->frame_control) &&
|
|
|
+ !is_multicast_ether_addr(hdr->addr1)) {
|
|
|
if (unlikely(ieee80211_has_retry(hdr->frame_control) &&
|
|
|
rx->sta->last_seq_ctrl[rx->seqno_idx] ==
|
|
|
hdr->seq_ctrl)) {
|