|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983, 1988 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted provided ! 6: * that: (1) source distributions retain this entire copyright notice and ! 7: * comment, and (2) distributions including binaries display the following ! 8: * acknowledgement: ``This product includes software developed by the ! 9: * University of California, Berkeley and its contributors'' in the ! 10: * documentation or other materials provided with the distribution and in ! 11: * all advertising materials mentioning features or use of this software. ! 12: * Neither the name of the University nor the names of its contributors may ! 13: * be used to endorse or promote products derived from this software without ! 14: * specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)if.c 5.14 (Berkeley) 6/18/90"; ! 22: #endif /* not lint */ ! 23: ! 24: #include <sys/types.h> ! 25: #include <sys/socket.h> ! 26: ! 27: #include <net/if.h> ! 28: #include <net/if_dl.h> ! 29: #include <netinet/in.h> ! 30: #include <netinet/in_var.h> ! 31: #include <netns/ns.h> ! 32: #include <netns/ns_if.h> ! 33: #include <netiso/iso.h> ! 34: #include <netiso/iso_var.h> ! 35: ! 36: #include <stdio.h> ! 37: #include <signal.h> ! 38: ! 39: #define YES 1 ! 40: #define NO 0 ! 41: ! 42: extern int tflag; ! 43: extern int dflag; ! 44: extern int nflag; ! 45: extern char *interface; ! 46: extern int unit; ! 47: extern char *routename(), *netname(), *ns_phost(); ! 48: ! 49: /* ! 50: * Print a description of the network interfaces. ! 51: */ ! 52: intpr(interval, ifnetaddr) ! 53: int interval; ! 54: off_t ifnetaddr; ! 55: { ! 56: struct ifnet ifnet; ! 57: union { ! 58: struct ifaddr ifa; ! 59: struct in_ifaddr in; ! 60: struct ns_ifaddr ns; ! 61: struct iso_ifaddr iso; ! 62: } ifaddr; ! 63: off_t ifaddraddr; ! 64: struct sockaddr *sa; ! 65: char name[16]; ! 66: ! 67: if (ifnetaddr == 0) { ! 68: printf("ifnet: symbol not defined\n"); ! 69: return; ! 70: } ! 71: if (interval) { ! 72: sidewaysintpr((unsigned)interval, ifnetaddr); ! 73: return; ! 74: } ! 75: kvm_read(ifnetaddr, (char *)&ifnetaddr, sizeof ifnetaddr); ! 76: printf("%-5.5s %-5.5s %-11.11s %-15.15s %8.8s %5.5s %8.8s %5.5s", ! 77: "Name", "Mtu", "Network", "Address", "Ipkts", "Ierrs", ! 78: "Opkts", "Oerrs"); ! 79: printf(" %5s", "Coll"); ! 80: if (tflag) ! 81: printf(" %s", "Time"); ! 82: if (dflag) ! 83: printf(" %s", "Drop"); ! 84: putchar('\n'); ! 85: ifaddraddr = 0; ! 86: while (ifnetaddr || ifaddraddr) { ! 87: struct sockaddr_in *sin; ! 88: register char *cp; ! 89: int n, m; ! 90: char *index(); ! 91: struct in_addr inet_makeaddr(); ! 92: ! 93: if (ifaddraddr == 0) { ! 94: kvm_read(ifnetaddr, (char *)&ifnet, sizeof ifnet); ! 95: kvm_read((off_t)ifnet.if_name, name, 16); ! 96: name[15] = '\0'; ! 97: ifnetaddr = (off_t) ifnet.if_next; ! 98: if (interface != 0 && ! 99: (strcmp(name, interface) != 0 || unit != ifnet.if_unit)) ! 100: continue; ! 101: cp = index(name, '\0'); ! 102: *cp++ = ifnet.if_unit + '0'; ! 103: if ((ifnet.if_flags&IFF_UP) == 0) ! 104: *cp++ = '*'; ! 105: *cp = '\0'; ! 106: ifaddraddr = (off_t)ifnet.if_addrlist; ! 107: } ! 108: printf("%-5.5s %-5d ", name, ifnet.if_mtu); ! 109: if (ifaddraddr == 0) { ! 110: printf("%-11.11s ", "none"); ! 111: printf("%-15.15s ", "none"); ! 112: } else { ! 113: kvm_read(ifaddraddr, (char *)&ifaddr, sizeof ifaddr); ! 114: #define CP(x) ((char *)(x)) ! 115: cp = (CP(ifaddr.ifa.ifa_addr) - CP(ifaddraddr)) + ! 116: CP(&ifaddr); sa = (struct sockaddr *)cp; ! 117: switch (sa->sa_family) { ! 118: case AF_UNSPEC: ! 119: printf("%-11.11s ", "none"); ! 120: printf("%-15.15s ", "none"); ! 121: break; ! 122: case AF_INET: ! 123: sin = (struct sockaddr_in *)sa; ! 124: #ifdef notdef ! 125: /* can't use inet_makeaddr because kernel ! 126: * keeps nets unshifted. ! 127: */ ! 128: in = inet_makeaddr(ifaddr.in.ia_subnet, ! 129: INADDR_ANY); ! 130: printf("%-11.11s ", netname(in)); ! 131: #else ! 132: printf("%-11.11s ", ! 133: netname(htonl(ifaddr.in.ia_subnet), ! 134: ifaddr.in.ia_subnetmask)); ! 135: #endif ! 136: printf("%-15.15s ", routename(sin->sin_addr)); ! 137: break; ! 138: case AF_NS: ! 139: { ! 140: struct sockaddr_ns *sns = ! 141: (struct sockaddr_ns *)sa; ! 142: u_long net; ! 143: char netnum[8]; ! 144: char *ns_phost(); ! 145: ! 146: *(union ns_net *) &net = sns->sns_addr.x_net; ! 147: sprintf(netnum, "%lxH", ntohl(net)); ! 148: upHex(netnum); ! 149: printf("ns:%-8s ", netnum); ! 150: printf("%-15s ", ns_phost(sns)); ! 151: } ! 152: break; ! 153: case AF_LINK: ! 154: { ! 155: struct sockaddr_dl *sdl = ! 156: (struct sockaddr_dl *)sa; ! 157: cp = (char *)LLADDR(sdl); ! 158: n = sdl->sdl_alen; ! 159: } ! 160: m = printf("<Link>"); ! 161: goto hexprint; ! 162: default: ! 163: m = printf("(%d)", sa->sa_family); ! 164: for (cp = sa->sa_len + (char *)sa; ! 165: --cp > sa->sa_data && (*cp == 0);) {} ! 166: n = cp - sa->sa_data + 1; ! 167: cp = sa->sa_data; ! 168: hexprint: ! 169: while (--n >= 0) ! 170: m += printf("%x%c", *cp++ & 0xff, ! 171: n > 0 ? '.' : ' '); ! 172: m = 28 - m; ! 173: while (m-- > 0) ! 174: putchar(' '); ! 175: break; ! 176: } ! 177: ifaddraddr = (off_t)ifaddr.ifa.ifa_next; ! 178: } ! 179: printf("%8d %5d %8d %5d %5d", ! 180: ifnet.if_ipackets, ifnet.if_ierrors, ! 181: ifnet.if_opackets, ifnet.if_oerrors, ! 182: ifnet.if_collisions); ! 183: if (tflag) ! 184: printf(" %3d", ifnet.if_timer); ! 185: if (dflag) ! 186: printf(" %3d", ifnet.if_snd.ifq_drops); ! 187: putchar('\n'); ! 188: } ! 189: } ! 190: ! 191: #define MAXIF 10 ! 192: struct iftot { ! 193: char ift_name[16]; /* interface name */ ! 194: int ift_ip; /* input packets */ ! 195: int ift_ie; /* input errors */ ! 196: int ift_op; /* output packets */ ! 197: int ift_oe; /* output errors */ ! 198: int ift_co; /* collisions */ ! 199: int ift_dr; /* drops */ ! 200: } iftot[MAXIF]; ! 201: ! 202: u_char signalled; /* set if alarm goes off "early" */ ! 203: ! 204: /* ! 205: * Print a running summary of interface statistics. ! 206: * Repeat display every interval seconds, showing statistics ! 207: * collected over that interval. Assumes that interval is non-zero. ! 208: * First line printed at top of screen is always cumulative. ! 209: */ ! 210: sidewaysintpr(interval, off) ! 211: unsigned interval; ! 212: off_t off; ! 213: { ! 214: struct ifnet ifnet; ! 215: off_t firstifnet; ! 216: register struct iftot *ip, *total; ! 217: register int line; ! 218: struct iftot *lastif, *sum, *interesting; ! 219: int oldmask; ! 220: int catchalarm(); ! 221: ! 222: kvm_read(off, (char *)&firstifnet, sizeof (off_t)); ! 223: lastif = iftot; ! 224: sum = iftot + MAXIF - 1; ! 225: total = sum - 1; ! 226: interesting = iftot; ! 227: for (off = firstifnet, ip = iftot; off;) { ! 228: char *cp; ! 229: ! 230: kvm_read(off, (char *)&ifnet, sizeof ifnet); ! 231: ip->ift_name[0] = '('; ! 232: kvm_read((off_t)ifnet.if_name, ip->ift_name + 1, 15); ! 233: if (interface && strcmp(ip->ift_name + 1, interface) == 0 && ! 234: unit == ifnet.if_unit) ! 235: interesting = ip; ! 236: ip->ift_name[15] = '\0'; ! 237: cp = index(ip->ift_name, '\0'); ! 238: sprintf(cp, "%d)", ifnet.if_unit); ! 239: ip++; ! 240: if (ip >= iftot + MAXIF - 2) ! 241: break; ! 242: off = (off_t) ifnet.if_next; ! 243: } ! 244: lastif = ip; ! 245: ! 246: (void)signal(SIGALRM, catchalarm); ! 247: signalled = NO; ! 248: (void)alarm(interval); ! 249: banner: ! 250: printf(" input %-6.6s output ", interesting->ift_name); ! 251: if (lastif - iftot > 0) { ! 252: if (dflag) ! 253: printf(" "); ! 254: printf(" input (Total) output"); ! 255: } ! 256: for (ip = iftot; ip < iftot + MAXIF; ip++) { ! 257: ip->ift_ip = 0; ! 258: ip->ift_ie = 0; ! 259: ip->ift_op = 0; ! 260: ip->ift_oe = 0; ! 261: ip->ift_co = 0; ! 262: ip->ift_dr = 0; ! 263: } ! 264: putchar('\n'); ! 265: printf("%8.8s %5.5s %8.8s %5.5s %5.5s ", ! 266: "packets", "errs", "packets", "errs", "colls"); ! 267: if (dflag) ! 268: printf("%5.5s ", "drops"); ! 269: if (lastif - iftot > 0) ! 270: printf(" %8.8s %5.5s %8.8s %5.5s %5.5s", ! 271: "packets", "errs", "packets", "errs", "colls"); ! 272: if (dflag) ! 273: printf(" %5.5s", "drops"); ! 274: putchar('\n'); ! 275: fflush(stdout); ! 276: line = 0; ! 277: loop: ! 278: sum->ift_ip = 0; ! 279: sum->ift_ie = 0; ! 280: sum->ift_op = 0; ! 281: sum->ift_oe = 0; ! 282: sum->ift_co = 0; ! 283: sum->ift_dr = 0; ! 284: for (off = firstifnet, ip = iftot; off && ip < lastif; ip++) { ! 285: kvm_read(off, (char *)&ifnet, sizeof ifnet); ! 286: if (ip == interesting) { ! 287: printf("%8d %5d %8d %5d %5d", ! 288: ifnet.if_ipackets - ip->ift_ip, ! 289: ifnet.if_ierrors - ip->ift_ie, ! 290: ifnet.if_opackets - ip->ift_op, ! 291: ifnet.if_oerrors - ip->ift_oe, ! 292: ifnet.if_collisions - ip->ift_co); ! 293: if (dflag) ! 294: printf(" %5d", ! 295: ifnet.if_snd.ifq_drops - ip->ift_dr); ! 296: } ! 297: ip->ift_ip = ifnet.if_ipackets; ! 298: ip->ift_ie = ifnet.if_ierrors; ! 299: ip->ift_op = ifnet.if_opackets; ! 300: ip->ift_oe = ifnet.if_oerrors; ! 301: ip->ift_co = ifnet.if_collisions; ! 302: ip->ift_dr = ifnet.if_snd.ifq_drops; ! 303: sum->ift_ip += ip->ift_ip; ! 304: sum->ift_ie += ip->ift_ie; ! 305: sum->ift_op += ip->ift_op; ! 306: sum->ift_oe += ip->ift_oe; ! 307: sum->ift_co += ip->ift_co; ! 308: sum->ift_dr += ip->ift_dr; ! 309: off = (off_t) ifnet.if_next; ! 310: } ! 311: if (lastif - iftot > 0) { ! 312: printf(" %8d %5d %8d %5d %5d", ! 313: sum->ift_ip - total->ift_ip, ! 314: sum->ift_ie - total->ift_ie, ! 315: sum->ift_op - total->ift_op, ! 316: sum->ift_oe - total->ift_oe, ! 317: sum->ift_co - total->ift_co); ! 318: if (dflag) ! 319: printf(" %5d", sum->ift_dr - total->ift_dr); ! 320: } ! 321: *total = *sum; ! 322: putchar('\n'); ! 323: fflush(stdout); ! 324: line++; ! 325: oldmask = sigblock(sigmask(SIGALRM)); ! 326: if (! signalled) { ! 327: sigpause(0); ! 328: } ! 329: sigsetmask(oldmask); ! 330: signalled = NO; ! 331: (void)alarm(interval); ! 332: if (line == 21) ! 333: goto banner; ! 334: goto loop; ! 335: /*NOTREACHED*/ ! 336: } ! 337: ! 338: /* ! 339: * Called if an interval expires before sidewaysintpr has completed a loop. ! 340: * Sets a flag to not wait for the alarm. ! 341: */ ! 342: catchalarm() ! 343: { ! 344: signalled = YES; ! 345: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.