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