diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/rx.c | 9 | ||||
-rw-r--r-- | net/mac80211/wme.c | 3 |
2 files changed, 10 insertions, 2 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 3173dcfc2136..72c1eb4eb451 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -747,7 +747,7 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx) | |||
747 | struct sta_info *sta = rx->sta; | 747 | struct sta_info *sta = rx->sta; |
748 | struct tid_ampdu_rx *tid_agg_rx; | 748 | struct tid_ampdu_rx *tid_agg_rx; |
749 | u16 sc; | 749 | u16 sc; |
750 | int tid; | 750 | u8 tid, ack_policy; |
751 | 751 | ||
752 | if (!ieee80211_is_data_qos(hdr->frame_control)) | 752 | if (!ieee80211_is_data_qos(hdr->frame_control)) |
753 | goto dont_reorder; | 753 | goto dont_reorder; |
@@ -760,6 +760,8 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx) | |||
760 | if (!sta) | 760 | if (!sta) |
761 | goto dont_reorder; | 761 | goto dont_reorder; |
762 | 762 | ||
763 | ack_policy = *ieee80211_get_qos_ctl(hdr) & | ||
764 | IEEE80211_QOS_CTL_ACK_POLICY_MASK; | ||
763 | tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK; | 765 | tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK; |
764 | 766 | ||
765 | tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); | 767 | tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); |
@@ -770,6 +772,11 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx) | |||
770 | if (unlikely(hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_NULLFUNC))) | 772 | if (unlikely(hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_NULLFUNC))) |
771 | goto dont_reorder; | 773 | goto dont_reorder; |
772 | 774 | ||
775 | /* not part of a BA session */ | ||
776 | if (ack_policy != IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK && | ||
777 | ack_policy != IEEE80211_QOS_CTL_ACK_POLICY_NORMAL) | ||
778 | goto dont_reorder; | ||
779 | |||
773 | /* new, potentially un-ordered, ampdu frame - process it */ | 780 | /* new, potentially un-ordered, ampdu frame - process it */ |
774 | 781 | ||
775 | /* reset session timer */ | 782 | /* reset session timer */ |
diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c index d0240bba45f3..d4f789a4e4f1 100644 --- a/net/mac80211/wme.c +++ b/net/mac80211/wme.c | |||
@@ -150,7 +150,8 @@ void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata, | |||
150 | /* preserve EOSP bit */ | 150 | /* preserve EOSP bit */ |
151 | ack_policy = *p & IEEE80211_QOS_CTL_EOSP; | 151 | ack_policy = *p & IEEE80211_QOS_CTL_EOSP; |
152 | 152 | ||
153 | if (unlikely(sdata->local->wifi_wme_noack_test)) | 153 | if (unlikely(sdata->local->wifi_wme_noack_test) || |
154 | is_multicast_ether_addr(hdr->addr1)) | ||
154 | ack_policy |= IEEE80211_QOS_CTL_ACK_POLICY_NOACK; | 155 | ack_policy |= IEEE80211_QOS_CTL_ACK_POLICY_NOACK; |
155 | /* qos header is 2 bytes */ | 156 | /* qos header is 2 bytes */ |
156 | *p++ = ack_policy | tid; | 157 | *p++ = ack_policy | tid; |