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 3505ddff6eSPeter Wemm static char sccsid[] = "@(#)if.c 8.3 (Berkeley) 4/28/95"; 369b50d902SRodney W. Grimes #endif /* not lint */ 379b50d902SRodney W. Grimes 389b50d902SRodney W. Grimes #include <sys/types.h> 399b50d902SRodney W. Grimes #include <sys/protosw.h> 409b50d902SRodney W. Grimes #include <sys/socket.h> 41628d2ac1SGarrett Wollman #include <sys/time.h> 429b50d902SRodney W. Grimes 439b50d902SRodney W. Grimes #include <net/if.h> 449b50d902SRodney W. Grimes #include <net/if_dl.h> 45f6719675SBill Fenner #include <net/if_types.h> 469b50d902SRodney W. Grimes #include <netinet/in.h> 479b50d902SRodney W. Grimes #include <netinet/in_var.h> 48f6719675SBill Fenner #define KERNEL 1 49f6719675SBill Fenner #include <netinet/if_ether.h> 50f6719675SBill Fenner #undef KERNEL 51cc6a66f2SJulian Elischer #include <netipx/ipx.h> 52cc6a66f2SJulian Elischer #include <netipx/ipx_if.h> 53cbc17e71SGarrett Wollman #ifdef NS 549b50d902SRodney W. Grimes #include <netns/ns.h> 559b50d902SRodney W. Grimes #include <netns/ns_if.h> 56cbc17e71SGarrett Wollman #endif 570761cb29SGarrett Wollman #ifdef ISO 589b50d902SRodney W. Grimes #include <netiso/iso.h> 599b50d902SRodney W. Grimes #include <netiso/iso_var.h> 600761cb29SGarrett Wollman #endif 619b50d902SRodney W. Grimes #include <arpa/inet.h> 629b50d902SRodney W. Grimes 639b50d902SRodney W. Grimes #include <signal.h> 649b50d902SRodney W. Grimes #include <stdio.h> 659b50d902SRodney W. Grimes #include <string.h> 669b50d902SRodney W. Grimes #include <unistd.h> 679b50d902SRodney W. Grimes 689b50d902SRodney W. Grimes #include "netstat.h" 699b50d902SRodney W. Grimes 709b50d902SRodney W. Grimes #define YES 1 719b50d902SRodney W. Grimes #define NO 0 729b50d902SRodney W. Grimes 739b50d902SRodney W. Grimes static void sidewaysintpr __P((u_int, u_long)); 749b50d902SRodney W. Grimes static void catchalarm __P((int)); 759b50d902SRodney W. Grimes 769b50d902SRodney W. Grimes /* 779b50d902SRodney W. Grimes * Print a description of the network interfaces. 789b50d902SRodney W. Grimes */ 799b50d902SRodney W. Grimes void 809b50d902SRodney W. Grimes intpr(interval, ifnetaddr) 819b50d902SRodney W. Grimes int interval; 829b50d902SRodney W. Grimes u_long ifnetaddr; 839b50d902SRodney W. Grimes { 849b50d902SRodney W. Grimes struct ifnet ifnet; 850e27dc05SGarrett Wollman struct ifnethead ifnethead; 869b50d902SRodney W. Grimes union { 879b50d902SRodney W. Grimes struct ifaddr ifa; 889b50d902SRodney W. Grimes struct in_ifaddr in; 89cc6a66f2SJulian Elischer struct ipx_ifaddr ipx; 90cbc17e71SGarrett Wollman #ifdef NS 919b50d902SRodney W. Grimes struct ns_ifaddr ns; 92cbc17e71SGarrett Wollman #endif 930761cb29SGarrett Wollman #ifdef ISO 949b50d902SRodney W. Grimes struct iso_ifaddr iso; 950761cb29SGarrett Wollman #endif 969b50d902SRodney W. Grimes } ifaddr; 979b50d902SRodney W. Grimes u_long ifaddraddr; 98f6719675SBill Fenner u_long ifaddrfound; 99f6719675SBill Fenner u_long ifnetfound; 1009b50d902SRodney W. Grimes struct sockaddr *sa; 1011b72e71cSDavid Greenman char name[32], tname[16]; 1029b50d902SRodney W. Grimes 1039b50d902SRodney W. Grimes if (ifnetaddr == 0) { 1049b50d902SRodney W. Grimes printf("ifnet: symbol not defined\n"); 1059b50d902SRodney W. Grimes return; 1069b50d902SRodney W. Grimes } 1079b50d902SRodney W. Grimes if (interval) { 1089b50d902SRodney W. Grimes sidewaysintpr((unsigned)interval, ifnetaddr); 1099b50d902SRodney W. Grimes return; 1109b50d902SRodney W. Grimes } 1110e27dc05SGarrett Wollman if (kread(ifnetaddr, (char *)&ifnethead, sizeof ifnethead)) 1129b50d902SRodney W. Grimes return; 1130e27dc05SGarrett Wollman ifnetaddr = (u_long)ifnethead.tqh_first; 1140e27dc05SGarrett Wollman if (kread(ifnetaddr, (char *)&ifnet, sizeof ifnet)) 1150e27dc05SGarrett Wollman return; 1160e27dc05SGarrett Wollman 117cc6a66f2SJulian Elischer printf("%-5.5s %-5.5s %-13.13s %-15.15s %8.8s %5.5s", 118e1e293a5SDavid Greenman "Name", "Mtu", "Network", "Address", "Ipkts", "Ierrs"); 119e1e293a5SDavid Greenman if (bflag) 120e1e293a5SDavid Greenman printf(" %10.10s","Ibytes"); 121e1e293a5SDavid Greenman printf(" %8.8s %5.5s", "Opkts", "Oerrs"); 122e1e293a5SDavid Greenman if (bflag) 123e1e293a5SDavid Greenman printf(" %10.10s","Obytes"); 1249b50d902SRodney W. Grimes printf(" %5s", "Coll"); 1259b50d902SRodney W. Grimes if (tflag) 1269b50d902SRodney W. Grimes printf(" %s", "Time"); 1279b50d902SRodney W. Grimes if (dflag) 1289b50d902SRodney W. Grimes printf(" %s", "Drop"); 1299b50d902SRodney W. Grimes putchar('\n'); 1309b50d902SRodney W. Grimes ifaddraddr = 0; 1319b50d902SRodney W. Grimes while (ifnetaddr || ifaddraddr) { 1329b50d902SRodney W. Grimes struct sockaddr_in *sin; 1339b50d902SRodney W. Grimes register char *cp; 1349b50d902SRodney W. Grimes int n, m; 1359b50d902SRodney W. Grimes 1369b50d902SRodney W. Grimes if (ifaddraddr == 0) { 137f6719675SBill Fenner ifnetfound = ifnetaddr; 1389b50d902SRodney W. Grimes if (kread(ifnetaddr, (char *)&ifnet, sizeof ifnet) || 1391b72e71cSDavid Greenman kread((u_long)ifnet.if_name, tname, 16)) 1409b50d902SRodney W. Grimes return; 1411b72e71cSDavid Greenman tname[15] = '\0'; 1420e27dc05SGarrett Wollman ifnetaddr = (u_long)ifnet.if_link.tqe_next; 1431b72e71cSDavid Greenman snprintf(name, 32, "%s%d", tname, ifnet.if_unit); 1441b72e71cSDavid Greenman if (interface != 0 && (strcmp(name, interface) != 0)) 1459b50d902SRodney W. Grimes continue; 1469b50d902SRodney W. Grimes cp = index(name, '\0'); 1479b50d902SRodney W. Grimes if ((ifnet.if_flags&IFF_UP) == 0) 1489b50d902SRodney W. Grimes *cp++ = '*'; 1499b50d902SRodney W. Grimes *cp = '\0'; 1509b50d902SRodney W. Grimes ifaddraddr = (u_long)ifnet.if_addrlist; 1519b50d902SRodney W. Grimes } 1527d56c0eeSAlexander Langer printf("%-5.5s %-5lu ", name, ifnet.if_mtu); 153f6719675SBill Fenner ifaddrfound = ifaddraddr; 1549b50d902SRodney W. Grimes if (ifaddraddr == 0) { 155cc6a66f2SJulian Elischer printf("%-13.13s ", "none"); 1569b50d902SRodney W. Grimes printf("%-15.15s ", "none"); 1579b50d902SRodney W. Grimes } else { 1589b50d902SRodney W. Grimes if (kread(ifaddraddr, (char *)&ifaddr, sizeof ifaddr)) { 1599b50d902SRodney W. Grimes ifaddraddr = 0; 1609b50d902SRodney W. Grimes continue; 1619b50d902SRodney W. Grimes } 1629b50d902SRodney W. Grimes #define CP(x) ((char *)(x)) 1639b50d902SRodney W. Grimes cp = (CP(ifaddr.ifa.ifa_addr) - CP(ifaddraddr)) + 1649b50d902SRodney W. Grimes CP(&ifaddr); sa = (struct sockaddr *)cp; 1659b50d902SRodney W. Grimes switch (sa->sa_family) { 1669b50d902SRodney W. Grimes case AF_UNSPEC: 167cc6a66f2SJulian Elischer printf("%-13.13s ", "none"); 1689b50d902SRodney W. Grimes printf("%-15.15s ", "none"); 1699b50d902SRodney W. Grimes break; 1709b50d902SRodney W. Grimes case AF_INET: 1719b50d902SRodney W. Grimes sin = (struct sockaddr_in *)sa; 1729b50d902SRodney W. Grimes #ifdef notdef 1739b50d902SRodney W. Grimes /* can't use inet_makeaddr because kernel 1749b50d902SRodney W. Grimes * keeps nets unshifted. 1759b50d902SRodney W. Grimes */ 1769b50d902SRodney W. Grimes in = inet_makeaddr(ifaddr.in.ia_subnet, 1779b50d902SRodney W. Grimes INADDR_ANY); 17809a67ffaSStefan Eßer printf("%-13.13s ", netname(in.s_addr, 1799b50d902SRodney W. Grimes ifaddr.in.ia_subnetmask)); 1809b50d902SRodney W. Grimes #else 18109a67ffaSStefan Eßer printf("%-13.13s ", 1829b50d902SRodney W. Grimes netname(htonl(ifaddr.in.ia_subnet), 1839b50d902SRodney W. Grimes ifaddr.in.ia_subnetmask)); 1849b50d902SRodney W. Grimes #endif 1859b50d902SRodney W. Grimes printf("%-15.15s ", 1869b50d902SRodney W. Grimes routename(sin->sin_addr.s_addr)); 1879b50d902SRodney W. Grimes break; 188cc6a66f2SJulian Elischer case AF_IPX: 189cc6a66f2SJulian Elischer { 190cc6a66f2SJulian Elischer struct sockaddr_ipx *sipx = 191cc6a66f2SJulian Elischer (struct sockaddr_ipx *)sa; 192cc6a66f2SJulian Elischer u_long net; 193cc6a66f2SJulian Elischer char netnum[10]; 194cc6a66f2SJulian Elischer 195cc6a66f2SJulian Elischer *(union ipx_net *) &net = sipx->sipx_addr.x_net; 196cc6a66f2SJulian Elischer sprintf(netnum, "%lx", ntohl(net)); 197cc6a66f2SJulian Elischer printf("ipx:%-8s ", netnum); 198cc6a66f2SJulian Elischer /* printf("ipx:%-8s ", netname(net, 0L)); */ 199cc6a66f2SJulian Elischer printf("%-15s ", 200cc6a66f2SJulian Elischer ipx_phost((struct sockaddr *)sipx)); 201cc6a66f2SJulian Elischer } 202cc6a66f2SJulian Elischer break; 2036ffcfd6cSJulian Elischer 2046ffcfd6cSJulian Elischer case AF_APPLETALK: 205a8d37845SJulian Elischer printf("atalk:%-12.12s ",atalk_print(sa,0x10) ); 206a8d37845SJulian Elischer printf("%-9.9s ",atalk_print(sa,0x0b) ); 2076ffcfd6cSJulian Elischer break; 208cbc17e71SGarrett Wollman #ifdef NS 2099b50d902SRodney W. Grimes case AF_NS: 2109b50d902SRodney W. Grimes { 2119b50d902SRodney W. Grimes struct sockaddr_ns *sns = 2129b50d902SRodney W. Grimes (struct sockaddr_ns *)sa; 2139b50d902SRodney W. Grimes u_long net; 214cc6a66f2SJulian Elischer char netnum[10]; 2159b50d902SRodney W. Grimes 2169b50d902SRodney W. Grimes *(union ns_net *) &net = sns->sns_addr.x_net; 2179b50d902SRodney W. Grimes sprintf(netnum, "%lxH", ntohl(net)); 2189b50d902SRodney W. Grimes upHex(netnum); 2199b50d902SRodney W. Grimes printf("ns:%-8s ", netnum); 2209b50d902SRodney W. Grimes printf("%-15s ", 2219b50d902SRodney W. Grimes ns_phost((struct sockaddr *)sns)); 2229b50d902SRodney W. Grimes } 2239b50d902SRodney W. Grimes break; 224cbc17e71SGarrett Wollman #endif 2259b50d902SRodney W. Grimes case AF_LINK: 2269b50d902SRodney W. Grimes { 2279b50d902SRodney W. Grimes struct sockaddr_dl *sdl = 2289b50d902SRodney W. Grimes (struct sockaddr_dl *)sa; 2299b50d902SRodney W. Grimes cp = (char *)LLADDR(sdl); 2309b50d902SRodney W. Grimes n = sdl->sdl_alen; 2319b50d902SRodney W. Grimes } 23205ddff6eSPeter Wemm m = printf("%-11.11s ", "<Link>"); 2339b50d902SRodney W. Grimes goto hexprint; 2349b50d902SRodney W. Grimes default: 2359b50d902SRodney W. Grimes m = printf("(%d)", sa->sa_family); 2369b50d902SRodney W. Grimes for (cp = sa->sa_len + (char *)sa; 2379b50d902SRodney W. Grimes --cp > sa->sa_data && (*cp == 0);) {} 2389b50d902SRodney W. Grimes n = cp - sa->sa_data + 1; 2399b50d902SRodney W. Grimes cp = sa->sa_data; 2409b50d902SRodney W. Grimes hexprint: 2419b50d902SRodney W. Grimes while (--n >= 0) 242541f2562SDavid Greenman m += printf("%02x%c", *cp++ & 0xff, 2439b50d902SRodney W. Grimes n > 0 ? '.' : ' '); 244cc6a66f2SJulian Elischer m = 30 - m; 2459b50d902SRodney W. Grimes while (m-- > 0) 2469b50d902SRodney W. Grimes putchar(' '); 2479b50d902SRodney W. Grimes break; 2489b50d902SRodney W. Grimes } 2499b50d902SRodney W. Grimes ifaddraddr = (u_long)ifaddr.ifa.ifa_next; 2509b50d902SRodney W. Grimes } 2517d56c0eeSAlexander Langer printf("%8lu %5lu ", 252e1e293a5SDavid Greenman ifnet.if_ipackets, ifnet.if_ierrors); 253e1e293a5SDavid Greenman if (bflag) 2547d56c0eeSAlexander Langer printf("%10lu ", ifnet.if_ibytes); 2557d56c0eeSAlexander Langer printf("%8lu %5lu ", 256e1e293a5SDavid Greenman ifnet.if_opackets, ifnet.if_oerrors); 257e1e293a5SDavid Greenman if (bflag) 2587d56c0eeSAlexander Langer printf("%10lu ", ifnet.if_obytes); 2597d56c0eeSAlexander Langer printf("%5lu", ifnet.if_collisions); 2609b50d902SRodney W. Grimes if (tflag) 2619b50d902SRodney W. Grimes printf(" %3d", ifnet.if_timer); 2629b50d902SRodney W. Grimes if (dflag) 2639b50d902SRodney W. Grimes printf(" %3d", ifnet.if_snd.ifq_drops); 2649b50d902SRodney W. Grimes putchar('\n'); 265f6719675SBill Fenner if (aflag && ifaddrfound) { 266f6719675SBill Fenner /* 267f6719675SBill Fenner * Print family's multicast addresses 268f6719675SBill Fenner */ 269f6719675SBill Fenner switch (sa->sa_family) { 270f6719675SBill Fenner case AF_INET: 271f6719675SBill Fenner { 272f6719675SBill Fenner u_long multiaddr; 273f6719675SBill Fenner struct in_multi inm; 274f6719675SBill Fenner 275f6719675SBill Fenner multiaddr = (u_long)ifaddr.in.ia_multiaddrs.lh_first; 276f6719675SBill Fenner while (multiaddr != 0) { 277f6719675SBill Fenner kread(multiaddr, (char *)&inm, 278f6719675SBill Fenner sizeof inm); 279f6719675SBill Fenner multiaddr = (u_long)inm.inm_entry.le_next; 280f6719675SBill Fenner printf("%23s %s\n", "", 281f6719675SBill Fenner routename(inm.inm_addr.s_addr)); 282f6719675SBill Fenner } 283f6719675SBill Fenner break; 284f6719675SBill Fenner } 285f6719675SBill Fenner case AF_LINK: 286f6719675SBill Fenner switch (ifnet.if_type) { 287f6719675SBill Fenner case IFT_ETHER: 288f6719675SBill Fenner case IFT_FDDI: /*XXX*/ 289f6719675SBill Fenner { 290f6719675SBill Fenner off_t multiaddr; 291f6719675SBill Fenner struct arpcom ac; 292f6719675SBill Fenner struct ether_multi enm; 293f6719675SBill Fenner 294f6719675SBill Fenner kread(ifnetfound, (char *)&ac, sizeof ac); 295f6719675SBill Fenner multiaddr = (u_long)ac.ac_multiaddrs; 296f6719675SBill Fenner while (multiaddr != 0) { 297f6719675SBill Fenner kread(multiaddr, (char *)&enm, 298f6719675SBill Fenner sizeof enm); 299f6719675SBill Fenner multiaddr = (u_long)enm.enm_next; 300f6719675SBill Fenner printf("%23s %s", "", 301f6719675SBill Fenner ether_ntoa(&enm.enm_addrlo)); 302f6719675SBill Fenner if (bcmp(&enm.enm_addrlo, 303f6719675SBill Fenner &enm.enm_addrhi, 6) != 0) 304f6719675SBill Fenner printf(" to %s", 305f6719675SBill Fenner ether_ntoa(&enm.enm_addrhi)); 306f6719675SBill Fenner printf("\n"); 307f6719675SBill Fenner } 308f6719675SBill Fenner break; 309f6719675SBill Fenner } 310f6719675SBill Fenner default: 311f6719675SBill Fenner break; 312f6719675SBill Fenner } 313f6719675SBill Fenner default: 314f6719675SBill Fenner break; 315f6719675SBill Fenner } 316f6719675SBill Fenner } 3179b50d902SRodney W. Grimes } 3189b50d902SRodney W. Grimes } 3199b50d902SRodney W. Grimes 3209b50d902SRodney W. Grimes #define MAXIF 10 3219b50d902SRodney W. Grimes struct iftot { 3229b50d902SRodney W. Grimes char ift_name[16]; /* interface name */ 323e1e293a5SDavid Greenman u_int ift_ip; /* input packets */ 324e1e293a5SDavid Greenman u_int ift_ie; /* input errors */ 325e1e293a5SDavid Greenman u_int ift_op; /* output packets */ 326e1e293a5SDavid Greenman u_int ift_oe; /* output errors */ 327e1e293a5SDavid Greenman u_int ift_co; /* collisions */ 328e1e293a5SDavid Greenman u_int ift_dr; /* drops */ 329e1e293a5SDavid Greenman u_int ift_ib; /* input bytes */ 330e1e293a5SDavid Greenman u_int ift_ob; /* output bytes */ 3319b50d902SRodney W. Grimes } iftot[MAXIF]; 3329b50d902SRodney W. Grimes 3339b50d902SRodney W. Grimes u_char signalled; /* set if alarm goes off "early" */ 3349b50d902SRodney W. Grimes 3359b50d902SRodney W. Grimes /* 3369b50d902SRodney W. Grimes * Print a running summary of interface statistics. 3379b50d902SRodney W. Grimes * Repeat display every interval seconds, showing statistics 3389b50d902SRodney W. Grimes * collected over that interval. Assumes that interval is non-zero. 3399b50d902SRodney W. Grimes * First line printed at top of screen is always cumulative. 3400e27dc05SGarrett Wollman * XXX - should be rewritten to use ifmib(4). 3419b50d902SRodney W. Grimes */ 3429b50d902SRodney W. Grimes static void 3439b50d902SRodney W. Grimes sidewaysintpr(interval, off) 3449b50d902SRodney W. Grimes unsigned interval; 3459b50d902SRodney W. Grimes u_long off; 3469b50d902SRodney W. Grimes { 3479b50d902SRodney W. Grimes struct ifnet ifnet; 3489b50d902SRodney W. Grimes u_long firstifnet; 3490e27dc05SGarrett Wollman struct ifnethead ifnethead; 3509b50d902SRodney W. Grimes register struct iftot *ip, *total; 3519b50d902SRodney W. Grimes register int line; 3529b50d902SRodney W. Grimes struct iftot *lastif, *sum, *interesting; 3530b87c915SDavid Greenman int oldmask, first; 3540b87c915SDavid Greenman u_long interesting_off; 3559b50d902SRodney W. Grimes 3560e27dc05SGarrett Wollman if (kread(off, (char *)&ifnethead, sizeof ifnethead)) 3579b50d902SRodney W. Grimes return; 3580e27dc05SGarrett Wollman firstifnet = (u_long)ifnethead.tqh_first; 3590e27dc05SGarrett Wollman 3609b50d902SRodney W. Grimes lastif = iftot; 3619b50d902SRodney W. Grimes sum = iftot + MAXIF - 1; 3629b50d902SRodney W. Grimes total = sum - 1; 3630b87c915SDavid Greenman interesting = NULL; 3640b87c915SDavid Greenman interesting_off = 0; 3659b50d902SRodney W. Grimes for (off = firstifnet, ip = iftot; off;) { 3661b72e71cSDavid Greenman char name[16], tname[16]; 3679b50d902SRodney W. Grimes 3689b50d902SRodney W. Grimes if (kread(off, (char *)&ifnet, sizeof ifnet)) 3699b50d902SRodney W. Grimes break; 3701b72e71cSDavid Greenman if (kread((u_long)ifnet.if_name, tname, 16)) 3719b50d902SRodney W. Grimes break; 3721b72e71cSDavid Greenman tname[15] = '\0'; 3731b72e71cSDavid Greenman snprintf(name, 16, "%s%d", tname, ifnet.if_unit); 3740b87c915SDavid Greenman if (interface && strcmp(name, interface) == 0) { 3759b50d902SRodney W. Grimes interesting = ip; 3760b87c915SDavid Greenman interesting_off = off; 3770b87c915SDavid Greenman } 3781b72e71cSDavid Greenman snprintf(ip->ift_name, 16, "(%s)", name);; 3799b50d902SRodney W. Grimes ip++; 3809b50d902SRodney W. Grimes if (ip >= iftot + MAXIF - 2) 3819b50d902SRodney W. Grimes break; 3820e27dc05SGarrett Wollman off = (u_long) ifnet.if_link.tqe_next; 3839b50d902SRodney W. Grimes } 3849b50d902SRodney W. Grimes lastif = ip; 3859b50d902SRodney W. Grimes 3869b50d902SRodney W. Grimes (void)signal(SIGALRM, catchalarm); 3879b50d902SRodney W. Grimes signalled = NO; 3889b50d902SRodney W. Grimes (void)alarm(interval); 3899b50d902SRodney W. Grimes for (ip = iftot; ip < iftot + MAXIF; ip++) { 3909b50d902SRodney W. Grimes ip->ift_ip = 0; 3919b50d902SRodney W. Grimes ip->ift_ie = 0; 3920b87c915SDavid Greenman ip->ift_ib = 0; 3939b50d902SRodney W. Grimes ip->ift_op = 0; 3949b50d902SRodney W. Grimes ip->ift_oe = 0; 3950b87c915SDavid Greenman ip->ift_ob = 0; 3969b50d902SRodney W. Grimes ip->ift_co = 0; 3979b50d902SRodney W. Grimes ip->ift_dr = 0; 3989b50d902SRodney W. Grimes } 3990b87c915SDavid Greenman first = 1; 4000b87c915SDavid Greenman banner: 4010b87c915SDavid Greenman printf("%17s %14s %16s", "input", 4020b87c915SDavid Greenman interesting ? interesting->ift_name : "(Total)", "output"); 4039b50d902SRodney W. Grimes putchar('\n'); 4040b87c915SDavid Greenman printf("%10s %5s %10s %10s %5s %10s %5s", 4050b87c915SDavid Greenman "packets", "errs", "bytes", "packets", "errs", "bytes", "colls"); 4069b50d902SRodney W. Grimes if (dflag) 4079b50d902SRodney W. Grimes printf(" %5.5s", "drops"); 4089b50d902SRodney W. Grimes putchar('\n'); 4099b50d902SRodney W. Grimes fflush(stdout); 4109b50d902SRodney W. Grimes line = 0; 4119b50d902SRodney W. Grimes loop: 4120b87c915SDavid Greenman if (interesting != NULL) { 4130b87c915SDavid Greenman ip = interesting; 4140b87c915SDavid Greenman if (kread(interesting_off, (char *)&ifnet, sizeof ifnet)) { 4150b87c915SDavid Greenman printf("???\n"); 4160b87c915SDavid Greenman exit(1); 4170b87c915SDavid Greenman }; 4180b87c915SDavid Greenman if (!first) { 4197d56c0eeSAlexander Langer printf("%10lu %5lu %10lu %10lu %5lu %10lu %5lu", 4200b87c915SDavid Greenman ifnet.if_ipackets - ip->ift_ip, 4210b87c915SDavid Greenman ifnet.if_ierrors - ip->ift_ie, 4220b87c915SDavid Greenman ifnet.if_ibytes - ip->ift_ib, 4230b87c915SDavid Greenman ifnet.if_opackets - ip->ift_op, 4240b87c915SDavid Greenman ifnet.if_oerrors - ip->ift_oe, 4250b87c915SDavid Greenman ifnet.if_obytes - ip->ift_ob, 4260b87c915SDavid Greenman ifnet.if_collisions - ip->ift_co); 4270b87c915SDavid Greenman if (dflag) 4280b87c915SDavid Greenman printf(" %5u", ifnet.if_snd.ifq_drops - ip->ift_dr); 4290b87c915SDavid Greenman } 4300b87c915SDavid Greenman ip->ift_ip = ifnet.if_ipackets; 4310b87c915SDavid Greenman ip->ift_ie = ifnet.if_ierrors; 4320b87c915SDavid Greenman ip->ift_ib = ifnet.if_ibytes; 4330b87c915SDavid Greenman ip->ift_op = ifnet.if_opackets; 4340b87c915SDavid Greenman ip->ift_oe = ifnet.if_oerrors; 4350b87c915SDavid Greenman ip->ift_ob = ifnet.if_obytes; 4360b87c915SDavid Greenman ip->ift_co = ifnet.if_collisions; 4370b87c915SDavid Greenman ip->ift_dr = ifnet.if_snd.ifq_drops; 4380b87c915SDavid Greenman } else { 4399b50d902SRodney W. Grimes sum->ift_ip = 0; 4409b50d902SRodney W. Grimes sum->ift_ie = 0; 4410b87c915SDavid Greenman sum->ift_ib = 0; 4429b50d902SRodney W. Grimes sum->ift_op = 0; 4439b50d902SRodney W. Grimes sum->ift_oe = 0; 4440b87c915SDavid Greenman sum->ift_ob = 0; 4459b50d902SRodney W. Grimes sum->ift_co = 0; 4469b50d902SRodney W. Grimes sum->ift_dr = 0; 4479b50d902SRodney W. Grimes for (off = firstifnet, ip = iftot; off && ip < lastif; ip++) { 4489b50d902SRodney W. Grimes if (kread(off, (char *)&ifnet, sizeof ifnet)) { 4499b50d902SRodney W. Grimes off = 0; 4509b50d902SRodney W. Grimes continue; 4519b50d902SRodney W. Grimes } 4520b87c915SDavid Greenman sum->ift_ip += ifnet.if_ipackets; 4530b87c915SDavid Greenman sum->ift_ie += ifnet.if_ierrors; 4540b87c915SDavid Greenman sum->ift_ib += ifnet.if_ibytes; 4550b87c915SDavid Greenman sum->ift_op += ifnet.if_opackets; 4560b87c915SDavid Greenman sum->ift_oe += ifnet.if_oerrors; 4570b87c915SDavid Greenman sum->ift_ob += ifnet.if_obytes; 4580b87c915SDavid Greenman sum->ift_co += ifnet.if_collisions; 4590b87c915SDavid Greenman sum->ift_dr += ifnet.if_snd.ifq_drops; 4600e27dc05SGarrett Wollman off = (u_long) ifnet.if_link.tqe_next; 4619b50d902SRodney W. Grimes } 4620b87c915SDavid Greenman if (!first) { 4630b87c915SDavid Greenman printf("%10u %5u %10u %10u %5u %10u %5u", 4649b50d902SRodney W. Grimes sum->ift_ip - total->ift_ip, 4650b87c915SDavid Greenman sum->ift_ie - total->ift_ie, 4660b87c915SDavid Greenman sum->ift_ib - total->ift_ib, 4679b50d902SRodney W. Grimes sum->ift_op - total->ift_op, 4680b87c915SDavid Greenman sum->ift_oe - total->ift_oe, 4690b87c915SDavid Greenman sum->ift_ob - total->ift_ob, 4700b87c915SDavid Greenman sum->ift_co - total->ift_co); 4719b50d902SRodney W. Grimes if (dflag) 4723aa80b1dSDavid Greenman printf(" %5u", sum->ift_dr - total->ift_dr); 4739b50d902SRodney W. Grimes } 4749b50d902SRodney W. Grimes *total = *sum; 4750b87c915SDavid Greenman } 4760b87c915SDavid Greenman if (!first) 4779b50d902SRodney W. Grimes putchar('\n'); 4789b50d902SRodney W. Grimes fflush(stdout); 4799b50d902SRodney W. Grimes oldmask = sigblock(sigmask(SIGALRM)); 4809b50d902SRodney W. Grimes if (! signalled) { 4819b50d902SRodney W. Grimes sigpause(0); 4829b50d902SRodney W. Grimes } 4839b50d902SRodney W. Grimes sigsetmask(oldmask); 4849b50d902SRodney W. Grimes signalled = NO; 4859b50d902SRodney W. Grimes (void)alarm(interval); 4860b87c915SDavid Greenman line++; 4870b87c915SDavid Greenman first = 0; 4889b50d902SRodney W. Grimes if (line == 21) 4899b50d902SRodney W. Grimes goto banner; 4900b87c915SDavid Greenman else 4919b50d902SRodney W. Grimes goto loop; 4929b50d902SRodney W. Grimes /*NOTREACHED*/ 4939b50d902SRodney W. Grimes } 4949b50d902SRodney W. Grimes 4959b50d902SRodney W. Grimes /* 4969b50d902SRodney W. Grimes * Called if an interval expires before sidewaysintpr has completed a loop. 4979b50d902SRodney W. Grimes * Sets a flag to not wait for the alarm. 4989b50d902SRodney W. Grimes */ 4999b50d902SRodney W. Grimes static void 5009b50d902SRodney W. Grimes catchalarm(signo) 5019b50d902SRodney W. Grimes int signo; 5029b50d902SRodney W. Grimes { 5039b50d902SRodney W. Grimes signalled = YES; 5049b50d902SRodney W. Grimes } 505