aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/ipv6.h3
-rw-r--r--net/ipv6/icmp.c2
-rw-r--r--net/ipv6/ip6_output.c56
-rw-r--r--net/ipv6/mcast.c10
-rw-r--r--net/ipv6/ndisc.c4
-rw-r--r--net/ipv6/netfilter.c3
-rw-r--r--net/ipv6/raw.c4
-rw-r--r--net/ipv6/reassembly.c8
-rw-r--r--net/ipv6/route.c7
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 */
130DECLARE_SNMP_STAT(struct ipstats_mib, ipv6_statistics); 130DECLARE_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)
194int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, 196int 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
867fail: 878fail:
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;
1386error: 1397error:
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);
654error: 654error:
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
435err: 435err:
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
621fail_hdr: 621fail_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)
1833static int ip6_pkt_drop(struct sk_buff *skb, int code, int ipstats_mib_noroutes) 1833static 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);