mirror of https://gitee.com/openkylin/linux.git
ipvs: fix multiplicative hashing in sh/dh/lblc/lblcr algorithms
The sh/dh/lblc/lblcr algorithms are using Knuth's multiplicative hashing incorrectly. Replace its use by the hash_32() macro, which correctly implements this algorithm. It doesn't use the same constant, but it shouldn't matter. Signed-off-by: Vincent Bernat <vincent@bernat.im> Acked-by: Julian Anastasov <ja@ssi.bg> Signed-off-by: Simon Horman <horms@verge.net.au>
This commit is contained in:
parent
30edf801d7
commit
9a17740e0e
|
@ -43,6 +43,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
|
#include <linux/hash.h>
|
||||||
|
|
||||||
#include <net/ip_vs.h>
|
#include <net/ip_vs.h>
|
||||||
|
|
||||||
|
@ -81,7 +82,7 @@ static inline unsigned int ip_vs_dh_hashkey(int af, const union nf_inet_addr *ad
|
||||||
addr_fold = addr->ip6[0]^addr->ip6[1]^
|
addr_fold = addr->ip6[0]^addr->ip6[1]^
|
||||||
addr->ip6[2]^addr->ip6[3];
|
addr->ip6[2]^addr->ip6[3];
|
||||||
#endif
|
#endif
|
||||||
return (ntohl(addr_fold)*2654435761UL) & IP_VS_DH_TAB_MASK;
|
return hash_32(ntohl(addr_fold), IP_VS_DH_TAB_BITS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/jiffies.h>
|
#include <linux/jiffies.h>
|
||||||
|
#include <linux/hash.h>
|
||||||
|
|
||||||
/* for sysctl */
|
/* for sysctl */
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
|
@ -160,7 +161,7 @@ ip_vs_lblc_hashkey(int af, const union nf_inet_addr *addr)
|
||||||
addr_fold = addr->ip6[0]^addr->ip6[1]^
|
addr_fold = addr->ip6[0]^addr->ip6[1]^
|
||||||
addr->ip6[2]^addr->ip6[3];
|
addr->ip6[2]^addr->ip6[3];
|
||||||
#endif
|
#endif
|
||||||
return (ntohl(addr_fold)*2654435761UL) & IP_VS_LBLC_TAB_MASK;
|
return hash_32(ntohl(addr_fold), IP_VS_LBLC_TAB_BITS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
#include <linux/jiffies.h>
|
#include <linux/jiffies.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/hash.h>
|
||||||
|
|
||||||
/* for sysctl */
|
/* for sysctl */
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
|
@ -323,7 +324,7 @@ ip_vs_lblcr_hashkey(int af, const union nf_inet_addr *addr)
|
||||||
addr_fold = addr->ip6[0]^addr->ip6[1]^
|
addr_fold = addr->ip6[0]^addr->ip6[1]^
|
||||||
addr->ip6[2]^addr->ip6[3];
|
addr->ip6[2]^addr->ip6[3];
|
||||||
#endif
|
#endif
|
||||||
return (ntohl(addr_fold)*2654435761UL) & IP_VS_LBLCR_TAB_MASK;
|
return hash_32(ntohl(addr_fold), IP_VS_LBLCR_TAB_BITS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,8 @@ ip_vs_sh_hashkey(int af, const union nf_inet_addr *addr,
|
||||||
addr_fold = addr->ip6[0]^addr->ip6[1]^
|
addr_fold = addr->ip6[0]^addr->ip6[1]^
|
||||||
addr->ip6[2]^addr->ip6[3];
|
addr->ip6[2]^addr->ip6[3];
|
||||||
#endif
|
#endif
|
||||||
return (offset + (ntohs(port) + ntohl(addr_fold))*2654435761UL) &
|
return (offset + hash_32(ntohs(port) + ntohl(addr_fold),
|
||||||
|
IP_VS_SH_TAB_BITS)) &
|
||||||
IP_VS_SH_TAB_MASK;
|
IP_VS_SH_TAB_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue