19b50d902SRodney W. Grimes /* 29b50d902SRodney W. Grimes * Copyright (c) 1983, 1988, 1993 39b50d902SRodney W. Grimes * The Regents of the University of California. All rights reserved. 49b50d902SRodney W. Grimes * 59b50d902SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 69b50d902SRodney W. Grimes * modification, are permitted provided that the following conditions 79b50d902SRodney W. Grimes * are met: 89b50d902SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 99b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 109b50d902SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 119b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 129b50d902SRodney W. Grimes * documentation and/or other materials provided with the distribution. 139b50d902SRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 149b50d902SRodney W. Grimes * must display the following acknowledgement: 159b50d902SRodney W. Grimes * This product includes software developed by the University of 169b50d902SRodney W. Grimes * California, Berkeley and its contributors. 179b50d902SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 189b50d902SRodney W. Grimes * may be used to endorse or promote products derived from this software 199b50d902SRodney W. Grimes * without specific prior written permission. 209b50d902SRodney W. Grimes * 219b50d902SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 229b50d902SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 239b50d902SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 249b50d902SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 259b50d902SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 269b50d902SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 279b50d902SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 289b50d902SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 299b50d902SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 309b50d902SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 319b50d902SRodney W. Grimes * SUCH DAMAGE. 329b50d902SRodney W. Grimes */ 339b50d902SRodney W. Grimes 349b50d902SRodney W. Grimes #ifndef lint 3587669425SGarrett Wollman /* 3605ddff6eSPeter Wemm static char sccsid[] = "@(#)if.c 8.3 (Berkeley) 4/28/95"; 3787669425SGarrett Wollman */ 3887669425SGarrett Wollman static const char rcsid[] = 3975fb8770SGarrett Wollman "$Id: if.c,v 1.20 1997/01/03 20:16:29 wollman Exp $"; 409b50d902SRodney W. Grimes #endif /* not lint */ 419b50d902SRodney W. Grimes 429b50d902SRodney W. Grimes #include <sys/types.h> 439b50d902SRodney W. Grimes #include <sys/protosw.h> 449b50d902SRodney W. Grimes #include <sys/socket.h> 45628d2ac1SGarrett Wollman #include <sys/time.h> 469b50d902SRodney W. Grimes 479b50d902SRodney W. Grimes #include <net/if.h> 4887669425SGarrett Wollman #include <net/if_var.h> 499b50d902SRodney W. Grimes #include <net/if_dl.h> 50f6719675SBill Fenner #include <net/if_types.h> 5175fb8770SGarrett Wollman #include <net/ethernet.h> 529b50d902SRodney W. Grimes #include <netinet/in.h> 539b50d902SRodney W. Grimes #include <netinet/in_var.h> 54cc6a66f2SJulian Elischer #include <netipx/ipx.h> 55cc6a66f2SJulian Elischer #include <netipx/ipx_if.h> 56cbc17e71SGarrett Wollman #ifdef NS 579b50d902SRodney W. Grimes #include <netns/ns.h> 589b50d902SRodney W. Grimes #include <netns/ns_if.h> 59cbc17e71SGarrett Wollman #endif 600761cb29SGarrett Wollman #ifdef ISO 619b50d902SRodney W. Grimes #include <netiso/iso.h> 629b50d902SRodney W. Grimes #include <netiso/iso_var.h> 630761cb29SGarrett Wollman #endif 649b50d902SRodney W. Grimes #include <arpa/inet.h> 659b50d902SRodney W. Grimes 669b50d902SRodney W. Grimes #include <signal.h> 679b50d902SRodney W. Grimes #include <stdio.h> 689b50d902SRodney W. Grimes #include <string.h> 699b50d902SRodney W. Grimes #include <unistd.h> 709b50d902SRodney W. Grimes 719b50d902SRodney W. Grimes #include "netstat.h" 729b50d902SRodney W. Grimes 739b50d902SRodney W. Grimes #define YES 1 749b50d902SRodney W. Grimes #define NO 0 759b50d902SRodney W. Grimes 769b50d902SRodney W. Grimes static void sidewaysintpr __P((u_int, u_long)); 779b50d902SRodney W. Grimes static void catchalarm __P((int)); 789b50d902SRodney W. Grimes 799b50d902SRodney W. Grimes /* 809b50d902SRodney W. Grimes * Print a description of the network interfaces. 819b50d902SRodney W. Grimes */ 829b50d902SRodney W. Grimes void 839b50d902SRodney W. Grimes intpr(interval, ifnetaddr) 849b50d902SRodney W. Grimes int interval; 859b50d902SRodney W. Grimes u_long ifnetaddr; 869b50d902SRodney W. Grimes { 879b50d902SRodney W. Grimes struct ifnet ifnet; 880e27dc05SGarrett Wollman struct ifnethead ifnethead; 899b50d902SRodney W. Grimes union { 909b50d902SRodney W. Grimes struct ifaddr ifa; 919b50d902SRodney W. Grimes struct in_ifaddr in; 92cc6a66f2SJulian Elischer struct ipx_ifaddr ipx; 93cbc17e71SGarrett Wollman #ifdef NS 949b50d902SRodney W. Grimes struct ns_ifaddr ns; 95cbc17e71SGarrett Wollman #endif 960761cb29SGarrett Wollman #ifdef ISO 979b50d902SRodney W. Grimes struct iso_ifaddr iso; 980761cb29SGarrett Wollman #endif 999b50d902SRodney W. Grimes } ifaddr; 1009b50d902SRodney W. Grimes u_long ifaddraddr; 101f6719675SBill Fenner u_long ifaddrfound; 102f6719675SBill Fenner u_long ifnetfound; 1039b50d902SRodney W. Grimes struct sockaddr *sa; 1041b72e71cSDavid Greenman char name[32], tname[16]; 1059b50d902SRodney W. Grimes 1069b50d902SRodney W. Grimes if (ifnetaddr == 0) { 1079b50d902SRodney W. Grimes printf("ifnet: symbol not defined\n"); 1089b50d902SRodney W. Grimes return; 1099b50d902SRodney W. Grimes } 1109b50d902SRodney W. Grimes if (interval) { 1119b50d902SRodney W. Grimes sidewaysintpr((unsigned)interval, ifnetaddr); 1129b50d902SRodney W. Grimes return; 1139b50d902SRodney W. Grimes } 1140e27dc05SGarrett Wollman if (kread(ifnetaddr, (char *)&ifnethead, sizeof ifnethead)) 1159b50d902SRodney W. Grimes return; 1160e27dc05SGarrett Wollman ifnetaddr = (u_long)ifnethead.tqh_first; 1170e27dc05SGarrett Wollman if (kread(ifnetaddr, (char *)&ifnet, sizeof ifnet)) 1180e27dc05SGarrett Wollman return; 1190e27dc05SGarrett Wollman 120cc6a66f2SJulian Elischer printf("%-5.5s %-5.5s %-13.13s %-15.15s %8.8s %5.5s", 121e1e293a5SDavid Greenman "Name", "Mtu", "Network", "Address", "Ipkts", "Ierrs"); 122e1e293a5SDavid Greenman if (bflag) 123e1e293a5SDavid Greenman printf(" %10.10s","Ibytes"); 124e1e293a5SDavid Greenman printf(" %8.8s %5.5s", "Opkts", "Oerrs"); 125e1e293a5SDavid Greenman if (bflag) 126e1e293a5SDavid Greenman printf(" %10.10s","Obytes"); 1279b50d902SRodney W. Grimes printf(" %5s", "Coll"); 1289b50d902SRodney W. Grimes if (tflag) 1299b50d902SRodney W. Grimes printf(" %s", "Time"); 1309b50d902SRodney W. Grimes if (dflag) 1319b50d902SRodney W. Grimes printf(" %s", "Drop"); 1329b50d902SRodney W. Grimes putchar('\n'); 1339b50d902SRodney W. Grimes ifaddraddr = 0; 1349b50d902SRodney W. Grimes while (ifnetaddr || ifaddraddr) { 1359b50d902SRodney W. Grimes struct sockaddr_in *sin; 1369b50d902SRodney W. Grimes register char *cp; 1379b50d902SRodney W. Grimes int n, m; 1389b50d902SRodney W. Grimes 1399b50d902SRodney W. Grimes if (ifaddraddr == 0) { 140f6719675SBill Fenner ifnetfound = ifnetaddr; 1419b50d902SRodney W. Grimes if (kread(ifnetaddr, (char *)&ifnet, sizeof ifnet) || 1421b72e71cSDavid Greenman kread((u_long)ifnet.if_name, tname, 16)) 1439b50d902SRodney W. Grimes return; 1441b72e71cSDavid Greenman tname[15] = '\0'; 1450e27dc05SGarrett Wollman ifnetaddr = (u_long)ifnet.if_link.tqe_next; 1461b72e71cSDavid Greenman snprintf(name, 32, "%s%d", tname, ifnet.if_unit); 1471b72e71cSDavid Greenman if (interface != 0 && (strcmp(name, interface) != 0)) 1489b50d902SRodney W. Grimes continue; 1499b50d902SRodney W. Grimes cp = index(name, '\0'); 1509b50d902SRodney W. Grimes if ((ifnet.if_flags&IFF_UP) == 0) 1519b50d902SRodney W. Grimes *cp++ = '*'; 1529b50d902SRodney W. Grimes *cp = '\0'; 15315244cd5SGarrett Wollman ifaddraddr = (u_long)ifnet.if_addrhead.tqh_first; 1549b50d902SRodney W. Grimes } 1557d56c0eeSAlexander Langer printf("%-5.5s %-5lu ", name, ifnet.if_mtu); 156f6719675SBill Fenner ifaddrfound = ifaddraddr; 1579b50d902SRodney W. Grimes if (ifaddraddr == 0) { 158cc6a66f2SJulian Elischer printf("%-13.13s ", "none"); 1599b50d902SRodney W. Grimes printf("%-15.15s ", "none"); 1609b50d902SRodney W. Grimes } else { 1619b50d902SRodney W. Grimes if (kread(ifaddraddr, (char *)&ifaddr, sizeof ifaddr)) { 1629b50d902SRodney W. Grimes ifaddraddr = 0; 1639b50d902SRodney W. Grimes continue; 1649b50d902SRodney W. Grimes } 1659b50d902SRodney W. Grimes #define CP(x) ((char *)(x)) 1669b50d902SRodney W. Grimes cp = (CP(ifaddr.ifa.ifa_addr) - CP(ifaddraddr)) + 1679b50d902SRodney W. Grimes CP(&ifaddr); sa = (struct sockaddr *)cp; 1689b50d902SRodney W. Grimes switch (sa->sa_family) { 1699b50d902SRodney W. Grimes case AF_UNSPEC: 170cc6a66f2SJulian Elischer printf("%-13.13s ", "none"); 1719b50d902SRodney W. Grimes printf("%-15.15s ", "none"); 1729b50d902SRodney W. Grimes break; 1739b50d902SRodney W. Grimes case AF_INET: 1749b50d902SRodney W. Grimes sin = (struct sockaddr_in *)sa; 1759b50d902SRodney W. Grimes #ifdef notdef 1769b50d902SRodney W. Grimes /* can't use inet_makeaddr because kernel 1779b50d902SRodney W. Grimes * keeps nets unshifted. 1789b50d902SRodney W. Grimes */ 1799b50d902SRodney W. Grimes in = inet_makeaddr(ifaddr.in.ia_subnet, 1809b50d902SRodney W. Grimes INADDR_ANY); 18109a67ffaSStefan Eßer printf("%-13.13s ", netname(in.s_addr, 1829b50d902SRodney W. Grimes ifaddr.in.ia_subnetmask)); 1839b50d902SRodney W. Grimes #else 18409a67ffaSStefan Eßer printf("%-13.13s ", 1859b50d902SRodney W. Grimes netname(htonl(ifaddr.in.ia_subnet), 1869b50d902SRodney W. Grimes ifaddr.in.ia_subnetmask)); 1879b50d902SRodney W. Grimes #endif 1889b50d902SRodney W. Grimes printf("%-15.15s ", 1899b50d902SRodney W. Grimes routename(sin->sin_addr.s_addr)); 1909b50d902SRodney W. Grimes break; 191cc6a66f2SJulian Elischer case AF_IPX: 192cc6a66f2SJulian Elischer { 193cc6a66f2SJulian Elischer struct sockaddr_ipx *sipx = 194cc6a66f2SJulian Elischer (struct sockaddr_ipx *)sa; 195cc6a66f2SJulian Elischer u_long net; 196cc6a66f2SJulian Elischer char netnum[10]; 197cc6a66f2SJulian Elischer 198cc6a66f2SJulian Elischer *(union ipx_net *) &net = sipx->sipx_addr.x_net; 199cc6a66f2SJulian Elischer sprintf(netnum, "%lx", ntohl(net)); 200cc6a66f2SJulian Elischer printf("ipx:%-8s ", netnum); 201cc6a66f2SJulian Elischer /* printf("ipx:%-8s ", netname(net, 0L)); */ 202cc6a66f2SJulian Elischer printf("%-15s ", 203cc6a66f2SJulian Elischer ipx_phost((struct sockaddr *)sipx)); 204cc6a66f2SJulian Elischer } 205cc6a66f2SJulian Elischer break; 2066ffcfd6cSJulian Elischer 2076ffcfd6cSJulian Elischer case AF_APPLETALK: 208a8d37845SJulian Elischer printf("atalk:%-12.12s ",atalk_print(sa,0x10) ); 209a8d37845SJulian Elischer printf("%-9.9s ",atalk_print(sa,0x0b) ); 2106ffcfd6cSJulian Elischer break; 211cbc17e71SGarrett Wollman #ifdef NS 2129b50d902SRodney W. Grimes case AF_NS: 2139b50d902SRodney W. Grimes { 2149b50d902SRodney W. Grimes struct sockaddr_ns *sns = 2159b50d902SRodney W. Grimes (struct sockaddr_ns *)sa; 2169b50d902SRodney W. Grimes u_long net; 217cc6a66f2SJulian Elischer char netnum[10]; 2189b50d902SRodney W. Grimes 2199b50d902SRodney W. Grimes *(union ns_net *) &net = sns->sns_addr.x_net; 2209b50d902SRodney W. Grimes sprintf(netnum, "%lxH", ntohl(net)); 2219b50d902SRodney W. Grimes upHex(netnum); 2229b50d902SRodney W. Grimes printf("ns:%-8s ", netnum); 2239b50d902SRodney W. Grimes printf("%-15s ", 2249b50d902SRodney W. Grimes ns_phost((struct sockaddr *)sns)); 2259b50d902SRodney W. Grimes } 2269b50d902SRodney W. Grimes break; 227cbc17e71SGarrett Wollman #endif 2289b50d902SRodney W. Grimes case AF_LINK: 2299b50d902SRodney W. Grimes { 2309b50d902SRodney W. Grimes struct sockaddr_dl *sdl = 2319b50d902SRodney W. Grimes (struct sockaddr_dl *)sa; 2329b50d902SRodney W. Grimes cp = (char *)LLADDR(sdl); 2339b50d902SRodney W. Grimes n = sdl->sdl_alen; 2349b50d902SRodney W. Grimes } 23505ddff6eSPeter Wemm m = printf("%-11.11s ", "<Link>"); 2369b50d902SRodney W. Grimes goto hexprint; 2379b50d902SRodney W. Grimes default: 2389b50d902SRodney W. Grimes m = printf("(%d)", sa->sa_family); 2399b50d902SRodney W. Grimes for (cp = sa->sa_len + (char *)sa; 2409b50d902SRodney W. Grimes --cp > sa->sa_data && (*cp == 0);) {} 2419b50d902SRodney W. Grimes n = cp - sa->sa_data + 1; 2429b50d902SRodney W. Grimes cp = sa->sa_data; 2439b50d902SRodney W. Grimes hexprint: 2449b50d902SRodney W. Grimes while (--n >= 0) 245541f2562SDavid Greenman m += printf("%02x%c", *cp++ & 0xff, 2469b50d902SRodney W. Grimes n > 0 ? '.' : ' '); 247cc6a66f2SJulian Elischer m = 30 - m; 2489b50d902SRodney W. Grimes while (m-- > 0) 2499b50d902SRodney W. Grimes putchar(' '); 2509b50d902SRodney W. Grimes break; 2519b50d902SRodney W. Grimes } 25215244cd5SGarrett Wollman ifaddraddr = (u_long)ifaddr.ifa.ifa_link.tqe_next; 2539b50d902SRodney W. Grimes } 2547d56c0eeSAlexander Langer printf("%8lu %5lu ", 255e1e293a5SDavid Greenman ifnet.if_ipackets, ifnet.if_ierrors); 256e1e293a5SDavid Greenman if (bflag) 2577d56c0eeSAlexander Langer printf("%10lu ", ifnet.if_ibytes); 2587d56c0eeSAlexander Langer printf("%8lu %5lu ", 259e1e293a5SDavid Greenman ifnet.if_opackets, ifnet.if_oerrors); 260e1e293a5SDavid Greenman if (bflag) 2617d56c0eeSAlexander Langer printf("%10lu ", ifnet.if_obytes); 2627d56c0eeSAlexander Langer printf("%5lu", ifnet.if_collisions); 2639b50d902SRodney W. Grimes if (tflag) 2649b50d902SRodney W. Grimes printf(" %3d", ifnet.if_timer); 2659b50d902SRodney W. Grimes if (dflag) 2669b50d902SRodney W. Grimes printf(" %3d", ifnet.if_snd.ifq_drops); 2679b50d902SRodney W. Grimes putchar('\n'); 268f6719675SBill Fenner if (aflag && ifaddrfound) { 269f6719675SBill Fenner /* 270f6719675SBill Fenner * Print family's multicast addresses 271f6719675SBill Fenner */ 272f6719675SBill Fenner u_long multiaddr; 27375fb8770SGarrett Wollman struct ifmultiaddr ifma; 27475fb8770SGarrett Wollman union { 27575fb8770SGarrett Wollman struct sockaddr sa; 27675fb8770SGarrett Wollman struct sockaddr_in in; 27775fb8770SGarrett Wollman struct sockaddr_dl dl; 27875fb8770SGarrett Wollman } msa; 27975fb8770SGarrett Wollman const char *fmt; 280f6719675SBill Fenner 28175fb8770SGarrett Wollman for(multiaddr = (u_long)ifnet.if_multiaddrs.lh_first; 28275fb8770SGarrett Wollman multiaddr; 28375fb8770SGarrett Wollman multiaddr = (u_long)ifma.ifma_link.le_next) { 28475fb8770SGarrett Wollman if (kread(multiaddr, (char *)&ifma, 28575fb8770SGarrett Wollman sizeof ifma)) 286f6719675SBill Fenner break; 28775fb8770SGarrett Wollman if (kread((u_long)ifma.ifma_addr, (char *)&msa, 28875fb8770SGarrett Wollman sizeof msa)) 28975fb8770SGarrett Wollman break; 29075fb8770SGarrett Wollman if (msa.sa.sa_family != sa->sa_family) 29175fb8770SGarrett Wollman continue; 29275fb8770SGarrett Wollman 29375fb8770SGarrett Wollman fmt = 0; 29475fb8770SGarrett Wollman switch (msa.sa.sa_family) { 29575fb8770SGarrett Wollman case AF_INET: 29675fb8770SGarrett Wollman fmt = routename(msa.in.sin_addr.s_addr); 29775fb8770SGarrett Wollman break; 29875fb8770SGarrett Wollman 299f6719675SBill Fenner case AF_LINK: 300f6719675SBill Fenner switch (ifnet.if_type) { 301f6719675SBill Fenner case IFT_ETHER: 30275fb8770SGarrett Wollman case IFT_FDDI: 30375fb8770SGarrett Wollman fmt = ether_ntoa( 30475fb8770SGarrett Wollman (struct ether_addr *) 30575fb8770SGarrett Wollman LLADDR(&msa.dl)); 30675fb8770SGarrett Wollman break; 307f6719675SBill Fenner } 308f6719675SBill Fenner break; 309f6719675SBill Fenner } 31075fb8770SGarrett Wollman if (fmt) 31175fb8770SGarrett Wollman printf("%23s %s\n", "", fmt); 312f6719675SBill Fenner } 313f6719675SBill Fenner } 3149b50d902SRodney W. Grimes } 3159b50d902SRodney W. Grimes } 3169b50d902SRodney W. Grimes 3179b50d902SRodney W. Grimes #define MAXIF 10 3189b50d902SRodney W. Grimes struct iftot { 3199b50d902SRodney W. Grimes char ift_name[16]; /* interface name */ 320e1e293a5SDavid Greenman u_int ift_ip; /* input packets */ 321e1e293a5SDavid Greenman u_int ift_ie; /* input errors */ 322e1e293a5SDavid Greenman u_int ift_op; /* output packets */ 323e1e293a5SDavid Greenman u_int ift_oe; /* output errors */ 324e1e293a5SDavid Greenman u_int ift_co; /* collisions */ 325e1e293a5SDavid Greenman u_int ift_dr; /* drops */ 326e1e293a5SDavid Greenman u_int ift_ib; /* input bytes */ 327e1e293a5SDavid Greenman u_int ift_ob; /* output bytes */ 3289b50d902SRodney W. Grimes } iftot[MAXIF]; 3299b50d902SRodney W. Grimes 3309b50d902SRodney W. Grimes u_char signalled; /* set if alarm goes off "early" */ 3319b50d902SRodney W. Grimes 3329b50d902SRodney W. Grimes /* 3339b50d902SRodney W. Grimes * Print a running summary of interface statistics. 3349b50d902SRodney W. Grimes * Repeat display every interval seconds, showing statistics 3359b50d902SRodney W. Grimes * collected over that interval. Assumes that interval is non-zero. 3369b50d902SRodney W. Grimes * First line printed at top of screen is always cumulative. 3370e27dc05SGarrett Wollman * XXX - should be rewritten to use ifmib(4). 3389b50d902SRodney W. Grimes */ 3399b50d902SRodney W. Grimes static void 3409b50d902SRodney W. Grimes sidewaysintpr(interval, off) 3419b50d902SRodney W. Grimes unsigned interval; 3429b50d902SRodney W. Grimes u_long off; 3439b50d902SRodney W. Grimes { 3449b50d902SRodney W. Grimes struct ifnet ifnet; 3459b50d902SRodney W. Grimes u_long firstifnet; 3460e27dc05SGarrett Wollman struct ifnethead ifnethead; 3479b50d902SRodney W. Grimes register struct iftot *ip, *total; 3489b50d902SRodney W. Grimes register int line; 3499b50d902SRodney W. Grimes struct iftot *lastif, *sum, *interesting; 3500b87c915SDavid Greenman int oldmask, first; 3510b87c915SDavid Greenman u_long interesting_off; 3529b50d902SRodney W. Grimes 3530e27dc05SGarrett Wollman if (kread(off, (char *)&ifnethead, sizeof ifnethead)) 3549b50d902SRodney W. Grimes return; 3550e27dc05SGarrett Wollman firstifnet = (u_long)ifnethead.tqh_first; 3560e27dc05SGarrett Wollman 3579b50d902SRodney W. Grimes lastif = iftot; 3589b50d902SRodney W. Grimes sum = iftot + MAXIF - 1; 3599b50d902SRodney W. Grimes total = sum - 1; 3600b87c915SDavid Greenman interesting = NULL; 3610b87c915SDavid Greenman interesting_off = 0; 3629b50d902SRodney W. Grimes for (off = firstifnet, ip = iftot; off;) { 3631b72e71cSDavid Greenman char name[16], tname[16]; 3649b50d902SRodney W. Grimes 3659b50d902SRodney W. Grimes if (kread(off, (char *)&ifnet, sizeof ifnet)) 3669b50d902SRodney W. Grimes break; 3671b72e71cSDavid Greenman if (kread((u_long)ifnet.if_name, tname, 16)) 3689b50d902SRodney W. Grimes break; 3691b72e71cSDavid Greenman tname[15] = '\0'; 3701b72e71cSDavid Greenman snprintf(name, 16, "%s%d", tname, ifnet.if_unit); 3710b87c915SDavid Greenman if (interface && strcmp(name, interface) == 0) { 3729b50d902SRodney W. Grimes interesting = ip; 3730b87c915SDavid Greenman interesting_off = off; 3740b87c915SDavid Greenman } 3751b72e71cSDavid Greenman snprintf(ip->ift_name, 16, "(%s)", name);; 3769b50d902SRodney W. Grimes ip++; 3779b50d902SRodney W. Grimes if (ip >= iftot + MAXIF - 2) 3789b50d902SRodney W. Grimes break; 3790e27dc05SGarrett Wollman off = (u_long) ifnet.if_link.tqe_next; 3809b50d902SRodney W. Grimes } 3819b50d902SRodney W. Grimes lastif = ip; 3829b50d902SRodney W. Grimes 3839b50d902SRodney W. Grimes (void)signal(SIGALRM, catchalarm); 3849b50d902SRodney W. Grimes signalled = NO; 3859b50d902SRodney W. Grimes (void)alarm(interval); 3869b50d902SRodney W. Grimes for (ip = iftot; ip < iftot + MAXIF; ip++) { 3879b50d902SRodney W. Grimes ip->ift_ip = 0; 3889b50d902SRodney W. Grimes ip->ift_ie = 0; 3890b87c915SDavid Greenman ip->ift_ib = 0; 3909b50d902SRodney W. Grimes ip->ift_op = 0; 3919b50d902SRodney W. Grimes ip->ift_oe = 0; 3920b87c915SDavid Greenman ip->ift_ob = 0; 3939b50d902SRodney W. Grimes ip->ift_co = 0; 3949b50d902SRodney W. Grimes ip->ift_dr = 0; 3959b50d902SRodney W. Grimes } 3960b87c915SDavid Greenman first = 1; 3970b87c915SDavid Greenman banner: 3980b87c915SDavid Greenman printf("%17s %14s %16s", "input", 3990b87c915SDavid Greenman interesting ? interesting->ift_name : "(Total)", "output"); 4009b50d902SRodney W. Grimes putchar('\n'); 4010b87c915SDavid Greenman printf("%10s %5s %10s %10s %5s %10s %5s", 4020b87c915SDavid Greenman "packets", "errs", "bytes", "packets", "errs", "bytes", "colls"); 4039b50d902SRodney W. Grimes if (dflag) 4049b50d902SRodney W. Grimes printf(" %5.5s", "drops"); 4059b50d902SRodney W. Grimes putchar('\n'); 4069b50d902SRodney W. Grimes fflush(stdout); 4079b50d902SRodney W. Grimes line = 0; 4089b50d902SRodney W. Grimes loop: 4090b87c915SDavid Greenman if (interesting != NULL) { 4100b87c915SDavid Greenman ip = interesting; 4110b87c915SDavid Greenman if (kread(interesting_off, (char *)&ifnet, sizeof ifnet)) { 4120b87c915SDavid Greenman printf("???\n"); 4130b87c915SDavid Greenman exit(1); 4140b87c915SDavid Greenman }; 4150b87c915SDavid Greenman if (!first) { 4167d56c0eeSAlexander Langer printf("%10lu %5lu %10lu %10lu %5lu %10lu %5lu", 4170b87c915SDavid Greenman ifnet.if_ipackets - ip->ift_ip, 4180b87c915SDavid Greenman ifnet.if_ierrors - ip->ift_ie, 4190b87c915SDavid Greenman ifnet.if_ibytes - ip->ift_ib, 4200b87c915SDavid Greenman ifnet.if_opackets - ip->ift_op, 4210b87c915SDavid Greenman ifnet.if_oerrors - ip->ift_oe, 4220b87c915SDavid Greenman ifnet.if_obytes - ip->ift_ob, 4230b87c915SDavid Greenman ifnet.if_collisions - ip->ift_co); 4240b87c915SDavid Greenman if (dflag) 4250b87c915SDavid Greenman printf(" %5u", ifnet.if_snd.ifq_drops - ip->ift_dr); 4260b87c915SDavid Greenman } 4270b87c915SDavid Greenman ip->ift_ip = ifnet.if_ipackets; 4280b87c915SDavid Greenman ip->ift_ie = ifnet.if_ierrors; 4290b87c915SDavid Greenman ip->ift_ib = ifnet.if_ibytes; 4300b87c915SDavid Greenman ip->ift_op = ifnet.if_opackets; 4310b87c915SDavid Greenman ip->ift_oe = ifnet.if_oerrors; 4320b87c915SDavid Greenman ip->ift_ob = ifnet.if_obytes; 4330b87c915SDavid Greenman ip->ift_co = ifnet.if_collisions; 4340b87c915SDavid Greenman ip->ift_dr = ifnet.if_snd.ifq_drops; 4350b87c915SDavid Greenman } else { 4369b50d902SRodney W. Grimes sum->ift_ip = 0; 4379b50d902SRodney W. Grimes sum->ift_ie = 0; 4380b87c915SDavid Greenman sum->ift_ib = 0; 4399b50d902SRodney W. Grimes sum->ift_op = 0; 4409b50d902SRodney W. Grimes sum->ift_oe = 0; 4410b87c915SDavid Greenman sum->ift_ob = 0; 4429b50d902SRodney W. Grimes sum->ift_co = 0; 4439b50d902SRodney W. Grimes sum->ift_dr = 0; 4449b50d902SRodney W. Grimes for (off = firstifnet, ip = iftot; off && ip < lastif; ip++) { 4459b50d902SRodney W. Grimes if (kread(off, (char *)&ifnet, sizeof ifnet)) { 4469b50d902SRodney W. Grimes off = 0; 4479b50d902SRodney W. Grimes continue; 4489b50d902SRodney W. Grimes } 4490b87c915SDavid Greenman sum->ift_ip += ifnet.if_ipackets; 4500b87c915SDavid Greenman sum->ift_ie += ifnet.if_ierrors; 4510b87c915SDavid Greenman sum->ift_ib += ifnet.if_ibytes; 4520b87c915SDavid Greenman sum->ift_op += ifnet.if_opackets; 4530b87c915SDavid Greenman sum->ift_oe += ifnet.if_oerrors; 4540b87c915SDavid Greenman sum->ift_ob += ifnet.if_obytes; 4550b87c915SDavid Greenman sum->ift_co += ifnet.if_collisions; 4560b87c915SDavid Greenman sum->ift_dr += ifnet.if_snd.ifq_drops; 4570e27dc05SGarrett Wollman off = (u_long) ifnet.if_link.tqe_next; 4589b50d902SRodney W. Grimes } 4590b87c915SDavid Greenman if (!first) { 4600b87c915SDavid Greenman printf("%10u %5u %10u %10u %5u %10u %5u", 4619b50d902SRodney W. Grimes sum->ift_ip - total->ift_ip, 4620b87c915SDavid Greenman sum->ift_ie - total->ift_ie, 4630b87c915SDavid Greenman sum->ift_ib - total->ift_ib, 4649b50d902SRodney W. Grimes sum->ift_op - total->ift_op, 4650b87c915SDavid Greenman sum->ift_oe - total->ift_oe, 4660b87c915SDavid Greenman sum->ift_ob - total->ift_ob, 4670b87c915SDavid Greenman sum->ift_co - total->ift_co); 4689b50d902SRodney W. Grimes if (dflag) 4693aa80b1dSDavid Greenman printf(" %5u", sum->ift_dr - total->ift_dr); 4709b50d902SRodney W. Grimes } 4719b50d902SRodney W. Grimes *total = *sum; 4720b87c915SDavid Greenman } 4730b87c915SDavid Greenman if (!first) 4749b50d902SRodney W. Grimes putchar('\n'); 4759b50d902SRodney W. Grimes fflush(stdout); 4769b50d902SRodney W. Grimes oldmask = sigblock(sigmask(SIGALRM)); 4779b50d902SRodney W. Grimes if (! signalled) { 4789b50d902SRodney W. Grimes sigpause(0); 4799b50d902SRodney W. Grimes } 4809b50d902SRodney W. Grimes sigsetmask(oldmask); 4819b50d902SRodney W. Grimes signalled = NO; 4829b50d902SRodney W. Grimes (void)alarm(interval); 4830b87c915SDavid Greenman line++; 4840b87c915SDavid Greenman first = 0; 4859b50d902SRodney W. Grimes if (line == 21) 4869b50d902SRodney W. Grimes goto banner; 4870b87c915SDavid Greenman else 4889b50d902SRodney W. Grimes goto loop; 4899b50d902SRodney W. Grimes /*NOTREACHED*/ 4909b50d902SRodney W. Grimes } 4919b50d902SRodney W. Grimes 4929b50d902SRodney W. Grimes /* 4939b50d902SRodney W. Grimes * Called if an interval expires before sidewaysintpr has completed a loop. 4949b50d902SRodney W. Grimes * Sets a flag to not wait for the alarm. 4959b50d902SRodney W. Grimes */ 4969b50d902SRodney W. Grimes static void 4979b50d902SRodney W. Grimes catchalarm(signo) 4989b50d902SRodney W. Grimes int signo; 4999b50d902SRodney W. Grimes { 5009b50d902SRodney W. Grimes signalled = YES; 5019b50d902SRodney W. Grimes } 502