]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - net/mac80211/rx.c
Merge tag 'mac80211-next-for-davem-2015-03-30' of git://git.kernel.org/pub/scm/linux...
[karo-tx-linux.git] / net / mac80211 / rx.c
index 944bdc04e913d2f599b6c5845ee2549abba20a1c..4f7b922cfda4898bbac5c78727f98abf084e14f8 100644 (file)
@@ -1912,8 +1912,7 @@ static int ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
        /* Drop unencrypted frames if key is set. */
        if (unlikely(!ieee80211_has_protected(fc) &&
                     !ieee80211_is_nullfunc(fc) &&
-                    ieee80211_is_data(fc) &&
-                    (rx->key || rx->sdata->drop_unencrypted)))
+                    ieee80211_is_data(fc) && rx->key))
                return -EACCES;
 
        return 0;
@@ -2043,6 +2042,9 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
        struct sta_info *dsta;
        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
 
+       dev->stats.rx_packets++;
+       dev->stats.rx_bytes += rx->skb->len;
+
        skb = rx->skb;
        xmit_skb = NULL;
 
@@ -2173,8 +2175,6 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
                        dev_kfree_skb(rx->skb);
                        continue;
                }
-               dev->stats.rx_packets++;
-               dev->stats.rx_bytes += rx->skb->len;
 
                ieee80211_deliver_skb(rx);
        }
@@ -2400,9 +2400,6 @@ ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
 
        rx->skb->dev = dev;
 
-       dev->stats.rx_packets++;
-       dev->stats.rx_bytes += rx->skb->len;
-
        if (local->ps_sdata && local->hw.conf.dynamic_ps_timeout > 0 &&
            !is_multicast_ether_addr(
                    ((struct ethhdr *)rx->skb->data)->h_dest) &&
@@ -3128,6 +3125,12 @@ static void ieee80211_rx_handlers(struct ieee80211_rx_data *rx,
                        goto rxh_next;  \
        } while (0);
 
+       /* Lock here to avoid hitting all of the data used in the RX
+        * path (e.g. key data, station data, ...) concurrently when
+        * a frame is released from the reorder buffer due to timeout
+        * from the timer, potentially concurrently with RX from the
+        * driver.
+        */
        spin_lock_bh(&rx->local->rx_path_lock);
 
        while ((skb = __skb_dequeue(frames))) {