mroute.c revision 1.4 1 1.1 brezak /*
2 1.4 mycroft * Copyright (c) 1989 Stephen Deering
3 1.4 mycroft * Copyright (c) 1992, 1993
4 1.4 mycroft * The Regents of the University of California. All rights reserved.
5 1.4 mycroft *
6 1.4 mycroft * This code is derived from software contributed to Berkeley by
7 1.4 mycroft * Stephen Deering of Stanford University.
8 1.4 mycroft *
9 1.4 mycroft * Redistribution and use in source and binary forms, with or without
10 1.4 mycroft * modification, are permitted provided that the following conditions
11 1.4 mycroft * are met:
12 1.4 mycroft * 1. Redistributions of source code must retain the above copyright
13 1.4 mycroft * notice, this list of conditions and the following disclaimer.
14 1.4 mycroft * 2. Redistributions in binary form must reproduce the above copyright
15 1.4 mycroft * notice, this list of conditions and the following disclaimer in the
16 1.4 mycroft * documentation and/or other materials provided with the distribution.
17 1.4 mycroft * 3. All advertising materials mentioning features or use of this software
18 1.4 mycroft * must display the following acknowledgement:
19 1.4 mycroft * This product includes software developed by the University of
20 1.4 mycroft * California, Berkeley and its contributors.
21 1.4 mycroft * 4. Neither the name of the University nor the names of its contributors
22 1.4 mycroft * may be used to endorse or promote products derived from this software
23 1.4 mycroft * without specific prior written permission.
24 1.4 mycroft *
25 1.4 mycroft * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 1.4 mycroft * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 1.4 mycroft * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 1.4 mycroft * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 1.4 mycroft * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 1.4 mycroft * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 1.4 mycroft * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 1.4 mycroft * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 1.4 mycroft * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 1.4 mycroft * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 1.4 mycroft * SUCH DAMAGE.
36 1.4 mycroft *
37 1.4 mycroft * from: @(#)mroute.c 8.1 (Berkeley) 6/6/93
38 1.4 mycroft * $Id: mroute.c,v 1.4 1994/05/13 08:08:17 mycroft Exp $
39 1.4 mycroft */
40 1.4 mycroft
41 1.4 mycroft /*
42 1.1 brezak * Print DVMRP multicast routing structures and statistics.
43 1.1 brezak *
44 1.1 brezak * MROUTING 1.0
45 1.1 brezak */
46 1.1 brezak
47 1.4 mycroft #include <sys/param.h>
48 1.4 mycroft #include <sys/socket.h>
49 1.4 mycroft #include <sys/socketvar.h>
50 1.4 mycroft #include <sys/protosw.h>
51 1.1 brezak
52 1.1 brezak #include <netinet/in.h>
53 1.1 brezak #include <netinet/igmp.h>
54 1.1 brezak #define KERNEL 1
55 1.1 brezak #include <netinet/ip_mroute.h>
56 1.1 brezak #undef KERNEL
57 1.1 brezak
58 1.4 mycroft #include <stdio.h>
59 1.4 mycroft #include <stdlib.h>
60 1.4 mycroft #include "netstat.h"
61 1.1 brezak
62 1.4 mycroft void
63 1.1 brezak mroutepr(mrpaddr, mrtaddr, vifaddr)
64 1.3 cgd u_long mrpaddr, mrtaddr, vifaddr;
65 1.1 brezak {
66 1.1 brezak u_int mrtproto;
67 1.1 brezak struct mrt *mrttable[MRTHASHSIZ];
68 1.1 brezak struct vif viftable[MAXVIFS];
69 1.4 mycroft register struct mrt *mrt;
70 1.4 mycroft struct mrt smrt;
71 1.1 brezak register struct vif *v;
72 1.1 brezak register vifi_t vifi;
73 1.4 mycroft register struct in_addr *grp;
74 1.4 mycroft register int i, n;
75 1.4 mycroft register int banner_printed;
76 1.4 mycroft register int saved_nflag;
77 1.1 brezak
78 1.4 mycroft if (mrpaddr == 0) {
79 1.1 brezak printf("ip_mrtproto: symbol not in namelist\n");
80 1.1 brezak return;
81 1.1 brezak }
82 1.1 brezak
83 1.4 mycroft kread(mrpaddr, (char *)&mrtproto, sizeof(mrtproto));
84 1.1 brezak switch (mrtproto) {
85 1.4 mycroft
86 1.4 mycroft case 0:
87 1.1 brezak printf("no multicast routing compiled into this system\n");
88 1.1 brezak return;
89 1.1 brezak
90 1.4 mycroft case IGMP_DVMRP:
91 1.1 brezak break;
92 1.1 brezak
93 1.4 mycroft default:
94 1.1 brezak printf("multicast routing protocol %u, unknown\n", mrtproto);
95 1.1 brezak return;
96 1.1 brezak }
97 1.1 brezak
98 1.1 brezak if (mrtaddr == 0) {
99 1.1 brezak printf("mrttable: symbol not in namelist\n");
100 1.1 brezak return;
101 1.1 brezak }
102 1.1 brezak if (vifaddr == 0) {
103 1.1 brezak printf("viftable: symbol not in namelist\n");
104 1.1 brezak return;
105 1.1 brezak }
106 1.1 brezak
107 1.1 brezak saved_nflag = nflag;
108 1.1 brezak nflag = 1;
109 1.1 brezak
110 1.4 mycroft kread(vifaddr, (char *)&viftable, sizeof(viftable));
111 1.1 brezak banner_printed = 0;
112 1.1 brezak for (vifi = 0, v = viftable; vifi < MAXVIFS; ++vifi, ++v) {
113 1.4 mycroft if (v->v_lcl_addr.s_addr == 0)
114 1.4 mycroft continue;
115 1.1 brezak
116 1.1 brezak if (!banner_printed) {
117 1.1 brezak printf("\nVirtual Interface Table\n%s%s",
118 1.4 mycroft " Vif Threshold Local-Address ",
119 1.4 mycroft "Remote-Address Groups\n");
120 1.1 brezak banner_printed = 1;
121 1.1 brezak }
122 1.1 brezak
123 1.1 brezak printf(" %2u %3u %-15.15s",
124 1.4 mycroft vifi, v->v_threshold, routename(v->v_lcl_addr.s_addr));
125 1.4 mycroft printf(" %-15.15s\n", (v->v_flags & VIFF_TUNNEL) ?
126 1.4 mycroft routename(v->v_rmt_addr.s_addr) : "");
127 1.1 brezak
128 1.1 brezak n = v->v_lcl_grps_n;
129 1.4 mycroft grp = (struct in_addr *)malloc(n * sizeof(*grp));
130 1.4 mycroft if (grp == NULL) {
131 1.4 mycroft printf("v_lcl_grps_n: malloc failed\n");
132 1.4 mycroft return;
133 1.4 mycroft }
134 1.4 mycroft kread((u_long)v->v_lcl_grps, (caddr_t)grp, n * sizeof(*grp));
135 1.1 brezak for (i = 0; i < n; ++i)
136 1.4 mycroft printf("%51s %-15.15s\n",
137 1.4 mycroft "", routename((grp++)->s_addr));
138 1.4 mycroft free(grp);
139 1.1 brezak }
140 1.4 mycroft if (!banner_printed)
141 1.4 mycroft printf("\nVirtual Interface Table is empty\n");
142 1.1 brezak
143 1.4 mycroft kread(mrtaddr, (char *)&mrttable, sizeof(mrttable));
144 1.1 brezak banner_printed = 0;
145 1.1 brezak for (i = 0; i < MRTHASHSIZ; ++i) {
146 1.4 mycroft for (mrt = mrttable[i]; mrt != NULL; mrt = mrt->mrt_next) {
147 1.4 mycroft if (!banner_printed) {
148 1.4 mycroft printf("\nMulticast Routing Table\n%s",
149 1.4 mycroft " Hash Origin-Subnet In-Vif Out-Vifs\n");
150 1.4 mycroft banner_printed = 1;
151 1.4 mycroft }
152 1.1 brezak
153 1.4 mycroft kread((u_long)mrt, (char *)&smrt, sizeof(*mrt));
154 1.4 mycroft mrt = &smrt;
155 1.4 mycroft printf(" %3u %-15.15s %2u ",
156 1.4 mycroft i, netname(mrt->mrt_origin.s_addr,
157 1.4 mycroft ntohl(mrt->mrt_originmask.s_addr)),
158 1.4 mycroft mrt->mrt_parent);
159 1.4 mycroft for (vifi = 0; vifi < MAXVIFS; ++vifi)
160 1.4 mycroft if (VIFM_ISSET(vifi, mrt->mrt_children))
161 1.1 brezak printf(" %u%c",
162 1.4 mycroft vifi,
163 1.4 mycroft VIFM_ISSET(vifi, mrt->mrt_leaves) ?
164 1.4 mycroft '*' : ' ');
165 1.4 mycroft printf("\n");
166 1.1 brezak }
167 1.1 brezak }
168 1.4 mycroft if (!banner_printed)
169 1.4 mycroft printf("\nMulticast Routing Table is empty\n");
170 1.1 brezak
171 1.1 brezak printf("\n");
172 1.1 brezak nflag = saved_nflag;
173 1.1 brezak }
174 1.1 brezak
175 1.1 brezak
176 1.4 mycroft void
177 1.1 brezak mrt_stats(mrpaddr, mstaddr)
178 1.3 cgd u_long mrpaddr, mstaddr;
179 1.1 brezak {
180 1.1 brezak u_int mrtproto;
181 1.1 brezak struct mrtstat mrtstat;
182 1.1 brezak
183 1.1 brezak if(mrpaddr == 0) {
184 1.1 brezak printf("ip_mrtproto: symbol not in namelist\n");
185 1.1 brezak return;
186 1.1 brezak }
187 1.1 brezak
188 1.4 mycroft kread(mrpaddr, (char *)&mrtproto, sizeof(mrtproto));
189 1.1 brezak switch (mrtproto) {
190 1.1 brezak case 0:
191 1.1 brezak printf("no multicast routing compiled into this system\n");
192 1.1 brezak return;
193 1.1 brezak
194 1.1 brezak case IGMP_DVMRP:
195 1.1 brezak break;
196 1.1 brezak
197 1.1 brezak default:
198 1.1 brezak printf("multicast routing protocol %u, unknown\n", mrtproto);
199 1.1 brezak return;
200 1.1 brezak }
201 1.1 brezak
202 1.1 brezak if (mstaddr == 0) {
203 1.1 brezak printf("mrtstat: symbol not in namelist\n");
204 1.1 brezak return;
205 1.1 brezak }
206 1.1 brezak
207 1.4 mycroft kread(mstaddr, (char *)&mrtstat, sizeof(mrtstat));
208 1.1 brezak printf("multicast routing:\n");
209 1.1 brezak printf(" %10u multicast route lookup%s\n",
210 1.1 brezak mrtstat.mrts_mrt_lookups, plural(mrtstat.mrts_mrt_lookups));
211 1.1 brezak printf(" %10u multicast route cache miss%s\n",
212 1.1 brezak mrtstat.mrts_mrt_misses, plurales(mrtstat.mrts_mrt_misses));
213 1.1 brezak printf(" %10u group address lookup%s\n",
214 1.1 brezak mrtstat.mrts_grp_lookups, plural(mrtstat.mrts_grp_lookups));
215 1.1 brezak printf(" %10u group address cache miss%s\n",
216 1.1 brezak mrtstat.mrts_grp_misses, plurales(mrtstat.mrts_grp_misses));
217 1.1 brezak printf(" %10u datagram%s with no route for origin\n",
218 1.1 brezak mrtstat.mrts_no_route, plural(mrtstat.mrts_no_route));
219 1.1 brezak printf(" %10u datagram%s with malformed tunnel options\n",
220 1.1 brezak mrtstat.mrts_bad_tunnel, plural(mrtstat.mrts_bad_tunnel));
221 1.1 brezak printf(" %10u datagram%s with no room for tunnel options\n",
222 1.1 brezak mrtstat.mrts_cant_tunnel, plural(mrtstat.mrts_cant_tunnel));
223 1.1 brezak }
224