diff options
Diffstat (limited to 'net/mac80211/status.c')
-rw-r--r-- | net/mac80211/status.c | 32 |
1 files changed, 5 insertions, 27 deletions
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 9e171b178276..800b6777e0ed 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c | |||
@@ -45,37 +45,16 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local, | |||
45 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 45 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
46 | 46 | ||
47 | /* | 47 | /* |
48 | * XXX: This is temporary! | ||
49 | * | ||
50 | * The problem here is that when we get here, the driver will | ||
51 | * quite likely have pretty much overwritten info->control by | ||
52 | * using info->driver_data or info->rate_driver_data. Thus, | ||
53 | * when passing out the frame to the driver again, we would be | ||
54 | * passing completely bogus data since the driver would then | ||
55 | * expect a properly filled info->control. In mac80211 itself | ||
56 | * the same problem occurs, since we need info->control.vif | ||
57 | * internally. | ||
58 | * | ||
59 | * To fix this, we should send the frame through TX processing | ||
60 | * again. However, it's not that simple, since the frame will | ||
61 | * have been software-encrypted (if applicable) already, and | ||
62 | * encrypting it again doesn't do much good. So to properly do | ||
63 | * that, we not only have to skip the actual 'raw' encryption | ||
64 | * (key selection etc. still has to be done!) but also the | ||
65 | * sequence number assignment since that impacts the crypto | ||
66 | * encapsulation, of course. | ||
67 | * | ||
68 | * Hence, for now, fix the bug by just dropping the frame. | ||
69 | */ | ||
70 | goto drop; | ||
71 | |||
72 | /* | ||
73 | * This skb 'survived' a round-trip through the driver, and | 48 | * This skb 'survived' a round-trip through the driver, and |
74 | * hopefully the driver didn't mangle it too badly. However, | 49 | * hopefully the driver didn't mangle it too badly. However, |
75 | * we can definitely not rely on the the control information | 50 | * we can definitely not rely on the the control information |
76 | * being correct. Clear it so we don't get junk there. | 51 | * being correct. Clear it so we don't get junk there, and |
52 | * indicate that it needs new processing, but must not be | ||
53 | * modified/encrypted again. | ||
77 | */ | 54 | */ |
78 | memset(&info->control, 0, sizeof(info->control)); | 55 | memset(&info->control, 0, sizeof(info->control)); |
56 | info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING | | ||
57 | IEEE80211_TX_INTFL_RETRANSMISSION; | ||
79 | 58 | ||
80 | sta->tx_filtered_count++; | 59 | sta->tx_filtered_count++; |
81 | 60 | ||
@@ -130,7 +109,6 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local, | |||
130 | return; | 109 | return; |
131 | } | 110 | } |
132 | 111 | ||
133 | drop: | ||
134 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 112 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG |
135 | if (net_ratelimit()) | 113 | if (net_ratelimit()) |
136 | printk(KERN_DEBUG "%s: dropped TX filtered frame, " | 114 | printk(KERN_DEBUG "%s: dropped TX filtered frame, " |