summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorgnn <gnn@FreeBSD.org>2010-01-28 16:48:44 +0000
committergnn <gnn@FreeBSD.org>2010-01-28 16:48:44 +0000
commit889d37774b3df1dc9414bebc108c1960664dfb1c (patch)
tree70f36c4ef8ae6e4b99986dfa9a4a34d375a2bb74 /usr.bin
parent880dc001b5df23d619456a7c32792c8e0fdb483a (diff)
downloadFreeBSD-src-889d37774b3df1dc9414bebc108c1960664dfb1c.zip
FreeBSD-src-889d37774b3df1dc9414bebc108c1960664dfb1c.tar.gz
MFC r196797:
Add ARP statistics to the kernel and netstat.
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