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