net: add a core netdev->rx_dropped counter
[deliverable/linux.git] / net / 8021q / vlan_core.c
index 07eeb5b99dce05a799054e192069753a879dc58d..dee727ce0291ea3cf8887a894fb08185414ba48c 100644 (file)
@@ -24,12 +24,16 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
 
        if (vlan_dev)
                skb->dev = vlan_dev;
-       else if (vlan_id)
-               goto drop;
+       else if (vlan_id) {
+               if (!(skb->dev->flags & IFF_PROMISC))
+                       goto drop;
+               skb->pkt_type = PACKET_OTHERHOST;
+       }
 
-       return (polling ? netif_receive_skb(skb) : netif_rx(skb));
+       return polling ? netif_receive_skb(skb) : netif_rx(skb);
 
 drop:
+       atomic_long_inc(&skb->dev->rx_dropped);
        dev_kfree_skb_any(skb);
        return NET_RX_DROP;
 }
@@ -40,7 +44,7 @@ void vlan_hwaccel_do_receive(struct sk_buff *skb)
        struct net_device *dev = skb->dev;
        struct vlan_rx_stats     *rx_stats;
 
-       skb->dev = vlan_dev_info(dev)->real_dev;
+       skb->dev = vlan_dev_real_dev(dev);
        netif_nit_deliver(skb);
 
        skb->dev = dev;
@@ -101,19 +105,26 @@ vlan_gro_common(struct napi_struct *napi, struct vlan_group *grp,
 
        if (vlan_dev)
                skb->dev = vlan_dev;
-       else if (vlan_id)
-               goto drop;
+       else if (vlan_id) {
+               if (!(skb->dev->flags & IFF_PROMISC))
+                       goto drop;
+               skb->pkt_type = PACKET_OTHERHOST;
+       }
 
        for (p = napi->gro_list; p; p = p->next) {
-               NAPI_GRO_CB(p)->same_flow =
-                       p->dev == skb->dev && !compare_ether_header(
-                               skb_mac_header(p), skb_gro_mac_header(skb));
+               unsigned long diffs;
+
+               diffs = (unsigned long)p->dev ^ (unsigned long)skb->dev;
+               diffs |= compare_ether_header(skb_mac_header(p),
+                                             skb_gro_mac_header(skb));
+               NAPI_GRO_CB(p)->same_flow = !diffs;
                NAPI_GRO_CB(p)->flush = 0;
        }
 
        return dev_gro_receive(napi, skb);
 
 drop:
+       atomic_long_inc(&skb->dev->rx_dropped);
        return GRO_DROP;
 }
 
This page took 0.025428 seconds and 5 git commands to generate.