diff options
author | Changli Gao <xiaosuo@gmail.com> | 2010-08-17 19:04:32 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-08-19 17:16:23 -0700 |
commit | 12fcdefb3643607c47f39906a49056cf608bb545 (patch) | |
tree | 1f0495dcc9b7f4abee57f4ff2107d88ba64c8e97 /net | |
parent | e760702ed8333588f9f21e7bf6597873993006f1 (diff) | |
download | linux-12fcdefb3643607c47f39906a49056cf608bb545.tar.bz2 |
net: rps: use proto_ports_offset() to handle the AH message correctly
The SPI isn't at the beginning of an AH message.
Signed-off-by: Changli Gao <xiaosuo@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/dev.c | 23 |
1 files changed, 7 insertions, 16 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 7e97e891636e..da584f5ab3d2 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2266,7 +2266,7 @@ static inline void ____napi_schedule(struct softnet_data *sd, */ __u32 __skb_get_rxhash(struct sk_buff *skb) { - int nhoff, hash = 0; + int nhoff, hash = 0, poff; struct ipv6hdr *ip6; struct iphdr *ip; u8 ip_proto; @@ -2306,24 +2306,15 @@ __u32 __skb_get_rxhash(struct sk_buff *skb) goto done; } - switch (ip_proto) { - case IPPROTO_TCP: - case IPPROTO_UDP: - case IPPROTO_DCCP: - case IPPROTO_ESP: - case IPPROTO_AH: - case IPPROTO_SCTP: - case IPPROTO_UDPLITE: - if (pskb_may_pull(skb, (ihl * 4) + 4 + nhoff)) { - ports.v32 = * (__force u32 *) (skb->data + nhoff + - (ihl * 4)); + ports.v32 = 0; + poff = proto_ports_offset(ip_proto); + if (poff >= 0) { + nhoff += ihl * 4 + poff; + if (pskb_may_pull(skb, nhoff + 4)) { + ports.v32 = * (__force u32 *) (skb->data + nhoff); if (ports.v16[1] < ports.v16[0]) swap(ports.v16[0], ports.v16[1]); - break; } - default: - ports.v32 = 0; - break; } /* get a consistent hash (same value on both flow directions) */ |