diff options
author | David S. Miller <davem@davemloft.net> | 2011-12-28 15:06:58 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-12-28 15:06:58 -0500 |
commit | 2c2aba6c561ac425602f4a0be61422224cb87151 (patch) | |
tree | 30b5f2c40b823ca61e2e0930d5e98a89a83222bb /net/ipv6/ndisc.c | |
parent | 32288eb4d940b10e40c6d4178fe3a40d1437d2f8 (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.c | 13 |
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 | ||
94 | static u32 ndisc_hash(const void *pkey, | 94 | static 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); |
97 | static int ndisc_constructor(struct neighbour *neigh); | 97 | static int ndisc_constructor(struct neighbour *neigh); |
98 | static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb); | 98 | static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb); |
99 | static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb); | 99 | static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb); |
@@ -349,16 +349,9 @@ EXPORT_SYMBOL(ndisc_mc_map); | |||
349 | 349 | ||
350 | static u32 ndisc_hash(const void *pkey, | 350 | static 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 | ||
364 | static int ndisc_constructor(struct neighbour *neigh) | 357 | static int ndisc_constructor(struct neighbour *neigh) |