|
@@ -1065,6 +1065,7 @@ static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx,
|
|
|
{
|
|
|
bool queued = false;
|
|
|
bool reset_agg_timer = false;
|
|
|
+ struct sk_buff *purge_skb = NULL;
|
|
|
|
|
|
if (test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) {
|
|
|
info->flags |= IEEE80211_TX_CTL_AMPDU;
|
|
@@ -1106,8 +1107,13 @@ static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx,
|
|
|
info->control.vif = &tx->sdata->vif;
|
|
|
info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
|
|
|
__skb_queue_tail(&tid_tx->pending, skb);
|
|
|
+ if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER)
|
|
|
+ purge_skb = __skb_dequeue(&tid_tx->pending);
|
|
|
}
|
|
|
spin_unlock(&tx->sta->lock);
|
|
|
+
|
|
|
+ if (purge_skb)
|
|
|
+ dev_kfree_skb(purge_skb);
|
|
|
}
|
|
|
|
|
|
/* reset session timer */
|