summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorgnn <gnn@FreeBSD.org>2009-09-03 21:10:57 +0000
committergnn <gnn@FreeBSD.org>2009-09-03 21:10:57 +0000
commit60eb51e7a3e3a1dfacd9d9284b7e21e1fe4de011 (patch)
treeadac442cdf92025f0d2ded02f1a96f79bc1b1cfc /usr.bin
parent5d151fa1f9e0bab1181b49200884097a9b1874ac (diff)
downloadFreeBSD-src-60eb51e7a3e3a1dfacd9d9284b7e21e1fe4de011.zip
FreeBSD-src-60eb51e7a3e3a1dfacd9d9284b7e21e1fe4de011.tar.gz
Add ARP statistics to the kernel and netstat.
New counters now exist for: requests sent replies sent requests received replies received packets received total packets dropped due to no ARP entry entrys timed out Duplicate IPs seen The new statistics are seen in the netstat command when it is given the -s command line switch. MFC after: 2 weeks In collaboration with: bz
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/netstat/inet.c42
-rw-r--r--usr.bin/netstat/main.c4
-rw-r--r--usr.bin/netstat/netstat.h1
3 files changed, 47 insertions, 0 deletions
diff --git a/usr.bin/netstat/inet.c b/usr.bin/netstat/inet.c
index 8be6840..51b71c7 100644
--- a/usr.bin/netstat/inet.c
+++ b/usr.bin/netstat/inet.c
@@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <net/route.h>
+#include <net/if_arp.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
@@ -871,6 +872,47 @@ ip_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
#undef p1a
}
+/*
+ * Dump ARP statistics structure.
+ */
+void
+arp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
+{
+ struct arpstat arpstat, zerostat;
+ size_t len = sizeof(arpstat);
+
+ if (live) {
+ if (zflag)
+ memset(&zerostat, 0, len);
+ if (sysctlbyname("net.link.ether.arp.stats", &arpstat, &len,
+ zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
+ warn("sysctl: net.link.ether.arp.stats");
+ return;
+ }
+ } else
+ kread(off, &arpstat, len);
+
+ printf("%s:\n", name);
+
+#define p(f, m) if (arpstat.f || sflag <= 1) \
+ printf(m, arpstat.f, plural(arpstat.f))
+#define p2(f, m) if (arpstat.f || sflag <= 1) \
+ printf(m, arpstat.f, pluralies(arpstat.f))
+
+ p(txrequests, "\t%lu ARP request%s sent\n");
+ p2(txreplies, "\t%lu ARP repl%s sent\n");
+ p(rxrequests, "\t%lu ARP request%s received\n");
+ p2(rxreplies, "\t%lu ARP repl%s received\n");
+ p(received, "\t%lu ARP packet%s received\n");
+ p(dropped, "\t%lu total packet%s dropped due to no ARP entry\n");
+ p(timeouts, "\t%lu ARP entry%s timed out\n");
+ p(dupips, "\t%lu Duplicate IP%s seen\n");
+#undef p
+#undef p2
+}
+
+
+
static const char *icmpnames[ICMP_MAXTYPE + 1] = {
"echo reply", /* RFC 792 */
"#1",
diff --git a/usr.bin/netstat/main.c b/usr.bin/netstat/main.c
index 8b25ff5..ebbe1d2 100644
--- a/usr.bin/netstat/main.c
+++ b/usr.bin/netstat/main.c
@@ -184,6 +184,8 @@ static struct nlist nl[] = {
{ .n_name = "_sctpstat" },
#define N_MFCTABLESIZE 54
{ .n_name = "_mfctablesize" },
+#define N_ARPSTAT 55
+ { .n_name = "_arpstat" },
{ .n_name = NULL },
};
@@ -232,6 +234,8 @@ struct protox {
carp_stats, NULL, "carp", 1, 0 },
{ -1, N_PFSYNCSTAT, 1, NULL,
pfsync_stats, NULL, "pfsync", 1, 0 },
+ { -1, N_ARPSTAT, 1, NULL,
+ arp_stats, NULL, "arp", 1, 0 },
{ -1, -1, 0, NULL,
NULL, NULL, NULL, 0, 0 }
};
diff --git a/usr.bin/netstat/netstat.h b/usr.bin/netstat/netstat.h
index 483bd6c..f834495 100644
--- a/usr.bin/netstat/netstat.h
+++ b/usr.bin/netstat/netstat.h
@@ -75,6 +75,7 @@ void udp_stats(u_long, const char *, int, int);
void sctp_protopr(u_long, const char *, int, int);
void sctp_stats(u_long, const char *, int, int);
#endif
+void arp_stats(u_long, const char *, int, int);
void ip_stats(u_long, const char *, int, int);
void icmp_stats(u_long, const char *, int, int);
void igmp_stats(u_long, const char *, int, int);
OpenPOWER on IntegriCloud