aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2014-01-08 19:45:28 -0500
committerJohannes Berg <johannes.berg@intel.com>2014-01-10 03:43:34 -0500
commit03c8c06f2d080b841ecbfc63253228ba6efcab08 (patch)
treefa8d392dcace4dadbe93fe8c29f9b1aa2bf094cc /net/mac80211
parentf9f760b4883d7fbfb463a67267e2be6b440d1aeb (diff)
mac80211: reset TX info flags when frame will be reprocessed
The temporary TX info flags need to be cleared if the frame will be processed through the TX handlers again, otherwise it can get messed up. This fixes a bug that happened when an aggregation session was stopped while the station was sleeping - some frames might get transmitted marked as aggregation erroneously without this fix. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/tx.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 377cf974d97d..9f3cbf14989b 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -500,6 +500,7 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
500 info->control.jiffies = jiffies; 500 info->control.jiffies = jiffies;
501 info->control.vif = &tx->sdata->vif; 501 info->control.vif = &tx->sdata->vif;
502 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; 502 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
503 info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
503 skb_queue_tail(&sta->ps_tx_buf[ac], tx->skb); 504 skb_queue_tail(&sta->ps_tx_buf[ac], tx->skb);
504 505
505 if (!timer_pending(&local->sta_cleanup)) 506 if (!timer_pending(&local->sta_cleanup))
@@ -1073,6 +1074,7 @@ static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx,
1073 queued = true; 1074 queued = true;
1074 info->control.vif = &tx->sdata->vif; 1075 info->control.vif = &tx->sdata->vif;
1075 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; 1076 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
1077 info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
1076 __skb_queue_tail(&tid_tx->pending, skb); 1078 __skb_queue_tail(&tid_tx->pending, skb);
1077 if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER) 1079 if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER)
1078 purge_skb = __skb_dequeue(&tid_tx->pending); 1080 purge_skb = __skb_dequeue(&tid_tx->pending);