socsvn commit: r269630 - soc2014/zkorchev/freebsd_head/usr.bin/netstat

zkorchev at FreeBSD.org zkorchev at FreeBSD.org
Mon Jun 16 17:43:30 UTC 2014


Author: zkorchev
Date: Mon Jun 16 17:43:28 2014
New Revision: 269630
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=269630

Log:
  netstat sol support

Modified:
  soc2014/zkorchev/freebsd_head/usr.bin/netstat/if.c
  soc2014/zkorchev/freebsd_head/usr.bin/netstat/inet.c
  soc2014/zkorchev/freebsd_head/usr.bin/netstat/main.c
  soc2014/zkorchev/freebsd_head/usr.bin/netstat/mroute.c
  soc2014/zkorchev/freebsd_head/usr.bin/netstat/mroute6.c
  soc2014/zkorchev/freebsd_head/usr.bin/netstat/route.c
  soc2014/zkorchev/freebsd_head/usr.bin/netstat/unix.c

Modified: soc2014/zkorchev/freebsd_head/usr.bin/netstat/if.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/netstat/if.c	Mon Jun 16 16:37:41 2014	(r269629)
+++ soc2014/zkorchev/freebsd_head/usr.bin/netstat/if.c	Mon Jun 16 17:43:28 2014	(r269630)
@@ -200,6 +200,20 @@
 	}
 }
 
+#if defined(SOL_ON)
+static void
+show_stat_sol(u_long value)
+{
+	if (hflag) {
+		char buf[5];
+		humanize_number(buf, sizeof(buf), (int64_t)value, "",
+			HN_AUTOSCALE, HN_NOSPACE | HN_DECIMAL);
+		sol_string(&sol_stream, buf, strlen(buf));
+	} else
+		sol_integer(&sol_stream, value);
+}
+#endif
+
 /*
  * Find next multiaddr for a given interface name.
  */
@@ -236,25 +250,30 @@
 	if (aflag && getifmaddrs(&ifmap) != 0)
 		err(EX_OSERR, "getifmaddrs");
 
-	// TODO finish sol output
-
-	if (!Oflag && !pfunc) {
-		if (Wflag)
-			printf("%-7.7s", "Name");
-		else
-			printf("%-5.5s", "Name");
-		printf(" %5.5s %-13.13s %-17.17s %8.8s %5.5s %5.5s",
-		    "Mtu", "Network", "Address", "Ipkts", "Ierrs", "Idrop");
-		if (bflag)
-			printf(" %10.10s","Ibytes");
-		printf(" %8.8s %5.5s", "Opkts", "Oerrs");
-		if (bflag)
-			printf(" %10.10s","Obytes");
-		printf(" %5s", "Coll");
-		if (dflag)
-			printf("  %s", "Drop");
-		putchar('\n');
+#if defined(SOL_ON)
+	if (Oflag) {
+		SOL_MAP_KEYL(&sol_stream, "network");
+		sol_array_start(&sol_stream);
 	}
+	else
+#endif
+		if (!pfunc) {
+			if (Wflag)
+				printf("%-7.7s", "Name");
+			else
+				printf("%-5.5s", "Name");
+			printf(" %5.5s %-13.13s %-17.17s %8.8s %5.5s %5.5s",
+				"Mtu", "Network", "Address", "Ipkts", "Ierrs", "Idrop");
+			if (bflag)
+				printf(" %10.10s","Ibytes");
+			printf(" %8.8s %5.5s", "Opkts", "Oerrs");
+			if (bflag)
+				printf(" %10.10s","Obytes");
+			printf(" %5s", "Coll");
+			if (dflag)
+				printf("  %s", "Drop");
+			putchar('\n');
+		}
 
 	for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
 		bool network = false, link = false;
@@ -281,19 +300,37 @@
 		if (af != AF_UNSPEC && ifa->ifa_addr->sa_family != af)
 			continue;
 
-		if (Wflag)
-			printf("%-7.7s", ifa->ifa_name);
+#if defined(SOL_ON)
+		if (Oflag) {
+			sol_map_start(&sol_stream);
+
+			SOL_MAP_KEYL(&sol_stream, "name");
+			sol_string(&sol_stream, ifa->ifa_name, strlen(ifa->ifa_name));
+			SOL_MAP_KEYL(&sol_stream, "mtu");
+			show_stat_sol(((struct if_data *)ifa->ifa_data)->ifi_mtu);
+		}
 		else
-			printf("%-5.5s", ifa->ifa_name);
+#endif
+		{
+			if (Wflag)
+				printf("%-7.7s", ifa->ifa_name);
+			else
+				printf("%-5.5s", ifa->ifa_name);
 
 #define IFA_MTU(ifa)	(((struct if_data *)(ifa)->ifa_data)->ifi_mtu)
-		show_stat("lu", 6, IFA_MTU(ifa), IFA_MTU(ifa));
+			show_stat("lu", 6, IFA_MTU(ifa), IFA_MTU(ifa));
 #undef IFA_MTU
+		}
 
 		switch (ifa->ifa_addr->sa_family) {
 		case AF_UNSPEC:
-			printf("%-13.13s ", "none");
-			printf("%-15.15s ", "none");
+#if defined(SOL_ON)
+			if (!Oflag)
+#endif
+			{
+				printf("%-13.13s ", "none");
+				printf("%-15.15s ", "none");
+			}
 			break;
 		case AF_INET:
 		    {
@@ -301,10 +338,24 @@
 
 			sin = (struct sockaddr_in *)ifa->ifa_addr;
 			mask = (struct sockaddr_in *)ifa->ifa_netmask;
-			printf("%-13.13s ", netname(sin->sin_addr.s_addr,
-			    mask->sin_addr.s_addr));
-			printf("%-17.17s ",
-			    routename(sin->sin_addr.s_addr));
+#if defined(SOL_ON)
+			if (Oflag)
+			{
+				char *network = netname(sin->sin_addr.s_addr, mask->sin_addr.s_addr);
+				char *address = routename(sin->sin_addr.s_addr);
+				SOL_MAP_KEYL(&sol_stream, "network");
+				sol_string(&sol_stream, network, strlen(network));
+				SOL_MAP_KEYL(&sol_stream, "address");
+				sol_string(&sol_stream, address, strlen(address));
+			}
+			else
+#endif
+			{
+				printf("%-13.13s ", netname(sin->sin_addr.s_addr,
+					mask->sin_addr.s_addr));
+				printf("%-17.17s ",
+					routename(sin->sin_addr.s_addr));
+			}
 
 			network = true;
 			break;
@@ -317,14 +368,29 @@
 			sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
 			mask = (struct sockaddr_in6 *)ifa->ifa_netmask;
 
-			printf("%-13.13s ", netname6(sin6, &mask->sin6_addr));
-			getnameinfo(ifa->ifa_addr, ifa->ifa_addr->sa_len,
-			    addr_buf, sizeof(addr_buf), 0, 0, NI_NUMERICHOST);
-			printf("%-17.17s ", addr_buf);
+#if defined(SOL_ON)
+			if (Oflag)
+			{
+				const char *network = netname6(sin6, &mask->sin6_addr);
+				SOL_MAP_KEYL(&sol_stream, "network");
+				sol_string(&sol_stream, network, strlen(network));
+				getnameinfo(ifa->ifa_addr, ifa->ifa_addr->sa_len,
+					addr_buf, sizeof(addr_buf), 0, 0, NI_NUMERICHOST);
+				SOL_MAP_KEYL(&sol_stream, "address");
+				sol_string(&sol_stream, addr_buf, strlen(addr_buf));
+			}
+			else
+#endif
+			{
+				printf("%-13.13s ", netname6(sin6, &mask->sin6_addr));
+				getnameinfo(ifa->ifa_addr, ifa->ifa_addr->sa_len,
+					addr_buf, sizeof(addr_buf), 0, 0, NI_NUMERICHOST);
+				printf("%-17.17s ", addr_buf);
+			}
 
 			network = 1;
 			break;
-	            }
+			}
 #endif /* INET6 */
 		case AF_LINK:
 		    {
@@ -335,42 +401,115 @@
 			sdl = (struct sockaddr_dl *)ifa->ifa_addr;
 			cp = (char *)LLADDR(sdl);
 			n = sdl->sdl_alen;
-			sprintf(linknum, "<Link#%d>", sdl->sdl_index);
-			m = printf("%-13.13s ", linknum);
-
-			while ((--n >= 0) && (m < 30))
-				m += printf("%02x%c", *cp++ & 0xff,
-					    n > 0 ? ':' : ' ');
-			m = 32 - m;
-			while (m-- > 0)
-				putchar(' ');
-
+			m = sprintf(linknum, "<Link#%d>", sdl->sdl_index);
+#if defined(SOL_ON)
+			if (Oflag)
+			{
+				char buf[64]; // TODO make sure this is enough
+				size_t len = 0;
+
+				SOL_MAP_KEYL(&sol_stream, "network");
+				sol_string(&sol_stream, linknum, m);
+				while (--n >= 0)
+					len += snprintf(buf + len, sizeof(buf) - len, "%02x%c",
+						*cp++ & 0xff,
+						n > 0 ? ':' : '\0');
+				if (len) {
+					SOL_MAP_KEYL(&sol_stream, "address");
+					sol_string(&sol_stream, buf, len - 1);
+				}
+			}
+			else
+#endif
+			{
+				m = printf("%-13.13s ", linknum);
+
+				while ((--n >= 0) && (m < 30))
+					m += printf("%02x%c", *cp++ & 0xff,
+							n > 0 ? ':' : ' ');
+				m = 32 - m;
+				while (m-- > 0)
+					putchar(' ');
+			}
 			link = 1;
 			break;
 		    }
 		}
 
 #define	IFA_STAT(s)	(((struct if_data *)ifa->ifa_data)->ifi_ ## s)
-		show_stat("lu", 8, IFA_STAT(ipackets), link|network);
-		show_stat("lu", 5, IFA_STAT(ierrors), link);
-		show_stat("lu", 5, IFA_STAT(iqdrops), link);
-		if (bflag)
-			show_stat("lu", 10, IFA_STAT(ibytes), link|network);
-		show_stat("lu", 8, IFA_STAT(opackets), link|network);
-		show_stat("lu", 5, IFA_STAT(oerrors), link);
-		if (bflag)
-			show_stat("lu", 10, IFA_STAT(obytes), link|network);
-		show_stat("NRSlu", 5, IFA_STAT(collisions), link);
-		if (dflag)
-			show_stat("LSlu", 5, IFA_STAT(oqdrops), link);
-		putchar('\n');
 
-		if (!aflag)
+#if defined(SOL_ON)
+		if (Oflag)
+		{
+			SOL_MAP_KEYL(&sol_stream, "input");
+			sol_map_start(&sol_stream);
+
+			SOL_MAP_KEYL(&sol_stream, "packets");
+			show_stat_sol(IFA_STAT(ipackets));
+			SOL_MAP_KEYL(&sol_stream, "errors");
+			show_stat_sol(IFA_STAT(ierrors));
+			SOL_MAP_KEYL(&sol_stream, "drops");
+			show_stat_sol(IFA_STAT(iqdrops));
+			if (bflag) {
+				SOL_MAP_KEYL(&sol_stream, "bytes");
+				show_stat_sol(IFA_STAT(ibytes));
+			}
+
+			sol_map_end(&sol_stream);
+			SOL_MAP_KEYL(&sol_stream, "output");
+			sol_map_start(&sol_stream);
+
+			SOL_MAP_KEYL(&sol_stream, "packets");
+			show_stat_sol(IFA_STAT(opackets));
+			SOL_MAP_KEYL(&sol_stream, "errors");
+			show_stat_sol(IFA_STAT(oerrors));
+			if (dflag) {
+				SOL_MAP_KEYL(&sol_stream, "drops");
+				show_stat_sol(IFA_STAT(oqdrops));
+			}
+			if (bflag) {
+				SOL_MAP_KEYL(&sol_stream, "bytes");
+				show_stat_sol(IFA_STAT(obytes));
+			}
+
+			sol_map_end(&sol_stream);
+			SOL_MAP_KEYL(&sol_stream, "collisions");
+			show_stat_sol(IFA_STAT(collisions));
+		}
+		else
+#endif
+		{
+			show_stat("lu", 8, IFA_STAT(ipackets), link|network);
+			show_stat("lu", 5, IFA_STAT(ierrors), link);
+			show_stat("lu", 5, IFA_STAT(iqdrops), link);
+			if (bflag)
+				show_stat("lu", 10, IFA_STAT(ibytes), link|network);
+			show_stat("lu", 8, IFA_STAT(opackets), link|network);
+			show_stat("lu", 5, IFA_STAT(oerrors), link);
+			if (bflag)
+				show_stat("lu", 10, IFA_STAT(obytes), link|network);
+			show_stat("NRSlu", 5, IFA_STAT(collisions), link);
+			if (dflag)
+				show_stat("LSlu", 5, IFA_STAT(oqdrops), link);
+			putchar('\n');
+		}
+
+		if (!aflag) {
+#if defined(SOL_ON)
+			if (Oflag) sol_map_end(&sol_stream);
+#endif
 			continue;
+		}
 
 		/*
 		 * Print family's multicast addresses.
 		 */
+#if defined(SOL_ON)
+		if (Oflag) {
+			SOL_MAP_KEYL(&sol_stream, "multicast");
+			sol_array_start(&sol_stream);
+		}
+#endif
 		for (ifma = next_ifma(ifmap, ifa->ifa_name,
 		     ifa->ifa_addr->sa_family);
 		     ifma != NULL;
@@ -394,8 +533,13 @@
 				getnameinfo(ifma->ifma_addr,
 				    ifma->ifma_addr->sa_len, addr_buf,
 				    sizeof(addr_buf), 0, 0, NI_NUMERICHOST);
-				printf("%*s %s\n",
-				    Wflag ? 27 : 25, "", addr_buf);
+#if defined(SOL_ON)
+				if (Oflag)
+					sol_string(&sol_stream, addr_buf, strlen(addr_buf));
+				else
+#endif
+					printf("%*s %s\n",
+						Wflag ? 27 : 25, "", addr_buf);
 				break;
 #endif /* INET6 */
 			case AF_LINK:
@@ -415,25 +559,51 @@
 			}
 
 			if (fmt) {
-				printf("%*s %-17.17s",
-				    Wflag ? 27 : 25, "", fmt);
-				if (ifma->ifma_addr->sa_family == AF_LINK) {
-					printf(" %8ju",
-					    (uintmax_t )IFA_STAT(imcasts));
-					printf("%*s", bflag ? 17 : 6, "");
-					printf(" %8ju",
-					    (uintmax_t )IFA_STAT(omcasts));
+#if defined(SOL_ON)
+				if (Oflag)
+				{
+					sol_map_start(&sol_stream);
+					SOL_MAP_KEYL(&sol_stream, "address");
+					sol_string(&sol_stream, fmt, strlen(fmt));
+					SOL_MAP_KEYL(&sol_stream, "in");
+					sol_integer(&sol_stream, (uintmax_t )IFA_STAT(imcasts));
+					SOL_MAP_KEYL(&sol_stream, "out");
+					sol_integer(&sol_stream, (uintmax_t )IFA_STAT(omcasts));
+					sol_map_end(&sol_stream);
+				}
+				else
+#endif
+				{
+					printf("%*s %-17.17s",
+						Wflag ? 27 : 25, "", fmt);
+					if (ifma->ifma_addr->sa_family == AF_LINK) {
+						printf(" %8ju",
+							(uintmax_t )IFA_STAT(imcasts));
+						printf("%*s", bflag ? 17 : 6, "");
+						printf(" %8ju",
+							(uintmax_t )IFA_STAT(omcasts));
+					}
+					putchar('\n');
 				}
-				putchar('\n');
 			}
 
 			ifma = ifma->ifma_next;
 		}
+#if defined(SOL_ON)
+		if (Oflag) {
+			sol_array_end(&sol_stream);
+			sol_map_end(&sol_stream);
+		}
+#endif
 	}
 
 	freeifaddrs(ifap);
 	if (aflag)
 		freeifmaddrs(ifmap);
+
+#if defined(SOL_ON)
+	if (Oflag) sol_array_end(&sol_stream);
+#endif
 }
 
 struct iftot {

Modified: soc2014/zkorchev/freebsd_head/usr.bin/netstat/inet.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/netstat/inet.c	Mon Jun 16 16:37:41 2014	(r269629)
+++ soc2014/zkorchev/freebsd_head/usr.bin/netstat/inet.c	Mon Jun 16 17:43:28 2014	(r269630)
@@ -80,6 +80,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <sol.h>
 #include "netstat.h"
 
 char	*inetname(struct in_addr *);
@@ -347,6 +348,14 @@
 			return;
 	}
 
+#if defined(SOL_ON)
+	if (Oflag) {
+		SOL_MAP_KEYL(&sol_stream, "internet");
+		sol_array_start(&sol_stream);
+		first = 0;
+	}
+#endif
+
 	oxig = xig = (struct xinpgen *)buf;
 	for (xig = (struct xinpgen *)((char *)xig + xig->xig_len);
 	     xig->xig_len > sizeof(struct xinpgen);
@@ -450,11 +459,24 @@
 		}
 		if (Lflag && so->so_qlimit == 0)
 			continue;
+#if defined(SOL_ON)
+		if (Oflag) sol_map_start(&sol_stream);
+#endif
 		if (Aflag) {
-			if (istcp)
-				printf("%*lx ", 2 * (int)sizeof(void *), (u_long)inp->inp_ppcb);
+#if defined(SOL_ON)
+			if (Oflag) {
+				SOL_MAP_KEYL(&sol_stream, "socket");
+				if (istcp)
+					sol_integer(&sol_stream, (u_long)inp->inp_ppcb); // TODO hex?
+				else
+					sol_integer(&sol_stream, (u_long)so->so_pcb); // TODO hex?
+			}
 			else
-				printf("%*lx ", 2 * (int)sizeof(void *), (u_long)so->so_pcb);
+#endif
+				if (istcp)
+					printf("%*lx ", 2 * (int)sizeof(void *), (u_long)inp->inp_ppcb);
+				else
+					printf("%*lx ", 2 * (int)sizeof(void *), (u_long)so->so_pcb);
 		}
 #ifdef INET6
 		if ((inp->inp_vflag & INP_IPV6) != 0)
@@ -464,22 +486,67 @@
 #endif
 		vchar = ((inp->inp_vflag & INP_IPV4) != 0) ?
 		    "4 " : "  ";
-		if (istcp && (tp->t_flags & TF_TOE) != 0)
-			printf("%-3.3s%-2.2s ", "toe", vchar);
+#if defined(SOL_ON)
+		if (Oflag)
+		{
+			char proto[5 + 1];
+			size_t len;
+			SOL_MAP_KEYL(&sol_stream, "proto");
+			if (istcp && (tp->t_flags & TF_TOE) != 0)
+				len = snprintf(proto, sizeof(proto), "%-3.3s%-2.2s", "toe", vchar);
+			else
+				len = snprintf(proto, sizeof(proto), "%-3.3s%-2.2s", name, vchar);
+			sol_string(&sol_stream, proto, len);
+
+			if (Lflag) {
+				char buf1[15];
+				size_t len;
+
+				SOL_MAP_KEYL(&sol_stream, "qlen/incqlen/maxqlen");
+				len = snprintf(buf1, 15, "%d/%d/%d", so->so_qlen,
+					so->so_incqlen, so->so_qlimit);
+				sol_string(&sol_stream, buf1, len);
+			} else if (Tflag) {
+				if (istcp) {
+					SOL_MAP_KEYL(&sol_stream, "tcp");
+					sol_map_start(&sol_stream);
+
+					SOL_MAP_KEYL(&sol_stream, "retransmit");
+					sol_integer(&sol_stream, tp->t_sndrexmitpack);
+					SOL_MAP_KEYL(&sol_stream, "out of order");
+					sol_integer(&sol_stream, tp->t_rcvoopack);
+					SOL_MAP_KEYL(&sol_stream, "zero windows");
+					sol_integer(&sol_stream, tp->t_sndzerowin);
+
+					sol_map_end(&sol_stream);
+				}
+			} else {
+				SOL_MAP_KEYL(&sol_stream, "recv");
+				sol_integer(&sol_stream, so->so_rcv.sb_cc);
+				SOL_MAP_KEYL(&sol_stream, "sent");
+				sol_integer(&sol_stream, so->so_snd.sb_cc);
+			}
+		}
 		else
-			printf("%-3.3s%-2.2s ", name, vchar);
-		if (Lflag) {
-			char buf1[15];
-
-			snprintf(buf1, 15, "%d/%d/%d", so->so_qlen,
-			    so->so_incqlen, so->so_qlimit);
-			printf("%-14.14s ", buf1);
-		} else if (Tflag) {
-			if (istcp)
-				printf("%6u %6u %6u ", tp->t_sndrexmitpack,
-				       tp->t_rcvoopack, tp->t_sndzerowin);
-		} else {
-			printf("%6u %6u ", so->so_rcv.sb_cc, so->so_snd.sb_cc);
+#endif
+		{
+			if (istcp && (tp->t_flags & TF_TOE) != 0)
+				printf("%-3.3s%-2.2s ", "toe", vchar);
+			else
+				printf("%-3.3s%-2.2s ", name, vchar);
+			if (Lflag) {
+				char buf1[15];
+
+				snprintf(buf1, 15, "%d/%d/%d", so->so_qlen,
+					so->so_incqlen, so->so_qlimit);
+				printf("%-14.14s ", buf1);
+			} else if (Tflag) {
+				if (istcp)
+					printf("%6u %6u %6u ", tp->t_sndrexmitpack,
+						   tp->t_rcvoopack, tp->t_sndzerowin);
+			} else {
+				printf("%6u %6u ", so->so_rcv.sb_cc, so->so_snd.sb_cc);
+			}
 		}
 		if (numeric_port) {
 			if (inp->inp_vflag & INP_IPV4) {
@@ -535,53 +602,153 @@
 			} /* else nothing printed now */
 #endif /* INET6 */
 		}
-		if (xflag) {
-			printf("%6u %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u",
-			       so->so_rcv.sb_mcnt, so->so_snd.sb_mcnt,
-			       so->so_rcv.sb_ccnt, so->so_snd.sb_ccnt,
-			       so->so_rcv.sb_hiwat, so->so_snd.sb_hiwat,
-			       so->so_rcv.sb_lowat, so->so_snd.sb_lowat,
-			       so->so_rcv.sb_mbcnt, so->so_snd.sb_mbcnt,
-			       so->so_rcv.sb_mbmax, so->so_snd.sb_mbmax);
-			if (timer != NULL)
-				printf(" %4d.%02d %4d.%02d %4d.%02d %4d.%02d %4d.%02d %4d.%02d",
-				    timer->tt_rexmt / 1000, (timer->tt_rexmt % 1000) / 10,
-				    timer->tt_persist / 1000, (timer->tt_persist % 1000) / 10,
-				    timer->tt_keep / 1000, (timer->tt_keep % 1000) / 10,
-				    timer->tt_2msl / 1000, (timer->tt_2msl % 1000) / 10,
-				    timer->tt_delack / 1000, (timer->tt_delack % 1000) / 10,
-				    timer->t_rcvtime / 1000, (timer->t_rcvtime % 1000) / 10);
-		}
-		if (istcp && !Lflag && !xflag && !Tflag && !Rflag) {
-			if (tp->t_state < 0 || tp->t_state >= TCP_NSTATES)
-				printf("%d", tp->t_state);
-			else {
-				printf("%s", tcpstates[tp->t_state]);
+#if defined(SOL_ON)
+		if (Oflag)
+		{
+			if (xflag) {
+				SOL_MAP_KEYL(&sol_stream, "recv mcnt");
+				sol_integer(&sol_stream, so->so_rcv.sb_mcnt);
+				SOL_MAP_KEYL(&sol_stream, "recv ccnt");
+				sol_integer(&sol_stream, so->so_rcv.sb_ccnt);
+				SOL_MAP_KEYL(&sol_stream, "recv hiwat");
+				sol_integer(&sol_stream, so->so_rcv.sb_hiwat);
+				SOL_MAP_KEYL(&sol_stream, "recv lowat");
+				sol_integer(&sol_stream, so->so_rcv.sb_lowat);
+				SOL_MAP_KEYL(&sol_stream, "recv mbcnt");
+				sol_integer(&sol_stream, so->so_rcv.sb_mbcnt);
+				SOL_MAP_KEYL(&sol_stream, "recv mbmax");
+				sol_integer(&sol_stream, so->so_rcv.sb_mbmax);
+				SOL_MAP_KEYL(&sol_stream, "send mcnt");
+				sol_integer(&sol_stream, so->so_snd.sb_mcnt);
+				SOL_MAP_KEYL(&sol_stream, "send ccnt");
+				sol_integer(&sol_stream, so->so_snd.sb_ccnt);
+				SOL_MAP_KEYL(&sol_stream, "send hiwat");
+				sol_integer(&sol_stream, so->so_snd.sb_hiwat);
+				SOL_MAP_KEYL(&sol_stream, "send lowat");
+				sol_integer(&sol_stream, so->so_snd.sb_lowat);
+				SOL_MAP_KEYL(&sol_stream, "send mbcnt");
+				sol_integer(&sol_stream, so->so_snd.sb_mbcnt);
+				SOL_MAP_KEYL(&sol_stream, "send mbmax");
+				sol_integer(&sol_stream, so->so_snd.sb_mbmax);
+
+				if (timer != NULL) {
+					SOL_MAP_KEYL(&sol_stream, "timer");
+					sol_map_start(&sol_stream);
+
+					SOL_MAP_KEYL(&sol_stream, "rexmt");
+					sol_integer(&sol_stream, timer->tt_rexmt);
+					SOL_MAP_KEYL(&sol_stream, "persist");
+					sol_integer(&sol_stream, timer->tt_persist);
+					SOL_MAP_KEYL(&sol_stream, "keep");
+					sol_integer(&sol_stream, timer->tt_keep);
+					SOL_MAP_KEYL(&sol_stream, "2msl");
+					sol_integer(&sol_stream, timer->tt_2msl);
+					SOL_MAP_KEYL(&sol_stream, "delack");
+					sol_integer(&sol_stream, timer->tt_delack);
+					SOL_MAP_KEYL(&sol_stream, "rcvtime");
+					sol_integer(&sol_stream, timer->t_rcvtime);
+
+					sol_map_end(&sol_stream);
+				}
+			}
+
+			if (istcp && !Lflag && !xflag && !Tflag && !Rflag) {
+				SOL_MAP_KEYL(&sol_stream, "tcp state");
+				if (tp->t_state < 0 || tp->t_state >= TCP_NSTATES) {
+					sol_integer(&sol_stream, tp->t_state);
+				}
+				else {
+					sol_string(&sol_stream,
+						tcpstates[tp->t_state],
+						strlen(tcpstates[tp->t_state]));
 #if defined(TF_NEEDSYN) && defined(TF_NEEDFIN)
-				/* Show T/TCP `hidden state' */
-				if (tp->t_flags & (TF_NEEDSYN|TF_NEEDFIN))
-					putchar('*');
+					/* Show T/TCP `hidden state' */
+					if (tp->t_flags & (TF_NEEDSYN|TF_NEEDFIN)) {
+						SOL_MAP_KEYL(&sol_stream, "need (syn|fin)");
+						sol_string(&sol_stream, "*", 1);
+					}
 #endif /* defined(TF_NEEDSYN) && defined(TF_NEEDFIN) */
+				}
 			}
+			if (Rflag) {
+				SOL_MAP_KEYL(&sol_stream, "inp flowid");
+				sol_integer(&sol_stream, inp->inp_flowid); // TODO hex
+				SOL_MAP_KEYL(&sol_stream, "inp flowtype");
+				sol_integer(&sol_stream, inp->inp_flowtype); // TODO hex
+			}
+
+			sol_map_end(&sol_stream);
 		}
-		if (Rflag) {
-			printf(" %08x %5d",
-			    inp->inp_flowid,
-			    inp->inp_flowtype);
+		else
+#endif
+		{
+			if (xflag) {
+				printf("%6u %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u",
+					   so->so_rcv.sb_mcnt, so->so_snd.sb_mcnt,
+					   so->so_rcv.sb_ccnt, so->so_snd.sb_ccnt,
+					   so->so_rcv.sb_hiwat, so->so_snd.sb_hiwat,
+					   so->so_rcv.sb_lowat, so->so_snd.sb_lowat,
+					   so->so_rcv.sb_mbcnt, so->so_snd.sb_mbcnt,
+					   so->so_rcv.sb_mbmax, so->so_snd.sb_mbmax);
+				if (timer != NULL)
+					printf(" %4d.%02d %4d.%02d %4d.%02d %4d.%02d %4d.%02d %4d.%02d",
+						timer->tt_rexmt / 1000, (timer->tt_rexmt % 1000) / 10,
+						timer->tt_persist / 1000, (timer->tt_persist % 1000) / 10,
+						timer->tt_keep / 1000, (timer->tt_keep % 1000) / 10,
+						timer->tt_2msl / 1000, (timer->tt_2msl % 1000) / 10,
+						timer->tt_delack / 1000, (timer->tt_delack % 1000) / 10,
+						timer->t_rcvtime / 1000, (timer->t_rcvtime % 1000) / 10);
+			}
+			if (istcp && !Lflag && !xflag && !Tflag && !Rflag) {
+				if (tp->t_state < 0 || tp->t_state >= TCP_NSTATES)
+					printf("%d", tp->t_state);
+				else {
+					printf("%s", tcpstates[tp->t_state]);
+#if defined(TF_NEEDSYN) && defined(TF_NEEDFIN)
+					/* Show T/TCP `hidden state' */
+					if (tp->t_flags & (TF_NEEDSYN|TF_NEEDFIN))
+						putchar('*');
+#endif /* defined(TF_NEEDSYN) && defined(TF_NEEDFIN) */
+				}
+			}
+			if (Rflag) {
+				printf(" %08x %5d",
+					inp->inp_flowid,
+					inp->inp_flowtype);
+			}
+			putchar('\n');
 		}
-		putchar('\n');
 	}
-	if (xig != oxig && xig->xig_gen != oxig->xig_gen) {
-		if (oxig->xig_count > xig->xig_count) {
-			printf("Some %s sockets may have been deleted.\n",
-			    name);
-		} else if (oxig->xig_count < xig->xig_count) {
-			printf("Some %s sockets may have been created.\n",
-			    name);
-		} else {
-			printf(
-	"Some %s sockets may have been created or deleted.\n",
-			    name);
+#if defined(SOL_ON)
+	if (Oflag)
+	{
+		if (xig != oxig && xig->xig_gen != oxig->xig_gen) {
+			if (oxig->xig_count > xig->xig_count)
+				SOL_MAP_KEYL(&sol_stream, "maybe deleted");
+			else if (oxig->xig_count < xig->xig_count)
+				SOL_MAP_KEYL(&sol_stream, "maybe created");
+			else
+				SOL_MAP_KEYL(&sol_stream, "maybe created/deleted");
+			sol_string(&sol_stream, name, strlen(name));
+		}
+
+		sol_array_end(&sol_stream);
+	}
+	else
+#endif
+	{
+		if (xig != oxig && xig->xig_gen != oxig->xig_gen) {
+			if (oxig->xig_count > xig->xig_count) {
+				printf("Some %s sockets may have been deleted.\n",
+					name);
+			} else if (oxig->xig_count < xig->xig_count) {
+				printf("Some %s sockets may have been created.\n",
+					name);
+			} else {
+				printf(
+		"Some %s sockets may have been created or deleted.\n",
+					name);
+			}
 		}
 	}
 	free(buf);

Modified: soc2014/zkorchev/freebsd_head/usr.bin/netstat/main.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/netstat/main.c	Mon Jun 16 16:37:41 2014	(r269629)
+++ soc2014/zkorchev/freebsd_head/usr.bin/netstat/main.c	Mon Jun 16 17:43:28 2014	(r269630)
@@ -562,10 +562,16 @@
 	 */
 #endif
 	if (iflag && !sflag) {
-		intpr(interval, NULL, af);
 #if defined(SOL_ON)
-		if (Oflag) sol_term(&sol_stream);
+		if (Oflag) {
+			sol_map_start(&sol_stream);
+			intpr(interval, NULL, af);
+			sol_map_end(&sol_stream);
+			sol_term(&sol_stream);
+		}
+		else
 #endif
+			intpr(interval, NULL, af);
 		exit(0);
 	}
 	if (rflag) {
@@ -586,6 +592,10 @@
 		exit(0);
 	}
 
+#if defined(SOL_ON)
+	if (Oflag) sol_map_start(&sol_stream);
+#endif
+
 	if (gflag) {
 		if (sflag) {
 			if (af == AF_INET || af == AF_UNSPEC)
@@ -603,7 +613,10 @@
 #endif
 		}
 #if defined(SOL_ON)
-		if (Oflag) sol_term(&sol_stream);
+		if (Oflag) {
+			sol_map_end(&sol_stream);
+			sol_term(&sol_stream);
+		}
 #endif
 		exit(0);
 	}
@@ -614,7 +627,10 @@
 	if (tp) {
 		printproto(tp, tp->pr_name);
 #if defined(SOL_ON)
-		if (Oflag) sol_term(&sol_stream);
+		if (Oflag) {
+			sol_map_end(&sol_stream);
+			sol_term(&sol_stream);
+		}
 #endif
 		exit(0);
 	}
@@ -641,7 +657,10 @@
 		    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);
+	if (Oflag) {
+		sol_map_end(&sol_stream);
+		sol_term(&sol_stream);
+	}
 #endif
 	exit(0);
 }
@@ -657,6 +676,12 @@
 	void (*pr)(u_long, const char *, int, int);
 	u_long off;
 
+/*#if defined(SOL_ON)
+	if (Oflag) {
+		return;
+	}
+#endif*/
+
 	if (sflag) {
 		if (iflag) {
 			if (tp->pr_istats)

Modified: soc2014/zkorchev/freebsd_head/usr.bin/netstat/mroute.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/netstat/mroute.c	Mon Jun 16 16:37:41 2014	(r269629)
+++ soc2014/zkorchev/freebsd_head/usr.bin/netstat/mroute.c	Mon Jun 16 17:43:28 2014	(r269630)
@@ -69,9 +69,18 @@
 #include <stdint.h>
 #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)
+
+/*
  * kvm(3) bindings for every needed symbol
  */
 static struct nlist mrl[] = {
@@ -97,6 +106,54 @@
 
 	gettimeofday(&now, NULL);
 
+#if defined(SOL_ON)
+	if (Oflag)
+	{
+# define SECOND_USECONDS 1000000 /* number of microseconds in a second */
+# define TIMEVAL_SECONDS(tv) ((tv).tv_sec + (double)(tv).tv_usec / SECOND_USECONDS)
+
+		SOL_MAP_KEYL(&sol_stream, "bandwidth start");
+		sol_float(&sol_stream, TIMEVAL_SECONDS(bw_meter->bm_start_time));
+		SOL_MAP_KEYL(&sol_stream, "bandwidth interval");
+		sol_float(&sol_stream, TIMEVAL_SECONDS(bw_meter->bm_threshold.b_time));
+		if (bw_meter->bm_flags & BW_METER_UNIT_PACKETS) {
+			SOL_MAP_KEYL(&sol_stream, "bandwidth measured packets");
+			sol_integer(&sol_stream, (uintmax_t)bw_meter->bm_measured.b_packets);
+			SOL_MAP_KEYL(&sol_stream, "bandwidth thresh packets");
+			sol_integer(&sol_stream, (uintmax_t)bw_meter->bm_threshold.b_packets);
+		}
+		if (bw_meter->bm_flags & BW_METER_UNIT_BYTES) {
+			SOL_MAP_KEYL(&sol_stream, "bandwidth measured bytes");
+			sol_integer(&sol_stream, (uintmax_t)bw_meter->bm_measured.b_bytes);
+			SOL_MAP_KEYL(&sol_stream, "bandwidth thresh bytes");
+			sol_integer(&sol_stream, (uintmax_t)bw_meter->bm_threshold.b_bytes);
+		}
+
+		/* The type of entry */
+		SOL_MAP_KEYL(&sol_stream, "meter type");
+		if (bw_meter->bm_flags & BW_METER_GEQ)
+			sol_string(&sol_stream, ">=", 2);
+		else if (bw_meter->bm_flags & BW_METER_LEQ)
+			sol_string(&sol_stream, "<=", 2);
+		else
+			sol_string(&sol_stream, "?", 1);
+
+		/* Remaining time */
+		SOL_MAP_KEYL(&sol_stream, "remain");
+		timeradd(&bw_meter->bm_start_time, &bw_meter->bm_threshold.b_time, &end);
+		if (timercmp(&now, &end, <=)) {
+			timersub(&end, &now, &delta);
+			sol_float(&sol_stream, TIMEVAL_SECONDS(delta));
+		} else {
+			/* Negative time */
+			timersub(&now, &end, &delta);
+			sol_float(&sol_stream, -TIMEVAL_SECONDS(delta));
+		}
+
+		return;
+	}
+#endif
+
 	if (! *banner_printed) {
 		printf(" Bandwidth Meters\n");
 		printf("  %-30s", "Measured(Start|Packets|Bytes)");
@@ -175,22 +232,51 @@
 
 	bw_banner_printed = 0;
 
-	if (! *banner_printed) {
-		printf("\nIPv4 Multicast Forwarding Table\n"
-		       " Origin          Group            "
-		       " Packets In-Vif  Out-Vifs:Ttls\n");
-		*banner_printed = 1;
+#if defined(SOL_ON)
+	if (Oflag)
+	{
+		const char *origin = routename(m->mfc_origin.s_addr);
+		const char *group = routename(m->mfc_mcastgrp.s_addr);
+		char index[3 + STRBUF_SIZEOF(vifi) + 1]; /* vif# */
+		size_t len;
+
+		SOL_MAP_KEYL(&sol_stream, "origin");
+		sol_string(&sol_stream, origin, strlen(origin));
+		SOL_MAP_KEYL(&sol_stream, "group");
+		sol_string(&sol_stream, group, strlen(group));
+		SOL_MAP_KEYL(&sol_stream, "packets in");
+		sol_integer(&sol_stream, m->mfc_pkt_cnt);
+		SOL_MAP_KEYL(&sol_stream, "out TTLs");
+		sol_integer(&sol_stream, m->mfc_parent);
+
+		for (vifi = 0; vifi <= maxvif; vifi++) {
+			if (m->mfc_ttls[vifi] > 0) {
+				len = snprintf(index, sizeof(index), "vif%u", vifi);
+				sol_map_key(&sol_stream, index, len);
+				sol_integer(&sol_stream, m->mfc_ttls[vifi]);
+			}
+		}
 	}
-
-	printf(" %-15.15s", routename(m->mfc_origin.s_addr));
-	printf(" %-15.15s", routename(m->mfc_mcastgrp.s_addr));
-	printf(" %9lu", m->mfc_pkt_cnt);
-	printf("  %3d   ", m->mfc_parent);
-	for (vifi = 0; vifi <= maxvif; vifi++) {
-		if (m->mfc_ttls[vifi] > 0)
-			printf(" %u:%u", vifi, m->mfc_ttls[vifi]);
+	else
+#endif
+	{
+		if (! *banner_printed) {
+			printf("\nIPv4 Multicast Forwarding Table\n"
+				   " Origin          Group            "
+				   " Packets In-Vif  Out-Vifs:Ttls\n");
+			*banner_printed = 1;
+		}
+
+		printf(" %-15.15s", routename(m->mfc_origin.s_addr));
+		printf(" %-15.15s", routename(m->mfc_mcastgrp.s_addr));
+		printf(" %9lu", m->mfc_pkt_cnt);
+		printf("  %3d   ", m->mfc_parent);
+		for (vifi = 0; vifi <= maxvif; vifi++) {
+			if (m->mfc_ttls[vifi] > 0)
+				printf(" %u:%u", vifi, m->mfc_ttls[vifi]);
+		}
+		printf("\n");
 	}
-	printf("\n");
 
 	/*
 	 * XXX We break the rules and try to use KVM to read the
@@ -202,7 +288,16 @@
 		    sizeof(bw_meter));
 		if (error)
 			break;
-		print_bw_meter(&bw_meter, &bw_banner_printed);
+#if defined(SOL_ON)
+		if (Oflag) {
+			SOL_MAP_KEYL(&sol_stream, "bandwidth");
+			sol_array_start(&sol_stream);
+			print_bw_meter(&bw_meter, &bw_banner_printed);
+			sol_array_end(&sol_stream);
+		}
+		else
+#endif
+			print_bw_meter(&bw_meter, &bw_banner_printed);
 		bwm = bw_meter.bm_mfc_next;
 	}
 }
@@ -259,32 +354,77 @@
 		kread(pviftbl, (char *)viftable, sizeof(viftable));
 	}
 
+#if defined(SOL_ON)
+	if (Oflag)
+	{
+		SOL_MAP_KEYL(&sol_stream, "vifs IPv4");
+		sol_array_start(&sol_stream);
+	}
+#endif
 	banner_printed = 0;
 	for (vifi = 0, v = viftable; vifi < MAXVIFS; ++vifi, ++v) {
 		if (v->v_lcl_addr.s_addr == 0)
 			continue;
 
 		maxvif = vifi;
-		if (!banner_printed) {
-			printf("\nIPv4 Virtual Interface Table\n"
-			       " Vif   Thresh   Local-Address   "
-			       "Remote-Address    Pkts-In   Pkts-Out\n");
-			banner_printed = 1;
-		}
-
-		printf(" %2u    %6u   %-15.15s",
-					/* opposite math of add_vif() */
-		    vifi, v->v_threshold,
-		    routename(v->v_lcl_addr.s_addr));
-		printf(" %-15.15s", (v->v_flags & VIFF_TUNNEL) ?
-		    routename(v->v_rmt_addr.s_addr) : "");
 

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-soc-all mailing list