diff options
author | Julian Anastasov <ja@ssi.bg> | 2013-03-09 23:25:07 +0200 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2013-03-19 21:18:38 +0900 |
commit | e9836f24f2e2a12336f7c95964661d5ea3d5a6a1 (patch) | |
tree | 015ba4ceadbe4a7d8958a72de848ce7eb4a00b43 /net/netfilter/ipvs/ip_vs_ctl.c | |
parent | 1cdb09056b27b2a06b06dc7187d2c33d57082d20 (diff) | |
download | linux-e9836f24f2e2a12336f7c95964661d5ea3d5a6a1.tar.bz2 |
ipvs: fix hashing in ip_vs_svc_hashkey
net is a pointer in host order, mix it properly
with other keys in network order. Fixes sparse warning.
Signed-off-by: Julian Anastasov <ja@ssi.bg>
Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'net/netfilter/ipvs/ip_vs_ctl.c')
-rw-r--r-- | net/netfilter/ipvs/ip_vs_ctl.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index c68198bf9128..a528178f7506 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c @@ -271,16 +271,18 @@ ip_vs_svc_hashkey(struct net *net, int af, unsigned int proto, { register unsigned int porth = ntohs(port); __be32 addr_fold = addr->ip; + __u32 ahash; #ifdef CONFIG_IP_VS_IPV6 if (af == AF_INET6) addr_fold = addr->ip6[0]^addr->ip6[1]^ addr->ip6[2]^addr->ip6[3]; #endif - addr_fold ^= ((size_t)net>>8); + ahash = ntohl(addr_fold); + ahash ^= ((size_t) net >> 8); - return (proto^ntohl(addr_fold)^(porth>>IP_VS_SVC_TAB_BITS)^porth) - & IP_VS_SVC_TAB_MASK; + return (proto ^ ahash ^ (porth >> IP_VS_SVC_TAB_BITS) ^ porth) & + IP_VS_SVC_TAB_MASK; } /* |