1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)if.c 5.3 (Berkeley) 4/23/86";
9: #endif not lint
10:
11: #include <sys/types.h>
12: #include <sys/socket.h>
13:
14: #include <net/if.h>
15: #include <netinet/in.h>
16: #include <netinet/in_var.h>
17: #include <netns/ns.h>
18:
19: #include <stdio.h>
20:
21: extern int kmem;
22: extern int tflag;
23: extern int nflag;
24: extern char *interface;
25: extern int unit;
26: extern char *routename(), *netname();
27:
28: /*
29: * Print a description of the network interfaces.
30: */
31: intpr(interval, ifnetaddr)
32: int interval;
33: off_t ifnetaddr;
34: {
35: struct ifnet ifnet;
36: union {
37: struct ifaddr ifa;
38: struct in_ifaddr in;
39: } ifaddr;
40: off_t ifaddraddr;
41: char name[16];
42:
43: if (ifnetaddr == 0) {
44: printf("ifnet: symbol not defined\n");
45: return;
46: }
47: if (interval) {
48: sidewaysintpr(interval, ifnetaddr);
49: return;
50: }
51: klseek(kmem, ifnetaddr, 0);
52: read(kmem, &ifnetaddr, sizeof ifnetaddr);
53: printf("%-5.5s %-5.5s %-10.10s %-12.12s %-7.7s %-5.5s %-7.7s %-5.5s",
54: "Name", "Mtu", "Network", "Address", "Ipkts", "Ierrs",
55: "Opkts", "Oerrs");
56: printf(" %-6.6s", "Collis");
57: if (tflag)
58: printf(" %-6.6s", "Timer");
59: putchar('\n');
60: ifaddraddr = 0;
61: while (ifnetaddr || ifaddraddr) {
62: struct sockaddr_in *sin;
63: register char *cp;
64: int n;
65: char *index();
66: struct in_addr in, inet_makeaddr();
67:
68: if (ifaddraddr == 0) {
69: klseek(kmem, ifnetaddr, 0);
70: read(kmem, &ifnet, sizeof ifnet);
71: klseek(kmem, (off_t)ifnet.if_name, 0);
72: read(kmem, name, 16);
73: name[15] = '\0';
74: ifnetaddr = (off_t) ifnet.if_next;
75: if (interface != 0 &&
76: (strcmp(name, interface) != 0 || unit != ifnet.if_unit))
77: continue;
78: cp = index(name, '\0');
79: *cp++ = ifnet.if_unit + '0';
80: if ((ifnet.if_flags&IFF_UP) == 0)
81: *cp++ = '*';
82: *cp = '\0';
83: ifaddraddr = (off_t)ifnet.if_addrlist;
84: }
85: printf("%-5.5s %-5d ", name, ifnet.if_mtu);
86: if (ifaddraddr == 0) {
87: printf("%-10.10s ", "none");
88: printf("%-12.12s ", "none");
89: } else {
90: klseek(kmem, ifaddraddr, 0);
91: read(kmem, &ifaddr, sizeof ifaddr);
92: ifaddraddr = (off_t)ifaddr.ifa.ifa_next;
93: switch (ifaddr.ifa.ifa_addr.sa_family) {
94: case AF_UNSPEC:
95: printf("%-10.10s ", "none");
96: printf("%-12.12s ", "none");
97: break;
98: case AF_INET:
99: sin = (struct sockaddr_in *)&ifaddr.in.ia_addr;
100: #ifdef notdef
101: /* can't use inet_makeaddr because kernel
102: * keeps nets unshifted.
103: */
104: in = inet_makeaddr(ifaddr.in.ia_subnet,
105: INADDR_ANY);
106: printf("%-10.10s ", netname(in));
107: #else
108: printf("%-10.10s ",
109: netname(htonl(ifaddr.in.ia_subnet),
110: ifaddr.in.ia_subnetmask));
111: #endif
112: printf("%-12.12s ", routename(sin->sin_addr));
113: break;
114: case AF_NS:
115: {
116: struct sockaddr_ns *sns =
117: (struct sockaddr_ns *)&ifaddr.in.ia_addr;
118: long net;
119: char host[8];
120: *(union ns_net *) &net = sns->sns_addr.x_net;
121: sprintf(host, "%lxH", ntohl(net));
122: upHex(host);
123: printf("ns:%-8s ", host);
124:
125: printf("%-12s ",ns_phost(sns));
126: }
127: break;
128: default:
129: printf("af%2d: ", ifaddr.ifa.ifa_addr.sa_family);
130: for (cp = (char *)&ifaddr.ifa.ifa_addr +
131: sizeof(struct sockaddr) - 1;
132: cp >= ifaddr.ifa.ifa_addr.sa_data; --cp)
133: if (*cp != 0)
134: break;
135: n = cp - (char *)ifaddr.ifa.ifa_addr.sa_data + 1;
136: cp = (char *)ifaddr.ifa.ifa_addr.sa_data;
137: if (n <= 6)
138: while (--n)
139: printf("%02d.", *cp++ & 0xff);
140: else
141: while (--n)
142: printf("%02d", *cp++ & 0xff);
143: printf("%02d ", *cp & 0xff);
144: break;
145: }
146: }
147: printf("%-7d %-5d %-7d %-5d %-6d",
148: ifnet.if_ipackets, ifnet.if_ierrors,
149: ifnet.if_opackets, ifnet.if_oerrors,
150: ifnet.if_collisions);
151: if (tflag)
152: printf(" %-6d", ifnet.if_timer);
153: putchar('\n');
154: }
155: }
156:
157: #define MAXIF 10
158: struct iftot {
159: char ift_name[16]; /* interface name */
160: int ift_ip; /* input packets */
161: int ift_ie; /* input errors */
162: int ift_op; /* output packets */
163: int ift_oe; /* output errors */
164: int ift_co; /* collisions */
165: } iftot[MAXIF];
166:
167: /*
168: * Print a running summary of interface statistics.
169: * Repeat display every interval seconds, showing
170: * statistics collected over that interval. First
171: * line printed at top of screen is always cumulative.
172: */
173: sidewaysintpr(interval, off)
174: int interval;
175: off_t off;
176: {
177: struct ifnet ifnet;
178: off_t firstifnet;
179: register struct iftot *ip, *total;
180: register int line;
181: struct iftot *lastif, *sum, *interesting;
182: int maxtraffic;
183:
184: klseek(kmem, off, 0);
185: read(kmem, &firstifnet, sizeof (off_t));
186: lastif = iftot;
187: sum = iftot + MAXIF - 1;
188: total = sum - 1;
189: interesting = iftot;
190: for (off = firstifnet, ip = iftot; off;) {
191: char *cp;
192:
193: klseek(kmem, off, 0);
194: read(kmem, &ifnet, sizeof ifnet);
195: klseek(kmem, (int)ifnet.if_name, 0);
196: ip->ift_name[0] = '(';
197: read(kmem, ip->ift_name + 1, 15);
198: if (interface && strcmp(ip->ift_name + 1, interface) == 0 &&
199: unit == ifnet.if_unit)
200: interesting = ip;
201: ip->ift_name[15] = '\0';
202: cp = index(ip->ift_name, '\0');
203: sprintf(cp, "%d)", ifnet.if_unit);
204: ip++;
205: if (ip >= iftot + MAXIF - 2)
206: break;
207: off = (off_t) ifnet.if_next;
208: }
209: lastif = ip;
210: banner:
211: printf(" input %-6.6s output ", interesting->ift_name);
212: if (lastif - iftot > 0)
213: printf(" input (Total) output ");
214: for (ip = iftot; ip < iftot + MAXIF; ip++) {
215: ip->ift_ip = 0;
216: ip->ift_ie = 0;
217: ip->ift_op = 0;
218: ip->ift_oe = 0;
219: ip->ift_co = 0;
220: }
221: putchar('\n');
222: printf("%-7.7s %-5.5s %-7.7s %-5.5s %-5.5s ",
223: "packets", "errs", "packets", "errs", "colls");
224: if (lastif - iftot > 0)
225: printf("%-7.7s %-5.5s %-7.7s %-5.5s %-5.5s ",
226: "packets", "errs", "packets", "errs", "colls");
227: putchar('\n');
228: fflush(stdout);
229: line = 0;
230: loop:
231: sum->ift_ip = 0;
232: sum->ift_ie = 0;
233: sum->ift_op = 0;
234: sum->ift_oe = 0;
235: sum->ift_co = 0;
236: for (off = firstifnet, ip = iftot; off && ip < lastif; ip++) {
237: klseek(kmem, off, 0);
238: read(kmem, &ifnet, sizeof ifnet);
239: if (ip == interesting)
240: printf("%-7d %-5d %-7d %-5d %-5d ",
241: ifnet.if_ipackets - ip->ift_ip,
242: ifnet.if_ierrors - ip->ift_ie,
243: ifnet.if_opackets - ip->ift_op,
244: ifnet.if_oerrors - ip->ift_oe,
245: ifnet.if_collisions - ip->ift_co);
246: ip->ift_ip = ifnet.if_ipackets;
247: ip->ift_ie = ifnet.if_ierrors;
248: ip->ift_op = ifnet.if_opackets;
249: ip->ift_oe = ifnet.if_oerrors;
250: ip->ift_co = ifnet.if_collisions;
251: sum->ift_ip += ip->ift_ip;
252: sum->ift_ie += ip->ift_ie;
253: sum->ift_op += ip->ift_op;
254: sum->ift_oe += ip->ift_oe;
255: sum->ift_co += ip->ift_co;
256: off = (off_t) ifnet.if_next;
257: }
258: if (lastif - iftot > 0)
259: printf("%-7d %-5d %-7d %-5d %-5d\n",
260: sum->ift_ip - total->ift_ip,
261: sum->ift_ie - total->ift_ie,
262: sum->ift_op - total->ift_op,
263: sum->ift_oe - total->ift_oe,
264: sum->ift_co - total->ift_co);
265: *total = *sum;
266: fflush(stdout);
267: line++;
268: if (interval)
269: sleep(interval);
270: if (line == 21)
271: goto banner;
272: goto loop;
273: /*NOTREACHED*/
274: }