From owner-svn-soc-all@FreeBSD.ORG Mon Jun 16 17:43:30 2014 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 7516A9CE for ; Mon, 16 Jun 2014 17:43:30 +0000 (UTC) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 5FEA42A87 for ; Mon, 16 Jun 2014 17:43:30 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.8/8.14.8) with ESMTP id s5GHhUeH079625 for ; Mon, 16 Jun 2014 17:43:30 GMT (envelope-from zkorchev@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.8/8.14.8/Submit) id s5GHhSnc079596 for svn-soc-all@FreeBSD.org; Mon, 16 Jun 2014 17:43:28 GMT (envelope-from zkorchev@FreeBSD.org) Date: Mon, 16 Jun 2014 17:43:28 GMT Message-Id: <201406161743.s5GHhSnc079596@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to zkorchev@FreeBSD.org using -f From: zkorchev@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r269630 - soc2014/zkorchev/freebsd_head/usr.bin/netstat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 Jun 2014 17:43:30 -0000 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, "", 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, "", 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 #include #include +#include #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 #include #include +#include +#include #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 ***