Merge tag 'drm-intel-next-2014-09-01' of git://anongit.freedesktop.org/drm-intel...
[firefly-linux-kernel-4.4.55.git] / net / mac802154 / wpan.c
index 23bc91cf99c465232b0b2406f29a9bcd2b539b98..3c3069fd69718277fc719e82d7bf2c51bb9747db 100644 (file)
@@ -472,6 +472,7 @@ mac802154_subif_frame(struct mac802154_sub_if_data *sdata, struct sk_buff *skb,
        rc = mac802154_llsec_decrypt(&sdata->sec, skb);
        if (rc) {
                pr_debug("decryption failed: %i\n", rc);
+               kfree_skb(skb);
                return NET_RX_DROP;
        }
 
@@ -566,7 +567,6 @@ static int mac802154_parse_frame_start(struct sk_buff *skb,
 void mac802154_wpans_rx(struct mac802154_priv *priv, struct sk_buff *skb)
 {
        int ret;
-       struct sk_buff *sskb;
        struct mac802154_sub_if_data *sdata;
        struct ieee802154_hdr hdr;
 
@@ -578,12 +578,16 @@ void mac802154_wpans_rx(struct mac802154_priv *priv, struct sk_buff *skb)
 
        rcu_read_lock();
        list_for_each_entry_rcu(sdata, &priv->slaves, list) {
-               if (sdata->type != IEEE802154_DEV_WPAN)
+               if (sdata->type != IEEE802154_DEV_WPAN ||
+                   !netif_running(sdata->dev))
                        continue;
 
-               sskb = skb_clone(skb, GFP_ATOMIC);
-               if (sskb)
-                       mac802154_subif_frame(sdata, sskb, &hdr);
+               mac802154_subif_frame(sdata, skb, &hdr);
+               skb = NULL;
+               break;
        }
        rcu_read_unlock();
+
+       if (skb)
+               kfree_skb(skb);
 }