aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/ndisc.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-12-28 15:06:58 -0500
committerDavid S. Miller <davem@davemloft.net>2011-12-28 15:06:58 -0500
commit2c2aba6c561ac425602f4a0be61422224cb87151 (patch)
tree30b5f2c40b823ca61e2e0930d5e98a89a83222bb /net/ipv6/ndisc.c
parent32288eb4d940b10e40c6d4178fe3a40d1437d2f8 (diff)
ipv6: Use universal hash for NDISC.
In order to perform a proper universal hash on a vector of integers, we have to use different universal hashes on each vector element. Which means we need 4 different hash randoms for ipv6. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/ndisc.c')
-rw-r--r--net/ipv6/ndisc.c13
1 files changed, 3 insertions, 10 deletions
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index f3e50c29add4..538a61960a24 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -93,7 +93,7 @@
93 93
94static u32 ndisc_hash(const void *pkey, 94static u32 ndisc_hash(const void *pkey,
95 const struct net_device *dev, 95 const struct net_device *dev,
96 __u32 rnd); 96 __u32 *hash_rnd);
97static int ndisc_constructor(struct neighbour *neigh); 97static int ndisc_constructor(struct neighbour *neigh);
98static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb); 98static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb);
99static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb); 99static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb);
@@ -349,16 +349,9 @@ EXPORT_SYMBOL(ndisc_mc_map);
349 349
350static u32 ndisc_hash(const void *pkey, 350static u32 ndisc_hash(const void *pkey,
351 const struct net_device *dev, 351 const struct net_device *dev,
352 __u32 hash_rnd) 352 __u32 *hash_rnd)
353{ 353{
354 const u32 *p32 = pkey; 354 return ndisc_hashfn(pkey, dev, hash_rnd);
355 u32 addr_hash, i;
356
357 addr_hash = 0;
358 for (i = 0; i < (sizeof(struct in6_addr) / sizeof(u32)); i++)
359 addr_hash ^= *p32++;
360
361 return jhash_2words(addr_hash, dev->ifindex, hash_rnd);
362} 355}
363 356
364static int ndisc_constructor(struct neighbour *neigh) 357static int ndisc_constructor(struct neighbour *neigh)