fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / net / ipv6 / proc.c
index 4238b1e..35249d8 100644 (file)
@@ -17,7 +17,6 @@
  *             as published by the Free Software Foundation; either version
  *             2 of the License, or (at your option) any later version.
  */
-#include <linux/config.h>
 #include <linux/sched.h>
 #include <linux/socket.h>
 #include <linux/net.h>
@@ -38,7 +37,7 @@ static int fold_prot_inuse(struct proto *proto)
        int res = 0;
        int cpu;
 
-       for_each_cpu(cpu)
+       for_each_possible_cpu(cpu)
                res += proto->stats[cpu].inuse;
 
        return res;
@@ -50,6 +49,8 @@ static int sockstat6_seq_show(struct seq_file *seq, void *v)
                       fold_prot_inuse(&tcpv6_prot));
        seq_printf(seq, "UDP6: inuse %d\n",
                       fold_prot_inuse(&udpv6_prot));
+       seq_printf(seq, "UDPLITE6: inuse %d\n",
+                       fold_prot_inuse(&udplitev6_prot));
        seq_printf(seq, "RAW6: inuse %d\n",
                       fold_prot_inuse(&rawv6_prot));
        seq_printf(seq, "FRAG6: inuse %d memory %d\n",
@@ -134,13 +135,21 @@ static struct snmp_mib snmp6_udp6_list[] = {
        SNMP_MIB_SENTINEL
 };
 
+static struct snmp_mib snmp6_udplite6_list[] = {
+       SNMP_MIB_ITEM("UdpLite6InDatagrams", UDP_MIB_INDATAGRAMS),
+       SNMP_MIB_ITEM("UdpLite6NoPorts", UDP_MIB_NOPORTS),
+       SNMP_MIB_ITEM("UdpLite6InErrors", UDP_MIB_INERRORS),
+       SNMP_MIB_ITEM("UdpLite6OutDatagrams", UDP_MIB_OUTDATAGRAMS),
+       SNMP_MIB_SENTINEL
+};
+
 static unsigned long
 fold_field(void *mib[], int offt)
 {
         unsigned long res = 0;
         int i;
  
-        for_each_cpu(i) {
+        for_each_possible_cpu(i) {
                 res += *(((unsigned long *)per_cpu_ptr(mib[0], i)) + offt);
                 res += *(((unsigned long *)per_cpu_ptr(mib[1], i)) + offt);
         }
@@ -162,11 +171,13 @@ static int snmp6_seq_show(struct seq_file *seq, void *v)
 
        if (idev) {
                seq_printf(seq, "%-32s\t%u\n", "ifIndex", idev->dev->ifindex);
+               snmp6_seq_show_item(seq, (void **)idev->stats.ipv6, snmp6_ipstats_list);
                snmp6_seq_show_item(seq, (void **)idev->stats.icmpv6, snmp6_icmp6_list);
        } else {
                snmp6_seq_show_item(seq, (void **)ipv6_statistics, snmp6_ipstats_list);
                snmp6_seq_show_item(seq, (void **)icmpv6_statistics, snmp6_icmp6_list);
                snmp6_seq_show_item(seq, (void **)udp_stats_in6, snmp6_udp6_list);
+               snmp6_seq_show_item(seq, (void **)udplite_stats_in6, snmp6_udplite6_list);
        }
        return 0;
 }
@@ -282,6 +293,9 @@ int snmp6_alloc_dev(struct inet6_dev *idev)
        if (!idev || !idev->dev)
                return -EINVAL;
 
+       if (snmp6_mib_init((void **)idev->stats.ipv6, sizeof(struct ipstats_mib),
+                          __alignof__(struct ipstats_mib)) < 0)
+               goto err_ip;
        if (snmp6_mib_init((void **)idev->stats.icmpv6, sizeof(struct icmpv6_mib),
                           __alignof__(struct icmpv6_mib)) < 0)
                goto err_icmp;
@@ -289,12 +303,15 @@ int snmp6_alloc_dev(struct inet6_dev *idev)
        return 0;
 
 err_icmp:
+       snmp6_mib_free((void **)idev->stats.ipv6);
+err_ip:
        return err;
 }
 
 int snmp6_free_dev(struct inet6_dev *idev)
 {
        snmp6_mib_free((void **)idev->stats.icmpv6);
+       snmp6_mib_free((void **)idev->stats.ipv6);
        return 0;
 }