diff options
author | Reyk Floeter <reyk@cvs.openbsd.org> | 2007-12-13 20:00:54 +0000 |
---|---|---|
committer | Reyk Floeter <reyk@cvs.openbsd.org> | 2007-12-13 20:00:54 +0000 |
commit | 90654a32a12cd0e30f6adb846ff6e9e5e6682a28 (patch) | |
tree | e8f59de8c6fe04c760d9e46528cb22f1da0c1cfc /usr.bin/netstat | |
parent | b03a990aaf0a66e97ca7dd68b5f8b065d05e4b95 (diff) |
implement sysctls to report IP, TCP, UDP, and ICMP statistics and
change netstat to use them instead of accessing kvm for it. more
protocols will be added later.
discussed with deraadt@ claudio@ gilles@
ok deraadt@
Diffstat (limited to 'usr.bin/netstat')
-rw-r--r-- | usr.bin/netstat/inet.c | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/usr.bin/netstat/inet.c b/usr.bin/netstat/inet.c index 2ef4ac59c02..f3db9d55909 100644 --- a/usr.bin/netstat/inet.c +++ b/usr.bin/netstat/inet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: inet.c,v 1.101 2007/09/03 06:10:54 joel Exp $ */ +/* $OpenBSD: inet.c,v 1.102 2007/12/13 20:00:53 reyk Exp $ */ /* $NetBSD: inet.c,v 1.14 1995/10/03 21:42:37 thorpej Exp $ */ /* @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "from: @(#)inet.c 8.4 (Berkeley) 4/20/94"; #else -static const char *rcsid = "$OpenBSD: inet.c,v 1.101 2007/09/03 06:10:54 joel Exp $"; +static const char *rcsid = "$OpenBSD: inet.c,v 1.102 2007/12/13 20:00:53 reyk Exp $"; #endif #endif /* not lint */ @@ -44,6 +44,7 @@ static const char *rcsid = "$OpenBSD: inet.c,v 1.101 2007/09/03 06:10:54 joel Ex #include <sys/socketvar.h> #include <sys/mbuf.h> #include <sys/protosw.h> +#include <sys/sysctl.h> #include <net/route.h> #include <netinet/in.h> @@ -245,12 +246,20 @@ void tcp_stats(u_long off, char *name) { struct tcpstat tcpstat; + size_t len; + int mib[] = { CTL_NET, AF_INET, IPPROTO_TCP, TCPCTL_STATS }; if (off == 0) return; - printf("%s:\n", name); - kread(off, &tcpstat, sizeof (tcpstat)); + len = sizeof(tcpstat); + if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), + &tcpstat, &len, NULL, 0) == -1) { + warn(name); + return; + } + + printf("%s:\n", name); #define p(f, m) if (tcpstat.f || sflag <= 1) \ printf(m, tcpstat.f, plural(tcpstat.f)) #define p1(f, m) if (tcpstat.f || sflag <= 1) \ @@ -371,10 +380,19 @@ udp_stats(u_long off, char *name) { struct udpstat udpstat; u_long delivered; + size_t len; + int mib[] = { CTL_NET, AF_INET, IPPROTO_UDP, UDPCTL_STATS }; if (off == 0) return; - kread(off, &udpstat, sizeof (udpstat)); + + len = sizeof(udpstat); + if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), + &udpstat, &len, NULL, 0) == -1) { + warn(name); + return; + } + printf("%s:\n", name); #define p(f, m) if (udpstat.f || sflag <= 1) \ printf(m, udpstat.f, plural(udpstat.f)) @@ -411,12 +429,20 @@ void ip_stats(u_long off, char *name) { struct ipstat ipstat; + size_t len; + int mib[] = { CTL_NET, AF_INET, IPPROTO_IP, IPCTL_STATS }; if (off == 0) return; - kread(off, &ipstat, sizeof (ipstat)); - printf("%s:\n", name); + len = sizeof(ipstat); + if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), + &ipstat, &len, NULL, 0) == -1) { + warn(name); + return; + } + + printf("%s:\n", name); #define p(f, m) if (ipstat.f || sflag <= 1) \ printf(m, ipstat.f, plural(ipstat.f)) #define p1(f, m) if (ipstat.f || sflag <= 1) \ @@ -510,12 +536,20 @@ icmp_stats(u_long off, char *name) { struct icmpstat icmpstat; int i, first; + int mib[] = { CTL_NET, AF_INET, IPPROTO_ICMP, ICMPCTL_STATS }; + size_t len; if (off == 0) return; - kread(off, &icmpstat, sizeof (icmpstat)); - printf("%s:\n", name); + len = sizeof(icmpstat); + if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), + &icmpstat, &len, NULL, 0) == -1) { + warn(name); + return; + } + + printf("%s:\n", name); #define p(f, m) if (icmpstat.f || sflag <= 1) \ printf(m, icmpstat.f, plural(icmpstat.f)) |