mac80211: re-enable re-transmission of filtered frames
[safe/jmp/linux-2.6] / net / mac80211 / status.c
index 0c0850d..800b677 100644 (file)
@@ -45,29 +45,16 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 
        /*
-        * XXX: This is temporary!
-        *
-        *      The problem here is that when we get here, the driver will
-        *      quite likely have pretty much overwritten info->control by
-        *      using info->driver_data or info->rate_driver_data. Thus,
-        *      when passing out the frame to the driver again, we would be
-        *      passing completely bogus data since the driver would then
-        *      expect a properly filled info->control. In mac80211 itself
-        *      the same problem occurs, since we need info->control.vif
-        *      internally.
-        *
-        *      To fix this, we should send the frame through TX processing
-        *      again. However, it's not that simple, since the frame will
-        *      have been software-encrypted (if applicable) already, and
-        *      encrypting it again doesn't do much good. So to properly do
-        *      that, we not only have to skip the actual 'raw' encryption
-        *      (key selection etc. still has to be done!) but also the
-        *      sequence number assignment since that impacts the crypto
-        *      encapsulation, of course.
-        *
-        *      Hence, for now, fix the bug by just dropping the frame.
+        * This skb 'survived' a round-trip through the driver, and
+        * hopefully the driver didn't mangle it too badly. However,
+        * we can definitely not rely on the the control information
+        * being correct. Clear it so we don't get junk there, and
+        * indicate that it needs new processing, but must not be
+        * modified/encrypted again.
         */
-       goto drop;
+       memset(&info->control, 0, sizeof(info->control));
+       info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING |
+                      IEEE80211_TX_INTFL_RETRANSMISSION;
 
        sta->tx_filtered_count++;
 
@@ -122,7 +109,6 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
                return;
        }
 
- drop:
 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
        if (net_ratelimit())
                printk(KERN_DEBUG "%s: dropped TX filtered frame, "
@@ -351,7 +337,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
        rcu_read_lock();
        list_for_each_entry_rcu(sdata, &local->interfaces, list) {
                if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
-                       if (!netif_running(sdata->dev))
+                       if (!ieee80211_sdata_running(sdata))
                                continue;
 
                        if ((sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) &&