|
@@ -747,7 +747,7 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx)
|
|
struct sta_info *sta = rx->sta;
|
|
struct sta_info *sta = rx->sta;
|
|
struct tid_ampdu_rx *tid_agg_rx;
|
|
struct tid_ampdu_rx *tid_agg_rx;
|
|
u16 sc;
|
|
u16 sc;
|
|
- int tid;
|
|
|
|
|
|
+ u8 tid, ack_policy;
|
|
|
|
|
|
if (!ieee80211_is_data_qos(hdr->frame_control))
|
|
if (!ieee80211_is_data_qos(hdr->frame_control))
|
|
goto dont_reorder;
|
|
goto dont_reorder;
|
|
@@ -760,6 +760,8 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx)
|
|
if (!sta)
|
|
if (!sta)
|
|
goto dont_reorder;
|
|
goto dont_reorder;
|
|
|
|
|
|
|
|
+ ack_policy = *ieee80211_get_qos_ctl(hdr) &
|
|
|
|
+ IEEE80211_QOS_CTL_ACK_POLICY_MASK;
|
|
tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
|
|
tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
|
|
|
|
|
|
tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]);
|
|
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)
|
|
if (unlikely(hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_NULLFUNC)))
|
|
if (unlikely(hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_NULLFUNC)))
|
|
goto dont_reorder;
|
|
goto dont_reorder;
|
|
|
|
|
|
|
|
+ /* not part of a BA session */
|
|
|
|
+ if (ack_policy != IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK &&
|
|
|
|
+ ack_policy != IEEE80211_QOS_CTL_ACK_POLICY_NORMAL)
|
|
|
|
+ goto dont_reorder;
|
|
|
|
+
|
|
/* new, potentially un-ordered, ampdu frame - process it */
|
|
/* new, potentially un-ordered, ampdu frame - process it */
|
|
|
|
|
|
/* reset session timer */
|
|
/* reset session timer */
|