diff options
author | Johannes Berg <johannes.berg@intel.com> | 2016-08-29 23:25:18 +0300 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2016-09-12 12:46:21 +0300 |
commit | bfe40fa395ddc41e45310a4426574703a05e1177 (patch) | |
tree | 7924a96bbbcb492c99f082b6708db482aa873cc0 /net/mac80211/rx.c | |
parent | 99ee7cae3bf3ce04e90d7b193d9f4f59a7044d91 (diff) | |
download | linux-bfe40fa395ddc41e45310a4426574703a05e1177.tar.xz |
mac80211: send delBA on unexpected BlockAck data frames
When we receive data frames with ACK policy BlockAck, send
delBA as requested by the 802.11 spec. Since this would be
happening for every frame inside an A-MPDU if it's really
received outside a session, limit it to a single attempt.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r-- | net/mac80211/rx.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 284f0f25e22e..ad636c930f84 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -1122,8 +1122,15 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx, tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK; tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); - if (!tid_agg_rx) + if (!tid_agg_rx) { + if (ack_policy == IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK && + !test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && + !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) + ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, + WLAN_BACK_RECIPIENT, + WLAN_REASON_QSTA_REQUIRE_SETUP); goto dont_reorder; + } /* qos null data frames are excluded */ if (unlikely(hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_NULLFUNC))) |