diff options
Diffstat (limited to 'net/ipv6/exthdrs.c')
-rw-r--r-- | net/ipv6/exthdrs.c | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 837c830d6d8e..6bfffec2371c 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
@@ -277,7 +277,7 @@ static int ipv6_destopt_rcv(struct sk_buff *skb) | |||
277 | if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || | 277 | if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || |
278 | !pskb_may_pull(skb, (skb_transport_offset(skb) + | 278 | !pskb_may_pull(skb, (skb_transport_offset(skb) + |
279 | ((skb_transport_header(skb)[1] + 1) << 3)))) { | 279 | ((skb_transport_header(skb)[1] + 1) << 3)))) { |
280 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 280 | IP6_INC_STATS_BH(dev_net(skb->dst->dev), ip6_dst_idev(skb->dst), |
281 | IPSTATS_MIB_INHDRERRORS); | 281 | IPSTATS_MIB_INHDRERRORS); |
282 | kfree_skb(skb); | 282 | kfree_skb(skb); |
283 | return -1; | 283 | return -1; |
@@ -301,7 +301,8 @@ static int ipv6_destopt_rcv(struct sk_buff *skb) | |||
301 | return 1; | 301 | return 1; |
302 | } | 302 | } |
303 | 303 | ||
304 | IP6_INC_STATS_BH(ip6_dst_idev(dst), IPSTATS_MIB_INHDRERRORS); | 304 | IP6_INC_STATS_BH(dev_net(dst->dev), |
305 | ip6_dst_idev(dst), IPSTATS_MIB_INHDRERRORS); | ||
305 | dst_release(dst); | 306 | dst_release(dst); |
306 | return -1; | 307 | return -1; |
307 | } | 308 | } |
@@ -319,7 +320,8 @@ static int ipv6_rthdr_rcv(struct sk_buff *skb) | |||
319 | int n, i; | 320 | int n, i; |
320 | struct ipv6_rt_hdr *hdr; | 321 | struct ipv6_rt_hdr *hdr; |
321 | struct rt0_hdr *rthdr; | 322 | struct rt0_hdr *rthdr; |
322 | int accept_source_route = dev_net(skb->dev)->ipv6.devconf_all->accept_source_route; | 323 | struct net *net = dev_net(skb->dev); |
324 | int accept_source_route = net->ipv6.devconf_all->accept_source_route; | ||
323 | 325 | ||
324 | idev = in6_dev_get(skb->dev); | 326 | idev = in6_dev_get(skb->dev); |
325 | if (idev) { | 327 | if (idev) { |
@@ -331,7 +333,7 @@ static int ipv6_rthdr_rcv(struct sk_buff *skb) | |||
331 | if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || | 333 | if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || |
332 | !pskb_may_pull(skb, (skb_transport_offset(skb) + | 334 | !pskb_may_pull(skb, (skb_transport_offset(skb) + |
333 | ((skb_transport_header(skb)[1] + 1) << 3)))) { | 335 | ((skb_transport_header(skb)[1] + 1) << 3)))) { |
334 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 336 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), |
335 | IPSTATS_MIB_INHDRERRORS); | 337 | IPSTATS_MIB_INHDRERRORS); |
336 | kfree_skb(skb); | 338 | kfree_skb(skb); |
337 | return -1; | 339 | return -1; |
@@ -341,7 +343,7 @@ static int ipv6_rthdr_rcv(struct sk_buff *skb) | |||
341 | 343 | ||
342 | if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) || | 344 | if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) || |
343 | skb->pkt_type != PACKET_HOST) { | 345 | skb->pkt_type != PACKET_HOST) { |
344 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 346 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), |
345 | IPSTATS_MIB_INADDRERRORS); | 347 | IPSTATS_MIB_INADDRERRORS); |
346 | kfree_skb(skb); | 348 | kfree_skb(skb); |
347 | return -1; | 349 | return -1; |
@@ -356,7 +358,7 @@ looped_back: | |||
356 | * processed by own | 358 | * processed by own |
357 | */ | 359 | */ |
358 | if (!addr) { | 360 | if (!addr) { |
359 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 361 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), |
360 | IPSTATS_MIB_INADDRERRORS); | 362 | IPSTATS_MIB_INADDRERRORS); |
361 | kfree_skb(skb); | 363 | kfree_skb(skb); |
362 | return -1; | 364 | return -1; |
@@ -382,7 +384,7 @@ looped_back: | |||
382 | goto unknown_rh; | 384 | goto unknown_rh; |
383 | /* Silently discard invalid RTH type 2 */ | 385 | /* Silently discard invalid RTH type 2 */ |
384 | if (hdr->hdrlen != 2 || hdr->segments_left != 1) { | 386 | if (hdr->hdrlen != 2 || hdr->segments_left != 1) { |
385 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 387 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), |
386 | IPSTATS_MIB_INHDRERRORS); | 388 | IPSTATS_MIB_INHDRERRORS); |
387 | kfree_skb(skb); | 389 | kfree_skb(skb); |
388 | return -1; | 390 | return -1; |
@@ -401,7 +403,7 @@ looped_back: | |||
401 | n = hdr->hdrlen >> 1; | 403 | n = hdr->hdrlen >> 1; |
402 | 404 | ||
403 | if (hdr->segments_left > n) { | 405 | if (hdr->segments_left > n) { |
404 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 406 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), |
405 | IPSTATS_MIB_INHDRERRORS); | 407 | IPSTATS_MIB_INHDRERRORS); |
406 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, | 408 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, |
407 | ((&hdr->segments_left) - | 409 | ((&hdr->segments_left) - |
@@ -415,7 +417,7 @@ looped_back: | |||
415 | if (skb_cloned(skb)) { | 417 | if (skb_cloned(skb)) { |
416 | /* the copy is a forwarded packet */ | 418 | /* the copy is a forwarded packet */ |
417 | if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { | 419 | if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { |
418 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 420 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), |
419 | IPSTATS_MIB_OUTDISCARDS); | 421 | IPSTATS_MIB_OUTDISCARDS); |
420 | kfree_skb(skb); | 422 | kfree_skb(skb); |
421 | return -1; | 423 | return -1; |
@@ -438,13 +440,13 @@ looped_back: | |||
438 | if (xfrm6_input_addr(skb, (xfrm_address_t *)addr, | 440 | if (xfrm6_input_addr(skb, (xfrm_address_t *)addr, |
439 | (xfrm_address_t *)&ipv6_hdr(skb)->saddr, | 441 | (xfrm_address_t *)&ipv6_hdr(skb)->saddr, |
440 | IPPROTO_ROUTING) < 0) { | 442 | IPPROTO_ROUTING) < 0) { |
441 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 443 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), |
442 | IPSTATS_MIB_INADDRERRORS); | 444 | IPSTATS_MIB_INADDRERRORS); |
443 | kfree_skb(skb); | 445 | kfree_skb(skb); |
444 | return -1; | 446 | return -1; |
445 | } | 447 | } |
446 | if (!ipv6_chk_home_addr(dev_net(skb->dst->dev), addr)) { | 448 | if (!ipv6_chk_home_addr(dev_net(skb->dst->dev), addr)) { |
447 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 449 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), |
448 | IPSTATS_MIB_INADDRERRORS); | 450 | IPSTATS_MIB_INADDRERRORS); |
449 | kfree_skb(skb); | 451 | kfree_skb(skb); |
450 | return -1; | 452 | return -1; |
@@ -456,7 +458,7 @@ looped_back: | |||
456 | } | 458 | } |
457 | 459 | ||
458 | if (ipv6_addr_is_multicast(addr)) { | 460 | if (ipv6_addr_is_multicast(addr)) { |
459 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 461 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), |
460 | IPSTATS_MIB_INADDRERRORS); | 462 | IPSTATS_MIB_INADDRERRORS); |
461 | kfree_skb(skb); | 463 | kfree_skb(skb); |
462 | return -1; | 464 | return -1; |
@@ -476,7 +478,7 @@ looped_back: | |||
476 | 478 | ||
477 | if (skb->dst->dev->flags&IFF_LOOPBACK) { | 479 | if (skb->dst->dev->flags&IFF_LOOPBACK) { |
478 | if (ipv6_hdr(skb)->hop_limit <= 1) { | 480 | if (ipv6_hdr(skb)->hop_limit <= 1) { |
479 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 481 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), |
480 | IPSTATS_MIB_INHDRERRORS); | 482 | IPSTATS_MIB_INHDRERRORS); |
481 | icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, | 483 | icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, |
482 | 0, skb->dev); | 484 | 0, skb->dev); |
@@ -492,7 +494,7 @@ looped_back: | |||
492 | return -1; | 494 | return -1; |
493 | 495 | ||
494 | unknown_rh: | 496 | unknown_rh: |
495 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_INHDRERRORS); | 497 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), IPSTATS_MIB_INHDRERRORS); |
496 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, | 498 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, |
497 | (&hdr->type) - skb_network_header(skb)); | 499 | (&hdr->type) - skb_network_header(skb)); |
498 | return -1; | 500 | return -1; |
@@ -579,29 +581,33 @@ static int ipv6_hop_jumbo(struct sk_buff *skb, int optoff) | |||
579 | { | 581 | { |
580 | const unsigned char *nh = skb_network_header(skb); | 582 | const unsigned char *nh = skb_network_header(skb); |
581 | u32 pkt_len; | 583 | u32 pkt_len; |
584 | struct net *net = dev_net(skb->dst->dev); | ||
582 | 585 | ||
583 | if (nh[optoff + 1] != 4 || (optoff & 3) != 2) { | 586 | if (nh[optoff + 1] != 4 || (optoff & 3) != 2) { |
584 | LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n", | 587 | LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n", |
585 | nh[optoff+1]); | 588 | nh[optoff+1]); |
586 | IP6_INC_STATS_BH(ipv6_skb_idev(skb), | 589 | IP6_INC_STATS_BH(net, ipv6_skb_idev(skb), |
587 | IPSTATS_MIB_INHDRERRORS); | 590 | IPSTATS_MIB_INHDRERRORS); |
588 | goto drop; | 591 | goto drop; |
589 | } | 592 | } |
590 | 593 | ||
591 | pkt_len = ntohl(*(__be32 *)(nh + optoff + 2)); | 594 | pkt_len = ntohl(*(__be32 *)(nh + optoff + 2)); |
592 | if (pkt_len <= IPV6_MAXPLEN) { | 595 | if (pkt_len <= IPV6_MAXPLEN) { |
593 | IP6_INC_STATS_BH(ipv6_skb_idev(skb), IPSTATS_MIB_INHDRERRORS); | 596 | IP6_INC_STATS_BH(net, ipv6_skb_idev(skb), |
597 | IPSTATS_MIB_INHDRERRORS); | ||
594 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2); | 598 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2); |
595 | return 0; | 599 | return 0; |
596 | } | 600 | } |
597 | if (ipv6_hdr(skb)->payload_len) { | 601 | if (ipv6_hdr(skb)->payload_len) { |
598 | IP6_INC_STATS_BH(ipv6_skb_idev(skb), IPSTATS_MIB_INHDRERRORS); | 602 | IP6_INC_STATS_BH(net, ipv6_skb_idev(skb), |
603 | IPSTATS_MIB_INHDRERRORS); | ||
599 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff); | 604 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff); |
600 | return 0; | 605 | return 0; |
601 | } | 606 | } |
602 | 607 | ||
603 | if (pkt_len > skb->len - sizeof(struct ipv6hdr)) { | 608 | if (pkt_len > skb->len - sizeof(struct ipv6hdr)) { |
604 | IP6_INC_STATS_BH(ipv6_skb_idev(skb), IPSTATS_MIB_INTRUNCATEDPKTS); | 609 | IP6_INC_STATS_BH(net, ipv6_skb_idev(skb), |
610 | IPSTATS_MIB_INTRUNCATEDPKTS); | ||
605 | goto drop; | 611 | goto drop; |
606 | } | 612 | } |
607 | 613 | ||