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/exthdrs.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/exthdrs.c')
-rw-r--r-- | net/ipv6/exthdrs.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 113374dc342c..2a1e7e45b890 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
@@ -152,7 +152,7 @@ static struct tlvtype_proc tlvprocdestopt_lst[] = { | |||
152 | {-1, NULL} | 152 | {-1, NULL} |
153 | }; | 153 | }; |
154 | 154 | ||
155 | static int ipv6_destopt_rcv(struct sk_buff **skbp, unsigned int *nhoffp) | 155 | static int ipv6_destopt_rcv(struct sk_buff **skbp) |
156 | { | 156 | { |
157 | struct sk_buff *skb = *skbp; | 157 | struct sk_buff *skb = *skbp; |
158 | struct inet6_skb_parm *opt = IP6CB(skb); | 158 | struct inet6_skb_parm *opt = IP6CB(skb); |
@@ -169,7 +169,7 @@ static int ipv6_destopt_rcv(struct sk_buff **skbp, unsigned int *nhoffp) | |||
169 | 169 | ||
170 | if (ip6_parse_tlv(tlvprocdestopt_lst, skb)) { | 170 | if (ip6_parse_tlv(tlvprocdestopt_lst, skb)) { |
171 | skb->h.raw += ((skb->h.raw[1]+1)<<3); | 171 | skb->h.raw += ((skb->h.raw[1]+1)<<3); |
172 | *nhoffp = opt->dst1; | 172 | opt->nhoff = opt->dst1; |
173 | return 1; | 173 | return 1; |
174 | } | 174 | } |
175 | 175 | ||
@@ -192,7 +192,7 @@ void __init ipv6_destopt_init(void) | |||
192 | NONE header. No data in packet. | 192 | NONE header. No data in packet. |
193 | ********************************/ | 193 | ********************************/ |
194 | 194 | ||
195 | static int ipv6_nodata_rcv(struct sk_buff **skbp, unsigned int *nhoffp) | 195 | static int ipv6_nodata_rcv(struct sk_buff **skbp) |
196 | { | 196 | { |
197 | struct sk_buff *skb = *skbp; | 197 | struct sk_buff *skb = *skbp; |
198 | 198 | ||
@@ -215,7 +215,7 @@ void __init ipv6_nodata_init(void) | |||
215 | Routing header. | 215 | Routing header. |
216 | ********************************/ | 216 | ********************************/ |
217 | 217 | ||
218 | static int ipv6_rthdr_rcv(struct sk_buff **skbp, unsigned int *nhoffp) | 218 | static int ipv6_rthdr_rcv(struct sk_buff **skbp) |
219 | { | 219 | { |
220 | struct sk_buff *skb = *skbp; | 220 | struct sk_buff *skb = *skbp; |
221 | struct inet6_skb_parm *opt = IP6CB(skb); | 221 | struct inet6_skb_parm *opt = IP6CB(skb); |
@@ -249,7 +249,7 @@ looped_back: | |||
249 | skb->h.raw += (hdr->hdrlen + 1) << 3; | 249 | skb->h.raw += (hdr->hdrlen + 1) << 3; |
250 | opt->dst0 = opt->dst1; | 250 | opt->dst0 = opt->dst1; |
251 | opt->dst1 = 0; | 251 | opt->dst1 = 0; |
252 | *nhoffp = (&hdr->nexthdr) - skb->nh.raw; | 252 | opt->nhoff = (&hdr->nexthdr) - skb->nh.raw; |
253 | return 1; | 253 | return 1; |
254 | } | 254 | } |
255 | 255 | ||
@@ -487,9 +487,14 @@ static struct tlvtype_proc tlvprochopopt_lst[] = { | |||
487 | 487 | ||
488 | int ipv6_parse_hopopts(struct sk_buff *skb, int nhoff) | 488 | int ipv6_parse_hopopts(struct sk_buff *skb, int nhoff) |
489 | { | 489 | { |
490 | IP6CB(skb)->hop = sizeof(struct ipv6hdr); | 490 | struct inet6_skb_parm *opt = IP6CB(skb); |
491 | if (ip6_parse_tlv(tlvprochopopt_lst, skb)) | 491 | |
492 | opt->hop = sizeof(struct ipv6hdr); | ||
493 | if (ip6_parse_tlv(tlvprochopopt_lst, skb)) { | ||
494 | skb->h.raw += (skb->h.raw[1]+1)<<3; | ||
495 | opt->nhoff = sizeof(struct ipv6hdr); | ||
492 | return sizeof(struct ipv6hdr); | 496 | return sizeof(struct ipv6hdr); |
497 | } | ||
493 | return -1; | 498 | return -1; |
494 | } | 499 | } |
495 | 500 | ||