Date: Mon, 27 Jul 2009 14:48:51 GMT From: Gabor Pali <pgj@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 166624 for review Message-ID: <200907271448.n6REmpYL089923@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=166624 Change 166624 by pgj@petymeg-current on 2009/07/27 14:47:50 Teach netstat(1) to use libnetstat(3) for UDP statistics. Affected files ... .. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/extern.h#11 edit .. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/inet.c#26 edit .. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/main.c#19 edit Differences ... ==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/extern.h#11 (text+ko) ==== @@ -75,7 +75,7 @@ void inetppr(const struct socket_type *); void unixdomainpr(const struct socket_type *); void tcp_stats(void *, const char *); -void udp_stats(u_long, const char *, int, int); +void udp_stats(void *, const char *); #ifdef SCTP void sctp_protopr(u_long, const char *, int, int); void sctp_stats(u_long, const char *, int, int); ==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/inet.c#26 (text+ko) ==== @@ -405,11 +405,11 @@ * Dump UDP statistics structure. */ void -udp_stats(u_long off, const char *name, int af1 __unused, int proto __unused) +udp_stats(void *kvmd, const char *name) { - struct udpstat udpstat, zerostat; - size_t len = sizeof udpstat; - u_long delivered; + const struct udp_stat *s; + struct stat_type *sttp; + int stt_flags, error; #ifdef INET6 if (udp_done != 0) @@ -418,45 +418,54 @@ udp_done = 1; #endif - if (live) { - if (zflag) - memset(&zerostat, 0, len); - if (sysctlbyname("net.inet.udp.stats", &udpstat, &len, - zflag ? &zerostat : NULL, zflag ? len : 0) < 0) { - warn("sysctl: net.inet.udp.stats"); - return; - } - } else - kread(off, &udpstat, len); + if (zflag) { + netstat_zerostat(stat_UDP); + return; + } + + stt_flags = 0; + if (!live) + stt_flags |= NETSTAT_STAT_KVM; + + sttp = netstat_stat_alloc(); + if (sttp == NULL) { + warn("netstat_stat_alloc"); + return; + } + + if (netstat_stat(stat_UDP, sttp, stt_flags, kvmd) < 0) { + error = netstat_stat_geterror(sttp); + if (error == NETSTAT_ERROR_KVM) + warnx("netstat_stat: %s", kvm_geterr(kvmd)); + else + warnx("netstat_stat: %s", netstat_strerror(error)); + goto out; + } + + s = netstat_get_udpstats(sttp); printf("%s:\n", name); -#define p(f, m) if (udpstat.f || sflag <= 1) \ - printf(m, udpstat.f, plural(udpstat.f)) -#define p1a(f, m) if (udpstat.f || sflag <= 1) \ - printf(m, udpstat.f) - p(udps_ipackets, "\t%lu datagram%s received\n"); - p1a(udps_hdrops, "\t%lu with incomplete header\n"); - p1a(udps_badlen, "\t%lu with bad data length field\n"); - p1a(udps_badsum, "\t%lu with bad checksum\n"); - p1a(udps_nosum, "\t%lu with no checksum\n"); - p1a(udps_noport, "\t%lu dropped due to no socket\n"); - p(udps_noportbcast, - "\t%lu broadcast/multicast datagram%s undelivered\n"); - p1a(udps_fullsock, "\t%lu dropped due to full socket buffers\n"); - p1a(udpps_pcbhashmiss, "\t%lu not for hashed pcb\n"); - delivered = udpstat.udps_ipackets - - udpstat.udps_hdrops - - udpstat.udps_badlen - - udpstat.udps_badsum - - udpstat.udps_noport - - udpstat.udps_noportbcast - - udpstat.udps_fullsock; - if (delivered || sflag <= 1) - printf("\t%lu delivered\n", delivered); - p(udps_opackets, "\t%lu datagram%s output\n"); +#define p(f, m) if (netstat_udps_get_##f(s) || sflag <= 1) \ + printf(m, netstat_udps_get_##f(s), plural(netstat_udps_get_##f(s))) +#define p1a(f, m) if (netstat_udps_get_##f(s) || sflag <= 1) \ + printf(m, netstat_udps_get_##f(s)) + p(ipackets, "\t%ju datagram%s received\n"); + p1a(hdrops, "\t%ju with incomplete header\n"); + p1a(badlen, "\t%ju with bad data length field\n"); + p1a(badsum, "\t%ju with bad checksum\n"); + p1a(nosum, "\t%ju with no checksum\n"); + p1a(noport, "\t%ju dropped due to no socket\n"); + p(noportbcast, + "\t%ju broadcast/multicast datagram%s undelivered\n"); + p1a(fullsock, "\t%ju dropped due to full socket buffers\n"); + p1a(pcbhashmiss, "\t%ju not for hashed pcb\n"); + p1a(delivered, "\t%ju delivered\n"); + p(opackets, "\t%ju datagram%s output\n"); /* the next statistic is cumulative in udps_noportbcast */ - p(udps_filtermcast, - "\t%lu time%s multicast source filter matched\n"); + p(filtermcast, + "\t%ju time%s multicast source filter matched\n"); +out: + netstat_stat_free(sttp); #undef p #undef p1a } ==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/main.c#19 (text+ko) ==== @@ -129,21 +129,19 @@ { .n_name = "_espstat" }, #define N_IPCOMPSTAT 25 { .n_name = "_ipcompstat" }, -#define N_UDPSTAT 26 - { .n_name = "_udpstat" }, -#define N_IPSTAT 27 +#define N_IPSTAT 26 { .n_name = "_ipstat" }, -#define N_ICMPSTAT 28 +#define N_ICMPSTAT 27 { .n_name = "_icmpstat" }, -#define N_IGMPSTAT 29 +#define N_IGMPSTAT 28 { .n_name = "_igmpstat" }, -#define N_PIMSTAT 30 +#define N_PIMSTAT 29 { .n_name = "_pimstat" }, -#define N_RIP6STAT 31 +#define N_RIP6STAT 30 { .n_name = "_rip6stat" }, -#define N_SCTPSTAT 32 +#define N_SCTPSTAT 31 { .n_name = "_sctpstat" }, -#define N_MFCTABLESIZE 33 +#define N_MFCTABLESIZE 32 { .n_name = "_mfctablesize" }, { .n_name = NULL }, }; @@ -163,8 +161,8 @@ } protox[] = { { 0, 0, 1, NULL, NULL, NULL, "tcp", 1, IPPROTO_TCP }, - { 0, N_UDPSTAT, 1, NULL, - udp_stats, NULL, "udp", 1, IPPROTO_UDP }, + { 0, 0, 1, NULL, + NULL, NULL, "udp", 1, IPPROTO_UDP }, #ifdef SCTP { -1, N_SCTPSTAT, 1, sctp_protopr, sctp_stats, NULL, "sctp", 1, IPPROTO_SCTP }, @@ -201,8 +199,8 @@ struct protox ip6protox[] = { { 0, 0, 1, NULL, NULL, NULL, "tcp", 1, IPPROTO_TCP }, - { 0, N_UDPSTAT, 1, NULL, - udp_stats, NULL, "udp", 1, IPPROTO_UDP }, + { 0, 0, 1, NULL, + NULL, NULL, "udp", 1, IPPROTO_UDP }, { 0, N_IP6STAT, 1, NULL, ip6_stats, ip6_ifstats, "ip6", 1, IPPROTO_RAW }, { 0, N_ICMP6STAT, 1, NULL, @@ -657,6 +655,9 @@ case IPPROTO_TCP: tcp_stats(kvmd, "tcp"); break; + case IPPROTO_UDP: + udp_stats(kvmd, "udp"); + break; default: pr = tp->pr_stats; if (!pr) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907271448.n6REmpYL089923>