diff options
-rw-r--r-- | net/mac80211/tx.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index a23a84e93e80..7e7de811e6ad 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1420,6 +1420,7 @@ bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, | |||
1420 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); | 1420 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); |
1421 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 1421 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1422 | struct ieee80211_tx_data tx; | 1422 | struct ieee80211_tx_data tx; |
1423 | struct sk_buff *skb2; | ||
1423 | 1424 | ||
1424 | if (ieee80211_tx_prepare(sdata, &tx, skb) == TX_DROP) | 1425 | if (ieee80211_tx_prepare(sdata, &tx, skb) == TX_DROP) |
1425 | return false; | 1426 | return false; |
@@ -1438,6 +1439,14 @@ bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, | |||
1438 | *sta = NULL; | 1439 | *sta = NULL; |
1439 | } | 1440 | } |
1440 | 1441 | ||
1442 | /* this function isn't suitable for fragmented data frames */ | ||
1443 | skb2 = __skb_dequeue(&tx.skbs); | ||
1444 | if (WARN_ON(skb2 != skb || !skb_queue_empty(&tx.skbs))) { | ||
1445 | ieee80211_free_txskb(hw, skb2); | ||
1446 | ieee80211_purge_tx_queue(hw, &tx.skbs); | ||
1447 | return false; | ||
1448 | } | ||
1449 | |||
1441 | return true; | 1450 | return true; |
1442 | } | 1451 | } |
1443 | EXPORT_SYMBOL(ieee80211_tx_prepare_skb); | 1452 | EXPORT_SYMBOL(ieee80211_tx_prepare_skb); |