mroute.c revision 1.3 1 1.1 brezak /*
2 1.1 brezak * Print DVMRP multicast routing structures and statistics.
3 1.1 brezak *
4 1.1 brezak * MROUTING 1.0
5 1.1 brezak */
6 1.1 brezak
7 1.1 brezak #ifndef lint
8 1.3 cgd static char rcsid[] = "$Id: mroute.c,v 1.3 1994/04/01 09:18:14 cgd Exp $";
9 1.1 brezak #endif /* not lint */
10 1.1 brezak
11 1.1 brezak #include <stdio.h>
12 1.2 cgd #include <nlist.h>
13 1.2 cgd #include <kvm.h>
14 1.1 brezak #include <sys/param.h>
15 1.1 brezak #include <sys/mbuf.h>
16 1.1 brezak #include <netinet/in.h>
17 1.1 brezak #include <netinet/igmp.h>
18 1.1 brezak #define KERNEL 1
19 1.1 brezak struct socket; /* shut up warning */
20 1.1 brezak struct ip;
21 1.1 brezak #include <netinet/ip_mroute.h>
22 1.1 brezak #undef KERNEL
23 1.1 brezak
24 1.1 brezak extern int kmem;
25 1.1 brezak extern int nflag;
26 1.1 brezak extern char *routename();
27 1.1 brezak extern char *netname();
28 1.1 brezak extern char *plural();
29 1.1 brezak
30 1.1 brezak char *plurales(n)
31 1.1 brezak int n;
32 1.1 brezak {
33 1.1 brezak return (n == 1? "" : "es");
34 1.1 brezak }
35 1.1 brezak
36 1.1 brezak mroutepr(mrpaddr, mrtaddr, vifaddr)
37 1.3 cgd u_long mrpaddr, mrtaddr, vifaddr;
38 1.1 brezak {
39 1.1 brezak u_int mrtproto;
40 1.1 brezak #if BSD >= 199006
41 1.1 brezak struct mrt *mrttable[MRTHASHSIZ];
42 1.1 brezak struct mrt *mp;
43 1.1 brezak struct mrt mb;
44 1.1 brezak struct mrt *mrt = &mb;
45 1.1 brezak #else
46 1.1 brezak struct mbuf *mrttable[MRTHASHSIZ];
47 1.1 brezak struct mbuf *mp;
48 1.1 brezak struct mbuf mb;
49 1.1 brezak struct mrt *mrt = mtod(&mb, struct mrt *);
50 1.1 brezak #endif
51 1.1 brezak struct vif viftable[MAXVIFS];
52 1.1 brezak register struct vif *v;
53 1.1 brezak register vifi_t vifi;
54 1.1 brezak struct in_addr *grp;
55 1.1 brezak int i, n;
56 1.1 brezak int banner_printed;
57 1.1 brezak int saved_nflag;
58 1.1 brezak
59 1.1 brezak if(mrpaddr == 0) {
60 1.1 brezak printf("ip_mrtproto: symbol not in namelist\n");
61 1.1 brezak return;
62 1.1 brezak }
63 1.1 brezak
64 1.2 cgd kvm_read((void *)(long)mrpaddr, (char *)&mrtproto, sizeof(mrtproto));
65 1.1 brezak switch (mrtproto) {
66 1.1 brezak case 0:
67 1.1 brezak printf("no multicast routing compiled into this system\n");
68 1.1 brezak return;
69 1.1 brezak
70 1.1 brezak case IGMP_DVMRP:
71 1.1 brezak break;
72 1.1 brezak
73 1.1 brezak default:
74 1.1 brezak printf("multicast routing protocol %u, unknown\n", mrtproto);
75 1.1 brezak return;
76 1.1 brezak }
77 1.1 brezak
78 1.1 brezak if (mrtaddr == 0) {
79 1.1 brezak printf("mrttable: symbol not in namelist\n");
80 1.1 brezak return;
81 1.1 brezak }
82 1.1 brezak if (vifaddr == 0) {
83 1.1 brezak printf("viftable: symbol not in namelist\n");
84 1.1 brezak return;
85 1.1 brezak }
86 1.1 brezak
87 1.1 brezak saved_nflag = nflag;
88 1.1 brezak nflag = 1;
89 1.1 brezak
90 1.2 cgd kvm_read((void *)(long)vifaddr, (char *)viftable, sizeof(viftable));
91 1.1 brezak banner_printed = 0;
92 1.1 brezak for (vifi = 0, v = viftable; vifi < MAXVIFS; ++vifi, ++v) {
93 1.1 brezak struct in_addr v_lcl_grps[1024];
94 1.1 brezak
95 1.1 brezak if (v->v_lcl_addr.s_addr == 0) continue;
96 1.1 brezak
97 1.1 brezak if (!banner_printed) {
98 1.1 brezak printf("\nVirtual Interface Table\n%s%s",
99 1.1 brezak " Vif Threshold Local-Address ",
100 1.1 brezak "Remote-Address Groups\n");
101 1.1 brezak banner_printed = 1;
102 1.1 brezak }
103 1.1 brezak
104 1.1 brezak printf(" %2u %3u %-15.15s",
105 1.1 brezak vifi, v->v_threshold, routename(v->v_lcl_addr));
106 1.1 brezak printf(" %-15.15s\n",
107 1.1 brezak (v->v_flags & VIFF_TUNNEL) ?
108 1.1 brezak routename(v->v_rmt_addr) : "");
109 1.1 brezak
110 1.1 brezak n = v->v_lcl_grps_n;
111 1.1 brezak if (n == 0)
112 1.1 brezak continue;
113 1.1 brezak if (n < 0 || n > 1024)
114 1.1 brezak printf("[v_lcl_grps_n = %d!]\n", n);
115 1.1 brezak
116 1.1 brezak kvm_read(v->v_lcl_grps, (char *)v_lcl_grps,
117 1.1 brezak n * sizeof(struct in_addr));
118 1.1 brezak for (i = 0; i < n; ++i)
119 1.1 brezak printf("%51s %-15.15s\n", "",
120 1.1 brezak routename(v_lcl_grps[i]));
121 1.1 brezak }
122 1.1 brezak if (!banner_printed) printf("\nVirtual Interface Table is empty\n");
123 1.1 brezak
124 1.2 cgd kvm_read((void *)(long)mrtaddr, (char *)mrttable, sizeof(mrttable));
125 1.1 brezak banner_printed = 0;
126 1.1 brezak for (i = 0; i < MRTHASHSIZ; ++i) {
127 1.1 brezak for (mp = mrttable[i]; mp != NULL;
128 1.1 brezak #if BSD >= 199006
129 1.1 brezak mp = mb.mrt_next
130 1.1 brezak #else
131 1.1 brezak mp = mb.m_next
132 1.1 brezak #endif
133 1.1 brezak ) {
134 1.1 brezak
135 1.1 brezak if (!banner_printed) {
136 1.1 brezak printf("\nMulticast Routing Table\n%s",
137 1.1 brezak " Hash Origin-Subnet In-Vif Out-Vifs\n");
138 1.1 brezak banner_printed = 1;
139 1.1 brezak }
140 1.1 brezak kvm_read(mp, (char *)&mb, sizeof(mb));
141 1.1 brezak
142 1.1 brezak
143 1.1 brezak printf(" %3u %-15.15s %2u ",
144 1.1 brezak i,
145 1.1 brezak netname(mrt->mrt_origin.s_addr,
146 1.1 brezak ntohl(mrt->mrt_originmask.s_addr)),
147 1.1 brezak mrt->mrt_parent);
148 1.1 brezak for (vifi = 0; vifi < MAXVIFS; ++vifi) {
149 1.1 brezak if (viftable[vifi].v_lcl_addr.s_addr) {
150 1.1 brezak if (VIFM_ISSET(vifi, mrt->mrt_children)) {
151 1.1 brezak printf(" %u%c",
152 1.1 brezak vifi,
153 1.1 brezak VIFM_ISSET(vifi,
154 1.1 brezak mrt->mrt_leaves) ?
155 1.1 brezak '*' : ' ');
156 1.1 brezak } else
157 1.1 brezak printf(" ");
158 1.1 brezak }
159 1.1 brezak }
160 1.1 brezak printf("\n");
161 1.1 brezak }
162 1.1 brezak }
163 1.1 brezak if (!banner_printed) printf("\nMulticast Routing Table is empty\n");
164 1.1 brezak
165 1.1 brezak printf("\n");
166 1.1 brezak nflag = saved_nflag;
167 1.1 brezak }
168 1.1 brezak
169 1.1 brezak
170 1.1 brezak mrt_stats(mrpaddr, mstaddr)
171 1.3 cgd u_long mrpaddr, mstaddr;
172 1.1 brezak {
173 1.1 brezak u_int mrtproto;
174 1.1 brezak struct mrtstat mrtstat;
175 1.1 brezak
176 1.1 brezak if(mrpaddr == 0) {
177 1.1 brezak printf("ip_mrtproto: symbol not in namelist\n");
178 1.1 brezak return;
179 1.1 brezak }
180 1.1 brezak
181 1.2 cgd kvm_read((void *)(long)mrpaddr, (char *)&mrtproto, sizeof(mrtproto));
182 1.1 brezak switch (mrtproto) {
183 1.1 brezak case 0:
184 1.1 brezak printf("no multicast routing compiled into this system\n");
185 1.1 brezak return;
186 1.1 brezak
187 1.1 brezak case IGMP_DVMRP:
188 1.1 brezak break;
189 1.1 brezak
190 1.1 brezak default:
191 1.1 brezak printf("multicast routing protocol %u, unknown\n", mrtproto);
192 1.1 brezak return;
193 1.1 brezak }
194 1.1 brezak
195 1.1 brezak if (mstaddr == 0) {
196 1.1 brezak printf("mrtstat: symbol not in namelist\n");
197 1.1 brezak return;
198 1.1 brezak }
199 1.1 brezak
200 1.2 cgd kvm_read((void *)(long)mstaddr, (char *)&mrtstat, sizeof(mrtstat));
201 1.1 brezak printf("multicast routing:\n");
202 1.1 brezak printf(" %10u multicast route lookup%s\n",
203 1.1 brezak mrtstat.mrts_mrt_lookups, plural(mrtstat.mrts_mrt_lookups));
204 1.1 brezak printf(" %10u multicast route cache miss%s\n",
205 1.1 brezak mrtstat.mrts_mrt_misses, plurales(mrtstat.mrts_mrt_misses));
206 1.1 brezak printf(" %10u group address lookup%s\n",
207 1.1 brezak mrtstat.mrts_grp_lookups, plural(mrtstat.mrts_grp_lookups));
208 1.1 brezak printf(" %10u group address cache miss%s\n",
209 1.1 brezak mrtstat.mrts_grp_misses, plurales(mrtstat.mrts_grp_misses));
210 1.1 brezak printf(" %10u datagram%s with no route for origin\n",
211 1.1 brezak mrtstat.mrts_no_route, plural(mrtstat.mrts_no_route));
212 1.1 brezak printf(" %10u datagram%s with malformed tunnel options\n",
213 1.1 brezak mrtstat.mrts_bad_tunnel, plural(mrtstat.mrts_bad_tunnel));
214 1.1 brezak printf(" %10u datagram%s with no room for tunnel options\n",
215 1.1 brezak mrtstat.mrts_cant_tunnel, plural(mrtstat.mrts_cant_tunnel));
216 1.1 brezak printf(" %10u datagram%s arrived on wrong interface\n",
217 1.1 brezak mrtstat.mrts_wrong_if, plural(mrtstat.mrts_wrong_if));
218 1.1 brezak }
219