diff options
author | Patrick McHardy <kaber@trash.net> | 2006-01-07 02:02:34 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-01-07 15:57:29 -0500 |
commit | 951dbc8ac714b04c36296b8b5c36c8e036ce433f (patch) | |
tree | 7f3599987f6b6db765f66c65d5c1cefe1457ea6a /net/ipv6/reassembly.c | |
parent | 16a6677fdf1d1194f688f8291b06fbaff248c353 (diff) |
[IPV6]: Move nextheader offset to the IP6CB
Move nextheader offset to the IP6CB to make it possible to pass a
packet to ip6_input_finish multiple times and have it skip already
parsed headers. As a nice side effect this gets rid of the manual
hopopts skipping in ip6_input_finish.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/reassembly.c')
-rw-r--r-- | net/ipv6/reassembly.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 5d316cb72ec9..15e1456b3f18 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
@@ -581,7 +581,6 @@ err: | |||
581 | * the last and the first frames arrived and all the bits are here. | 581 | * the last and the first frames arrived and all the bits are here. |
582 | */ | 582 | */ |
583 | static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in, | 583 | static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in, |
584 | unsigned int *nhoffp, | ||
585 | struct net_device *dev) | 584 | struct net_device *dev) |
586 | { | 585 | { |
587 | struct sk_buff *fp, *head = fq->fragments; | 586 | struct sk_buff *fp, *head = fq->fragments; |
@@ -654,6 +653,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in, | |||
654 | head->dev = dev; | 653 | head->dev = dev; |
655 | skb_set_timestamp(head, &fq->stamp); | 654 | skb_set_timestamp(head, &fq->stamp); |
656 | head->nh.ipv6h->payload_len = htons(payload_len); | 655 | head->nh.ipv6h->payload_len = htons(payload_len); |
656 | IP6CB(head)->nhoff = nhoff; | ||
657 | 657 | ||
658 | *skb_in = head; | 658 | *skb_in = head; |
659 | 659 | ||
@@ -663,7 +663,6 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in, | |||
663 | 663 | ||
664 | IP6_INC_STATS_BH(IPSTATS_MIB_REASMOKS); | 664 | IP6_INC_STATS_BH(IPSTATS_MIB_REASMOKS); |
665 | fq->fragments = NULL; | 665 | fq->fragments = NULL; |
666 | *nhoffp = nhoff; | ||
667 | return 1; | 666 | return 1; |
668 | 667 | ||
669 | out_oversize: | 668 | out_oversize: |
@@ -678,7 +677,7 @@ out_fail: | |||
678 | return -1; | 677 | return -1; |
679 | } | 678 | } |
680 | 679 | ||
681 | static int ipv6_frag_rcv(struct sk_buff **skbp, unsigned int *nhoffp) | 680 | static int ipv6_frag_rcv(struct sk_buff **skbp) |
682 | { | 681 | { |
683 | struct sk_buff *skb = *skbp; | 682 | struct sk_buff *skb = *skbp; |
684 | struct net_device *dev = skb->dev; | 683 | struct net_device *dev = skb->dev; |
@@ -710,7 +709,7 @@ static int ipv6_frag_rcv(struct sk_buff **skbp, unsigned int *nhoffp) | |||
710 | skb->h.raw += sizeof(struct frag_hdr); | 709 | skb->h.raw += sizeof(struct frag_hdr); |
711 | IP6_INC_STATS_BH(IPSTATS_MIB_REASMOKS); | 710 | IP6_INC_STATS_BH(IPSTATS_MIB_REASMOKS); |
712 | 711 | ||
713 | *nhoffp = (u8*)fhdr - skb->nh.raw; | 712 | IP6CB(skb)->nhoff = (u8*)fhdr - skb->nh.raw; |
714 | return 1; | 713 | return 1; |
715 | } | 714 | } |
716 | 715 | ||
@@ -722,11 +721,11 @@ static int ipv6_frag_rcv(struct sk_buff **skbp, unsigned int *nhoffp) | |||
722 | 721 | ||
723 | spin_lock(&fq->lock); | 722 | spin_lock(&fq->lock); |
724 | 723 | ||
725 | ip6_frag_queue(fq, skb, fhdr, *nhoffp); | 724 | ip6_frag_queue(fq, skb, fhdr, IP6CB(skb)->nhoff); |
726 | 725 | ||
727 | if (fq->last_in == (FIRST_IN|LAST_IN) && | 726 | if (fq->last_in == (FIRST_IN|LAST_IN) && |
728 | fq->meat == fq->len) | 727 | fq->meat == fq->len) |
729 | ret = ip6_frag_reasm(fq, skbp, nhoffp, dev); | 728 | ret = ip6_frag_reasm(fq, skbp, dev); |
730 | 729 | ||
731 | spin_unlock(&fq->lock); | 730 | spin_unlock(&fq->lock); |
732 | fq_put(fq, NULL); | 731 | fq_put(fq, NULL); |