diff options
Diffstat (limited to 'net/ipv6/reassembly.c')
-rw-r--r-- | net/ipv6/reassembly.c | 28 |
1 files changed, 7 insertions, 21 deletions
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index e5253ec9e0fc..3c6a77290c6e 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
@@ -79,20 +79,8 @@ unsigned int inet6_hash_frag(__be32 id, const struct in6_addr *saddr, | |||
79 | { | 79 | { |
80 | u32 c; | 80 | u32 c; |
81 | 81 | ||
82 | c = jhash_3words((__force u32)saddr->s6_addr32[0], | 82 | c = jhash_3words(ipv6_addr_hash(saddr), ipv6_addr_hash(daddr), |
83 | (__force u32)saddr->s6_addr32[1], | 83 | (__force u32)id, rnd); |
84 | (__force u32)saddr->s6_addr32[2], | ||
85 | rnd); | ||
86 | |||
87 | c = jhash_3words((__force u32)saddr->s6_addr32[3], | ||
88 | (__force u32)daddr->s6_addr32[0], | ||
89 | (__force u32)daddr->s6_addr32[1], | ||
90 | c); | ||
91 | |||
92 | c = jhash_3words((__force u32)daddr->s6_addr32[2], | ||
93 | (__force u32)daddr->s6_addr32[3], | ||
94 | (__force u32)id, | ||
95 | c); | ||
96 | 84 | ||
97 | return c & (INETFRAGS_HASHSZ - 1); | 85 | return c & (INETFRAGS_HASHSZ - 1); |
98 | } | 86 | } |
@@ -327,7 +315,7 @@ found: | |||
327 | } | 315 | } |
328 | fq->q.stamp = skb->tstamp; | 316 | fq->q.stamp = skb->tstamp; |
329 | fq->q.meat += skb->len; | 317 | fq->q.meat += skb->len; |
330 | atomic_add(skb->truesize, &fq->q.net->mem); | 318 | add_frag_mem_limit(&fq->q, skb->truesize); |
331 | 319 | ||
332 | /* The first fragment. | 320 | /* The first fragment. |
333 | * nhoffset is obtained from the first fragment, of course. | 321 | * nhoffset is obtained from the first fragment, of course. |
@@ -341,9 +329,7 @@ found: | |||
341 | fq->q.meat == fq->q.len) | 329 | fq->q.meat == fq->q.len) |
342 | return ip6_frag_reasm(fq, prev, dev); | 330 | return ip6_frag_reasm(fq, prev, dev); |
343 | 331 | ||
344 | write_lock(&ip6_frags.lock); | 332 | inet_frag_lru_move(&fq->q); |
345 | list_move_tail(&fq->q.lru_list, &fq->q.net->lru_list); | ||
346 | write_unlock(&ip6_frags.lock); | ||
347 | return -1; | 333 | return -1; |
348 | 334 | ||
349 | discard_fq: | 335 | discard_fq: |
@@ -406,7 +392,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, | |||
406 | goto out_oversize; | 392 | goto out_oversize; |
407 | 393 | ||
408 | /* Head of list must not be cloned. */ | 394 | /* Head of list must not be cloned. */ |
409 | if (skb_cloned(head) && pskb_expand_head(head, 0, 0, GFP_ATOMIC)) | 395 | if (skb_unclone(head, GFP_ATOMIC)) |
410 | goto out_oom; | 396 | goto out_oom; |
411 | 397 | ||
412 | /* If the first fragment is fragmented itself, we split | 398 | /* If the first fragment is fragmented itself, we split |
@@ -429,7 +415,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, | |||
429 | head->len -= clone->len; | 415 | head->len -= clone->len; |
430 | clone->csum = 0; | 416 | clone->csum = 0; |
431 | clone->ip_summed = head->ip_summed; | 417 | clone->ip_summed = head->ip_summed; |
432 | atomic_add(clone->truesize, &fq->q.net->mem); | 418 | add_frag_mem_limit(&fq->q, clone->truesize); |
433 | } | 419 | } |
434 | 420 | ||
435 | /* We have to remove fragment header from datagram and to relocate | 421 | /* We have to remove fragment header from datagram and to relocate |
@@ -467,7 +453,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, | |||
467 | } | 453 | } |
468 | fp = next; | 454 | fp = next; |
469 | } | 455 | } |
470 | atomic_sub(sum_truesize, &fq->q.net->mem); | 456 | sub_frag_mem_limit(&fq->q, sum_truesize); |
471 | 457 | ||
472 | head->next = NULL; | 458 | head->next = NULL; |
473 | head->dev = dev; | 459 | head->dev = dev; |