[IA64] SGI Altix : fix a force_interrupt bug on altix
[safe/jmp/linux-2.6] / net / ipv4 / proc.c
index cd873da..3b690cf 100644 (file)
@@ -79,7 +79,7 @@ static int sockstat_seq_open(struct inode *inode, struct file *file)
        return single_open(file, sockstat_seq_show, NULL);
 }
 
-static struct file_operations sockstat_seq_fops = {
+static const struct file_operations sockstat_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = sockstat_seq_open,
        .read    = seq_read,
@@ -87,19 +87,6 @@ static struct file_operations sockstat_seq_fops = {
        .release = single_release,
 };
 
-static unsigned long
-fold_field(void *mib[], int offt)
-{
-       unsigned long res = 0;
-       int 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);
-       }
-       return res;
-}
-
 /* snmp items */
 static const struct snmp_mib snmp4_ipstats_list[] = {
        SNMP_MIB_ITEM("InReceives", IPSTATS_MIB_INRECEIVES),
@@ -122,6 +109,17 @@ static const struct snmp_mib snmp4_ipstats_list[] = {
        SNMP_MIB_SENTINEL
 };
 
+/* Following RFC4293 items are displayed in /proc/net/netstat */
+static const struct snmp_mib snmp4_ipextstats_list[] = {
+       SNMP_MIB_ITEM("InNoRoutes", IPSTATS_MIB_INNOROUTES),
+       SNMP_MIB_ITEM("InTruncatedPkts", IPSTATS_MIB_INTRUNCATEDPKTS),
+       SNMP_MIB_ITEM("InMcastPkts", IPSTATS_MIB_INMCASTPKTS),
+       SNMP_MIB_ITEM("OutMcastPkts", IPSTATS_MIB_OUTMCASTPKTS),
+       SNMP_MIB_ITEM("InBcastPkts", IPSTATS_MIB_INBCASTPKTS),
+       SNMP_MIB_ITEM("OutBcastPkts", IPSTATS_MIB_OUTBCASTPKTS),
+       SNMP_MIB_SENTINEL
+};
+
 static const struct snmp_mib snmp4_icmp_list[] = {
        SNMP_MIB_ITEM("InMsgs", ICMP_MIB_INMSGS),
        SNMP_MIB_ITEM("InErrors", ICMP_MIB_INERRORS),
@@ -262,12 +260,12 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
                seq_printf(seq, " %s", snmp4_ipstats_list[i].name);
 
        seq_printf(seq, "\nIp: %d %d",
-                       ipv4_devconf.forwarding ? 1 : 2, sysctl_ip_default_ttl);
+                  IPV4_DEVCONF_ALL(FORWARDING) ? 1 : 2, sysctl_ip_default_ttl);
 
        for (i = 0; snmp4_ipstats_list[i].name != NULL; i++)
                seq_printf(seq, " %lu",
-                          fold_field((void **) ip_statistics, 
-                                     snmp4_ipstats_list[i].entry));
+                          snmp_fold_field((void **)ip_statistics,
+                                          snmp4_ipstats_list[i].entry));
 
        seq_puts(seq, "\nIcmp:");
        for (i = 0; snmp4_icmp_list[i].name != NULL; i++)
@@ -276,8 +274,8 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
        seq_puts(seq, "\nIcmp:");
        for (i = 0; snmp4_icmp_list[i].name != NULL; i++)
                seq_printf(seq, " %lu",
-                          fold_field((void **) icmp_statistics, 
-                                     snmp4_icmp_list[i].entry));
+                          snmp_fold_field((void **)icmp_statistics,
+                                          snmp4_icmp_list[i].entry));
 
        seq_puts(seq, "\nTcp:");
        for (i = 0; snmp4_tcp_list[i].name != NULL; i++)
@@ -288,12 +286,12 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
                /* MaxConn field is signed, RFC 2012 */
                if (snmp4_tcp_list[i].entry == TCP_MIB_MAXCONN)
                        seq_printf(seq, " %ld",
-                                  fold_field((void **) tcp_statistics, 
-                                             snmp4_tcp_list[i].entry));
+                                  snmp_fold_field((void **)tcp_statistics,
+                                                  snmp4_tcp_list[i].entry));
                else
                        seq_printf(seq, " %lu",
-                                  fold_field((void **) tcp_statistics,
-                                             snmp4_tcp_list[i].entry));
+                                  snmp_fold_field((void **)tcp_statistics,
+                                                  snmp4_tcp_list[i].entry));
        }
 
        seq_puts(seq, "\nUdp:");
@@ -303,8 +301,8 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
        seq_puts(seq, "\nUdp:");
        for (i = 0; snmp4_udp_list[i].name != NULL; i++)
                seq_printf(seq, " %lu",
-                          fold_field((void **) udp_statistics, 
-                                     snmp4_udp_list[i].entry));
+                          snmp_fold_field((void **)udp_statistics,
+                                          snmp4_udp_list[i].entry));
 
        /* the UDP and UDP-Lite MIBs are the same */
        seq_puts(seq, "\nUdpLite:");
@@ -314,8 +312,8 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
        seq_puts(seq, "\nUdpLite:");
        for (i = 0; snmp4_udp_list[i].name != NULL; i++)
                seq_printf(seq, " %lu",
-                          fold_field((void **) udplite_statistics,
-                                     snmp4_udp_list[i].entry)     );
+                          snmp_fold_field((void **)udplite_statistics,
+                                          snmp4_udp_list[i].entry));
 
        seq_putc(seq, '\n');
        return 0;
@@ -326,7 +324,7 @@ static int snmp_seq_open(struct inode *inode, struct file *file)
        return single_open(file, snmp_seq_show, NULL);
 }
 
-static struct file_operations snmp_seq_fops = {
+static const struct file_operations snmp_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = snmp_seq_open,
        .read    = seq_read,
@@ -348,8 +346,18 @@ static int netstat_seq_show(struct seq_file *seq, void *v)
        seq_puts(seq, "\nTcpExt:");
        for (i = 0; snmp4_net_list[i].name != NULL; i++)
                seq_printf(seq, " %lu",
-                          fold_field((void **) net_statistics, 
-                                     snmp4_net_list[i].entry));
+                          snmp_fold_field((void **)net_statistics,
+                                          snmp4_net_list[i].entry));
+
+       seq_puts(seq, "\nIpExt:");
+       for (i = 0; snmp4_ipextstats_list[i].name != NULL; i++)
+               seq_printf(seq, " %s", snmp4_ipextstats_list[i].name);
+
+       seq_puts(seq, "\nIpExt:");
+       for (i = 0; snmp4_ipextstats_list[i].name != NULL; i++)
+               seq_printf(seq, " %lu",
+                          snmp_fold_field((void **)ip_statistics,
+                                          snmp4_ipextstats_list[i].entry));
 
        seq_putc(seq, '\n');
        return 0;
@@ -360,7 +368,7 @@ static int netstat_seq_open(struct inode *inode, struct file *file)
        return single_open(file, netstat_seq_show, NULL);
 }
 
-static struct file_operations netstat_seq_fops = {
+static const struct file_operations netstat_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = netstat_seq_open,
        .read    = seq_read,