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