|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)route.c 4.6 83/05/30";
3: #endif
4:
5: #include <sys/types.h>
6: #include <sys/socket.h>
7: #include <sys/mbuf.h>
8:
9: #include <net/if.h>
10: #define KERNEL /* to get routehash and RTHASHSIZ */
11: #include <net/route.h>
12: #include <netinet/in.h>
13:
14: #include <netdb.h>
15:
16: extern int kmem;
17: extern int nflag;
18: extern char *routename();
19:
20: /*
21: * Definitions for showing gateway flags.
22: */
23: struct bits {
24: short b_mask;
25: char b_val;
26: } bits[] = {
27: { RTF_UP, 'U' },
28: { RTF_GATEWAY, 'G' },
29: { RTF_HOST, 'H' },
30: { 0 }
31: };
32:
33: /*
34: * Print routing tables.
35: */
36: routepr(hostaddr, netaddr)
37: off_t hostaddr, netaddr;
38: {
39: struct mbuf mb;
40: register struct rtentry *rt;
41: register struct mbuf *m;
42: register struct bits *p;
43: struct netent *np;
44: struct hostent *hp;
45: char name[16], *flags;
46: struct mbuf *routehash[RTHASHSIZ];
47: struct ifnet ifnet;
48: int first = 1, i, doinghost = 1;
49:
50: if (hostaddr == 0) {
51: printf("rthost: symbol not in namelist\n");
52: return;
53: }
54: if (netaddr == 0) {
55: printf("rtnet: symbol not in namelist\n");
56: return;
57: }
58: klseek(kmem, hostaddr, 0);
59: read(kmem, routehash, sizeof (routehash));
60: printf("Routing tables\n");
61: printf("%-15.15s %-15.15s %-8.8s %-6.6s %-10.10s %s\n",
62: "Destination", "Gateway",
63: "Flags", "Refcnt", "Use", "Interface");
64: again:
65: for (i = 0; i < RTHASHSIZ; i++) {
66: if (routehash[i] == 0)
67: continue;
68: m = routehash[i];
69: while (m) {
70: struct sockaddr_in *sin;
71:
72: klseek(kmem, m, 0);
73: read(kmem, &mb, sizeof (mb));
74: rt = mtod(&mb, struct rtentry *);
75: sin = (struct sockaddr_in *)&rt->rt_dst;
76: printf("%-15.15s ",
77: sin->sin_addr.s_addr ?
78: routename(sin->sin_addr) : "default");
79: sin = (struct sockaddr_in *)&rt->rt_gateway;
80: printf("%-15.15s ", routename(sin->sin_addr));
81: for (flags = name, p = bits; p->b_mask; p++)
82: if (p->b_mask & rt->rt_flags)
83: *flags++ = p->b_val;
84: *flags = '\0';
85: printf("%-8.8s %-6d %-10d ", name,
86: rt->rt_refcnt, rt->rt_use);
87: if (rt->rt_ifp == 0) {
88: putchar('\n');
89: m = mb.m_next;
90: continue;
91: }
92: klseek(kmem, rt->rt_ifp, 0);
93: read(kmem, &ifnet, sizeof (ifnet));
94: klseek(kmem, (int)ifnet.if_name, 0);
95: read(kmem, name, 16);
96: printf("%s%d\n", name, ifnet.if_unit);
97: m = mb.m_next;
98: }
99: }
100: if (doinghost) {
101: klseek(kmem, netaddr, 0);
102: read(kmem, routehash, sizeof (routehash));
103: doinghost = 0;
104: goto again;
105: }
106: }
107:
108: char *
109: routename(in)
110: struct in_addr in;
111: {
112: char *cp = 0;
113: static char line[50];
114: int lna, net;
115:
116: net = inet_netof(in);
117: lna = inet_lnaof(in);
118: if (!nflag) {
119: if (lna == INADDR_ANY) {
120: struct netent *np = getnetbyaddr(net, AF_INET);
121:
122: if (np)
123: cp = np->n_name;
124: } else {
125: struct hostent *hp;
126:
127: hp = gethostbyaddr(&in, sizeof (struct in_addr),
128: AF_INET);
129: if (hp)
130: cp = hp->h_name;
131: }
132: }
133: if (cp)
134: strcpy(line, cp);
135: else {
136: u_char *ucp = (u_char *)∈
137: if (lna == INADDR_ANY)
138: sprintf(line, "%u.%u.%u", ucp[0], ucp[1], ucp[2]);
139: else
140: sprintf(line, "%u.%u.%u.%u", ucp[0], ucp[1],
141: ucp[2], ucp[3]);
142: }
143: return (line);
144: }
145:
146: /*
147: * Print routing statistics
148: */
149: rt_stats(off)
150: off_t off;
151: {
152: struct rtstat rtstat;
153:
154: if (off == 0) {
155: printf("rtstat: symbol not in namelist\n");
156: return;
157: }
158: klseek(kmem, off, 0);
159: read(kmem, (char *)&rtstat, sizeof (rtstat));
160: printf("routing:\n");
161: printf("\t%d bad routing redirect%s\n",
162: rtstat.rts_badredirect, plural(rtstat.rts_badredirect));
163: printf("\t%d dynamically created route%s\n",
164: rtstat.rts_dynamic, plural(rtstat.rts_dynamic));
165: printf("\t%d new gateway%s due to redirects\n",
166: rtstat.rts_newgateway, plural(rtstat.rts_newgateway));
167: printf("\t%d destination%s found unreachable\n",
168: rtstat.rts_unreach, plural(rtstat.rts_unreach));
169: printf("\t%d use%s of a wildcard route\n",
170: rtstat.rts_wildcard, plural(rtstat.rts_wildcard));
171: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.