|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)if.c 4.4 82/11/14";
3: #endif
4:
5: #include <sys/types.h>
6: #include <sys/socket.h>
7:
8: #include <net/if.h>
9: #include <netinet/in.h>
10: #include <netinet/if_ether.h>
11: #include <tahoeif/if_enp.h>
12: #include <nlist.h>
13:
14: #include <stdio.h>
15: #include "nstat.h"
16:
17: struct nlist ifnl[] = {
18: # define N_IFNET 0
19: { "_ifnet" },
20: { "" },
21: };
22: extern long flaggiven;
23: extern int kmem;
24: extern ENPSTAT enp_stats;
25: extern char *system;
26: extern char *routename();
27: char name[16];
28:
29: /*
30: * Print a description of the network interfaces.
31: */
32: intpr(interval)
33: int interval;
34: {
35: off_t ifnetaddr;
36: struct ifnet ifnet;
37: static int getvm = 0;
38: int i, statflag;
39:
40: if (!getvm) {
41: nlist(system, ifnl);
42: ++getvm;
43: }
44: ifnetaddr = ifnl[N_IFNET].n_value;
45: if (ifnetaddr == 0) {
46: printf("ifnet: symbol not defined\n");
47: return;
48: }
49: if (interval && !iflag) {
50: sidewaysintpr(interval, ifnetaddr);
51: return;
52: }
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: printf(" %-6.6s", "Timer");
58: putchar('\n');
59: klseek(kmem, ifnetaddr, 0);
60: read(kmem, &ifnetaddr, sizeof ifnetaddr);
61: while (ifnetaddr) {
62: struct sockaddr_in *sin;
63: register char *cp;
64: char *index();
65: struct in_addr in, inet_makeaddr();
66:
67: klseek(kmem, ifnetaddr, 0);
68: read(kmem, &ifnet, sizeof ifnet);
69: klseek(kmem, (int)ifnet.if_name, 0);
70: read(kmem, name, 16);
71: name[15] = '\0';
72: cp = index(name, '\0');
73: if ((ifnet.if_flags&IFF_UP) == 0) {
74: *cp++ = ifnet.if_unit + '0';
75: *cp++ = '*';
76: } else {
77: if (!strcmp(name, "enp")) {
78: if (!enpstat(ifnet.if_unit, 1))
79: get_enpstat(&enp_stats, &ifnet);
80: }
81: *cp++ = ifnet.if_unit + '0';
82: }
83: *cp = '\0';
84: printf("%-5.5s %-5d ", name, ifnet.if_mtu);
85: sin = (struct sockaddr_in *)&ifnet.if_addr;
86: in = inet_makeaddr(ifnet.if_net, INADDR_ANY);
87: printf("%-10.10s ", routename(in));
88: printf("%-12.12s %-7d %-5d %-7d %-5d %-6d",
89: routename(sin->sin_addr),
90: ifnet.if_ipackets, ifnet.if_ierrors,
91: ifnet.if_opackets, ifnet.if_oerrors,
92: ifnet.if_collisions);
93: printf(" %-6d", ifnet.if_timer);
94: putchar('\n');
95: ifnetaddr = (off_t) ifnet.if_next;
96: }
97: }
98:
99: #define MAXIF 10
100: struct iftot {
101: char ift_name[16]; /* interface name */
102: int ift_ip; /* input packets */
103: int ift_ie; /* input errors */
104: int ift_op; /* output packets */
105: int ift_oe; /* output errors */
106: int ift_co; /* collisions */
107: } iftot[MAXIF];
108:
109: /*
110: * Print a running summary of interface statistics.
111: * Repeat display every interval seconds, showing
112: * statistics collected over that interval. First
113: * line printed at top of screen is always cumulative.
114: */
115: sidewaysintpr(interval, off)
116: int interval;
117: off_t off;
118: {
119: struct ifnet ifnet;
120: off_t firstifnet;
121: extern char _sobuf[];
122: register struct iftot *ip, *total;
123: register int line;
124: struct iftot *lastif, *sum, *interesting;
125: int maxtraffic;
126:
127: setbuf(stdout, _sobuf);
128: klseek(kmem, off, 0);
129: read(kmem, &firstifnet, sizeof (off_t));
130: lastif = iftot;
131: sum = iftot + MAXIF - 1;
132: total = sum - 1;
133: for (off = firstifnet, ip = iftot; off;) {
134: struct sockaddr_in *sin;
135: char *cp;
136:
137: klseek(kmem, off, 0);
138: read(kmem, &ifnet, sizeof ifnet);
139: sin = (struct sockaddr_in *)&ifnet.if_addr;
140:
141: klseek(kmem, (int)ifnet.if_name, 0);
142: ip->ift_name[0] = '(';
143: read(kmem, ip->ift_name + 1, 15);
144: ip->ift_name[15] = '\0';
145: cp = index(ip->ift_name, '\0');
146: sprintf(cp, "%d)", ifnet.if_unit);
147:
148: ip++;
149: if (ip >= iftot + MAXIF - 2)
150: break;
151: off = (off_t) ifnet.if_next;
152:
153: }
154: lastif = ip;
155: interesting = iftot;
156: banner:
157: printf(" input %-6.6s output ", interesting->ift_name);
158: if (lastif - iftot > 0)
159: printf(" input (Total) output ");
160: for (ip = iftot; ip < iftot + MAXIF; ip++) {
161: ip->ift_ip = 0;
162: ip->ift_ie = 0;
163: ip->ift_op = 0;
164: ip->ift_oe = 0;
165: ip->ift_co = 0;
166: }
167: putchar('\n');
168: printf("%-7.7s %-5.5s %-7.7s %-5.5s %-5.5s ",
169: "packets", "errs", "packets", "errs", "colls");
170: if (lastif - iftot > 0)
171: printf("%-7.7s %-5.5s %-7.7s %-5.5s %-5.5s ",
172: "packets", "errs", "packets", "errs", "colls");
173: putchar('\n');
174: fflush(stdout);
175: line = 0;
176: loop:
177: sum->ift_ip = 0;
178: sum->ift_ie = 0;
179: sum->ift_op = 0;
180: sum->ift_oe = 0;
181: sum->ift_co = 0;
182: for (off = firstifnet, ip = iftot; off && ip < lastif; ip++) {
183: klseek(kmem, off, 0);
184: read(kmem, &ifnet, sizeof ifnet);
185: klseek(kmem, (int)ifnet.if_name, 0);
186: read(kmem, name, 16);
187: name[15] = '\0';
188: if (!strcmp(name, "enp")) {
189: if (!enpstat(ifnet.if_unit, 1))
190: get_enpstat(&enp_stats, &ifnet);
191: }
192: if (ip == interesting)
193: printf("%-7d %-5d %-7d %-5d %-5d ",
194: ifnet.if_ipackets - ip->ift_ip,
195: ifnet.if_ierrors - ip->ift_ie,
196: ifnet.if_opackets - ip->ift_op,
197: ifnet.if_oerrors - ip->ift_oe,
198: ifnet.if_collisions - ip->ift_co);
199: ip->ift_ip = ifnet.if_ipackets;
200: ip->ift_ie = ifnet.if_ierrors;
201: ip->ift_op = ifnet.if_opackets;
202: ip->ift_oe = ifnet.if_oerrors;
203: ip->ift_co = ifnet.if_collisions;
204: sum->ift_ip += ip->ift_ip;
205: sum->ift_ie += ip->ift_ie;
206: sum->ift_op += ip->ift_op;
207: sum->ift_oe += ip->ift_oe;
208: sum->ift_co += ip->ift_co;
209: off = (off_t) ifnet.if_next;
210: }
211: if (lastif - iftot > 0)
212: printf("%-7d %-5d %-7d %-5d %-5d\n",
213: sum->ift_ip - total->ift_ip,
214: sum->ift_ie - total->ift_ie,
215: sum->ift_op - total->ift_op,
216: sum->ift_oe - total->ift_oe,
217: sum->ift_co - total->ift_co);
218: *total = *sum;
219: fflush(stdout);
220: line++;
221: if (interval)
222: sleep(interval);
223: if (line == 21)
224: goto banner;
225: goto loop;
226: /*NOTREACHED*/
227: }
228:
229: get_enpstat(stat, ifp)
230: ENPSTAT *stat;
231: struct ifnet *ifp;
232: {
233: ifp->if_oerrors = stat->e_fail_retry +
234: stat->e_xmit_buff_err + stat->e_silo_underrun +
235: stat->e_late_coll + stat->e_lost_carrier +
236: stat->e_babble + stat->e_xmit_mem_err;
237:
238: ifp->if_collisions = stat->e_mult_retry + stat->e_one_retry +
239: stat->e_late_coll;
240:
241: ifp->if_ierrors = stat->e_rcv_missed + stat->e_crc_err +
242: stat->e_frame_err + stat->e_rcv_buff_err +
243: stat->e_silo_overrun + stat->e_rcv_mem_err;
244:
245: return;
246: }
247:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.