diff options
author | Johannes Berg <johannes.berg@intel.com> | 2014-01-08 19:45:28 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2014-01-10 03:43:34 -0500 |
commit | 03c8c06f2d080b841ecbfc63253228ba6efcab08 (patch) | |
tree | fa8d392dcace4dadbe93fe8c29f9b1aa2bf094cc /net/mac80211 | |
parent | f9f760b4883d7fbfb463a67267e2be6b440d1aeb (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.c | 2 |
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); |