aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/main.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-07-27 14:28:40 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-08-04 16:43:18 -0400
commit4da163ab0a224590f3cae67c1d54ae8c428f6223 (patch)
tree901e5929df0b72ffccb84ba5ec439ac709f78705 /net/mac80211/main.c
parente4c4e448cf557921ffbbbd6d6ddac81fdceacb4f (diff)
mac80211: disable software retry for now
Pavel Roskin reported a problem that seems to be due to software retry of already transmitted frames. It turns out that we've never done that correctly, but due to some recent changes it now crashes in the TX code. I've added a comment in the patch that explains the problem better and also points to possible solutions -- which I can't implement right now. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/main.c')
-rw-r--r--net/mac80211/main.c26
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, "