diff options
-rw-r--r-- | include/net/ipv6.h | 3 | ||||
-rw-r--r-- | net/ipv6/icmp.c | 2 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 56 | ||||
-rw-r--r-- | net/ipv6/mcast.c | 10 | ||||
-rw-r--r-- | net/ipv6/ndisc.c | 4 | ||||
-rw-r--r-- | net/ipv6/netfilter.c | 3 | ||||
-rw-r--r-- | net/ipv6/raw.c | 4 | ||||
-rw-r--r-- | net/ipv6/reassembly.c | 8 | ||||
-rw-r--r-- | net/ipv6/route.c | 7 |
9 files changed, 57 insertions, 40 deletions
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index dfa7ae3c5607..26c17988b905 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
@@ -129,7 +129,8 @@ extern struct ctl_path net_ipv6_ctl_path[]; | |||
129 | /* MIBs */ | 129 | /* MIBs */ |
130 | DECLARE_SNMP_STAT(struct ipstats_mib, ipv6_statistics); | 130 | DECLARE_SNMP_STAT(struct ipstats_mib, ipv6_statistics); |
131 | 131 | ||
132 | #define IP6_INC_STATS(idev,field) _DEVINC(ipv6, , idev, field) | 132 | #define IP6_INC_STATS(net, idev,field) ({ (void)(net); \ |
133 | _DEVINC(ipv6, , idev, field); }) | ||
133 | #define IP6_INC_STATS_BH(idev,field) _DEVINC(ipv6, _BH, idev, field) | 134 | #define IP6_INC_STATS_BH(idev,field) _DEVINC(ipv6, _BH, idev, field) |
134 | #define IP6_ADD_STATS_BH(idev,field,val) _DEVADD(ipv6, _BH, idev, field, val) | 135 | #define IP6_ADD_STATS_BH(idev,field,val) _DEVADD(ipv6, _BH, idev, field, val) |
135 | 136 | ||
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index b3157a0cc15d..758cdd7dc27e 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
@@ -183,7 +183,7 @@ static inline int icmpv6_xrlim_allow(struct sock *sk, int type, | |||
183 | */ | 183 | */ |
184 | dst = ip6_route_output(net, sk, fl); | 184 | dst = ip6_route_output(net, sk, fl); |
185 | if (dst->error) { | 185 | if (dst->error) { |
186 | IP6_INC_STATS(ip6_dst_idev(dst), | 186 | IP6_INC_STATS(net, ip6_dst_idev(dst), |
187 | IPSTATS_MIB_OUTNOROUTES); | 187 | IPSTATS_MIB_OUTNOROUTES); |
188 | } else if (dst->dev && (dst->dev->flags&IFF_LOOPBACK)) { | 188 | } else if (dst->dev && (dst->dev->flags&IFF_LOOPBACK)) { |
189 | res = 1; | 189 | res = 1; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index f22393e11666..db28c208f329 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -150,13 +150,14 @@ static int ip6_output2(struct sk_buff *skb) | |||
150 | ip6_dev_loopback_xmit); | 150 | ip6_dev_loopback_xmit); |
151 | 151 | ||
152 | if (ipv6_hdr(skb)->hop_limit == 0) { | 152 | if (ipv6_hdr(skb)->hop_limit == 0) { |
153 | IP6_INC_STATS(idev, IPSTATS_MIB_OUTDISCARDS); | 153 | IP6_INC_STATS(dev_net(dev), idev, |
154 | IPSTATS_MIB_OUTDISCARDS); | ||
154 | kfree_skb(skb); | 155 | kfree_skb(skb); |
155 | return 0; | 156 | return 0; |
156 | } | 157 | } |
157 | } | 158 | } |
158 | 159 | ||
159 | IP6_INC_STATS(idev, IPSTATS_MIB_OUTMCASTPKTS); | 160 | IP6_INC_STATS(dev_net(dev), idev, IPSTATS_MIB_OUTMCASTPKTS); |
160 | } | 161 | } |
161 | 162 | ||
162 | return NF_HOOK(PF_INET6, NF_INET_POST_ROUTING, skb, NULL, skb->dev, | 163 | return NF_HOOK(PF_INET6, NF_INET_POST_ROUTING, skb, NULL, skb->dev, |
@@ -175,7 +176,8 @@ int ip6_output(struct sk_buff *skb) | |||
175 | { | 176 | { |
176 | struct inet6_dev *idev = ip6_dst_idev(skb->dst); | 177 | struct inet6_dev *idev = ip6_dst_idev(skb->dst); |
177 | if (unlikely(idev->cnf.disable_ipv6)) { | 178 | if (unlikely(idev->cnf.disable_ipv6)) { |
178 | IP6_INC_STATS(idev, IPSTATS_MIB_OUTDISCARDS); | 179 | IP6_INC_STATS(dev_net(skb->dst->dev), idev, |
180 | IPSTATS_MIB_OUTDISCARDS); | ||
179 | kfree_skb(skb); | 181 | kfree_skb(skb); |
180 | return 0; | 182 | return 0; |
181 | } | 183 | } |
@@ -194,6 +196,7 @@ int ip6_output(struct sk_buff *skb) | |||
194 | int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | 196 | int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, |
195 | struct ipv6_txoptions *opt, int ipfragok) | 197 | struct ipv6_txoptions *opt, int ipfragok) |
196 | { | 198 | { |
199 | struct net *net = sock_net(sk); | ||
197 | struct ipv6_pinfo *np = inet6_sk(sk); | 200 | struct ipv6_pinfo *np = inet6_sk(sk); |
198 | struct in6_addr *first_hop = &fl->fl6_dst; | 201 | struct in6_addr *first_hop = &fl->fl6_dst; |
199 | struct dst_entry *dst = skb->dst; | 202 | struct dst_entry *dst = skb->dst; |
@@ -216,7 +219,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | |||
216 | if (skb_headroom(skb) < head_room) { | 219 | if (skb_headroom(skb) < head_room) { |
217 | struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room); | 220 | struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room); |
218 | if (skb2 == NULL) { | 221 | if (skb2 == NULL) { |
219 | IP6_INC_STATS(ip6_dst_idev(skb->dst), | 222 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), |
220 | IPSTATS_MIB_OUTDISCARDS); | 223 | IPSTATS_MIB_OUTDISCARDS); |
221 | kfree_skb(skb); | 224 | kfree_skb(skb); |
222 | return -ENOBUFS; | 225 | return -ENOBUFS; |
@@ -270,7 +273,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | |||
270 | 273 | ||
271 | mtu = dst_mtu(dst); | 274 | mtu = dst_mtu(dst); |
272 | if ((skb->len <= mtu) || skb->local_df || skb_is_gso(skb)) { | 275 | if ((skb->len <= mtu) || skb->local_df || skb_is_gso(skb)) { |
273 | IP6_INC_STATS(ip6_dst_idev(skb->dst), | 276 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), |
274 | IPSTATS_MIB_OUTREQUESTS); | 277 | IPSTATS_MIB_OUTREQUESTS); |
275 | return NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev, | 278 | return NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev, |
276 | dst_output); | 279 | dst_output); |
@@ -280,7 +283,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | |||
280 | printk(KERN_DEBUG "IPv6: sending pkt_too_big to self\n"); | 283 | printk(KERN_DEBUG "IPv6: sending pkt_too_big to self\n"); |
281 | skb->dev = dst->dev; | 284 | skb->dev = dst->dev; |
282 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev); | 285 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev); |
283 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS); | 286 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS); |
284 | kfree_skb(skb); | 287 | kfree_skb(skb); |
285 | return -EMSGSIZE; | 288 | return -EMSGSIZE; |
286 | } | 289 | } |
@@ -422,7 +425,7 @@ int ip6_forward(struct sk_buff *skb) | |||
422 | goto drop; | 425 | goto drop; |
423 | 426 | ||
424 | if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) { | 427 | if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) { |
425 | IP6_INC_STATS(ip6_dst_idev(dst), IPSTATS_MIB_INDISCARDS); | 428 | IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_INDISCARDS); |
426 | goto drop; | 429 | goto drop; |
427 | } | 430 | } |
428 | 431 | ||
@@ -468,13 +471,14 @@ int ip6_forward(struct sk_buff *skb) | |||
468 | if (proxied > 0) | 471 | if (proxied > 0) |
469 | return ip6_input(skb); | 472 | return ip6_input(skb); |
470 | else if (proxied < 0) { | 473 | else if (proxied < 0) { |
471 | IP6_INC_STATS(ip6_dst_idev(dst), IPSTATS_MIB_INDISCARDS); | 474 | IP6_INC_STATS(net, ip6_dst_idev(dst), |
475 | IPSTATS_MIB_INDISCARDS); | ||
472 | goto drop; | 476 | goto drop; |
473 | } | 477 | } |
474 | } | 478 | } |
475 | 479 | ||
476 | if (!xfrm6_route_forward(skb)) { | 480 | if (!xfrm6_route_forward(skb)) { |
477 | IP6_INC_STATS(ip6_dst_idev(dst), IPSTATS_MIB_INDISCARDS); | 481 | IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_INDISCARDS); |
478 | goto drop; | 482 | goto drop; |
479 | } | 483 | } |
480 | dst = skb->dst; | 484 | dst = skb->dst; |
@@ -530,7 +534,7 @@ int ip6_forward(struct sk_buff *skb) | |||
530 | } | 534 | } |
531 | 535 | ||
532 | if (skb_cow(skb, dst->dev->hard_header_len)) { | 536 | if (skb_cow(skb, dst->dev->hard_header_len)) { |
533 | IP6_INC_STATS(ip6_dst_idev(dst), IPSTATS_MIB_OUTDISCARDS); | 537 | IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTDISCARDS); |
534 | goto drop; | 538 | goto drop; |
535 | } | 539 | } |
536 | 540 | ||
@@ -622,6 +626,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
622 | __be32 frag_id = 0; | 626 | __be32 frag_id = 0; |
623 | int ptr, offset = 0, err=0; | 627 | int ptr, offset = 0, err=0; |
624 | u8 *prevhdr, nexthdr = 0; | 628 | u8 *prevhdr, nexthdr = 0; |
629 | struct net *net = dev_net(skb->dst->dev); | ||
625 | 630 | ||
626 | hlen = ip6_find_1stfragopt(skb, &prevhdr); | 631 | hlen = ip6_find_1stfragopt(skb, &prevhdr); |
627 | nexthdr = *prevhdr; | 632 | nexthdr = *prevhdr; |
@@ -635,7 +640,8 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
635 | if (!skb->local_df) { | 640 | if (!skb->local_df) { |
636 | skb->dev = skb->dst->dev; | 641 | skb->dev = skb->dst->dev; |
637 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev); | 642 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev); |
638 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS); | 643 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), |
644 | IPSTATS_MIB_FRAGFAILS); | ||
639 | kfree_skb(skb); | 645 | kfree_skb(skb); |
640 | return -EMSGSIZE; | 646 | return -EMSGSIZE; |
641 | } | 647 | } |
@@ -684,7 +690,8 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
684 | *prevhdr = NEXTHDR_FRAGMENT; | 690 | *prevhdr = NEXTHDR_FRAGMENT; |
685 | tmp_hdr = kmemdup(skb_network_header(skb), hlen, GFP_ATOMIC); | 691 | tmp_hdr = kmemdup(skb_network_header(skb), hlen, GFP_ATOMIC); |
686 | if (!tmp_hdr) { | 692 | if (!tmp_hdr) { |
687 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS); | 693 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), |
694 | IPSTATS_MIB_FRAGFAILS); | ||
688 | return -ENOMEM; | 695 | return -ENOMEM; |
689 | } | 696 | } |
690 | 697 | ||
@@ -735,7 +742,8 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
735 | 742 | ||
736 | err = output(skb); | 743 | err = output(skb); |
737 | if(!err) | 744 | if(!err) |
738 | IP6_INC_STATS(ip6_dst_idev(&rt->u.dst), IPSTATS_MIB_FRAGCREATES); | 745 | IP6_INC_STATS(net, ip6_dst_idev(&rt->u.dst), |
746 | IPSTATS_MIB_FRAGCREATES); | ||
739 | 747 | ||
740 | if (err || !frag) | 748 | if (err || !frag) |
741 | break; | 749 | break; |
@@ -748,7 +756,8 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
748 | kfree(tmp_hdr); | 756 | kfree(tmp_hdr); |
749 | 757 | ||
750 | if (err == 0) { | 758 | if (err == 0) { |
751 | IP6_INC_STATS(ip6_dst_idev(&rt->u.dst), IPSTATS_MIB_FRAGOKS); | 759 | IP6_INC_STATS(net, ip6_dst_idev(&rt->u.dst), |
760 | IPSTATS_MIB_FRAGOKS); | ||
752 | dst_release(&rt->u.dst); | 761 | dst_release(&rt->u.dst); |
753 | return 0; | 762 | return 0; |
754 | } | 763 | } |
@@ -759,7 +768,8 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
759 | frag = skb; | 768 | frag = skb; |
760 | } | 769 | } |
761 | 770 | ||
762 | IP6_INC_STATS(ip6_dst_idev(&rt->u.dst), IPSTATS_MIB_FRAGFAILS); | 771 | IP6_INC_STATS(net, ip6_dst_idev(&rt->u.dst), |
772 | IPSTATS_MIB_FRAGFAILS); | ||
763 | dst_release(&rt->u.dst); | 773 | dst_release(&rt->u.dst); |
764 | return err; | 774 | return err; |
765 | } | 775 | } |
@@ -793,7 +803,7 @@ slow_path: | |||
793 | 803 | ||
794 | if ((frag = alloc_skb(len+hlen+sizeof(struct frag_hdr)+LL_ALLOCATED_SPACE(rt->u.dst.dev), GFP_ATOMIC)) == NULL) { | 804 | if ((frag = alloc_skb(len+hlen+sizeof(struct frag_hdr)+LL_ALLOCATED_SPACE(rt->u.dst.dev), GFP_ATOMIC)) == NULL) { |
795 | NETDEBUG(KERN_INFO "IPv6: frag: no memory for new fragment!\n"); | 805 | NETDEBUG(KERN_INFO "IPv6: frag: no memory for new fragment!\n"); |
796 | IP6_INC_STATS(ip6_dst_idev(skb->dst), | 806 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), |
797 | IPSTATS_MIB_FRAGFAILS); | 807 | IPSTATS_MIB_FRAGFAILS); |
798 | err = -ENOMEM; | 808 | err = -ENOMEM; |
799 | goto fail; | 809 | goto fail; |
@@ -857,15 +867,16 @@ slow_path: | |||
857 | if (err) | 867 | if (err) |
858 | goto fail; | 868 | goto fail; |
859 | 869 | ||
860 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGCREATES); | 870 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), |
871 | IPSTATS_MIB_FRAGCREATES); | ||
861 | } | 872 | } |
862 | IP6_INC_STATS(ip6_dst_idev(skb->dst), | 873 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), |
863 | IPSTATS_MIB_FRAGOKS); | 874 | IPSTATS_MIB_FRAGOKS); |
864 | kfree_skb(skb); | 875 | kfree_skb(skb); |
865 | return err; | 876 | return err; |
866 | 877 | ||
867 | fail: | 878 | fail: |
868 | IP6_INC_STATS(ip6_dst_idev(skb->dst), | 879 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), |
869 | IPSTATS_MIB_FRAGFAILS); | 880 | IPSTATS_MIB_FRAGFAILS); |
870 | kfree_skb(skb); | 881 | kfree_skb(skb); |
871 | return err; | 882 | return err; |
@@ -1385,7 +1396,7 @@ alloc_new_skb: | |||
1385 | return 0; | 1396 | return 0; |
1386 | error: | 1397 | error: |
1387 | inet->cork.length -= length; | 1398 | inet->cork.length -= length; |
1388 | IP6_INC_STATS(rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS); | 1399 | IP6_INC_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS); |
1389 | return err; | 1400 | return err; |
1390 | } | 1401 | } |
1391 | 1402 | ||
@@ -1409,6 +1420,7 @@ int ip6_push_pending_frames(struct sock *sk) | |||
1409 | struct in6_addr final_dst_buf, *final_dst = &final_dst_buf; | 1420 | struct in6_addr final_dst_buf, *final_dst = &final_dst_buf; |
1410 | struct inet_sock *inet = inet_sk(sk); | 1421 | struct inet_sock *inet = inet_sk(sk); |
1411 | struct ipv6_pinfo *np = inet6_sk(sk); | 1422 | struct ipv6_pinfo *np = inet6_sk(sk); |
1423 | struct net *net = sock_net(sk); | ||
1412 | struct ipv6hdr *hdr; | 1424 | struct ipv6hdr *hdr; |
1413 | struct ipv6_txoptions *opt = np->cork.opt; | 1425 | struct ipv6_txoptions *opt = np->cork.opt; |
1414 | struct rt6_info *rt = (struct rt6_info *)inet->cork.dst; | 1426 | struct rt6_info *rt = (struct rt6_info *)inet->cork.dst; |
@@ -1462,7 +1474,7 @@ int ip6_push_pending_frames(struct sock *sk) | |||
1462 | skb->mark = sk->sk_mark; | 1474 | skb->mark = sk->sk_mark; |
1463 | 1475 | ||
1464 | skb->dst = dst_clone(&rt->u.dst); | 1476 | skb->dst = dst_clone(&rt->u.dst); |
1465 | IP6_INC_STATS(rt->rt6i_idev, IPSTATS_MIB_OUTREQUESTS); | 1477 | IP6_INC_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUTREQUESTS); |
1466 | if (proto == IPPROTO_ICMPV6) { | 1478 | if (proto == IPPROTO_ICMPV6) { |
1467 | struct inet6_dev *idev = ip6_dst_idev(skb->dst); | 1479 | struct inet6_dev *idev = ip6_dst_idev(skb->dst); |
1468 | 1480 | ||
@@ -1491,7 +1503,7 @@ void ip6_flush_pending_frames(struct sock *sk) | |||
1491 | 1503 | ||
1492 | while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) { | 1504 | while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) { |
1493 | if (skb->dst) | 1505 | if (skb->dst) |
1494 | IP6_INC_STATS(ip6_dst_idev(skb->dst), | 1506 | IP6_INC_STATS(sock_net(sk), ip6_dst_idev(skb->dst), |
1495 | IPSTATS_MIB_OUTDISCARDS); | 1507 | IPSTATS_MIB_OUTDISCARDS); |
1496 | kfree_skb(skb); | 1508 | kfree_skb(skb); |
1497 | } | 1509 | } |
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index e7c03bcc2788..a1d588d0b5d4 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -1446,7 +1446,7 @@ static void mld_sendpack(struct sk_buff *skb) | |||
1446 | int err; | 1446 | int err; |
1447 | struct flowi fl; | 1447 | struct flowi fl; |
1448 | 1448 | ||
1449 | IP6_INC_STATS(idev, IPSTATS_MIB_OUTREQUESTS); | 1449 | IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTREQUESTS); |
1450 | payload_len = (skb->tail - skb->network_header) - sizeof(*pip6); | 1450 | payload_len = (skb->tail - skb->network_header) - sizeof(*pip6); |
1451 | mldlen = skb->tail - skb->transport_header; | 1451 | mldlen = skb->tail - skb->transport_header; |
1452 | pip6->payload_len = htons(payload_len); | 1452 | pip6->payload_len = htons(payload_len); |
@@ -1771,7 +1771,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type) | |||
1771 | struct flowi fl; | 1771 | struct flowi fl; |
1772 | 1772 | ||
1773 | rcu_read_lock(); | 1773 | rcu_read_lock(); |
1774 | IP6_INC_STATS(__in6_dev_get(dev), | 1774 | IP6_INC_STATS(net, __in6_dev_get(dev), |
1775 | IPSTATS_MIB_OUTREQUESTS); | 1775 | IPSTATS_MIB_OUTREQUESTS); |
1776 | rcu_read_unlock(); | 1776 | rcu_read_unlock(); |
1777 | if (type == ICMPV6_MGM_REDUCTION) | 1777 | if (type == ICMPV6_MGM_REDUCTION) |
@@ -1787,7 +1787,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type) | |||
1787 | 1787 | ||
1788 | if (skb == NULL) { | 1788 | if (skb == NULL) { |
1789 | rcu_read_lock(); | 1789 | rcu_read_lock(); |
1790 | IP6_INC_STATS(__in6_dev_get(dev), | 1790 | IP6_INC_STATS(net, __in6_dev_get(dev), |
1791 | IPSTATS_MIB_OUTDISCARDS); | 1791 | IPSTATS_MIB_OUTDISCARDS); |
1792 | rcu_read_unlock(); | 1792 | rcu_read_unlock(); |
1793 | return; | 1793 | return; |
@@ -1841,9 +1841,9 @@ out: | |||
1841 | if (!err) { | 1841 | if (!err) { |
1842 | ICMP6MSGOUT_INC_STATS(idev, type); | 1842 | ICMP6MSGOUT_INC_STATS(idev, type); |
1843 | ICMP6_INC_STATS(idev, ICMP6_MIB_OUTMSGS); | 1843 | ICMP6_INC_STATS(idev, ICMP6_MIB_OUTMSGS); |
1844 | IP6_INC_STATS(idev, IPSTATS_MIB_OUTMCASTPKTS); | 1844 | IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTMCASTPKTS); |
1845 | } else | 1845 | } else |
1846 | IP6_INC_STATS(idev, IPSTATS_MIB_OUTDISCARDS); | 1846 | IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); |
1847 | 1847 | ||
1848 | if (likely(idev != NULL)) | 1848 | if (likely(idev != NULL)) |
1849 | in6_dev_put(idev); | 1849 | in6_dev_put(idev); |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index f1c62ba0f56b..ce5b61763fd0 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -516,7 +516,7 @@ static void __ndisc_send(struct net_device *dev, | |||
516 | skb->dst = dst; | 516 | skb->dst = dst; |
517 | 517 | ||
518 | idev = in6_dev_get(dst->dev); | 518 | idev = in6_dev_get(dst->dev); |
519 | IP6_INC_STATS(idev, IPSTATS_MIB_OUTREQUESTS); | 519 | IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTREQUESTS); |
520 | 520 | ||
521 | err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev, | 521 | err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev, |
522 | dst_output); | 522 | dst_output); |
@@ -1581,7 +1581,7 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh, | |||
1581 | 1581 | ||
1582 | buff->dst = dst; | 1582 | buff->dst = dst; |
1583 | idev = in6_dev_get(dst->dev); | 1583 | idev = in6_dev_get(dst->dev); |
1584 | IP6_INC_STATS(idev, IPSTATS_MIB_OUTREQUESTS); | 1584 | IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTREQUESTS); |
1585 | err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, buff, NULL, dst->dev, | 1585 | err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, buff, NULL, dst->dev, |
1586 | dst_output); | 1586 | dst_output); |
1587 | if (!err) { | 1587 | if (!err) { |
diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c index 4cb4844a3220..6b29b03925f1 100644 --- a/net/ipv6/netfilter.c +++ b/net/ipv6/netfilter.c | |||
@@ -33,7 +33,8 @@ int ip6_route_me_harder(struct sk_buff *skb) | |||
33 | #endif | 33 | #endif |
34 | 34 | ||
35 | if (dst->error) { | 35 | if (dst->error) { |
36 | IP6_INC_STATS(ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); | 36 | IP6_INC_STATS(&init_net, ip6_dst_idev(dst), |
37 | IPSTATS_MIB_OUTNOROUTES); | ||
37 | LIMIT_NETDEBUG(KERN_DEBUG "ip6_route_me_harder: No more route.\n"); | 38 | LIMIT_NETDEBUG(KERN_DEBUG "ip6_route_me_harder: No more route.\n"); |
38 | dst_release(dst); | 39 | dst_release(dst); |
39 | return -EINVAL; | 40 | return -EINVAL; |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index e53e493606c5..2ba04d41dc25 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -638,7 +638,7 @@ static int rawv6_send_hdrinc(struct sock *sk, void *from, int length, | |||
638 | if (err) | 638 | if (err) |
639 | goto error_fault; | 639 | goto error_fault; |
640 | 640 | ||
641 | IP6_INC_STATS(rt->rt6i_idev, IPSTATS_MIB_OUTREQUESTS); | 641 | IP6_INC_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUTREQUESTS); |
642 | err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, rt->u.dst.dev, | 642 | err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, rt->u.dst.dev, |
643 | dst_output); | 643 | dst_output); |
644 | if (err > 0) | 644 | if (err > 0) |
@@ -652,7 +652,7 @@ error_fault: | |||
652 | err = -EFAULT; | 652 | err = -EFAULT; |
653 | kfree_skb(skb); | 653 | kfree_skb(skb); |
654 | error: | 654 | error: |
655 | IP6_INC_STATS(rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS); | 655 | IP6_INC_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS); |
656 | return err; | 656 | return err; |
657 | } | 657 | } |
658 | 658 | ||
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index f4f62f086096..63644075f2d6 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
@@ -433,7 +433,8 @@ static int ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, | |||
433 | return -1; | 433 | return -1; |
434 | 434 | ||
435 | err: | 435 | err: |
436 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_REASMFAILS); | 436 | IP6_INC_STATS(dev_net(skb->dst->dev), ip6_dst_idev(skb->dst), |
437 | IPSTATS_MIB_REASMFAILS); | ||
437 | kfree_skb(skb); | 438 | kfree_skb(skb); |
438 | return -1; | 439 | return -1; |
439 | } | 440 | } |
@@ -573,7 +574,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb) | |||
573 | struct frag_hdr *fhdr; | 574 | struct frag_hdr *fhdr; |
574 | struct frag_queue *fq; | 575 | struct frag_queue *fq; |
575 | struct ipv6hdr *hdr = ipv6_hdr(skb); | 576 | struct ipv6hdr *hdr = ipv6_hdr(skb); |
576 | struct net *net; | 577 | struct net *net = dev_net(skb->dst->dev); |
577 | 578 | ||
578 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_REASMREQDS); | 579 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_REASMREQDS); |
579 | 580 | ||
@@ -597,7 +598,6 @@ static int ipv6_frag_rcv(struct sk_buff *skb) | |||
597 | return 1; | 598 | return 1; |
598 | } | 599 | } |
599 | 600 | ||
600 | net = dev_net(skb->dev); | ||
601 | if (atomic_read(&net->ipv6.frags.mem) > net->ipv6.frags.high_thresh) | 601 | if (atomic_read(&net->ipv6.frags.mem) > net->ipv6.frags.high_thresh) |
602 | ip6_evictor(net, ip6_dst_idev(skb->dst)); | 602 | ip6_evictor(net, ip6_dst_idev(skb->dst)); |
603 | 603 | ||
@@ -619,7 +619,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb) | |||
619 | return -1; | 619 | return -1; |
620 | 620 | ||
621 | fail_hdr: | 621 | fail_hdr: |
622 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_INHDRERRORS); | 622 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), IPSTATS_MIB_INHDRERRORS); |
623 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb_network_header_len(skb)); | 623 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb_network_header_len(skb)); |
624 | return -1; | 624 | return -1; |
625 | } | 625 | } |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index e10a17015504..89dc69924340 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -1833,16 +1833,19 @@ int ipv6_route_ioctl(struct net *net, unsigned int cmd, void __user *arg) | |||
1833 | static int ip6_pkt_drop(struct sk_buff *skb, int code, int ipstats_mib_noroutes) | 1833 | static int ip6_pkt_drop(struct sk_buff *skb, int code, int ipstats_mib_noroutes) |
1834 | { | 1834 | { |
1835 | int type; | 1835 | int type; |
1836 | struct dst_entry *dst = skb->dst; | ||
1836 | switch (ipstats_mib_noroutes) { | 1837 | switch (ipstats_mib_noroutes) { |
1837 | case IPSTATS_MIB_INNOROUTES: | 1838 | case IPSTATS_MIB_INNOROUTES: |
1838 | type = ipv6_addr_type(&ipv6_hdr(skb)->daddr); | 1839 | type = ipv6_addr_type(&ipv6_hdr(skb)->daddr); |
1839 | if (type == IPV6_ADDR_ANY || type == IPV6_ADDR_RESERVED) { | 1840 | if (type == IPV6_ADDR_ANY || type == IPV6_ADDR_RESERVED) { |
1840 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_INADDRERRORS); | 1841 | IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst), |
1842 | IPSTATS_MIB_INADDRERRORS); | ||
1841 | break; | 1843 | break; |
1842 | } | 1844 | } |
1843 | /* FALLTHROUGH */ | 1845 | /* FALLTHROUGH */ |
1844 | case IPSTATS_MIB_OUTNOROUTES: | 1846 | case IPSTATS_MIB_OUTNOROUTES: |
1845 | IP6_INC_STATS(ip6_dst_idev(skb->dst), ipstats_mib_noroutes); | 1847 | IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst), |
1848 | ipstats_mib_noroutes); | ||
1846 | break; | 1849 | break; |
1847 | } | 1850 | } |
1848 | icmpv6_send(skb, ICMPV6_DEST_UNREACH, code, 0, skb->dev); | 1851 | icmpv6_send(skb, ICMPV6_DEST_UNREACH, code, 0, skb->dev); |