socsvn commit: r269256 - soc2014/zkorchev/freebsd_head/usr.bin/netstat
zkorchev at FreeBSD.org
zkorchev at FreeBSD.org
Sun Jun 8 15:52:10 UTC 2014
Author: zkorchev
Date: Sun Jun 8 15:52:07 2014
New Revision: 269256
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=269256
Log:
partial netstat integration with SOL
Modified:
soc2014/zkorchev/freebsd_head/usr.bin/netstat/Makefile
soc2014/zkorchev/freebsd_head/usr.bin/netstat/bpf.c
soc2014/zkorchev/freebsd_head/usr.bin/netstat/flowtable.c
soc2014/zkorchev/freebsd_head/usr.bin/netstat/if.c
soc2014/zkorchev/freebsd_head/usr.bin/netstat/main.c
soc2014/zkorchev/freebsd_head/usr.bin/netstat/mbuf.c
soc2014/zkorchev/freebsd_head/usr.bin/netstat/netisr.c
soc2014/zkorchev/freebsd_head/usr.bin/netstat/netstat.h
soc2014/zkorchev/freebsd_head/usr.bin/netstat/route.c
Modified: soc2014/zkorchev/freebsd_head/usr.bin/netstat/Makefile
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/netstat/Makefile Sun Jun 8 15:51:28 2014 (r269255)
+++ soc2014/zkorchev/freebsd_head/usr.bin/netstat/Makefile Sun Jun 8 15:52:07 2014 (r269256)
@@ -31,10 +31,12 @@
CFLAGS+=-DPF
.endif
+CFLAGS+=-DSOL_ON -I/usr/local/include
+
BINGRP= kmem
BINMODE=2555
DPADD= ${LIBKVM} ${LIBMEMSTAT} ${LIBUTIL}
-LDADD= -lkvm -lmemstat -lutil
+LDADD= -lkvm -lmemstat -lutil -lsol
.if ${MK_NETGRAPH_SUPPORT} != "no"
SRCS+= netgraph.c
Modified: soc2014/zkorchev/freebsd_head/usr.bin/netstat/bpf.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/netstat/bpf.c Sun Jun 8 15:51:28 2014 (r269255)
+++ soc2014/zkorchev/freebsd_head/usr.bin/netstat/bpf.c Sun Jun 8 15:52:07 2014 (r269256)
@@ -48,6 +48,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <sol.h>
#include "netstat.h"
@@ -120,9 +121,15 @@
free(bd);
return;
}
- (void) printf("%5s %6s %7s %9s %9s %9s %5s %5s %s\n",
- "Pid", "Netif", "Flags", "Recv", "Drop", "Match", "Sblen",
- "Hblen", "Command");
+
+#if defined(SOL_ON)
+ if (Oflag)
+ sol_map_start(&sol_stream);
+ else
+#endif
+ (void) printf("%5s %6s %7s %9s %9s %9s %5s %5s %s\n",
+ "Pid", "Netif", "Flags", "Recv", "Drop", "Match", "Sblen",
+ "Hblen", "Command");
for (d = &bd[0]; d < &bd[size / sizeof(*d)]; d++) {
if (d->bd_structsize != sizeof(*d)) {
warnx("bpf_stats_extended: version mismatch");
@@ -132,6 +139,37 @@
continue;
bpf_flags(d, flagbuf);
pname = bpf_pidname(d->bd_pid);
+#if defined(SOL_ON)
+ if (Oflag) {
+ sol_map_key(&sol_stream, "pid", 3);
+ sol_integer(&sol_stream, d->bd_pid);
+
+ sol_map_key(&sol_stream, "if", 2);
+ sol_string(&sol_stream, d->bd_ifname, strlen(d->bd_ifname));
+
+ sol_map_key(&sol_stream, "flags", 5);
+ sol_string(&sol_stream, flagbuf, strlen(flagbuf));
+
+ sol_map_key(&sol_stream, "recv", 4);
+ sol_integer(&sol_stream, d->bd_rcount);
+
+ sol_map_key(&sol_stream, "drop", 4);
+ sol_integer(&sol_stream, d->bd_dcount);
+
+ sol_map_key(&sol_stream, "match", 5);
+ sol_integer(&sol_stream, d->bd_fcount);
+
+ sol_map_key(&sol_stream, "sblen", 5);
+ sol_integer(&sol_stream, d->bd_slen);
+
+ sol_map_key(&sol_stream, "hblen", 5);
+ sol_integer(&sol_stream, d->bd_hlen);
+
+ sol_map_key(&sol_stream, "cmd", 3);
+ sol_string(&sol_stream, pname, strlen(pname));
+ }
+ else
+#endif
(void) printf("%5d %6s %7s %9ju %9ju %9ju %5d %5d %s\n",
d->bd_pid, d->bd_ifname, flagbuf,
d->bd_rcount, d->bd_dcount, d->bd_fcount,
@@ -139,4 +177,9 @@
free(pname);
}
free(bd);
+
+#if defined(SOL_ON)
+ if (Oflag)
+ sol_map_end(&sol_stream);
+#endif
}
Modified: soc2014/zkorchev/freebsd_head/usr.bin/netstat/flowtable.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/netstat/flowtable.c Sun Jun 8 15:51:28 2014 (r269255)
+++ soc2014/zkorchev/freebsd_head/usr.bin/netstat/flowtable.c Sun Jun 8 15:52:07 2014 (r269256)
@@ -34,6 +34,7 @@
#include <err.h>
#include <stdint.h>
#include <stdio.h>
+#include <sol.h>
#include "netstat.h"
/*
@@ -44,23 +45,50 @@
print_stats(struct flowtable_stat *stat)
{
+#if defined(SOL_ON)
+ if (Oflag)
+ {
+ sol_map_start(&sol_stream);
+
+#define p(f, m) if (stat->f || sflag <= 1) do { \
+ SOL_MAP_KEYL(&sol_stream, m); \
+ sol_integer(&sol_stream, stat->f); \
+} while (0)
+
+ p(ft_lookups, "lookups");
+ p(ft_hits, "hits");
+ p(ft_misses, "misses");
+ p(ft_inserts, "inserts");
+ p(ft_collisions, "collisions");
+ p(ft_free_checks, "free checks");
+ p(ft_frees, "frees");
+ p(ft_fail_lle_invalid, "lookups with not resolved Layer 2 address");
+
+#undef p
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ {
#define p(f, m) if (stat->f || sflag <= 1) \
printf(m, (uintmax_t)stat->f, plural(stat->f))
#define p2(f, m) if (stat->f || sflag <= 1) \
printf(m, (uintmax_t)stat->f, plurales(stat->f))
- p(ft_lookups, "\t%ju lookup%s\n");
- p(ft_hits, "\t%ju hit%s\n");
- p2(ft_misses, "\t%ju miss%s\n");
- p(ft_inserts, "\t%ju insert%s\n");
- p(ft_collisions, "\t%ju collision%s\n");
- p(ft_free_checks, "\t%ju free check%s\n");
- p(ft_frees, "\t%ju free%s\n");
- p(ft_fail_lle_invalid,
- "\t%ju lookup%s with not resolved Layer 2 address\n");
+ p(ft_lookups, "\t%ju lookup%s\n");
+ p(ft_hits, "\t%ju hit%s\n");
+ p2(ft_misses, "\t%ju miss%s\n");
+ p(ft_inserts, "\t%ju insert%s\n");
+ p(ft_collisions, "\t%ju collision%s\n");
+ p(ft_free_checks, "\t%ju free check%s\n");
+ p(ft_frees, "\t%ju free%s\n");
+ p(ft_fail_lle_invalid,
+ "\t%ju lookup%s with not resolved Layer 2 address\n");
#undef p2
#undef p
+ }
}
void
@@ -73,12 +101,22 @@
return;
if (sysctlbyname("net.flowtable.ip4.stat", &stat, &len, NULL, 0) == 0) {
- printf("flowtable for IPv4:\n");
+#if defined(SOL_ON)
+ if (Oflag)
+ SOL_MAP_KEYL(&sol_stream, "IPv4");
+ else
+#endif
+ printf("flowtable for IPv4:\n");
print_stats(&stat);
}
if (sysctlbyname("net.flowtable.ip6.stat", &stat, &len, NULL, 0) == 0) {
- printf("flowtable for IPv6:\n");
+#if defined(SOL_ON)
+ if (Oflag)
+ SOL_MAP_KEYL(&sol_stream, "IPv6");
+ else
+#endif
+ printf("flowtable for IPv6:\n");
print_stats(&stat);
}
}
Modified: soc2014/zkorchev/freebsd_head/usr.bin/netstat/if.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/netstat/if.c Sun Jun 8 15:51:28 2014 (r269255)
+++ soc2014/zkorchev/freebsd_head/usr.bin/netstat/if.c Sun Jun 8 15:52:07 2014 (r269256)
@@ -72,6 +72,7 @@
#include <string.h>
#include <sysexits.h>
#include <unistd.h>
+#include <sol.h>
#include "netstat.h"
@@ -235,7 +236,9 @@
if (aflag && getifmaddrs(&ifmap) != 0)
err(EX_OSERR, "getifmaddrs");
- if (!pfunc) {
+ // TODO finish sol output
+
+ if (!Oflag && !pfunc) {
if (Wflag)
printf("%-7.7s", "Name");
else
Modified: soc2014/zkorchev/freebsd_head/usr.bin/netstat/main.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/netstat/main.c Sun Jun 8 15:51:28 2014 (r269255)
+++ soc2014/zkorchev/freebsd_head/usr.bin/netstat/main.c Sun Jun 8 15:52:07 2014 (r269256)
@@ -67,6 +67,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <sol.h>
#include "netstat.h"
static struct nlist nl[] = {
@@ -292,6 +293,7 @@
int noutputs = 0; /* how much outputs before we exit */
int numeric_addr; /* show addresses numerically */
int numeric_port; /* show ports numerically */
+int Oflag; /* use JSON as output format */
static int pflag; /* show given protocol */
int Qflag; /* show netisr information */
int rflag; /* show routing tables (or routing stats) */
@@ -302,6 +304,10 @@
int xflag; /* extra information, includes all socket buffer info */
int zflag; /* zero stats */
+#if defined(SOL_ON)
+struct sol_stream sol_stream;
+#endif
+
int interval; /* repeat interval for i/f stats */
char *interface; /* desired i/f for stats, or NULL for all i/fs */
@@ -320,7 +326,7 @@
af = AF_UNSPEC;
- while ((ch = getopt(argc, argv, "46AaBbdF:f:ghI:iLlM:mN:np:Qq:RrSTsuWw:xz"))
+ while ((ch = getopt(argc, argv, "46AaBbdF:f:ghI:iLlM:mN:nOp:Qq:RrSTsuWw:xz"))
!= -1)
switch(ch) {
case '4':
@@ -415,6 +421,13 @@
case 'n':
numeric_addr = numeric_port = 1;
break;
+ case 'O':
+#if defined(SOL_ON)
+ Oflag = 1;
+#else
+ errx(1, "-O support is not compiled in");
+#endif
+ break;
case 'p':
if ((tp = name2protox(optarg)) == NULL) {
errx(1,
@@ -488,6 +501,10 @@
}
#endif
+#if defined(SOL_ON)
+ if (Oflag) sol_init(&sol_stream, SOL_JSON);
+#endif
+
/*
* Discard setgid privileges if not the running kernel so that bad
* guys can't print interesting stuff from kernel memory.
@@ -503,6 +520,9 @@
if (!live)
usage();
bpf_stats(interface);
+#if defined(SOL_ON)
+ if (Oflag) sol_term(&sol_stream);
+#endif
exit(0);
}
if (mflag) {
@@ -511,6 +531,9 @@
mbpr(kvmd, nl[N_SFSTAT].n_value);
} else
mbpr(NULL, 0);
+#if defined(SOL_ON)
+ if (Oflag) sol_term(&sol_stream);
+#endif
exit(0);
}
if (Qflag) {
@@ -519,6 +542,9 @@
netisr_stats(kvmd);
} else
netisr_stats(NULL);
+#if defined(SOL_ON)
+ if (Oflag) sol_term(&sol_stream);
+#endif
exit(0);
}
#if 0
@@ -537,14 +563,26 @@
#endif
if (iflag && !sflag) {
intpr(interval, NULL, af);
+#if defined(SOL_ON)
+ if (Oflag) sol_term(&sol_stream);
+#endif
exit(0);
}
if (rflag) {
+#if defined(SOL_ON)
+ if (Oflag) sol_map_start(&sol_stream);
+#endif
if (sflag) {
rt_stats();
flowtable_stats();
} else
routepr(fib, af);
+#if defined(SOL_ON)
+ if (Oflag) {
+ sol_map_end(&sol_stream);
+ sol_term(&sol_stream);
+ }
+#endif
exit(0);
}
@@ -564,6 +602,9 @@
mroute6pr();
#endif
}
+#if defined(SOL_ON)
+ if (Oflag) sol_term(&sol_stream);
+#endif
exit(0);
}
@@ -572,6 +613,9 @@
if (tp) {
printproto(tp, tp->pr_name);
+#if defined(SOL_ON)
+ if (Oflag) sol_term(&sol_stream);
+#endif
exit(0);
}
if (af == AF_INET || af == AF_UNSPEC)
@@ -596,6 +640,9 @@
unixpr(nl[N_UNP_COUNT].n_value, nl[N_UNP_GENCNT].n_value,
nl[N_UNP_DHEAD].n_value, nl[N_UNP_SHEAD].n_value,
nl[N_UNP_SPHEAD].n_value);
+#if defined(SOL_ON)
+ if (Oflag) sol_term(&sol_stream);
+#endif
exit(0);
}
@@ -825,20 +872,20 @@
{
(void)fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
"usage: netstat [-46AaLnRSTWx] [-f protocol_family | -p protocol]\n"
-" [-M core] [-N system]",
+" [-M core] [-N system] [-O]",
" netstat -i | -I interface [-46abdhnW] [-f address_family]\n"
-" [-M core] [-N system]",
-" netstat -w wait [-I interface] [-46d] [-M core] [-N system] [-q howmany]",
+" [-M core] [-N system] [-O]",
+" netstat -w wait [-I interface] [-46d] [-M core] [-N system] [-q howmany] [-O]",
" netstat -s [-s] [-46z] [-f protocol_family | -p protocol]\n"
-" [-M core] [-N system]",
+" [-M core] [-N system] [-O]",
" netstat -i | -I interface [-46s] [-f protocol_family | -p protocol]\n"
-" [-M core] [-N system]",
-" netstat -m [-M core] [-N system]",
-" netstat -B [-I interface]",
-" netstat -r [-46AanW] [-f address_family] [-M core] [-N system]",
-" netstat -rs [-s] [-M core] [-N system]",
-" netstat -g [-46W] [-f address_family] [-M core] [-N system]",
-" netstat -gs [-46s] [-f address_family] [-M core] [-N system]",
-" netstat -Q");
+" [-M core] [-N system] [-O]",
+" netstat -m [-M core] [-N system] [-O]",
+" netstat -B [-I interface] [-O]",
+" netstat -r [-46AanW] [-f address_family] [-M core] [-N system] [-O]",
+" netstat -rs [-s] [-M core] [-N system] [-O]",
+" netstat -g [-46W] [-f address_family] [-M core] [-N system] [-O]",
+" netstat -gs [-46s] [-f address_family] [-M core] [-N system] [-O]",
+" netstat -Q [-O]");
exit(1);
}
Modified: soc2014/zkorchev/freebsd_head/usr.bin/netstat/mbuf.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/netstat/mbuf.c Sun Jun 8 15:51:28 2014 (r269255)
+++ soc2014/zkorchev/freebsd_head/usr.bin/netstat/mbuf.c Sun Jun 8 15:52:07 2014 (r269256)
@@ -57,9 +57,17 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sol.h>
#include "netstat.h"
/*
+ * Upward approximation of the maximum number of characters needed to
+ * represent a value of integral type t as a string, excluding the
+ * NUL terminator.
+ */
+#define STRBUF_SIZEOF(t) (CHAR_BIT * sizeof(t) / 3 + 1)
+
+/*
* Print mbuf statistics.
*/
void
@@ -92,6 +100,10 @@
return;
}
+#if defined(SOL_ON)
+ if (Oflag) sol_map_start(&sol_stream);
+#endif
+
/*
* Use memstat_*_all() because some mbuf-related memory is in uma(9),
* and some malloc(9).
@@ -199,33 +211,137 @@
jumbo16_sleeps = memstat_get_sleeps(mtp);
jumbo16_size = memstat_get_size(mtp);
- printf("%ju/%ju/%ju mbufs in use (current/cache/total)\n",
- mbuf_count + packet_count, mbuf_free + packet_free,
- mbuf_count + packet_count + mbuf_free + packet_free);
-
- printf("%ju/%ju/%ju/%ju mbuf clusters in use "
- "(current/cache/total/max)\n",
- cluster_count - packet_free, cluster_free + packet_free,
- cluster_count + cluster_free, cluster_limit);
-
- printf("%ju/%ju mbuf+clusters out of packet secondary zone in use "
- "(current/cache)\n",
- packet_count, packet_free);
-
- printf("%ju/%ju/%ju/%ju %juk (page size) jumbo clusters in use "
- "(current/cache/total/max)\n",
- jumbop_count, jumbop_free, jumbop_count + jumbop_free,
- jumbop_limit, jumbop_size / 1024);
-
- printf("%ju/%ju/%ju/%ju 9k jumbo clusters in use "
- "(current/cache/total/max)\n",
- jumbo9_count, jumbo9_free, jumbo9_count + jumbo9_free,
- jumbo9_limit);
-
- printf("%ju/%ju/%ju/%ju 16k jumbo clusters in use "
- "(current/cache/total/max)\n",
- jumbo16_count, jumbo16_free, jumbo16_count + jumbo16_free,
- jumbo16_limit);
+#if defined(SOL_ON)
+ if (Oflag) {
+ sol_map_key(&sol_stream, "mbufs", 5);
+ sol_map_start(&sol_stream);
+
+ sol_map_key(&sol_stream, "current", 7);
+ sol_integer(&sol_stream, mbuf_count + packet_count);
+ sol_map_key(&sol_stream, "cache", 5);
+ sol_integer(&sol_stream, mbuf_free + packet_free);
+ sol_map_key(&sol_stream, "total", 5);
+ sol_integer(&sol_stream, mbuf_count + packet_count + mbuf_free + packet_free);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ printf("%ju/%ju/%ju mbufs in use (current/cache/total)\n",
+ mbuf_count + packet_count, mbuf_free + packet_free,
+ mbuf_count + packet_count + mbuf_free + packet_free);
+
+#if defined(SOL_ON)
+ if (Oflag) {
+ sol_map_key(&sol_stream, "mbuf clusters", sizeof("mbuf clusters") - 1);
+ sol_map_start(&sol_stream);
+
+ sol_map_key(&sol_stream, "current", 7);
+ sol_integer(&sol_stream, cluster_count - packet_free);
+ sol_map_key(&sol_stream, "cache", 5);
+ sol_integer(&sol_stream, cluster_free + packet_free);
+ sol_map_key(&sol_stream, "total", 5);
+ sol_integer(&sol_stream, cluster_count + cluster_free);
+ sol_map_key(&sol_stream, "max", 3);
+ sol_integer(&sol_stream, cluster_limit);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ printf("%ju/%ju/%ju/%ju mbuf clusters in use "
+ "(current/cache/total/max)\n",
+ cluster_count - packet_free, cluster_free + packet_free,
+ cluster_count + cluster_free, cluster_limit);
+
+#if defined(SOL_ON)
+ if (Oflag) {
+ SOL_MAP_KEYL(&sol_stream, "mbuf+clusters");
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "current");
+ sol_integer(&sol_stream, packet_count);
+ SOL_MAP_KEYL(&sol_stream, "cache");
+ sol_integer(&sol_stream, packet_free);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ printf("%ju/%ju mbuf+clusters out of packet secondary zone in use "
+ "(current/cache)\n",
+ packet_count, packet_free);
+
+#if defined(SOL_ON)
+ if (Oflag) {
+ SOL_MAP_KEYL(&sol_stream, "jumbo clusters");
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "current");
+ sol_integer(&sol_stream, jumbop_count);
+ SOL_MAP_KEYL(&sol_stream, "cache");
+ sol_integer(&sol_stream, jumbop_free);
+ SOL_MAP_KEYL(&sol_stream, "total");
+ sol_integer(&sol_stream, jumbop_count + jumbop_free);
+ SOL_MAP_KEYL(&sol_stream, "max");
+ sol_integer(&sol_stream, jumbop_limit);
+ SOL_MAP_KEYL(&sol_stream, "page size (k)");
+ sol_integer(&sol_stream, jumbop_size / 1024);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ printf("%ju/%ju/%ju/%ju %juk (page size) jumbo clusters in use "
+ "(current/cache/total/max)\n",
+ jumbop_count, jumbop_free, jumbop_count + jumbop_free,
+ jumbop_limit, jumbop_size / 1024);
+
+#if defined(SOL_ON)
+ if (Oflag) {
+ SOL_MAP_KEYL(&sol_stream, "jumbo clusters 9k");
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "current");
+ sol_integer(&sol_stream, jumbo9_count);
+ SOL_MAP_KEYL(&sol_stream, "cache");
+ sol_integer(&sol_stream, jumbo9_free);
+ SOL_MAP_KEYL(&sol_stream, "total");
+ sol_integer(&sol_stream, jumbo9_count + jumbo9_free);
+ SOL_MAP_KEYL(&sol_stream, "max");
+ sol_integer(&sol_stream, jumbo9_limit);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ printf("%ju/%ju/%ju/%ju 9k jumbo clusters in use "
+ "(current/cache/total/max)\n",
+ jumbo9_count, jumbo9_free, jumbo9_count + jumbo9_free,
+ jumbo9_limit);
+
+#if defined(SOL_ON)
+ if (Oflag) {
+ SOL_MAP_KEYL(&sol_stream, "jumbo clusters 16k");
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "current");
+ sol_integer(&sol_stream, jumbo16_count);
+ SOL_MAP_KEYL(&sol_stream, "cache");
+ sol_integer(&sol_stream, jumbo16_free);
+ SOL_MAP_KEYL(&sol_stream, "total");
+ sol_integer(&sol_stream, jumbo16_count + jumbo16_free);
+ SOL_MAP_KEYL(&sol_stream, "max");
+ sol_integer(&sol_stream, jumbo16_limit);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ printf("%ju/%ju/%ju/%ju 16k jumbo clusters in use "
+ "(current/cache/total/max)\n",
+ jumbo16_count, jumbo16_free, jumbo16_count + jumbo16_free,
+ jumbo16_limit);
#if 0
printf("%ju mbuf tags in use\n", tag_count);
@@ -276,23 +392,106 @@
*/
bytes_total = bytes_inuse + bytes_incache;
- printf("%juK/%juK/%juK bytes allocated to network "
- "(current/cache/total)\n", bytes_inuse / 1024,
- bytes_incache / 1024, bytes_total / 1024);
-
- printf("%ju/%ju/%ju requests for mbufs denied (mbufs/clusters/"
- "mbuf+clusters)\n", mbuf_failures, cluster_failures,
- packet_failures);
- printf("%ju/%ju/%ju requests for mbufs delayed (mbufs/clusters/"
- "mbuf+clusters)\n", mbuf_sleeps, cluster_sleeps,
- packet_sleeps);
-
- printf("%ju/%ju/%ju requests for jumbo clusters delayed "
- "(%juk/9k/16k)\n", jumbop_sleeps, jumbo9_sleeps,
- jumbo16_sleeps, jumbop_size / 1024);
- printf("%ju/%ju/%ju requests for jumbo clusters denied "
- "(%juk/9k/16k)\n", jumbop_failures, jumbo9_failures,
- jumbo16_failures, jumbop_size / 1024);
+#if defined(SOL_ON)
+ if (Oflag) {
+ SOL_MAP_KEYL(&sol_stream, "network");
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "current (K)");
+ sol_integer(&sol_stream, bytes_inuse / 1024);
+ SOL_MAP_KEYL(&sol_stream, "cache (K)");
+ sol_integer(&sol_stream, bytes_incache / 1024);
+ SOL_MAP_KEYL(&sol_stream, "total (K)");
+ sol_integer(&sol_stream, bytes_total / 1024);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ printf("%juK/%juK/%juK bytes allocated to network "
+ "(current/cache/total)\n", bytes_inuse / 1024,
+ bytes_incache / 1024, bytes_total / 1024);
+
+#if defined(SOL_ON)
+ if (Oflag)
+ {
+ SOL_MAP_KEYL(&sol_stream, "mbuf requests");
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "denied");
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "mbufs");
+ sol_integer(&sol_stream, bytes_inuse / 1024);
+ SOL_MAP_KEYL(&sol_stream, "clusters");
+ sol_integer(&sol_stream, bytes_incache / 1024);
+ SOL_MAP_KEYL(&sol_stream, "packets");
+ sol_integer(&sol_stream, bytes_total / 1024);
+ sol_map_end(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "delayed");
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "mbufs");
+ sol_integer(&sol_stream, mbuf_sleeps);
+ SOL_MAP_KEYL(&sol_stream, "clusters");
+ sol_integer(&sol_stream, cluster_sleeps);
+ SOL_MAP_KEYL(&sol_stream, "packets");
+ sol_integer(&sol_stream, packet_sleeps);
+ sol_map_end(&sol_stream);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ {
+ printf("%ju/%ju/%ju requests for mbufs denied (mbufs/clusters/"
+ "mbuf+clusters)\n", mbuf_failures, cluster_failures,
+ packet_failures);
+ printf("%ju/%ju/%ju requests for mbufs delayed (mbufs/clusters/"
+ "mbuf+clusters)\n", mbuf_sleeps, cluster_sleeps,
+ packet_sleeps);
+ }
+
+#if defined(SOL_ON)
+ if (Oflag)
+ {
+ char pagesize[STRBUF_SIZEOF(uintmax_t) + sizeof("k")];
+ size_t len = snprintf(pagesize, sizeof(pagesize), "%juk", jumbop_size / 1024);
+
+ SOL_MAP_KEYL(&sol_stream, "jumbo cluster requests");
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "denied");
+ sol_map_start(&sol_stream);
+ sol_map_key(&sol_stream, pagesize, len);
+ sol_integer(&sol_stream, jumbop_sleeps);
+ SOL_MAP_KEYL(&sol_stream, "9k");
+ sol_integer(&sol_stream, jumbo9_sleeps);
+ SOL_MAP_KEYL(&sol_stream, "16k");
+ sol_integer(&sol_stream, jumbo16_sleeps);
+ sol_map_end(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "delayed");
+ sol_map_start(&sol_stream);
+ sol_map_key(&sol_stream, pagesize, len);
+ sol_integer(&sol_stream, mbuf_sleeps);
+ SOL_MAP_KEYL(&sol_stream, "9k");
+ sol_integer(&sol_stream, cluster_sleeps);
+ SOL_MAP_KEYL(&sol_stream, "16k");
+ sol_integer(&sol_stream, packet_sleeps);
+ sol_map_end(&sol_stream);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ {
+ printf("%ju/%ju/%ju requests for jumbo clusters delayed "
+ "(%juk/9k/16k)\n", jumbop_sleeps, jumbo9_sleeps,
+ jumbo16_sleeps, jumbop_size / 1024);
+ printf("%ju/%ju/%ju requests for jumbo clusters denied "
+ "(%juk/9k/16k)\n", jumbop_failures, jumbo9_failures,
+ jumbo16_failures, jumbop_size / 1024);
+ }
if (live) {
mlen = sizeof(nsfbufs);
@@ -301,9 +500,26 @@
!sysctlbyname("kern.ipc.nsfbufsused", &nsfbufsused,
&mlen, NULL, 0) &&
!sysctlbyname("kern.ipc.nsfbufspeak", &nsfbufspeak,
- &mlen, NULL, 0))
- printf("%d/%d/%d sfbufs in use (current/peak/max)\n",
- nsfbufsused, nsfbufspeak, nsfbufs);
+ &mlen, NULL, 0)) {
+#if defined(SOL_ON)
+ if (Oflag) {
+ SOL_MAP_KEYL(&sol_stream, "sfbufs");
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "current");
+ sol_integer(&sol_stream, nsfbufsused);
+ SOL_MAP_KEYL(&sol_stream, "peak");
+ sol_integer(&sol_stream, nsfbufspeak);
+ SOL_MAP_KEYL(&sol_stream, "max");
+ sol_integer(&sol_stream, nsfbufs);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ printf("%d/%d/%d sfbufs in use (current/peak/max)\n",
+ nsfbufsused, nsfbufspeak, nsfbufs);
+ }
mlen = sizeof(sfstat);
if (sysctlbyname("kern.ipc.sfstat", &sfstat, &mlen, NULL, 0)) {
warn("kern.ipc.sfstat");
@@ -313,12 +529,35 @@
if (kread_counters(mbaddr, (char *)&sfstat, sizeof sfstat) != 0)
goto out;
}
- printf("%ju requests for sfbufs denied\n",
- (uintmax_t)sfstat.sf_allocfail);
- printf("%ju requests for sfbufs delayed\n",
- (uintmax_t)sfstat.sf_allocwait);
- printf("%ju requests for I/O initiated by sendfile\n",
- (uintmax_t)sfstat.sf_iocnt);
+#if defined(SOL_ON)
+ if (Oflag)
+ {
+ SOL_MAP_KEYL(&sol_stream, "sfbuf requests");
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "denied");
+ sol_integer(&sol_stream, sfstat.sf_allocfail);
+ SOL_MAP_KEYL(&sol_stream, "delayed");
+ sol_integer(&sol_stream, sfstat.sf_allocwait);
+
+ sol_map_end(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "I/O sendfile requests");
+ sol_integer(&sol_stream, sfstat.sf_iocnt);
+ }
+ else
+#endif
+ {
+ printf("%ju requests for sfbufs denied\n",
+ (uintmax_t)sfstat.sf_allocfail);
+ printf("%ju requests for sfbufs delayed\n",
+ (uintmax_t)sfstat.sf_allocwait);
+ printf("%ju requests for I/O initiated by sendfile\n",
+ (uintmax_t)sfstat.sf_iocnt);
+ }
out:
+#if defined(SOL_ON)
+ if (Oflag) sol_map_end(&sol_stream);
+#endif
memstat_mtl_free(mtlp);
}
Modified: soc2014/zkorchev/freebsd_head/usr.bin/netstat/netisr.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/netstat/netisr.c Sun Jun 8 15:51:28 2014 (r269255)
+++ soc2014/zkorchev/freebsd_head/usr.bin/netstat/netisr.c Sun Jun 8 15:52:07 2014 (r269256)
@@ -47,6 +47,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sol.h>
#include "netstat.h"
@@ -457,22 +458,55 @@
static void
netisr_print_proto(struct sysctl_netisr_proto *snpp)
{
- char tmp[20];
-
- printf("%-6s", snpp->snp_name);
- printf(" %5u", snpp->snp_proto);
- printf(" %6u", snpp->snp_qlimit);
- printf(" %6s",
- (snpp->snp_policy == NETISR_POLICY_SOURCE) ? "source" :
- (snpp->snp_policy == NETISR_POLICY_FLOW) ? "flow" :
- (snpp->snp_policy == NETISR_POLICY_CPU) ? "cpu" : "-");
- netisr_dispatch_policy_to_string(snpp->snp_dispatch, tmp,
- sizeof(tmp));
- printf(" %8s", tmp);
- printf(" %s%s%s\n",
- (snpp->snp_flags & NETISR_SNP_FLAGS_M2CPUID) ? "C" : "-",
- (snpp->snp_flags & NETISR_SNP_FLAGS_DRAINEDCPU) ? "D" : "-",
- (snpp->snp_flags & NETISR_SNP_FLAGS_M2FLOW) ? "F" : "-");
+ char dispatch[20];
+ const char *policy;
+ char flags[4];
+
+ netisr_dispatch_policy_to_string(snpp->snp_dispatch, dispatch, sizeof(dispatch));
+
+ policy = (snpp->snp_policy == NETISR_POLICY_SOURCE) ? "source" :
+ (snpp->snp_policy == NETISR_POLICY_FLOW) ? "flow" :
+ (snpp->snp_policy == NETISR_POLICY_CPU) ? "cpu" : "-";
+
+ flags[0] = ((snpp->snp_flags & NETISR_SNP_FLAGS_M2CPUID) ? 'C' : '-');
+ flags[1] = ((snpp->snp_flags & NETISR_SNP_FLAGS_DRAINEDCPU) ? 'D' : '-');
+ flags[2] = ((snpp->snp_flags & NETISR_SNP_FLAGS_M2FLOW) ? 'F' : '-');
+ flags[3] = 0;
+
+#if defined(SOL_ON)
+ if (Oflag)
+ {
+ sol_map_key(&sol_stream, snpp->snp_name, strlen(snpp->snp_name));
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "proto");
+ sol_integer(&sol_stream, snpp->snp_proto);
+
+ SOL_MAP_KEYL(&sol_stream, "qlimit");
+ sol_integer(&sol_stream, snpp->snp_qlimit);
+
+ SOL_MAP_KEYL(&sol_stream, "policy");
+ sol_string(&sol_stream, policy, strlen(policy));
+
+ SOL_MAP_KEYL(&sol_stream, "dispatch");
+ sol_string(&sol_stream, dispatch, strlen(dispatch));
+
+ SOL_MAP_KEYL(&sol_stream, "flags");
+ sol_string(&sol_stream, flags, sizeof(flags) - 1);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ {
+ printf("%-6s %5u %6u %6s %8s %s\n",
+ snpp->snp_name,
+ snpp->snp_proto,
+ snpp->snp_qlimit,
+ policy,
+ dispatch,
+ flags);
+ }
}
static void
@@ -485,18 +519,62 @@
snwp = &work_array[i];
if (snwp->snw_wsid != snwsp->snws_wsid)
continue;
- printf("%4u ", snwsp->snws_wsid);
- printf("%3u ", snwsp->snws_cpu);
- printf("%2s", "");
- printf("%-6s", netisr_proto2name(snwp->snw_proto));
- printf(" %5u", snwp->snw_len);
- printf(" %5u", snwp->snw_watermark);
- printf(" %8ju", snwp->snw_dispatched);
- printf(" %8ju", snwp->snw_hybrid_dispatched);
- printf(" %8ju", snwp->snw_qdrops);
- printf(" %8ju", snwp->snw_queued);
- printf(" %8ju", snwp->snw_handled);
- printf("\n");
+
+#if defined(SOL_ON)
+ if (Oflag)
+ {
+ const char *name = netisr_proto2name(snwp->snw_proto);
+
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "WSID");
+ sol_integer(&sol_stream, snwsp->snws_wsid);
+
+ SOL_MAP_KEYL(&sol_stream, "CPU");
+ sol_integer(&sol_stream, snwsp->snws_cpu);
+
+ SOL_MAP_KEYL(&sol_stream, "name");
+ sol_string(&sol_stream, name, strlen(name));
+
+ SOL_MAP_KEYL(&sol_stream, "len");
+ sol_integer(&sol_stream, snwp->snw_len);
+
+ SOL_MAP_KEYL(&sol_stream, "wmark");
+ sol_integer(&sol_stream, snwp->snw_watermark);
+
+ SOL_MAP_KEYL(&sol_stream, "displayed");
+ sol_integer(&sol_stream, snwp->snw_dispatched);
+
+ SOL_MAP_KEYL(&sol_stream, "Hdisplayed");
+ sol_integer(&sol_stream, snwp->snw_hybrid_dispatched);
+
+ SOL_MAP_KEYL(&sol_stream, "qdrops");
+ sol_integer(&sol_stream, snwp->snw_qdrops);
+
+ SOL_MAP_KEYL(&sol_stream, "queued");
+ sol_integer(&sol_stream, snwp->snw_queued);
+
+ SOL_MAP_KEYL(&sol_stream, "handled");
+ sol_integer(&sol_stream, snwp->snw_handled);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ {
+ printf("%4u ", snwsp->snws_wsid);
+ printf("%3u ", snwsp->snws_cpu);
+ printf("%2s", "");
+ printf("%-6s", netisr_proto2name(snwp->snw_proto));
+ printf(" %5u", snwp->snw_len);
+ printf(" %5u", snwp->snw_watermark);
+ printf(" %8ju", snwp->snw_dispatched);
+ printf(" %8ju", snwp->snw_hybrid_dispatched);
+ printf(" %8ju", snwp->snw_qdrops);
+ printf(" %8ju", snwp->snw_queued);
+ printf(" %8ju", snwp->snw_handled);
+ printf("\n");
+ }
}
}
@@ -521,33 +599,99 @@
netisr_load_kvm_workstream(kd); /* Also does work. */
}
- printf("Configuration:\n");
- printf("%-25s %12s %12s\n", "Setting", "Current", "Limit");
- printf("%-25s %12u %12u\n", "Thread count", numthreads, maxthreads);
- printf("%-25s %12u %12u\n", "Default queue limit", defaultqlimit,
- maxqlimit);
- printf("%-25s %12s %12s\n", "Dispatch policy", dispatch_policy,
- "n/a");
- printf("%-25s %12s %12s\n", "Threads bound to CPUs",
- bindthreads ? "enabled" : "disabled", "n/a");
- printf("\n");
-
- printf("Protocols:\n");
- printf("%-6s %5s %6s %-6s %-8s %-5s\n", "Name", "Proto", "QLimit",
- "Policy", "Dispatch", "Flags");
- for (i = 0; i < proto_array_len; i++) {
- snpp = &proto_array[i];
- netisr_print_proto(snpp);
+#if defined(SOL_ON)
+ if (Oflag)
+ {
+ char *threads_bound = (bindthreads ? "enabled" : "disabled");
+
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "configuration");
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "thread count");
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "current");
+ sol_integer(&sol_stream, numthreads);
+ SOL_MAP_KEYL(&sol_stream, "limit");
+ sol_integer(&sol_stream, maxthreads);
+ sol_map_end(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "queue limit");
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "current");
+ sol_integer(&sol_stream, defaultqlimit);
+ SOL_MAP_KEYL(&sol_stream, "limit");
+ sol_integer(&sol_stream, maxqlimit);
+ sol_map_end(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "dispatch policy");
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "current");
+ sol_string(&sol_stream, dispatch_policy, strlen(dispatch_policy));
+ SOL_MAP_KEYL(&sol_stream, "limit");
+ sol_string(&sol_stream, "n/a", 3);
+ sol_map_end(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "threads bound to CPUs");
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "current");
+ sol_string(&sol_stream, threads_bound, strlen(threads_bound));
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-soc-all
mailing list