diff options
Diffstat (limited to 'net/mac80211/status.c')
-rw-r--r-- | net/mac80211/status.c | 35 |
1 files changed, 12 insertions, 23 deletions
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 0ebcdda24200..e57ad6b1d7ea 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c | |||
@@ -45,29 +45,19 @@ 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! | 48 | * This skb 'survived' a round-trip through the driver, and |
49 | * | 49 | * hopefully the driver didn't mangle it too badly. However, |
50 | * The problem here is that when we get here, the driver will | 50 | * we can definitely not rely on the the control information |
51 | * quite likely have pretty much overwritten info->control by | 51 | * being correct. Clear it so we don't get junk there, and |
52 | * using info->driver_data or info->rate_driver_data. Thus, | 52 | * indicate that it needs new processing, but must not be |
53 | * when passing out the frame to the driver again, we would be | 53 | * modified/encrypted again. |
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 | */ | 54 | */ |
70 | goto drop; | 55 | memset(&info->control, 0, sizeof(info->control)); |
56 | |||
57 | info->control.jiffies = jiffies; | ||
58 | info->control.vif = &sta->sdata->vif; | ||
59 | info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING | | ||
60 | IEEE80211_TX_INTFL_RETRANSMISSION; | ||
71 | 61 | ||
72 | sta->tx_filtered_count++; | 62 | sta->tx_filtered_count++; |
73 | 63 | ||
@@ -122,7 +112,6 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local, | |||
122 | return; | 112 | return; |
123 | } | 113 | } |
124 | 114 | ||
125 | drop: | ||
126 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 115 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG |
127 | if (net_ratelimit()) | 116 | if (net_ratelimit()) |
128 | printk(KERN_DEBUG "%s: dropped TX filtered frame, " | 117 | printk(KERN_DEBUG "%s: dropped TX filtered frame, " |