aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/proc.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/proc.c')
-rw-r--r--net/ipv4/proc.c120
1 files changed, 89 insertions, 31 deletions
diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c
index 95a8f8f2de71..2015148b41a8 100644
--- a/net/ipv4/proc.c
+++ b/net/ipv4/proc.c
@@ -124,33 +124,30 @@ static const struct snmp_mib snmp4_ipextstats_list[] = {
124static const struct snmp_mib snmp4_icmp_list[] = { 124static const struct snmp_mib snmp4_icmp_list[] = {
125 SNMP_MIB_ITEM("InMsgs", ICMP_MIB_INMSGS), 125 SNMP_MIB_ITEM("InMsgs", ICMP_MIB_INMSGS),
126 SNMP_MIB_ITEM("InErrors", ICMP_MIB_INERRORS), 126 SNMP_MIB_ITEM("InErrors", ICMP_MIB_INERRORS),
127 SNMP_MIB_ITEM("InDestUnreachs", ICMP_MIB_INDESTUNREACHS),
128 SNMP_MIB_ITEM("InTimeExcds", ICMP_MIB_INTIMEEXCDS),
129 SNMP_MIB_ITEM("InParmProbs", ICMP_MIB_INPARMPROBS),
130 SNMP_MIB_ITEM("InSrcQuenchs", ICMP_MIB_INSRCQUENCHS),
131 SNMP_MIB_ITEM("InRedirects", ICMP_MIB_INREDIRECTS),
132 SNMP_MIB_ITEM("InEchos", ICMP_MIB_INECHOS),
133 SNMP_MIB_ITEM("InEchoReps", ICMP_MIB_INECHOREPS),
134 SNMP_MIB_ITEM("InTimestamps", ICMP_MIB_INTIMESTAMPS),
135 SNMP_MIB_ITEM("InTimestampReps", ICMP_MIB_INTIMESTAMPREPS),
136 SNMP_MIB_ITEM("InAddrMasks", ICMP_MIB_INADDRMASKS),
137 SNMP_MIB_ITEM("InAddrMaskReps", ICMP_MIB_INADDRMASKREPS),
138 SNMP_MIB_ITEM("OutMsgs", ICMP_MIB_OUTMSGS), 127 SNMP_MIB_ITEM("OutMsgs", ICMP_MIB_OUTMSGS),
139 SNMP_MIB_ITEM("OutErrors", ICMP_MIB_OUTERRORS), 128 SNMP_MIB_ITEM("OutErrors", ICMP_MIB_OUTERRORS),
140 SNMP_MIB_ITEM("OutDestUnreachs", ICMP_MIB_OUTDESTUNREACHS),
141 SNMP_MIB_ITEM("OutTimeExcds", ICMP_MIB_OUTTIMEEXCDS),
142 SNMP_MIB_ITEM("OutParmProbs", ICMP_MIB_OUTPARMPROBS),
143 SNMP_MIB_ITEM("OutSrcQuenchs", ICMP_MIB_OUTSRCQUENCHS),
144 SNMP_MIB_ITEM("OutRedirects", ICMP_MIB_OUTREDIRECTS),
145 SNMP_MIB_ITEM("OutEchos", ICMP_MIB_OUTECHOS),
146 SNMP_MIB_ITEM("OutEchoReps", ICMP_MIB_OUTECHOREPS),
147 SNMP_MIB_ITEM("OutTimestamps", ICMP_MIB_OUTTIMESTAMPS),
148 SNMP_MIB_ITEM("OutTimestampReps", ICMP_MIB_OUTTIMESTAMPREPS),
149 SNMP_MIB_ITEM("OutAddrMasks", ICMP_MIB_OUTADDRMASKS),
150 SNMP_MIB_ITEM("OutAddrMaskReps", ICMP_MIB_OUTADDRMASKREPS),
151 SNMP_MIB_SENTINEL 129 SNMP_MIB_SENTINEL
152}; 130};
153 131
132static struct {
133 char *name;
134 int index;
135} icmpmibmap[] = {
136 { "DestUnreachs", ICMP_DEST_UNREACH },
137 { "TimeExcds", ICMP_TIME_EXCEEDED },
138 { "ParmProbs", ICMP_PARAMETERPROB },
139 { "SrcQuenchs", ICMP_SOURCE_QUENCH },
140 { "Redirects", ICMP_REDIRECT },
141 { "Echos", ICMP_ECHO },
142 { "EchoReps", ICMP_ECHOREPLY },
143 { "Timestamps", ICMP_TIMESTAMP },
144 { "TimestampReps", ICMP_TIMESTAMPREPLY },
145 { "AddrMasks", ICMP_ADDRESS },
146 { "AddrMaskReps", ICMP_ADDRESSREPLY },
147 { 0, 0 }
148};
149
150
154static const struct snmp_mib snmp4_tcp_list[] = { 151static const struct snmp_mib snmp4_tcp_list[] = {
155 SNMP_MIB_ITEM("RtoAlgorithm", TCP_MIB_RTOALGORITHM), 152 SNMP_MIB_ITEM("RtoAlgorithm", TCP_MIB_RTOALGORITHM),
156 SNMP_MIB_ITEM("RtoMin", TCP_MIB_RTOMIN), 153 SNMP_MIB_ITEM("RtoMin", TCP_MIB_RTOMIN),
@@ -251,6 +248,72 @@ static const struct snmp_mib snmp4_net_list[] = {
251 SNMP_MIB_SENTINEL 248 SNMP_MIB_SENTINEL
252}; 249};
253 250
251static void icmpmsg_put(struct seq_file *seq)
252{
253#define PERLINE 16
254
255 int j, i, count;
256 static int out[PERLINE];
257
258 count = 0;
259 for (i = 0; i < ICMPMSG_MIB_MAX; i++) {
260
261 if (snmp_fold_field((void **) icmpmsg_statistics, i))
262 out[count++] = i;
263 if (count < PERLINE)
264 continue;
265
266 seq_printf(seq, "\nIcmpMsg:");
267 for (j = 0; j < PERLINE; ++j)
268 seq_printf(seq, " %sType%u", i & 0x100 ? "Out" : "In",
269 i & 0xff);
270 seq_printf(seq, "\nIcmpMsg: ");
271 for (j = 0; j < PERLINE; ++j)
272 seq_printf(seq, " %lu",
273 snmp_fold_field((void **) icmpmsg_statistics,
274 out[j]));
275 seq_putc(seq, '\n');
276 }
277 if (count) {
278 seq_printf(seq, "\nIcmpMsg:");
279 for (j = 0; j < count; ++j)
280 seq_printf(seq, " %sType%u", out[j] & 0x100 ? "Out" :
281 "In", out[j] & 0xff);
282 seq_printf(seq, "\nIcmpMsg:");
283 for (j = 0; j < count; ++j)
284 seq_printf(seq, " %lu", snmp_fold_field((void **)
285 icmpmsg_statistics, out[j]));
286 }
287
288#undef PERLINE
289}
290
291static void icmp_put(struct seq_file *seq)
292{
293 int i;
294
295 seq_puts(seq, "\nIcmp: InMsgs InErrors");
296 for (i=0; icmpmibmap[i].name != NULL; i++)
297 seq_printf(seq, " In%s", icmpmibmap[i].name);
298 seq_printf(seq, " OutMsgs OutErrors");
299 for (i=0; icmpmibmap[i].name != NULL; i++)
300 seq_printf(seq, " Out%s", icmpmibmap[i].name);
301 seq_printf(seq, "\nIcmp: %lu %lu",
302 snmp_fold_field((void **) icmp_statistics, ICMP_MIB_INMSGS),
303 snmp_fold_field((void **) icmp_statistics, ICMP_MIB_INERRORS));
304 for (i=0; icmpmibmap[i].name != NULL; i++)
305 seq_printf(seq, " %lu",
306 snmp_fold_field((void **) icmpmsg_statistics,
307 icmpmibmap[i].index));
308 seq_printf(seq, " %lu %lu",
309 snmp_fold_field((void **) icmp_statistics, ICMP_MIB_OUTMSGS),
310 snmp_fold_field((void **) icmp_statistics, ICMP_MIB_OUTERRORS));
311 for (i=0; icmpmibmap[i].name != NULL; i++)
312 seq_printf(seq, " %lu",
313 snmp_fold_field((void **) icmpmsg_statistics,
314 icmpmibmap[i].index));
315}
316
254/* 317/*
255 * Called from the PROCfs module. This outputs /proc/net/snmp. 318 * Called from the PROCfs module. This outputs /proc/net/snmp.
256 */ 319 */
@@ -271,15 +334,8 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
271 snmp_fold_field((void **)ip_statistics, 334 snmp_fold_field((void **)ip_statistics,
272 snmp4_ipstats_list[i].entry)); 335 snmp4_ipstats_list[i].entry));
273 336
274 seq_puts(seq, "\nIcmp:"); 337 icmp_put(seq); /* RFC 2011 compatibility */
275 for (i = 0; snmp4_icmp_list[i].name != NULL; i++) 338 icmpmsg_put(seq);
276 seq_printf(seq, " %s", snmp4_icmp_list[i].name);
277
278 seq_puts(seq, "\nIcmp:");
279 for (i = 0; snmp4_icmp_list[i].name != NULL; i++)
280 seq_printf(seq, " %lu",
281 snmp_fold_field((void **)icmp_statistics,
282 snmp4_icmp_list[i].entry));
283 339
284 seq_puts(seq, "\nTcp:"); 340 seq_puts(seq, "\nTcp:");
285 for (i = 0; snmp4_tcp_list[i].name != NULL; i++) 341 for (i = 0; snmp4_tcp_list[i].name != NULL; i++)
@@ -336,6 +392,8 @@ static const struct file_operations snmp_seq_fops = {
336 .release = single_release, 392 .release = single_release,
337}; 393};
338 394
395
396
339/* 397/*
340 * Output /proc/net/netstat 398 * Output /proc/net/netstat
341 */ 399 */