Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[firefly-linux-kernel-4.4.55.git] / net / 8021q / vlan_core.c
index 6c1323940263121549594f30865c6e84a210eb3d..2d6e405fc4981cf0189836ce3a163833269a2e8b 100644 (file)
@@ -1,12 +1,16 @@
 #include <linux/skbuff.h>
 #include <linux/netdevice.h>
 #include <linux/if_vlan.h>
+#include <linux/netpoll.h>
 #include "vlan.h"
 
 /* VLAN rx hw acceleration helper.  This acts like netif_{rx,receive_skb}(). */
 int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
                      u16 vlan_tci, int polling)
 {
+       if (netpoll_rx(skb))
+               return NET_RX_DROP;
+
        if (skb_bond_should_drop(skb))
                goto drop;
 
@@ -62,13 +66,13 @@ struct net_device *vlan_dev_real_dev(const struct net_device *dev)
 {
        return vlan_dev_info(dev)->real_dev;
 }
-EXPORT_SYMBOL_GPL(vlan_dev_real_dev);
+EXPORT_SYMBOL(vlan_dev_real_dev);
 
 u16 vlan_dev_vlan_id(const struct net_device *dev)
 {
        return vlan_dev_info(dev)->vlan_id;
 }
-EXPORT_SYMBOL_GPL(vlan_dev_vlan_id);
+EXPORT_SYMBOL(vlan_dev_vlan_id);
 
 static int vlan_gro_common(struct napi_struct *napi, struct vlan_group *grp,
                           unsigned int vlan_tci, struct sk_buff *skb)
@@ -85,7 +89,9 @@ static int vlan_gro_common(struct napi_struct *napi, struct vlan_group *grp,
                goto drop;
 
        for (p = napi->gro_list; p; p = p->next) {
-               NAPI_GRO_CB(p)->same_flow = p->dev == skb->dev;
+               NAPI_GRO_CB(p)->same_flow =
+                       p->dev == skb->dev && !compare_ether_header(
+                               skb_mac_header(p), skb_gro_mac_header(skb));
                NAPI_GRO_CB(p)->flush = 0;
        }
 
@@ -98,22 +104,12 @@ drop:
 int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
                     unsigned int vlan_tci, struct sk_buff *skb)
 {
-       int err = NET_RX_SUCCESS;
-
-       switch (vlan_gro_common(napi, grp, vlan_tci, skb)) {
-       case -1:
-               return netif_receive_skb(skb);
-
-       case 2:
-               err = NET_RX_DROP;
-               /* fall through */
+       skb_gro_reset_offset(skb);
 
-       case 1:
-               kfree_skb(skb);
-               break;
-       }
+       if (netpoll_receive_skb(skb))
+               return NET_RX_DROP;
 
-       return err;
+       return napi_skb_finish(vlan_gro_common(napi, grp, vlan_tci, skb), skb);
 }
 EXPORT_SYMBOL(vlan_gro_receive);
 
@@ -121,27 +117,14 @@ int vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
                   unsigned int vlan_tci, struct napi_gro_fraginfo *info)
 {
        struct sk_buff *skb = napi_fraginfo_skb(napi, info);
-       int err = NET_RX_DROP;
 
        if (!skb)
-               goto out;
+               return NET_RX_DROP;
 
-       err = NET_RX_SUCCESS;
-
-       switch (vlan_gro_common(napi, grp, vlan_tci, skb)) {
-       case -1:
-               return netif_receive_skb(skb);
-
-       case 2:
-               err = NET_RX_DROP;
-               /* fall through */
-
-       case 1:
-               napi_reuse_skb(napi, skb);
-               break;
-       }
+       if (netpoll_receive_skb(skb))
+               return NET_RX_DROP;
 
-out:
-       return err;
+       return napi_frags_finish(napi, skb,
+                                vlan_gro_common(napi, grp, vlan_tci, skb));
 }
 EXPORT_SYMBOL(vlan_gro_frags);