aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/reassembly.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6/reassembly.c')
-rw-r--r--net/ipv6/reassembly.c28
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
349discard_fq: 335discard_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;