diff options
Diffstat (limited to 'net/ipv6/reassembly.c')
-rw-r--r-- | net/ipv6/reassembly.c | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index c7ba3149633f..07beeb06f752 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
@@ -104,26 +104,22 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, | |||
104 | unsigned int inet6_hash_frag(__be32 id, const struct in6_addr *saddr, | 104 | unsigned int inet6_hash_frag(__be32 id, const struct in6_addr *saddr, |
105 | const struct in6_addr *daddr, u32 rnd) | 105 | const struct in6_addr *daddr, u32 rnd) |
106 | { | 106 | { |
107 | u32 a, b, c; | 107 | u32 c; |
108 | 108 | ||
109 | a = (__force u32)saddr->s6_addr32[0]; | 109 | c = jhash_3words((__force u32)saddr->s6_addr32[0], |
110 | b = (__force u32)saddr->s6_addr32[1]; | 110 | (__force u32)saddr->s6_addr32[1], |
111 | c = (__force u32)saddr->s6_addr32[2]; | 111 | (__force u32)saddr->s6_addr32[2], |
112 | rnd); | ||
112 | 113 | ||
113 | a += JHASH_GOLDEN_RATIO; | 114 | c = jhash_3words((__force u32)saddr->s6_addr32[3], |
114 | b += JHASH_GOLDEN_RATIO; | 115 | (__force u32)daddr->s6_addr32[0], |
115 | c += rnd; | 116 | (__force u32)daddr->s6_addr32[1], |
116 | __jhash_mix(a, b, c); | 117 | c); |
117 | 118 | ||
118 | a += (__force u32)saddr->s6_addr32[3]; | 119 | c = jhash_3words((__force u32)daddr->s6_addr32[2], |
119 | b += (__force u32)daddr->s6_addr32[0]; | 120 | (__force u32)daddr->s6_addr32[3], |
120 | c += (__force u32)daddr->s6_addr32[1]; | 121 | (__force u32)id, |
121 | __jhash_mix(a, b, c); | 122 | c); |
122 | |||
123 | a += (__force u32)daddr->s6_addr32[2]; | ||
124 | b += (__force u32)daddr->s6_addr32[3]; | ||
125 | c += (__force u32)id; | ||
126 | __jhash_mix(a, b, c); | ||
127 | 123 | ||
128 | return c & (INETFRAGS_HASHSZ - 1); | 124 | return c & (INETFRAGS_HASHSZ - 1); |
129 | } | 125 | } |
@@ -349,7 +345,7 @@ found: | |||
349 | 345 | ||
350 | /* Check for overlap with preceding fragment. */ | 346 | /* Check for overlap with preceding fragment. */ |
351 | if (prev && | 347 | if (prev && |
352 | (FRAG6_CB(prev)->offset + prev->len) - offset > 0) | 348 | (FRAG6_CB(prev)->offset + prev->len) > offset) |
353 | goto discard_fq; | 349 | goto discard_fq; |
354 | 350 | ||
355 | /* Look for overlap with succeeding segment. */ | 351 | /* Look for overlap with succeeding segment. */ |