Date: Mon, 27 Jul 2009 17:23:41 GMT From: Gabor Pali <pgj@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 166637 for review Message-ID: <200907271723.n6RHNfnB014393@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=166637 Change 166637 by pgj@petymeg-current on 2009/07/27 17:22:41 Simplify calling of statistics routines. Affected files ... .. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/extern.h#13 edit .. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/inet.c#28 edit .. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/main.c#21 edit Differences ... ==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/extern.h#13 (text+ko) ==== @@ -74,8 +74,8 @@ void inetpr(void *, int, int); void inetppr(const struct socket_type *); void unixdomainpr(const struct socket_type *); -void tcp_stats(void *, const char *); -void udp_stats(void *, const char *); +void tcp_stats(const struct stat_type *); +void udp_stats(const struct stat_type *); #ifdef SCTP void sctp_protopr(u_long, const char *, int, int); void sctp_stats(u_long, const char *, int, int); @@ -84,7 +84,7 @@ void icmp_stats(u_long, const char *, int, int); void igmp_stats(u_long, const char *, int, int); void pim_stats(u_long, const char *, int, int); -void carp_stats(void *, const char *); +void carp_stats(const struct stat_type *); void pfsync_stats(u_long, const char *, int, int); #ifdef IPSEC void ipsec_stats(u_long, const char *, int, int); ==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/inet.c#28 (text+ko) ==== @@ -242,11 +242,9 @@ * Dump TCP statistics structure. */ void -tcp_stats(void *kvmd, const char *name) +tcp_stats(const struct stat_type *sttp) { const struct tcp_stat *s; - struct stat_type *sttp; - int stt_flags, error; #ifdef INET6 if (tcp_done != 0) @@ -254,35 +252,7 @@ else tcp_done = 1; #endif - - if (zflag) { - netstat_zerostat(stat_TCP); - 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_TCP, 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_tcpstats(sttp); - - printf ("%s:\n", name); - #define p(f, m) if (netstat_tcps_get_##f(s) || sflag <= 1) \ printf(m, netstat_tcps_get_##f(s), plural(netstat_tcps_get_##f(s))) #define p1a(f, m) if (netstat_tcps_get_##f(s) || sflag <= 1) \ @@ -391,9 +361,6 @@ p(ecn_ect1, "\t%ju packet%s with ECN ECT(1) bit set\n"); p(ecn_shs, "\t%ju successful ECN handshake%s\n"); p(ecn_rcwnd, "\t%ju time%s ECN reduced the congestion window\n"); - -out: - netstat_stat_free(sttp); #undef p #undef p1a #undef p2 @@ -405,11 +372,9 @@ * Dump UDP statistics structure. */ void -udp_stats(void *kvmd, const char *name) +udp_stats(const struct stat_type *sttp) { const struct udp_stat *s; - struct stat_type *sttp; - int stt_flags, error; #ifdef INET6 if (udp_done != 0) @@ -417,34 +382,7 @@ else udp_done = 1; #endif - - 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 (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) \ @@ -464,8 +402,6 @@ /* the next statistic is cumulative in udps_noportbcast */ p(filtermcast, "\t%ju time%s multicast source filter matched\n"); -out: - netstat_stat_free(sttp); #undef p #undef p1a } @@ -474,45 +410,15 @@ * Dump CARP statistics structure. */ void -carp_stats(void *kvmd, const char *name) +carp_stats(const struct stat_type *sttp) { const struct carp_stat *s; - struct stat_type *sttp; - int stt_flags, error; - - if (zflag) { - netstat_zerostat(stat_CARP); - 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_CARP, 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_carpstats(sttp); - - printf("%s:\n", name); - #define p(f, m) if (netstat_carps_get_##f(s) || sflag <= 1) \ printf(m, netstat_carps_get_##f(s), plural(netstat_carps_get_##f(s))) #define p2(f, m) if (netstat_carps_get_##f(s) || sflag <= 1) \ printf(m, netstat_carps_get_##f(s)) - p(ipackets, "\t%ju packet%s received (IPv4)\n"); p(ipackets6, "\t%ju packet%s received (IPv6)\n"); p(badttl, "\t\t%ju packet%s discarded for wrong TTL\n"); @@ -529,8 +435,6 @@ #if notyet p(ostates, "\t\t%s state update%s sent\n"); #endif -out: - netstat_stat_free(sttp); #undef p #undef p2 } ==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/main.c#21 (text+ko) ==== @@ -150,6 +150,8 @@ u_char pr_wanted; /* 1 if wanted, 0 otherwise */ void (*pr_cblocks)(u_long, const char *, int, int); /* control blocks printing routine */ + void (*pr_nstats)(const struct stat_type *); + enum stat pr_stx; void (*pr_stats)(u_long, const char *, int, int); /* statistics printing routine */ void (*pr_istats)(char *); /* per/if statistics printing routine */ @@ -157,99 +159,99 @@ int pr_usesysctl; /* non-zero if we use sysctl, not kvm */ int pr_protocol; } protox[] = { - { 0, 0, 1, NULL, + { 0, 0, 1, NULL, tcp_stats, stat_TCP, NULL, NULL, "tcp", 1, IPPROTO_TCP }, - { 0, 0, 1, NULL, + { 0, 0, 1, NULL, udp_stats, stat_UDP, NULL, NULL, "udp", 1, IPPROTO_UDP }, #ifdef SCTP - { -1, N_SCTPSTAT, 1, sctp_protopr, + { -1, N_SCTPSTAT, 1, sctp_protopr, NULL, stat_MAX, sctp_stats, NULL, "sctp", 1, IPPROTO_SCTP }, #endif - { 0, -1, 1, NULL, + { 0, -1, 1, NULL, NULL, stat_MAX, NULL, NULL, "divert", 1, IPPROTO_DIVERT }, - { 0, N_IPSTAT, 1, NULL, + { 0, N_IPSTAT, 1, NULL, NULL, stat_MAX, ip_stats, NULL, "ip", 1, IPPROTO_RAW }, - { 0, N_ICMPSTAT, 1, NULL, + { 0, N_ICMPSTAT, 1, NULL, NULL, stat_MAX, icmp_stats, NULL, "icmp", 1, IPPROTO_ICMP }, - { 0, N_IGMPSTAT, 1, NULL, + { 0, N_IGMPSTAT, 1, NULL, NULL, stat_MAX, igmp_stats, NULL, "igmp", 1, IPPROTO_IGMP }, #ifdef IPSEC - { -1, N_IPSECSTAT, 1, NULL, /* keep as compat */ + { -1, N_IPSECSTAT, 1, NULL, NULL, stat_MAX, /* keep as compat */ ipsec_stats, NULL, "ipsec", 0, 0}, - { -1, N_AHSTAT, 1, NULL, + { -1, N_AHSTAT, 1, NULL, NULL, stat_MAX, ah_stats, NULL, "ah", 0, 0}, - { -1, N_ESPSTAT, 1, NULL, + { -1, N_ESPSTAT, 1, NULL, NULL, stat_MAX, esp_stats, NULL, "esp", 0, 0}, - { -1, N_IPCOMPSTAT, 1, NULL, + { -1, N_IPCOMPSTAT, 1, NULL, NULL, stat_MAX, ipcomp_stats, NULL, "ipcomp", 0, 0}, #endif - { 0, N_PIMSTAT, 1, NULL, + { 0, N_PIMSTAT, 1, NULL, NULL, stat_MAX, pim_stats, NULL, "pim", 1, IPPROTO_PIM }, - { -1, 0, 1, NULL, + { -1, 0, 1, NULL, carp_stats, stat_CARP, NULL, NULL, "carp", 1, 0 }, - { -1, N_PFSYNCSTAT, 1, NULL, + { -1, N_PFSYNCSTAT, 1, NULL, NULL, stat_MAX, pfsync_stats, NULL, "pfsync", 1, 0 }, - { -1, -1, 0, NULL, + { -1, -1, 0, NULL, NULL, stat_MAX, NULL, NULL, NULL, 0, 0 } }; #ifdef INET6 struct protox ip6protox[] = { - { 0, 0, 1, NULL, + { 0, 0, 1, NULL, tcp_stats, stat_TCP, NULL, NULL, "tcp", 1, IPPROTO_TCP }, - { 0, 0, 1, NULL, + { 0, 0, 1, NULL, udp_stats, stat_UDP, NULL, NULL, "udp", 1, IPPROTO_UDP }, - { 0, N_IP6STAT, 1, NULL, + { 0, N_IP6STAT, 1, NULL, NULL, stat_MAX, ip6_stats, ip6_ifstats, "ip6", 1, IPPROTO_RAW }, - { 0, N_ICMP6STAT, 1, NULL, + { 0, N_ICMP6STAT, 1, NULL, NULL, stat_MAX, icmp6_stats, icmp6_ifstats, "icmp6", 1, IPPROTO_ICMPV6 }, #ifdef IPSEC - { -1, N_IPSEC6STAT, 1, NULL, + { -1, N_IPSEC6STAT, 1, NULL, NULL, stat_MAX, ipsec_stats, NULL, "ipsec6", 0, 0 }, #endif #ifdef notyet - { -1, N_PIM6STAT, 1, NULL, + { -1, N_PIM6STAT, 1, NULL, NULL, stat_MAX, pim6_stats, NULL, "pim6", 1, 0 }, #endif - { -1, N_RIP6STAT, 1, NULL, + { -1, N_RIP6STAT, 1, NULL, NULL, stat_MAX, rip6_stats, NULL, "rip6", 1, 0 }, - { -1, -1, 0, NULL, + { -1, -1, 0, NULL, NULL, stat_MAX, NULL, NULL, NULL, 0, 0 } }; #endif /*INET6*/ #ifdef IPSEC struct protox pfkeyprotox[] = { - { -1, N_PFKEYSTAT, 1, NULL, + { -1, N_PFKEYSTAT, 1, NULL, NULL, stat_MAX, pfkey_stats, NULL, "pfkey", 0, 0 }, - { -1, -1, 0, NULL, + { -1, -1, 0, NULL, NULL, stat_MAX, NULL, NULL, NULL, 0, 0 } }; #endif struct protox atalkprotox[] = { - { N_DDPCB, N_DDPSTAT, 1, atalkprotopr, + { N_DDPCB, N_DDPSTAT, 1, atalkprotopr, NULL, stat_MAX, ddp_stats, NULL, "ddp", 0, 0 }, - { -1, -1, 0, NULL, + { -1, -1, 0, NULL, NULL, stat_MAX, NULL, NULL, NULL, 0, 0 } }; #ifdef NETGRAPH struct protox netgraphprotox[] = { - { N_NGSOCKS, -1, 1, netgraphprotopr, + { N_NGSOCKS, -1, 1, netgraphprotopr, NULL, stat_MAX, NULL, NULL, "ctrl", 0, 0 }, - { N_NGSOCKS, -1, 1, netgraphprotopr, + { N_NGSOCKS, -1, 1, netgraphprotopr, NULL, stat_MAX, NULL, NULL, "data", 0, 0 }, - { -1, -1, 0, NULL, + { -1, -1, 0, NULL, NULL, stat_MAX, NULL, NULL, NULL, 0, 0 } }; #endif #ifdef IPX struct protox ipxprotox[] = { - { N_IPX, N_IPXSTAT, 1, ipxprotopr, + { N_IPX, N_IPXSTAT, 1, ipxprotopr, NULL, stat_MAX, ipx_stats, NULL, "ipx", 0, 0 }, - { N_IPX, N_SPXSTAT, 1, ipxprotopr, + { N_IPX, N_SPXSTAT, 1, ipxprotopr, NULL, stat_MAX, spx_stats, NULL, "spx", 0, 0 }, - { -1, -1, 0, NULL, + { -1, -1, 0, NULL, NULL, stat_MAX, NULL, NULL, 0, 0, 0 } }; #endif @@ -268,6 +270,7 @@ atalkprotox, NULL }; static void connpr(const struct socket_type *); +static void statpr(void (*)(const struct stat_type *), enum stat, const char *); static void printproto(struct protox *, const char *); static void usage(void); static struct protox *name2protox(const char *); @@ -649,12 +652,8 @@ return; } else { /* XXX: temp. hack */ - if (strcmp(tp->pr_name, "udp") == 0) - tcp_stats(kvmd, tp->pr_name); - else if (strcmp(tp->pr_name, "tcp") == 0) - udp_stats(kvmd, tp->pr_name); - else if (strcmp(tp->pr_name, "carp") == 0) - carp_stats(kvmd, tp->pr_name); + if (tp->pr_nstats != NULL) + statpr(tp->pr_nstats, tp->pr_stx, tp->pr_name); else { pr = tp->pr_stats; if (!pr) { @@ -719,6 +718,43 @@ } } +void +statpr(void (*stats_routine)(const struct stat_type *), enum stat sts, + const char *name) +{ + struct stat_type *sttp; + int stt_flags, error; + + if (zflag) { + netstat_zerostat(sts); + 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(sts, 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; + } + + printf("%s:\n", name); + stats_routine(sttp); +out: + netstat_stat_free(sttp); +} + /* * Read kernel memory, return 0 on success. */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907271723.n6RHNfnB014393>
