net: compat_mmsghdr must be used in sys_recvmmsg
[safe/jmp/linux-2.6] / net / ipv6 / proc.c
index 25eda8b..c9605c3 100644 (file)
@@ -61,7 +61,7 @@ static const struct file_operations sockstat6_seq_fops = {
 
 static struct snmp_mib snmp6_ipstats_list[] = {
 /* ipv6 mib according to RFC 2465 */
-       SNMP_MIB_ITEM("Ip6InReceives", IPSTATS_MIB_INRECEIVES),
+       SNMP_MIB_ITEM("Ip6InReceives", IPSTATS_MIB_INPKTS),
        SNMP_MIB_ITEM("Ip6InHdrErrors", IPSTATS_MIB_INHDRERRORS),
        SNMP_MIB_ITEM("Ip6InTooBigErrors", IPSTATS_MIB_INTOOBIGERRORS),
        SNMP_MIB_ITEM("Ip6InNoRoutes", IPSTATS_MIB_INNOROUTES),
@@ -71,7 +71,7 @@ static struct snmp_mib snmp6_ipstats_list[] = {
        SNMP_MIB_ITEM("Ip6InDiscards", IPSTATS_MIB_INDISCARDS),
        SNMP_MIB_ITEM("Ip6InDelivers", IPSTATS_MIB_INDELIVERS),
        SNMP_MIB_ITEM("Ip6OutForwDatagrams", IPSTATS_MIB_OUTFORWDATAGRAMS),
-       SNMP_MIB_ITEM("Ip6OutRequests", IPSTATS_MIB_OUTREQUESTS),
+       SNMP_MIB_ITEM("Ip6OutRequests", IPSTATS_MIB_OUTPKTS),
        SNMP_MIB_ITEM("Ip6OutDiscards", IPSTATS_MIB_OUTDISCARDS),
        SNMP_MIB_ITEM("Ip6OutNoRoutes", IPSTATS_MIB_OUTNOROUTES),
        SNMP_MIB_ITEM("Ip6ReasmTimeout", IPSTATS_MIB_REASMTIMEOUT),
@@ -83,6 +83,12 @@ static struct snmp_mib snmp6_ipstats_list[] = {
        SNMP_MIB_ITEM("Ip6FragCreates", IPSTATS_MIB_FRAGCREATES),
        SNMP_MIB_ITEM("Ip6InMcastPkts", IPSTATS_MIB_INMCASTPKTS),
        SNMP_MIB_ITEM("Ip6OutMcastPkts", IPSTATS_MIB_OUTMCASTPKTS),
+       SNMP_MIB_ITEM("Ip6InOctets", IPSTATS_MIB_INOCTETS),
+       SNMP_MIB_ITEM("Ip6OutOctets", IPSTATS_MIB_OUTOCTETS),
+       SNMP_MIB_ITEM("Ip6InMcastOctets", IPSTATS_MIB_INMCASTOCTETS),
+       SNMP_MIB_ITEM("Ip6OutMcastOctets", IPSTATS_MIB_OUTMCASTOCTETS),
+       SNMP_MIB_ITEM("Ip6InBcastOctets", IPSTATS_MIB_INBCASTOCTETS),
+       SNMP_MIB_ITEM("Ip6OutBcastOctets", IPSTATS_MIB_OUTBCASTOCTETS),
        SNMP_MIB_SENTINEL
 };
 
@@ -95,7 +101,7 @@ static struct snmp_mib snmp6_icmp6_list[] = {
 };
 
 /* RFC 4293 v6 ICMPMsgStatsTable; named items for RFC 2466 compatibility */
-static char *icmp6type2name[256] = {
+static const char *const icmp6type2name[256] = {
        [ICMPV6_DEST_UNREACH] = "DestUnreachs",
        [ICMPV6_PKT_TOOBIG] = "PktTooBigs",
        [ICMPV6_TIME_EXCEED] = "TimeExcds",
@@ -132,19 +138,19 @@ static struct snmp_mib snmp6_udplite6_list[] = {
 
 static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib)
 {
-       static char name[32];
+       char name[32];
        int i;
 
        /* print by name -- deprecated items */
        for (i = 0; i < ICMP6MSG_MIB_MAX; i++) {
                int icmptype;
-               char *p;
+               const char *p;
 
                icmptype = i & 0xff;
                p = icmp6type2name[icmptype];
                if (!p) /* don't print un-named types here */
                        continue;
-               (void) snprintf(name, sizeof(name)-1, "Icmp6%s%s",
+               snprintf(name, sizeof(name), "Icmp6%s%s",
                        i & 0x100 ? "Out" : "In", p);
                seq_printf(seq, "%-32s\t%lu\n", name,
                        snmp_fold_field(mib, i));
@@ -157,7 +163,7 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib)
                val = snmp_fold_field(mib, i);
                if (!val)
                        continue;
-               (void) snprintf(name, sizeof(name)-1, "Icmp6%sType%u",
+               snprintf(name, sizeof(name), "Icmp6%sType%u",
                        i & 0x100 ?  "Out" : "In", i & 0xff);
                seq_printf(seq, "%-32s\t%lu\n", name, val);
        }
@@ -175,26 +181,23 @@ snmp6_seq_show_item(struct seq_file *seq, void **mib, struct snmp_mib *itemlist)
 
 static int snmp6_seq_show(struct seq_file *seq, void *v)
 {
-       struct inet6_dev *idev = (struct inet6_dev *)seq->private;
-
-       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);
-               snmp6_seq_show_icmpv6msg(seq, (void **)idev->stats.icmpv6msg);
-       } 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_icmpv6msg(seq, (void **)icmpv6msg_statistics);
-               snmp6_seq_show_item(seq, (void **)udp_stats_in6, snmp6_udp6_list);
-               snmp6_seq_show_item(seq, (void **)udplite_stats_in6, snmp6_udplite6_list);
-       }
+       struct net *net = (struct net *)seq->private;
+
+       snmp6_seq_show_item(seq, (void **)net->mib.ipv6_statistics,
+                           snmp6_ipstats_list);
+       snmp6_seq_show_item(seq, (void **)net->mib.icmpv6_statistics,
+                           snmp6_icmp6_list);
+       snmp6_seq_show_icmpv6msg(seq, (void **)net->mib.icmpv6msg_statistics);
+       snmp6_seq_show_item(seq, (void **)net->mib.udp_stats_in6,
+                           snmp6_udp6_list);
+       snmp6_seq_show_item(seq, (void **)net->mib.udplite_stats_in6,
+                           snmp6_udplite6_list);
        return 0;
 }
 
 static int snmp6_seq_open(struct inode *inode, struct file *file)
 {
-       return single_open(file, snmp6_seq_show, PDE(inode)->data);
+       return single_open_net(inode, file, snmp6_seq_show);
 }
 
 static const struct file_operations snmp6_seq_fops = {
@@ -202,6 +205,30 @@ static const struct file_operations snmp6_seq_fops = {
        .open    = snmp6_seq_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
+       .release = single_release_net,
+};
+
+static int snmp6_dev_seq_show(struct seq_file *seq, void *v)
+{
+       struct inet6_dev *idev = (struct inet6_dev *)seq->private;
+
+       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);
+       snmp6_seq_show_icmpv6msg(seq, (void **)idev->stats.icmpv6msg);
+       return 0;
+}
+
+static int snmp6_dev_seq_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, snmp6_dev_seq_show, PDE(inode)->data);
+}
+
+static const struct file_operations snmp6_dev_seq_fops = {
+       .owner   = THIS_MODULE,
+       .open    = snmp6_dev_seq_open,
+       .read    = seq_read,
+       .llseek  = seq_lseek,
        .release = single_release,
 };
 
@@ -214,14 +241,12 @@ int snmp6_register_dev(struct inet6_dev *idev)
                return -EINVAL;
 
        net = dev_net(idev->dev);
-       if (!net_eq(net, &init_net))
-               return 0;
-
        if (!net->mib.proc_net_devsnmp6)
                return -ENOENT;
 
        p = proc_create_data(idev->dev->name, S_IRUGO,
-                            net->mib.proc_net_devsnmp6, &snmp6_seq_fops, idev);
+                            net->mib.proc_net_devsnmp6,
+                            &snmp6_dev_seq_fops, idev);
        if (!p)
                return -ENOMEM;