Module Name: src Committed By: tls Date: Sun Aug 10 06:58:32 UTC 2014
Modified Files: src/usr.bin/netstat [tls-earlyentropy]: main.c netstat.h route.c show.c Log Message: Rebase. To generate a diff of this commit: cvs rdiff -u -r1.88 -r1.88.2.1 src/usr.bin/netstat/main.c cvs rdiff -u -r1.48 -r1.48.2.1 src/usr.bin/netstat/netstat.h cvs rdiff -u -r1.80 -r1.80.6.1 src/usr.bin/netstat/route.c cvs rdiff -u -r1.18 -r1.18.2.1 src/usr.bin/netstat/show.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/netstat/main.c diff -u src/usr.bin/netstat/main.c:1.88 src/usr.bin/netstat/main.c:1.88.2.1 --- src/usr.bin/netstat/main.c:1.88 Sat Nov 23 22:01:12 2013 +++ src/usr.bin/netstat/main.c Sun Aug 10 06:58:32 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.88 2013/11/23 22:01:12 christos Exp $ */ +/* $NetBSD: main.c,v 1.88.2.1 2014/08/10 06:58:32 tls Exp $ */ /* * Copyright (c) 1983, 1988, 1993 @@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1983, 19 #if 0 static char sccsid[] = "from: @(#)main.c 8.4 (Berkeley) 3/1/94"; #else -__RCSID("$NetBSD: main.c,v 1.88 2013/11/23 22:01:12 christos Exp $"); +__RCSID("$NetBSD: main.c,v 1.88.2.1 2014/08/10 06:58:32 tls Exp $"); #endif #endif /* not lint */ @@ -79,8 +79,8 @@ struct nlist nl[] = { { "_udbtable", 0, 0, 0, 0 }, #define N_UDPSTAT 5 { "_udpstat", 0, 0, 0, 0 }, /* not available via kvm */ -#define N_IFNET 6 - { "_ifnet", 0, 0, 0, 0 }, +#define N_IFNET_LIST 6 + { "_ifnet_list", 0, 0, 0, 0 }, #define N_ICMPSTAT 7 { "_icmpstat", 0, 0, 0, 0 }, /* not available via kvm */ #define N_RTSTAT 8 @@ -570,7 +570,7 @@ main(int argc, char *argv[]) } if (pflag) { if (iflag && tp->pr_istats) - intpr(interval, nl[N_IFNET].n_value, tp->pr_istats); + intpr(interval, nl[N_IFNET_LIST].n_value, tp->pr_istats); else if (tp->pr_stats) (*tp->pr_stats)(nl[tp->pr_sindex].n_value, tp->pr_name); @@ -624,17 +624,17 @@ main(int argc, char *argv[]) if (af != AF_UNSPEC) goto protostat; - intpr(interval, nl[N_IFNET].n_value, NULL); + intpr(interval, nl[N_IFNET_LIST].n_value, NULL); break; } if (rflag) { if (sflag) rt_stats(use_sysctl ? 0 : nl[N_RTSTAT].n_value); else { - if (!use_sysctl) - err(1, "-r is not supported " - "for post-mortem analysis."); - p_rttables(af); + if (use_sysctl) + p_rttables(af); + else + routepr(nl[N_RTREE].n_value); } break; } @@ -723,7 +723,7 @@ printproto(struct protox *tp, const char if (sflag) { if (iflag) { if (tp->pr_istats) - intpr(interval, nl[N_IFNET].n_value, + intpr(interval, nl[N_IFNET_LIST].n_value, tp->pr_istats); return; } Index: src/usr.bin/netstat/netstat.h diff -u src/usr.bin/netstat/netstat.h:1.48 src/usr.bin/netstat/netstat.h:1.48.2.1 --- src/usr.bin/netstat/netstat.h:1.48 Sat Nov 23 22:01:12 2013 +++ src/usr.bin/netstat/netstat.h Sun Aug 10 06:58:32 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: netstat.h,v 1.48 2013/11/23 22:01:12 christos Exp $ */ +/* $NetBSD: netstat.h,v 1.48.2.1 2014/08/10 06:58:32 tls Exp $ */ /* * Copyright (c) 1992, 1993 @@ -67,57 +67,59 @@ int use_sysctl; /* use sysctl instead of int force_sysctl; /* force use of sysctl (or exit) - for testing */ -int kread __P((u_long addr, char *buf, int size)); -const char *plural __P((int)); -const char *plurales __P((int)); -int get_hardticks __P((void)); - -void protopr __P((u_long, const char *)); -void tcp_stats __P((u_long, const char *)); -void tcp_dump __P((u_long, const char *, u_long)); -void udp_stats __P((u_long, const char *)); -void ip_stats __P((u_long, const char *)); -void icmp_stats __P((u_long, const char *)); -void igmp_stats __P((u_long, const char *)); -void pim_stats __P((u_long, const char *)); -void arp_stats __P((u_long, const char *)); -void carp_stats __P((u_long, const char *)); -void pfsync_stats __P((u_long, const char*)); +int kread(u_long addr, char *buf, int size); +const char *plural(int); +const char *plurales(int); +int get_hardticks(void); + +void protopr(u_long, const char *); +void tcp_stats(u_long, const char *); +void tcp_dump(u_long, const char *, u_long); +void udp_stats(u_long, const char *); +void ip_stats(u_long, const char *); +void icmp_stats(u_long, const char *); +void igmp_stats(u_long, const char *); +void pim_stats(u_long, const char *); +void arp_stats(u_long, const char *); +void carp_stats(u_long, const char *); +void pfsync_stats(u_long, const char*); #ifdef IPSEC -void fast_ipsec_stats __P((u_long, const char *)); +void fast_ipsec_stats(u_long, const char *); #endif #ifdef INET6 struct sockaddr_in6; struct in6_addr; -void ip6protopr __P((u_long, const char *)); -void tcp6_stats __P((u_long, const char *)); -void tcp6_dump __P((u_long, const char *, u_long)); -void udp6_stats __P((u_long, const char *)); -void ip6_stats __P((u_long, const char *)); -void ip6_ifstats __P((const char *)); -void icmp6_stats __P((u_long, const char *)); -void icmp6_ifstats __P((const char *)); -void pim6_stats __P((u_long, const char *)); -void rip6_stats __P((u_long, const char *)); -void mroute6pr __P((u_long, u_long, u_long)); -void mrt6_stats __P((u_long, u_long)); -char *routename6 __P((struct sockaddr_in6 *)); +void ip6protopr(u_long, const char *); +void tcp6_stats(u_long, const char *); +void tcp6_dump(u_long, const char *, u_long); +void udp6_stats(u_long, const char *); +void ip6_stats(u_long, const char *); +void ip6_ifstats(const char *); +void icmp6_stats(u_long, const char *); +void icmp6_ifstats(const char *); +void pim6_stats(u_long, const char *); +void rip6_stats(u_long, const char *); +void mroute6pr(u_long, u_long, u_long); +void mrt6_stats(u_long, u_long); +char *routename6(struct sockaddr_in6 *); #endif /*INET6*/ #ifdef IPSEC -void pfkey_stats __P((u_long, const char *)); +void pfkey_stats(u_long, const char *); #endif void mbpr(u_long, u_long, u_long, u_long, u_long); -void hostpr __P((u_long, u_long)); -void impstats __P((u_long, u_long)); +void hostpr(u_long, u_long); +void impstats(u_long, u_long); -void pr_rthdr __P((int, int)); -void pr_family __P((int)); -void rt_stats __P((u_long)); -char *ns_phost __P((struct sockaddr *)); +void pr_rthdr(int, int); +void pr_family(int); +struct rt_metrics; +void pr_rtrmx(struct rt_metrics *); +void rt_stats(u_long); +char *ns_phost(struct sockaddr *); void p_rttables(int); void p_flags(int, const char *); @@ -129,30 +131,31 @@ char *routename4(in_addr_t); char *netname(struct sockaddr *, struct sockaddr *); char *netname4(in_addr_t, in_addr_t); -/* char *routename __P((u_int32_t)); */ -/* char *netname __P((u_int32_t, u_int32_t)); */ +/* char *routename(u_int32_t); */ +/* char *netname(u_int32_t, u_int32_t); */ #ifdef INET6 -char *netname6 __P((struct sockaddr_in6 *, struct sockaddr_in6 *)); +char *netname6(struct sockaddr_in6 *, struct sockaddr_in6 *); #endif -const char *atalk_print __P((const struct sockaddr *, int)); -const char *atalk_print2 __P((const struct sockaddr *, const struct sockaddr *, - int)); -char *ns_print __P((struct sockaddr *)); - -void nsprotopr __P((u_long, const char *)); -void spp_stats __P((u_long, const char *)); -void idp_stats __P((u_long, const char *)); -void nserr_stats __P((u_long, const char *)); - -void atalkprotopr __P((u_long, const char *)); -void ddp_stats __P((u_long, const char *)); - -void intpr __P((int, u_long, void (*) __P((const char *)))); - -void unixpr __P((u_long)); - -void mroutepr __P((u_long, u_long, u_long, u_long)); -void mrt_stats __P((u_long, u_long)); +const char *atalk_print(const struct sockaddr *, int); +const char *atalk_print2(const struct sockaddr *, const struct sockaddr *, + int); +char *ns_print(struct sockaddr *); + +void nsprotopr(u_long, const char *); +void spp_stats(u_long, const char *); +void idp_stats(u_long, const char *); +void nserr_stats(u_long, const char *); + +void atalkprotopr(u_long, const char *); +void ddp_stats(u_long, const char *); + +void intpr(int, u_long, void (*)(const char *)); + +void unixpr(u_long); + +void routepr(u_long); +void mroutepr(u_long, u_long, u_long, u_long); +void mrt_stats(u_long, u_long); void bpf_stats(void); void bpf_dump(const char *); Index: src/usr.bin/netstat/route.c diff -u src/usr.bin/netstat/route.c:1.80 src/usr.bin/netstat/route.c:1.80.6.1 --- src/usr.bin/netstat/route.c:1.80 Mon Jan 28 13:49:08 2013 +++ src/usr.bin/netstat/route.c Sun Aug 10 06:58:32 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: route.c,v 1.80 2013/01/28 13:49:08 joerg Exp $ */ +/* $NetBSD: route.c,v 1.80.6.1 2014/08/10 06:58:32 tls Exp $ */ /* * Copyright (c) 1983, 1988, 1993 @@ -30,15 +30,284 @@ */ #include <sys/cdefs.h> +#ifndef lint +#if 0 +static char sccsid[] = "from: @(#)route.c 8.3 (Berkeley) 3/9/94"; +#else +__RCSID("$NetBSD: route.c,v 1.80.6.1 2014/08/10 06:58:32 tls Exp $"); +#endif +#endif /* not lint */ -__RCSID("$NetBSD: route.c,v 1.80 2013/01/28 13:49:08 joerg Exp $"); +#include <stdbool.h> +#include <sys/param.h> +#include <sys/protosw.h> +#include <sys/socket.h> +#include <sys/mbuf.h> +#include <sys/un.h> -#include <sys/sysctl.h> +#include <net/if.h> +#include <net/if_dl.h> +#include <net/if_types.h> #include <net/route.h> +#include <netinet/in.h> +#include <netatalk/at.h> +#include <netmpls/mpls.h> + +#include <sys/sysctl.h> + +#include <arpa/inet.h> + #include <err.h> +#include <kvm.h> +#include <netdb.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> #include "netstat.h" +#define kget(p, d) (kread((u_long)(p), (char *)&(d), sizeof (d))) + +/* + * XXX we put all of the sockaddr types in here to force the alignment + * to be correct. + */ +static union sockaddr_union { + struct sockaddr u_sa; + struct sockaddr_in u_in; + struct sockaddr_un u_un; + struct sockaddr_at u_at; + struct sockaddr_dl u_dl; + u_short u_data[128]; + int u_dummy; /* force word-alignment */ +} pt_u; + +int do_rtent = 0; +struct rtentry rtentry; +struct radix_node rnode; +struct radix_mask rmask; + +static struct sockaddr *kgetsa(const struct sockaddr *); +static void p_tree(struct radix_node *); +static void p_rtnode(void); +static void p_krtentry(struct rtentry *); + +/* + * Print routing tables. + */ +void +routepr(u_long rtree) +{ + struct radix_node_head *rnh, head; + struct radix_node_head *rt_nodes[AF_MAX+1]; + int i; + + printf("Routing tables\n"); + + if (rtree == 0) { + printf("rt_tables: symbol not in namelist\n"); + return; + } + + kget(rtree, rt_nodes); + for (i = 0; i <= AF_MAX; i++) { + if ((rnh = rt_nodes[i]) == 0) + continue; + kget(rnh, head); + if (i == AF_UNSPEC) { + if (Aflag && (af == 0 || af == 0xff)) { + printf("Netmasks:\n"); + p_tree(head.rnh_treetop); + } + } else if (af == AF_UNSPEC || af == i) { + pr_family(i); + do_rtent = 1; + pr_rthdr(i, Aflag); + p_tree(head.rnh_treetop); + } + } +} + +static struct sockaddr * +kgetsa(const struct sockaddr *dst) +{ + + kget(dst, pt_u.u_sa); + if (pt_u.u_sa.sa_len > sizeof (pt_u.u_sa)) + kread((u_long)dst, (char *)pt_u.u_data, pt_u.u_sa.sa_len); + return (&pt_u.u_sa); +} + +static void +p_tree(struct radix_node *rn) +{ + +again: + kget(rn, rnode); + if (rnode.rn_b < 0) { + if (Aflag) + printf("%-8.8lx ", (u_long) rn); + if (rnode.rn_flags & RNF_ROOT) { + if (Aflag) + printf("(root node)%s", + rnode.rn_dupedkey ? " =>\n" : "\n"); + } else if (do_rtent) { + kget(rn, rtentry); + p_krtentry(&rtentry); + if (Aflag) + p_rtnode(); + } else { + p_sockaddr(kgetsa((const struct sockaddr *)rnode.rn_key), + NULL, 0, 44); + putchar('\n'); + } + if ((rn = rnode.rn_dupedkey) != NULL) + goto again; + } else { + if (Aflag && do_rtent) { + printf("%-8.8lx ", (u_long) rn); + p_rtnode(); + } + rn = rnode.rn_r; + p_tree(rnode.rn_l); + p_tree(rn); + } +} + +static void +p_rtnode(void) +{ + struct radix_mask *rm = rnode.rn_mklist; + char nbuf[20]; + + if (rnode.rn_b < 0) { + if (rnode.rn_mask) { + printf("\t mask "); + p_sockaddr(kgetsa((const struct sockaddr *)rnode.rn_mask), + NULL, 0, -1); + } else if (rm == 0) + return; + } else { + (void)snprintf(nbuf, sizeof nbuf, "(%d)", rnode.rn_b); + printf("%6.6s %8.8lx : %8.8lx", nbuf, (u_long) rnode.rn_l, + (u_long) rnode.rn_r); + } + while (rm) { + kget(rm, rmask); + (void)snprintf(nbuf, sizeof nbuf, " %d refs, ", rmask.rm_refs); + printf(" mk = %8.8lx {(%d),%s", (u_long) rm, + -1 - rmask.rm_b, rmask.rm_refs ? nbuf : " "); + if (rmask.rm_flags & RNF_NORMAL) { + struct radix_node rnode_aux; + printf(" <normal>, "); + kget(rmask.rm_leaf, rnode_aux); + p_sockaddr(kgetsa((const struct sockaddr *)rnode_aux.rn_mask), + NULL, 0, -1); + } else + p_sockaddr(kgetsa((const struct sockaddr *)rmask.rm_mask), + NULL, 0, -1); + putchar('}'); + if ((rm = rmask.rm_mklist) != NULL) + printf(" ->"); + } + putchar('\n'); +} + +static struct sockaddr *sockcopy(struct sockaddr *, union sockaddr_union *); + +/* + * copy a sockaddr into an allocated region, allocate at least sockaddr + * bytes and zero unused + */ +static struct sockaddr * +sockcopy(struct sockaddr *sp, union sockaddr_union *dp) +{ + int len; + + if (sp == 0 || sp->sa_len == 0) + (void)memset(dp, 0, sizeof (*sp)); + else { + len = (sp->sa_len >= sizeof (*sp)) ? sp->sa_len : sizeof (*sp); + (void)memcpy(dp, sp, len); + } + return ((struct sockaddr *)dp); +} + +static void +p_krtentry(struct rtentry *rt) +{ + static struct ifnet ifnet, *lastif; + union sockaddr_union addr_un, mask_un; + struct sockaddr *addr, *mask; + + if (Lflag && (rt->rt_flags & RTF_LLINFO)) + return; + + memset(&addr_un, 0, sizeof(addr_un)); + memset(&mask_un, 0, sizeof(mask_un)); + addr = sockcopy(kgetsa(rt_getkey(rt)), &addr_un); + if (rt_mask(rt)) + mask = sockcopy(kgetsa(rt_mask(rt)), &mask_un); + else + mask = sockcopy(NULL, &mask_un); + p_addr(addr, mask, rt->rt_flags); + p_gwaddr(kgetsa(rt->rt_gateway), kgetsa(rt->rt_gateway)->sa_family); + p_flags(rt->rt_flags, "%-6.6s "); + printf("%6d %8"PRIu64" ", rt->rt_refcnt, rt->rt_use); + if (rt->rt_rmx.rmx_mtu) + printf("%6"PRIu64, rt->rt_rmx.rmx_mtu); + else + printf("%6s", "-"); + putchar((rt->rt_rmx.rmx_locks & RTV_MTU) ? 'L' : ' '); + if (tagflag == 1) { + if (rt->rt_tag != NULL) { + const struct sockaddr *tagsa = kgetsa(rt->rt_tag); + char *tagstr; + + if (tagsa->sa_family == AF_MPLS) { + tagstr = mpls_ntoa(tagsa); + if (strlen(tagstr) < 7) + printf("%7s", tagstr); + else + printf("%s", tagstr); + } + else + printf("%7s", "-"); + } else + printf("%7s", "-"); + } + if (rt->rt_ifp) { + if (rt->rt_ifp != lastif) { + kget(rt->rt_ifp, ifnet); + lastif = rt->rt_ifp; + } + printf(" %.16s%s", ifnet.if_xname, + rt->rt_nodes[0].rn_dupedkey ? " =>" : ""); + } + putchar('\n'); + if (vflag) + pr_rtrmx(&rt->rt_rmx); +} + +void +pr_rtrmx(struct rt_metrics *rmx) +{ + printf("\texpire %10"PRId64"%c recvpipe %10"PRIu64"%c " + "sendpipe %10"PRIu64"%c\n", + (int64_t)rmx->rmx_expire, + (rmx->rmx_locks & RTV_EXPIRE) ? 'L' : ' ', rmx->rmx_recvpipe, + (rmx->rmx_locks & RTV_RPIPE) ? 'L' : ' ', rmx->rmx_sendpipe, + (rmx->rmx_locks & RTV_SPIPE) ? 'L' : ' '); + printf("\tssthresh %10"PRIu64"%c rtt %10"PRIu64"%c " + "rttvar %10"PRIu64"%c\n", rmx->rmx_ssthresh, + (rmx->rmx_locks & RTV_SSTHRESH) ? 'L' : ' ', + rmx->rmx_rtt, (rmx->rmx_locks & RTV_RTT) ? 'L' : ' ', + rmx->rmx_rttvar, (rmx->rmx_locks & RTV_RTTVAR) ? 'L' : ' '); + printf("\thopcount %10"PRIu64"%c\n", + rmx->rmx_hopcount, (rmx->rmx_locks & RTV_HOPCOUNT) ? 'L' : ' '); +} + /* * Print routing statistics */ Index: src/usr.bin/netstat/show.c diff -u src/usr.bin/netstat/show.c:1.18 src/usr.bin/netstat/show.c:1.18.2.1 --- src/usr.bin/netstat/show.c:1.18 Sat Oct 19 15:56:06 2013 +++ src/usr.bin/netstat/show.c Sun Aug 10 06:58:32 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: show.c,v 1.18 2013/10/19 15:56:06 christos Exp $ */ +/* $NetBSD: show.c,v 1.18.2.1 2014/08/10 06:58:32 tls Exp $ */ /* $OpenBSD: show.c,v 1.1 2006/05/27 19:16:37 claudio Exp $ */ /* @@ -273,6 +273,8 @@ p_rtentry(struct rt_msghdr *rtm) p_tag(rti_info[RTAX_TAG]); printf(" %.16s", if_indextoname(rtm->rtm_index, ifbuf)); putchar('\n'); + if (vflag) + pr_rtrmx(&rtm->rtm_rmx); } /* @@ -703,6 +705,7 @@ char * mpls_ntoa(const struct sockaddr *sa) { static char obuf[16]; + size_t olen; const union mpls_shim *pms; union mpls_shim ms; int psize = sizeof(struct sockaddr_mpls); @@ -715,7 +718,8 @@ mpls_ntoa(const struct sockaddr *sa) while(psize < sa->sa_len) { pms++; ms.s_addr = ntohl(pms->s_addr); - snprintf(obuf, sizeof(obuf), "%s,%u", obuf, + olen = strlen(obuf); + snprintf(obuf + olen, sizeof(obuf) - olen, ",%u", ms.shim.label); psize+=sizeof(ms); }