diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/main.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index c1a799194fff..9dd8d25611e0 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -310,6 +310,31 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local, | |||
310 | { | 310 | { |
311 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 311 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
312 | 312 | ||
313 | /* | ||
314 | * XXX: This is temporary! | ||
315 | * | ||
316 | * The problem here is that when we get here, the driver will | ||
317 | * quite likely have pretty much overwritten info->control by | ||
318 | * using info->driver_data or info->rate_driver_data. Thus, | ||
319 | * when passing out the frame to the driver again, we would be | ||
320 | * passing completely bogus data since the driver would then | ||
321 | * expect a properly filled info->control. In mac80211 itself | ||
322 | * the same problem occurs, since we need info->control.vif | ||
323 | * internally. | ||
324 | * | ||
325 | * To fix this, we should send the frame through TX processing | ||
326 | * again. However, it's not that simple, since the frame will | ||
327 | * have been software-encrypted (if applicable) already, and | ||
328 | * encrypting it again doesn't do much good. So to properly do | ||
329 | * that, we not only have to skip the actual 'raw' encryption | ||
330 | * (key selection etc. still has to be done!) but also the | ||
331 | * sequence number assignment since that impacts the crypto | ||
332 | * encapsulation, of course. | ||
333 | * | ||
334 | * Hence, for now, fix the bug by just dropping the frame. | ||
335 | */ | ||
336 | goto drop; | ||
337 | |||
313 | sta->tx_filtered_count++; | 338 | sta->tx_filtered_count++; |
314 | 339 | ||
315 | /* | 340 | /* |
@@ -363,6 +388,7 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local, | |||
363 | return; | 388 | return; |
364 | } | 389 | } |
365 | 390 | ||
391 | drop: | ||
366 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 392 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG |
367 | if (net_ratelimit()) | 393 | if (net_ratelimit()) |
368 | printk(KERN_DEBUG "%s: dropped TX filtered frame, " | 394 | printk(KERN_DEBUG "%s: dropped TX filtered frame, " |