X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/641aea2eb1957ed8dd71edf70e7438e04d131fff..49f8097206e0f6adb1c12cd7854d3e34ec886344:/usr.bin/netstat/route.c diff --git a/usr.bin/netstat/route.c b/usr.bin/netstat/route.c index 582f52c7e7..a9f8b134a6 100644 --- a/usr.bin/netstat/route.c +++ b/usr.bin/netstat/route.c @@ -32,7 +32,9 @@ */ #ifndef lint -static char sccsid[] = "@(#)route.c 5.20 (Berkeley) 11/29/90"; +/* From: static char sccsid[] = "@(#)route.c 5.20 (Berkeley) 11/29/90"; */ +static const char route_c_rcsid[] = + "$Id$"; #endif /* not lint */ #include @@ -54,6 +56,7 @@ static char sccsid[] = "@(#)route.c 5.20 (Berkeley) 11/29/90"; #include #include +#include extern int nflag, aflag, Aflag, af; int do_rtent; @@ -61,7 +64,7 @@ extern char *routename(), *netname(), *plural(); #ifdef NS extern char *ns_print(); #endif -extern char *malloc(); + #define kget(p, d) \ (kvm_read((off_t)(p), (char *)&(d), sizeof (d))) @@ -81,6 +84,8 @@ struct bits { { RTF_XRESOLVE, 'X' }, { RTF_LLINFO, 'L' }, { RTF_REJECT, 'R' }, + { RTF_PROTO2, '2' }, + { RTF_PROTO1, '1' }, { 0 } }; @@ -96,6 +101,18 @@ p_proto(proto) case AF_INET: printf("inet"); break; + case AF_NS: + printf("NS"); + break; + case AF_OSI: + printf("OSI"); + break; + case AF_CCITT: + printf("CCITT"); + break; + case AF_APPLETALK: + printf("AppleTalk"); + break; default: printf("%d", proto); break; @@ -106,6 +123,7 @@ p_proto(proto) /* * Print routing tables. */ +int routepr(hostaddr, netaddr, hashsizeaddr, treeaddr) off_t hostaddr, netaddr, hashsizeaddr, treeaddr; { @@ -117,50 +135,26 @@ routepr(hostaddr, netaddr, hashsizeaddr, treeaddr) int hashsize; int i, doinghost = 1; + if (!treeaddr) { + printf("Could not find routing tables\n"); + return 1; + } printf("Routing tables\n"); if (Aflag) printf("%-8.8s ","Address"); - printf("%-16.16s %-18.18s %-6.6s %6.6s%8.8s %s\n", + printf("%-16.16s %-18.18s %-6.6s %6.6s%8.8s %-5.5s", "Destination", "Gateway", - "Flags", "Refs", "Use", "Interface"); - if (treeaddr) - return treestuff(treeaddr); - if (hostaddr == 0) { - printf("rthost: symbol not in namelist\n"); - return; - } - if (netaddr == 0) { - printf("rtnet: symbol not in namelist\n"); - return; - } - if (hashsizeaddr == 0) { - printf("rthashsize: symbol not in namelist\n"); - return; - } - kget(hashsizeaddr, hashsize); - routehash = (struct mbuf **)malloc( hashsize*sizeof (struct mbuf *) ); - kvm_read(hostaddr, (char *)routehash, hashsize*sizeof (struct mbuf *)); -again: - for (i = 0; i < hashsize; i++) { - if (routehash[i] == 0) - continue; - m = routehash[i]; - while (m) { - kget(m, mb); - if (Aflag) - printf("%8.8x ", m); - p_ortentry((struct ortentry *)(mb.m_dat)); - m = mb.m_next; - } - } - if (doinghost) { - kvm_read(netaddr, (char *)routehash, - hashsize*sizeof (struct mbuf *)); - doinghost = 0; - goto again; + "Flags", "Refs", "Use", "Iface"); + if(!aflag) { + printf("%-6.6s %-6.6s\n", "MTU", "Rtt"); + } else { + printf("\n %8s %8s %8s %8s %8s %8s %8s %8s\n", + "MTU", "Hopcount", "Expire", "recvpipe", + "sendpipe", "ssthresh", "RTT", "RTT var."); } - free((char *)routehash); - return; + + return treestuff(treeaddr); + } static union { @@ -407,29 +401,90 @@ register struct rtentry *rt; } kget(rt->rt_ifp, ifnet); kvm_read((off_t)ifnet.if_name, name, 16); - printf(" %.15s%d%s", name, ifnet.if_unit, - rt->rt_nodes[0].rn_dupedkey ? " =>\n" : "\n"); -} - -p_ortentry(rt) -register struct ortentry *rt; -{ - char name[16], *flags; - register struct bits *p; - register struct sockaddr_in *sin; - struct ifnet ifnet; - - p_sockaddr(&rt->rt_dst, rt->rt_flags, 16); - p_sockaddr(&rt->rt_gateway, 0, 18); - p_flags(rt->rt_flags, "%-6.6s "); - printf("%6d %8d ", rt->rt_refcnt, rt->rt_use); - if (rt->rt_ifp == 0) { - putchar('\n'); - return; + printf(" %.2s%d", name, ifnet.if_unit); + if(aflag) { + /* + * MTU + */ + if(rt->rt_rmx.rmx_mtu) + printf("\n %7d%c", rt->rt_rmx.rmx_mtu, + (rt->rt_rmx.rmx_locks & RTV_MTU) ? '*' : ' '); + else + printf("\n %-7s ", "-"); + + /* + * Hop count + */ + if(rt->rt_rmx.rmx_hopcount) + printf(" %7d%c", rt->rt_rmx.rmx_hopcount, + (rt->rt_rmx.rmx_locks & RTV_HOPCOUNT) ? '*' : ' '); + else + printf(" %-6s ", "-"); + + /* + * Expiration time + */ + if(rt->rt_rmx.rmx_expire) + printf(" %7d%c", rt->rt_rmx.rmx_expire, + (rt->rt_rmx.rmx_locks & RTV_EXPIRE) ? '*' : ' '); + else + printf(" %-7s ", "-"); + + /* + * Receive pipe size (bytes) + */ + if(rt->rt_rmx.rmx_recvpipe) + printf(" %7d%c", rt->rt_rmx.rmx_recvpipe, + (rt->rt_rmx.rmx_locks & RTV_RPIPE) ? '*' : ' '); + else + printf(" %-7s ", "-"); + + /* + * Send pipe size (bytes) + */ + if(rt->rt_rmx.rmx_sendpipe) + printf(" %7d%c", rt->rt_rmx.rmx_sendpipe, + (rt->rt_rmx.rmx_locks & RTV_SPIPE) ? '*' : ' '); + else + printf(" %-7s ", "-"); + + /* + * Slow-start threshold (bytes) + */ + if(rt->rt_rmx.rmx_ssthresh) + printf(" %7d%c", rt->rt_rmx.rmx_ssthresh, + (rt->rt_rmx.rmx_locks & RTV_SSTHRESH) ? '*' : ' '); + else + printf(" %-7s ", "-"); + + /* + * Round-trip time (seconds) + */ + if(rt->rt_rmx.rmx_rtt) + printf(" %7.4f%c", (1.0 * rt->rt_rmx.rmx_rtt) / RTM_RTTUNIT, + (rt->rt_rmx.rmx_locks & RTV_RTT) ? '*' : ' '); + else + printf(" %-7s ", "-"); + + /* + * Round-trip time variance (seconds) + */ + if(rt->rt_rmx.rmx_rttvar) + printf(" %7.4f%c", (1.0 * rt->rt_rmx.rmx_rttvar) / RTM_RTTUNIT, + (rt->rt_rmx.rmx_locks & RTV_RTTVAR) ? '*' : ' '); + else + printf(" %-7s ", "-"); + } else { /* no -a flag */ + if(rt->rt_rmx.rmx_mtu) + printf(" %6d", rt->rt_rmx.rmx_mtu); + else + printf(" %-6s", "-"); + if(rt->rt_rmx.rmx_rtt) + printf(" %6.3f", (1. * rt->rt_rmx.rmx_rtt) / RTM_RTTUNIT); + else + printf(" %-6s", "-"); } - kget(rt->rt_ifp, ifnet); - kvm_read((off_t)ifnet.if_name, name, 16); - printf(" %.15s%d\n", name, ifnet.if_unit); + printf(rt->rt_nodes[0].rn_dupedkey ? " =>\n" : "\n"); } char *