diff options
| -rw-r--r-- | net/mac80211/status.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 56d5b9a6ec5b..11805a3a626f 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c | |||
| @@ -171,7 +171,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
| 171 | struct net_device *prev_dev = NULL; | 171 | struct net_device *prev_dev = NULL; |
| 172 | struct sta_info *sta, *tmp; | 172 | struct sta_info *sta, *tmp; |
| 173 | int retry_count = -1, i; | 173 | int retry_count = -1, i; |
| 174 | bool injected; | 174 | bool send_to_cooked; |
| 175 | 175 | ||
| 176 | for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { | 176 | for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { |
| 177 | /* the HW cannot have attempted that rate */ | 177 | /* the HW cannot have attempted that rate */ |
| @@ -296,11 +296,15 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
| 296 | /* this was a transmitted frame, but now we want to reuse it */ | 296 | /* this was a transmitted frame, but now we want to reuse it */ |
| 297 | skb_orphan(skb); | 297 | skb_orphan(skb); |
| 298 | 298 | ||
| 299 | /* Need to make a copy before skb->cb gets cleared */ | ||
| 300 | send_to_cooked = !!(info->flags & IEEE80211_TX_CTL_INJECTED) || | ||
| 301 | (type != IEEE80211_FTYPE_DATA); | ||
| 302 | |||
| 299 | /* | 303 | /* |
| 300 | * This is a bit racy but we can avoid a lot of work | 304 | * This is a bit racy but we can avoid a lot of work |
| 301 | * with this test... | 305 | * with this test... |
| 302 | */ | 306 | */ |
| 303 | if (!local->monitors && !local->cooked_mntrs) { | 307 | if (!local->monitors && (!send_to_cooked || !local->cooked_mntrs)) { |
| 304 | dev_kfree_skb(skb); | 308 | dev_kfree_skb(skb); |
| 305 | return; | 309 | return; |
| 306 | } | 310 | } |
| @@ -345,9 +349,6 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
| 345 | /* for now report the total retry_count */ | 349 | /* for now report the total retry_count */ |
| 346 | rthdr->data_retries = retry_count; | 350 | rthdr->data_retries = retry_count; |
| 347 | 351 | ||
| 348 | /* Need to make a copy before skb->cb gets cleared */ | ||
| 349 | injected = !!(info->flags & IEEE80211_TX_CTL_INJECTED); | ||
| 350 | |||
| 351 | /* XXX: is this sufficient for BPF? */ | 352 | /* XXX: is this sufficient for BPF? */ |
| 352 | skb_set_mac_header(skb, 0); | 353 | skb_set_mac_header(skb, 0); |
| 353 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 354 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| @@ -362,8 +363,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
| 362 | continue; | 363 | continue; |
| 363 | 364 | ||
| 364 | if ((sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) && | 365 | if ((sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) && |
| 365 | !injected && | 366 | !send_to_cooked) |
| 366 | (type == IEEE80211_FTYPE_DATA)) | ||
| 367 | continue; | 367 | continue; |
| 368 | 368 | ||
| 369 | if (prev_dev) { | 369 | if (prev_dev) { |
