|
@@ -124,33 +124,30 @@ static const struct snmp_mib snmp4_ipextstats_list[] = {
|
|
|
static const struct snmp_mib snmp4_icmp_list[] = {
|
|
|
SNMP_MIB_ITEM("InMsgs", ICMP_MIB_INMSGS),
|
|
|
SNMP_MIB_ITEM("InErrors", ICMP_MIB_INERRORS),
|
|
|
- SNMP_MIB_ITEM("InDestUnreachs", ICMP_MIB_INDESTUNREACHS),
|
|
|
- SNMP_MIB_ITEM("InTimeExcds", ICMP_MIB_INTIMEEXCDS),
|
|
|
- SNMP_MIB_ITEM("InParmProbs", ICMP_MIB_INPARMPROBS),
|
|
|
- SNMP_MIB_ITEM("InSrcQuenchs", ICMP_MIB_INSRCQUENCHS),
|
|
|
- SNMP_MIB_ITEM("InRedirects", ICMP_MIB_INREDIRECTS),
|
|
|
- SNMP_MIB_ITEM("InEchos", ICMP_MIB_INECHOS),
|
|
|
- SNMP_MIB_ITEM("InEchoReps", ICMP_MIB_INECHOREPS),
|
|
|
- SNMP_MIB_ITEM("InTimestamps", ICMP_MIB_INTIMESTAMPS),
|
|
|
- SNMP_MIB_ITEM("InTimestampReps", ICMP_MIB_INTIMESTAMPREPS),
|
|
|
- SNMP_MIB_ITEM("InAddrMasks", ICMP_MIB_INADDRMASKS),
|
|
|
- SNMP_MIB_ITEM("InAddrMaskReps", ICMP_MIB_INADDRMASKREPS),
|
|
|
SNMP_MIB_ITEM("OutMsgs", ICMP_MIB_OUTMSGS),
|
|
|
SNMP_MIB_ITEM("OutErrors", ICMP_MIB_OUTERRORS),
|
|
|
- SNMP_MIB_ITEM("OutDestUnreachs", ICMP_MIB_OUTDESTUNREACHS),
|
|
|
- SNMP_MIB_ITEM("OutTimeExcds", ICMP_MIB_OUTTIMEEXCDS),
|
|
|
- SNMP_MIB_ITEM("OutParmProbs", ICMP_MIB_OUTPARMPROBS),
|
|
|
- SNMP_MIB_ITEM("OutSrcQuenchs", ICMP_MIB_OUTSRCQUENCHS),
|
|
|
- SNMP_MIB_ITEM("OutRedirects", ICMP_MIB_OUTREDIRECTS),
|
|
|
- SNMP_MIB_ITEM("OutEchos", ICMP_MIB_OUTECHOS),
|
|
|
- SNMP_MIB_ITEM("OutEchoReps", ICMP_MIB_OUTECHOREPS),
|
|
|
- SNMP_MIB_ITEM("OutTimestamps", ICMP_MIB_OUTTIMESTAMPS),
|
|
|
- SNMP_MIB_ITEM("OutTimestampReps", ICMP_MIB_OUTTIMESTAMPREPS),
|
|
|
- SNMP_MIB_ITEM("OutAddrMasks", ICMP_MIB_OUTADDRMASKS),
|
|
|
- SNMP_MIB_ITEM("OutAddrMaskReps", ICMP_MIB_OUTADDRMASKREPS),
|
|
|
SNMP_MIB_SENTINEL
|
|
|
};
|
|
|
|
|
|
+static struct {
|
|
|
+ char *name;
|
|
|
+ int index;
|
|
|
+} icmpmibmap[] = {
|
|
|
+ { "DestUnreachs", ICMP_DEST_UNREACH },
|
|
|
+ { "TimeExcds", ICMP_TIME_EXCEEDED },
|
|
|
+ { "ParmProbs", ICMP_PARAMETERPROB },
|
|
|
+ { "SrcQuenchs", ICMP_SOURCE_QUENCH },
|
|
|
+ { "Redirects", ICMP_REDIRECT },
|
|
|
+ { "Echos", ICMP_ECHO },
|
|
|
+ { "EchoReps", ICMP_ECHOREPLY },
|
|
|
+ { "Timestamps", ICMP_TIMESTAMP },
|
|
|
+ { "TimestampReps", ICMP_TIMESTAMPREPLY },
|
|
|
+ { "AddrMasks", ICMP_ADDRESS },
|
|
|
+ { "AddrMaskReps", ICMP_ADDRESSREPLY },
|
|
|
+ { 0, 0 }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
static const struct snmp_mib snmp4_tcp_list[] = {
|
|
|
SNMP_MIB_ITEM("RtoAlgorithm", TCP_MIB_RTOALGORITHM),
|
|
|
SNMP_MIB_ITEM("RtoMin", TCP_MIB_RTOMIN),
|
|
@@ -251,6 +248,72 @@ static const struct snmp_mib snmp4_net_list[] = {
|
|
|
SNMP_MIB_SENTINEL
|
|
|
};
|
|
|
|
|
|
+static void icmpmsg_put(struct seq_file *seq)
|
|
|
+{
|
|
|
+#define PERLINE 16
|
|
|
+
|
|
|
+ int j, i, count;
|
|
|
+ static int out[PERLINE];
|
|
|
+
|
|
|
+ count = 0;
|
|
|
+ for (i = 0; i < ICMPMSG_MIB_MAX; i++) {
|
|
|
+
|
|
|
+ if (snmp_fold_field((void **) icmpmsg_statistics, i))
|
|
|
+ out[count++] = i;
|
|
|
+ if (count < PERLINE)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ seq_printf(seq, "\nIcmpMsg:");
|
|
|
+ for (j = 0; j < PERLINE; ++j)
|
|
|
+ seq_printf(seq, " %sType%u", i & 0x100 ? "Out" : "In",
|
|
|
+ i & 0xff);
|
|
|
+ seq_printf(seq, "\nIcmpMsg: ");
|
|
|
+ for (j = 0; j < PERLINE; ++j)
|
|
|
+ seq_printf(seq, " %lu",
|
|
|
+ snmp_fold_field((void **) icmpmsg_statistics,
|
|
|
+ out[j]));
|
|
|
+ seq_putc(seq, '\n');
|
|
|
+ }
|
|
|
+ if (count) {
|
|
|
+ seq_printf(seq, "\nIcmpMsg:");
|
|
|
+ for (j = 0; j < count; ++j)
|
|
|
+ seq_printf(seq, " %sType%u", out[j] & 0x100 ? "Out" :
|
|
|
+ "In", out[j] & 0xff);
|
|
|
+ seq_printf(seq, "\nIcmpMsg:");
|
|
|
+ for (j = 0; j < count; ++j)
|
|
|
+ seq_printf(seq, " %lu", snmp_fold_field((void **)
|
|
|
+ icmpmsg_statistics, out[j]));
|
|
|
+ }
|
|
|
+
|
|
|
+#undef PERLINE
|
|
|
+}
|
|
|
+
|
|
|
+static void icmp_put(struct seq_file *seq)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ seq_puts(seq, "\nIcmp: InMsgs InErrors");
|
|
|
+ for (i=0; icmpmibmap[i].name != NULL; i++)
|
|
|
+ seq_printf(seq, " In%s", icmpmibmap[i].name);
|
|
|
+ seq_printf(seq, " OutMsgs OutErrors");
|
|
|
+ for (i=0; icmpmibmap[i].name != NULL; i++)
|
|
|
+ seq_printf(seq, " Out%s", icmpmibmap[i].name);
|
|
|
+ seq_printf(seq, "\nIcmp: %lu %lu",
|
|
|
+ snmp_fold_field((void **) icmp_statistics, ICMP_MIB_INMSGS),
|
|
|
+ snmp_fold_field((void **) icmp_statistics, ICMP_MIB_INERRORS));
|
|
|
+ for (i=0; icmpmibmap[i].name != NULL; i++)
|
|
|
+ seq_printf(seq, " %lu",
|
|
|
+ snmp_fold_field((void **) icmpmsg_statistics,
|
|
|
+ icmpmibmap[i].index));
|
|
|
+ seq_printf(seq, " %lu %lu",
|
|
|
+ snmp_fold_field((void **) icmp_statistics, ICMP_MIB_OUTMSGS),
|
|
|
+ snmp_fold_field((void **) icmp_statistics, ICMP_MIB_OUTERRORS));
|
|
|
+ for (i=0; icmpmibmap[i].name != NULL; i++)
|
|
|
+ seq_printf(seq, " %lu",
|
|
|
+ snmp_fold_field((void **) icmpmsg_statistics,
|
|
|
+ icmpmibmap[i].index));
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Called from the PROCfs module. This outputs /proc/net/snmp.
|
|
|
*/
|
|
@@ -271,15 +334,8 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
|
|
|
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++)
|
|
|
- seq_printf(seq, " %s", snmp4_icmp_list[i].name);
|
|
|
-
|
|
|
- seq_puts(seq, "\nIcmp:");
|
|
|
- for (i = 0; snmp4_icmp_list[i].name != NULL; i++)
|
|
|
- seq_printf(seq, " %lu",
|
|
|
- snmp_fold_field((void **)icmp_statistics,
|
|
|
- snmp4_icmp_list[i].entry));
|
|
|
+ icmp_put(seq); /* RFC 2011 compatibility */
|
|
|
+ icmpmsg_put(seq);
|
|
|
|
|
|
seq_puts(seq, "\nTcp:");
|
|
|
for (i = 0; snmp4_tcp_list[i].name != NULL; i++)
|
|
@@ -336,6 +392,8 @@ static const struct file_operations snmp_seq_fops = {
|
|
|
.release = single_release,
|
|
|
};
|
|
|
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
* Output /proc/net/netstat
|
|
|
*/
|