aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/mip6.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6/mip6.c')
-rw-r--r--net/ipv6/mip6.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/net/ipv6/mip6.c b/net/ipv6/mip6.c
index 0afcabdd8ed6..bb4033553f3b 100644
--- a/net/ipv6/mip6.c
+++ b/net/ipv6/mip6.c
@@ -99,14 +99,16 @@ int mip6_mh_filter(struct sock *sk, struct sk_buff *skb)
99 if (mh->ip6mh_hdrlen < mip6_mh_len(mh->ip6mh_type)) { 99 if (mh->ip6mh_hdrlen < mip6_mh_len(mh->ip6mh_type)) {
100 LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH message too short: %d vs >=%d\n", 100 LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH message too short: %d vs >=%d\n",
101 mh->ip6mh_hdrlen, mip6_mh_len(mh->ip6mh_type)); 101 mh->ip6mh_hdrlen, mip6_mh_len(mh->ip6mh_type));
102 mip6_param_prob(skb, 0, (&mh->ip6mh_hdrlen) - skb->nh.raw); 102 mip6_param_prob(skb, 0, ((&mh->ip6mh_hdrlen) -
103 skb_network_header(skb)));
103 return -1; 104 return -1;
104 } 105 }
105 106
106 if (mh->ip6mh_proto != IPPROTO_NONE) { 107 if (mh->ip6mh_proto != IPPROTO_NONE) {
107 LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH invalid payload proto = %d\n", 108 LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH invalid payload proto = %d\n",
108 mh->ip6mh_proto); 109 mh->ip6mh_proto);
109 mip6_param_prob(skb, 0, (&mh->ip6mh_proto) - skb->nh.raw); 110 mip6_param_prob(skb, 0, ((&mh->ip6mh_proto) -
111 skb_network_header(skb)));
110 return -1; 112 return -1;
111 } 113 }
112 114
@@ -152,8 +154,8 @@ static int mip6_destopt_output(struct xfrm_state *x, struct sk_buff *skb)
152 iph = (struct ipv6hdr *)skb->data; 154 iph = (struct ipv6hdr *)skb->data;
153 iph->payload_len = htons(skb->len - sizeof(*iph)); 155 iph->payload_len = htons(skb->len - sizeof(*iph));
154 156
155 nexthdr = *skb->nh.raw; 157 nexthdr = *skb_network_header(skb);
156 *skb->nh.raw = IPPROTO_DSTOPTS; 158 *skb_network_header(skb) = IPPROTO_DSTOPTS;
157 159
158 dstopt = (struct ipv6_destopt_hdr *)skb->h.raw; 160 dstopt = (struct ipv6_destopt_hdr *)skb->h.raw;
159 dstopt->nexthdr = nexthdr; 161 dstopt->nexthdr = nexthdr;
@@ -215,7 +217,8 @@ static int mip6_destopt_reject(struct xfrm_state *x, struct sk_buff *skb, struct
215 if (likely(opt->dsthao)) { 217 if (likely(opt->dsthao)) {
216 offset = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO); 218 offset = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
217 if (likely(offset >= 0)) 219 if (likely(offset >= 0))
218 hao = (struct ipv6_destopt_hao *)(skb->nh.raw + offset); 220 hao = (struct ipv6_destopt_hao *)
221 (skb_network_header(skb) + offset);
219 } 222 }
220 223
221 skb_get_timestamp(skb, &stamp); 224 skb_get_timestamp(skb, &stamp);
@@ -254,7 +257,8 @@ static int mip6_destopt_offset(struct xfrm_state *x, struct sk_buff *skb,
254{ 257{
255 u16 offset = sizeof(struct ipv6hdr); 258 u16 offset = sizeof(struct ipv6hdr);
256 struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.ipv6h + 1); 259 struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.ipv6h + 1);
257 unsigned int packet_len = skb->tail - skb->nh.raw; 260 const unsigned char *nh = skb_network_header(skb);
261 unsigned int packet_len = skb->tail - nh;
258 int found_rhdr = 0; 262 int found_rhdr = 0;
259 263
260 *nexthdr = &skb->nh.ipv6h->nexthdr; 264 *nexthdr = &skb->nh.ipv6h->nexthdr;
@@ -288,7 +292,7 @@ static int mip6_destopt_offset(struct xfrm_state *x, struct sk_buff *skb,
288 292
289 offset += ipv6_optlen(exthdr); 293 offset += ipv6_optlen(exthdr);
290 *nexthdr = &exthdr->nexthdr; 294 *nexthdr = &exthdr->nexthdr;
291 exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset); 295 exthdr = (struct ipv6_opt_hdr *)(nh + offset);
292 } 296 }
293 297
294 return offset; 298 return offset;
@@ -361,8 +365,8 @@ static int mip6_rthdr_output(struct xfrm_state *x, struct sk_buff *skb)
361 iph = (struct ipv6hdr *)skb->data; 365 iph = (struct ipv6hdr *)skb->data;
362 iph->payload_len = htons(skb->len - sizeof(*iph)); 366 iph->payload_len = htons(skb->len - sizeof(*iph));
363 367
364 nexthdr = *skb->nh.raw; 368 nexthdr = *skb_network_header(skb);
365 *skb->nh.raw = IPPROTO_ROUTING; 369 *skb_network_header(skb) = IPPROTO_ROUTING;
366 370
367 rt2 = (struct rt2_hdr *)skb->h.raw; 371 rt2 = (struct rt2_hdr *)skb->h.raw;
368 rt2->rt_hdr.nexthdr = nexthdr; 372 rt2->rt_hdr.nexthdr = nexthdr;
@@ -384,7 +388,8 @@ static int mip6_rthdr_offset(struct xfrm_state *x, struct sk_buff *skb,
384{ 388{
385 u16 offset = sizeof(struct ipv6hdr); 389 u16 offset = sizeof(struct ipv6hdr);
386 struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.ipv6h + 1); 390 struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.ipv6h + 1);
387 unsigned int packet_len = skb->tail - skb->nh.raw; 391 const unsigned char *nh = skb_network_header(skb);
392 unsigned int packet_len = skb->tail - nh;
388 int found_rhdr = 0; 393 int found_rhdr = 0;
389 394
390 *nexthdr = &skb->nh.ipv6h->nexthdr; 395 *nexthdr = &skb->nh.ipv6h->nexthdr;
@@ -397,7 +402,7 @@ static int mip6_rthdr_offset(struct xfrm_state *x, struct sk_buff *skb,
397 case NEXTHDR_ROUTING: 402 case NEXTHDR_ROUTING:
398 if (offset + 3 <= packet_len) { 403 if (offset + 3 <= packet_len) {
399 struct ipv6_rt_hdr *rt; 404 struct ipv6_rt_hdr *rt;
400 rt = (struct ipv6_rt_hdr *)(skb->nh.raw + offset); 405 rt = (struct ipv6_rt_hdr *)(nh + offset);
401 if (rt->type != 0) 406 if (rt->type != 0)
402 return offset; 407 return offset;
403 } 408 }
@@ -417,7 +422,7 @@ static int mip6_rthdr_offset(struct xfrm_state *x, struct sk_buff *skb,
417 422
418 offset += ipv6_optlen(exthdr); 423 offset += ipv6_optlen(exthdr);
419 *nexthdr = &exthdr->nexthdr; 424 *nexthdr = &exthdr->nexthdr;
420 exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset); 425 exthdr = (struct ipv6_opt_hdr *)(nh + offset);
421 } 426 }
422 427
423 return offset; 428 return offset;