net: rps: support 802.1Q
authorChangli Gao <xiaosuo@gmail.com>
Fri, 19 Aug 2011 05:07:54 +0000 (22:07 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 19 Aug 2011 05:07:54 +0000 (22:07 -0700)
For the 802.1Q packets, if the NIC doesn't support hw-accel-vlan-rx, RPS
won't inspect the internal 4 tuples to generate skb->rxhash, so this kind
of traffic can't get any benefit from RPS.

This patch adds the support for 802.1Q to RPS.

Signed-off-by: Changli Gao <xiaosuo@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index ead0366ee1e470a3e1b26ef814b8ec2cbe9a69ae..be7ee506f17aa9d0b2a8e6ce0bb6eb4bbdc3343f 100644 (file)
@@ -2529,6 +2529,7 @@ void __skb_get_rxhash(struct sk_buff *skb)
        int nhoff, hash = 0, poff;
        const struct ipv6hdr *ip6;
        const struct iphdr *ip;
+       const struct vlan_hdr *vlan;
        u8 ip_proto;
        u32 addr1, addr2;
        u16 proto;
@@ -2565,6 +2566,13 @@ again:
                addr2 = (__force u32) ip6->daddr.s6_addr32[3];
                nhoff += 40;
                break;
+       case __constant_htons(ETH_P_8021Q):
+               if (!pskb_may_pull(skb, sizeof(*vlan) + nhoff))
+                       goto done;
+               vlan = (const struct vlan_hdr *) (skb->data + nhoff);
+               proto = vlan->h_vlan_encapsulated_proto;
+               nhoff += sizeof(*vlan);
+               goto again;
        default:
                goto done;
        }