bridge: update sysfs link names if port device names have changed
[safe/jmp/linux-2.6] / net / 8021q / vlan_core.c
index c1f51e4..c584a0a 100644 (file)
@@ -11,10 +11,11 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
        if (netpoll_rx(skb))
                return NET_RX_DROP;
 
-       if (skb_bond_should_drop(skb))
+       if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master)))
                goto drop;
 
-       skb->vlan_tci = vlan_tci;
+       skb->skb_iif = skb->dev->ifindex;
+       __vlan_hwaccel_put_tag(skb, vlan_tci);
        skb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK);
 
        if (!skb->dev)
@@ -31,7 +32,7 @@ EXPORT_SYMBOL(__vlan_hwaccel_rx);
 int vlan_hwaccel_do_receive(struct sk_buff *skb)
 {
        struct net_device *dev = skb->dev;
-       struct net_device_stats *stats;
+       struct vlan_rx_stats     *rx_stats;
 
        skb->dev = vlan_dev_info(dev)->real_dev;
        netif_nit_deliver(skb);
@@ -40,15 +41,17 @@ int vlan_hwaccel_do_receive(struct sk_buff *skb)
        skb->priority = vlan_get_ingress_priority(dev, skb->vlan_tci);
        skb->vlan_tci = 0;
 
-       stats = &dev->stats;
-       stats->rx_packets++;
-       stats->rx_bytes += skb->len;
+       rx_stats = per_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats,
+                              smp_processor_id());
+
+       rx_stats->rx_packets++;
+       rx_stats->rx_bytes += skb->len;
 
        switch (skb->pkt_type) {
        case PACKET_BROADCAST:
                break;
        case PACKET_MULTICAST:
-               stats->multicast++;
+               rx_stats->multicast++;
                break;
        case PACKET_OTHERHOST:
                /* Our lower layer thinks this is not local, let's make sure.
@@ -74,15 +77,17 @@ u16 vlan_dev_vlan_id(const struct net_device *dev)
 }
 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)
+static gro_result_t
+vlan_gro_common(struct napi_struct *napi, struct vlan_group *grp,
+               unsigned int vlan_tci, struct sk_buff *skb)
 {
        struct sk_buff *p;
 
-       if (skb_bond_should_drop(skb))
+       if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master)))
                goto drop;
 
-       skb->vlan_tci = vlan_tci;
+       skb->skb_iif = skb->dev->ifindex;
+       __vlan_hwaccel_put_tag(skb, vlan_tci);
        skb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK);
 
        if (!skb->dev)
@@ -101,11 +106,12 @@ drop:
        return GRO_DROP;
 }
 
-int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
-                    unsigned int vlan_tci, struct sk_buff *skb)
+gro_result_t vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
+                             unsigned int vlan_tci, struct sk_buff *skb)
 {
        if (netpoll_rx_on(skb))
-               return vlan_hwaccel_receive_skb(skb, grp, vlan_tci);
+               return vlan_hwaccel_receive_skb(skb, grp, vlan_tci)
+                       ? GRO_DROP : GRO_NORMAL;
 
        skb_gro_reset_offset(skb);
 
@@ -113,16 +119,19 @@ int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
 }
 EXPORT_SYMBOL(vlan_gro_receive);
 
-int vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
-                  unsigned int vlan_tci)
+gro_result_t vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
+                           unsigned int vlan_tci)
 {
        struct sk_buff *skb = napi_frags_skb(napi);
 
        if (!skb)
-               return NET_RX_DROP;
+               return GRO_DROP;
 
-       if (netpoll_rx_on(skb))
-               return vlan_hwaccel_receive_skb(skb, grp, vlan_tci);
+       if (netpoll_rx_on(skb)) {
+               skb->protocol = eth_type_trans(skb, skb->dev);
+               return vlan_hwaccel_receive_skb(skb, grp, vlan_tci)
+                       ? GRO_DROP : GRO_NORMAL;
+       }
 
        return napi_frags_finish(napi, skb,
                                 vlan_gro_common(napi, grp, vlan_tci, skb));