Annotation of src/usr.bin/netstat/mroute.c, Revision 1.24
1.24 ! claudio 1: /* $OpenBSD: mroute.c,v 1.23 2015/01/16 06:40:10 deraadt Exp $ */
1.2 deraadt 2: /* $NetBSD: mroute.c,v 1.10 1996/05/11 13:51:27 mycroft Exp $ */
1.1 deraadt 3:
4: /*
5: * Copyright (c) 1989 Stephen Deering
6: * Copyright (c) 1992, 1993
7: * The Regents of the University of California. All rights reserved.
8: *
9: * This code is derived from software contributed to Berkeley by
10: * Stephen Deering of Stanford University.
11: *
12: * Redistribution and use in source and binary forms, with or without
13: * modification, are permitted provided that the following conditions
14: * are met:
15: * 1. Redistributions of source code must retain the above copyright
16: * notice, this list of conditions and the following disclaimer.
17: * 2. Redistributions in binary form must reproduce the above copyright
18: * notice, this list of conditions and the following disclaimer in the
19: * documentation and/or other materials provided with the distribution.
1.10 millert 20: * 3. Neither the name of the University nor the names of its contributors
1.1 deraadt 21: * may be used to endorse or promote products derived from this software
22: * without specific prior written permission.
23: *
24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34: * SUCH DAMAGE.
35: *
36: * from: @(#)mroute.c 8.1 (Berkeley) 6/6/93
37: */
38:
39: /*
1.12 mcbride 40: * Print multicast routing structures and statistics.
1.1 deraadt 41: *
42: * MROUTING 1.0
43: */
44:
1.23 deraadt 45: #include <sys/types.h>
1.1 deraadt 46: #include <sys/socket.h>
1.17 deraadt 47: #include <sys/sysctl.h>
1.1 deraadt 48:
49: #include <netinet/in.h>
50: #include <netinet/igmp.h>
51: #include <netinet/ip_mroute.h>
52:
1.18 chl 53: #include <err.h>
54: #include <errno.h>
1.5 millert 55: #include <limits.h>
1.1 deraadt 56: #include <stdio.h>
57: #include <stdlib.h>
1.24 ! claudio 58: #include <util.h>
1.1 deraadt 59: #include "netstat.h"
60:
61: void
1.24 ! claudio 62: mroutepr(void)
1.1 deraadt 63: {
64: u_int mrtproto;
1.24 ! claudio 65: struct vifinfo *v;
! 66: struct mfcinfo *m;
! 67: size_t needed, numvifs, nummfcs, vifi, mfci;
! 68: char *buf = NULL;
! 69: char fmtbuf[FMT_SCALED_STRSIZE];
! 70: vifi_t maxvif = 0;
1.21 guenther 71: int mib[] = { CTL_NET, PF_INET, IPPROTO_IP, IPCTL_MRTPROTO };
1.17 deraadt 72: size_t len = sizeof(int);
1.24 ! claudio 73: int banner_printed = 0, saved_nflag;
1.1 deraadt 74:
1.17 deraadt 75: if (sysctl(mib, sizeof(mib) / sizeof(mib[0]),
76: &mrtproto, &len, NULL, 0) == -1) {
77: if (errno != ENOPROTOOPT)
78: warn("mroute");
1.1 deraadt 79: return;
80: }
81: switch (mrtproto) {
82: case 0:
83: printf("no multicast routing compiled into this system\n");
84: return;
85: case IGMP_DVMRP:
86: break;
87: default:
88: printf("multicast routing protocol %u, unknown\n", mrtproto);
89: return;
90: }
91:
92: saved_nflag = nflag;
93: nflag = 1;
94:
1.24 ! claudio 95: mib[3] = IPCTL_MRTVIF;
! 96: needed = get_sysctl(mib, sizeof(mib) / sizeof(mib[0]), &buf);
! 97: numvifs = needed / sizeof(*v);
! 98: v = (struct vifinfo *)buf;
! 99: if (numvifs)
! 100: maxvif = v[numvifs - 1].v_vifi;
1.1 deraadt 101:
1.24 ! claudio 102: for (vifi = 0; vifi < numvifs; ++vifi, ++v) {
1.1 deraadt 103: if (!banner_printed) {
104: printf("\nVirtual Interface Table\n %s%s",
105: "Vif Thresh Limit Local-Address ",
106: "Remote-Address Pkt_in Pkt_out\n");
107: banner_printed = 1;
108: }
109:
1.19 michele 110: printf(" %3u %3u %-15.15s",
1.24 ! claudio 111: v->v_vifi, v->v_threshold,
1.16 claudio 112: routename4(v->v_lcl_addr.s_addr));
1.4 millert 113: printf(" %-15.15s %6lu %7lu\n", (v->v_flags & VIFF_TUNNEL) ?
1.16 claudio 114: routename4(v->v_rmt_addr.s_addr) : "",
1.1 deraadt 115: v->v_pkt_in, v->v_pkt_out);
116: }
117: if (!banner_printed)
1.17 deraadt 118: printf("Virtual Interface Table is empty\n");
1.1 deraadt 119:
120: banner_printed = 0;
121:
1.24 ! claudio 122: mib[3] = IPCTL_MRTMFC;
! 123: needed = get_sysctl(mib, sizeof(mib) / sizeof(mib[0]), &buf);
! 124: nummfcs = needed / sizeof(*m);
! 125: m = (struct mfcinfo *)buf;
1.1 deraadt 126:
1.24 ! claudio 127: for (mfci = 0; mfci < nummfcs; ++mfci, ++m) {
! 128: if (!banner_printed) {
! 129: printf("\nMulticast Forwarding Cache\n %s%s",
! 130: "Hash Origin Mcastgroup ",
! 131: "Traffic In-Vif Out-Vifs/Forw-ttl\n");
! 132: banner_printed = 1;
! 133: }
! 134:
! 135: printf(" %3zu %-15.15s",
! 136: mfci, routename4(m->mfc_origin.s_addr));
! 137: fmt_scaled(m->mfc_pkt_cnt, fmtbuf);
! 138: printf(" %-15.15s %7s %3u ",
! 139: routename4(m->mfc_mcastgrp.s_addr),
! 140: buf, m->mfc_parent);
! 141: for (vifi = 0; vifi <= maxvif; ++vifi)
! 142: if (m->mfc_ttls[vifi])
! 143: printf(" %zu/%u", vifi, m->mfc_ttls[vifi]);
1.12 mcbride 144:
1.24 ! claudio 145: printf("\n");
! 146: }
1.1 deraadt 147: if (!banner_printed)
1.17 deraadt 148: printf("Multicast Forwarding Cache is empty\n");
1.1 deraadt 149: else
1.24 ! claudio 150: printf("\nTotal no. of entries in cache: %zu\n", nummfcs);
1.1 deraadt 151:
152: printf("\n");
153: nflag = saved_nflag;
1.12 mcbride 154: }
1.1 deraadt 155:
156: void
1.17 deraadt 157: mrt_stats(void)
1.1 deraadt 158: {
159: u_int mrtproto;
160: struct mrtstat mrtstat;
1.21 guenther 161: int mib[] = { CTL_NET, PF_INET, IPPROTO_IP, IPCTL_MRTPROTO };
162: int mib2[] = { CTL_NET, PF_INET, IPPROTO_IP, IPCTL_MRTSTATS };
1.17 deraadt 163: size_t len = sizeof(int);
164:
165: if (sysctl(mib, sizeof(mib) / sizeof(mib[0]),
166: &mrtproto, &len, NULL, 0) == -1) {
167: if (errno != ENOPROTOOPT)
168: warn("mroute");
1.1 deraadt 169: return;
170: }
171: switch (mrtproto) {
172: case 0:
173: printf("no multicast routing compiled into this system\n");
174: return;
175:
176: case IGMP_DVMRP:
177: break;
178:
179: default:
180: printf("multicast routing protocol %u, unknown\n", mrtproto);
181: return;
182: }
183:
1.17 deraadt 184: len = sizeof(mrtstat);
185: if (sysctl(mib2, sizeof(mib2) / sizeof(mib2[0]),
186: &mrtstat, &len, NULL, 0) == -1) {
187: if (errno != ENOPROTOOPT)
188: warn("mroute");
1.1 deraadt 189: return;
190: }
191:
192: printf("multicast routing:\n");
1.8 itojun 193: printf("\t%lu datagram%s with no route for origin\n",
1.1 deraadt 194: mrtstat.mrts_no_route, plural(mrtstat.mrts_no_route));
1.8 itojun 195: printf("\t%lu upcall%s made to mrouted\n",
1.1 deraadt 196: mrtstat.mrts_upcalls, plural(mrtstat.mrts_upcalls));
1.8 itojun 197: printf("\t%lu datagram%s with malformed tunnel options\n",
1.1 deraadt 198: mrtstat.mrts_bad_tunnel, plural(mrtstat.mrts_bad_tunnel));
1.8 itojun 199: printf("\t%lu datagram%s with no room for tunnel options\n",
1.1 deraadt 200: mrtstat.mrts_cant_tunnel, plural(mrtstat.mrts_cant_tunnel));
1.8 itojun 201: printf("\t%lu datagram%s arrived on wrong interface\n",
1.1 deraadt 202: mrtstat.mrts_wrong_if, plural(mrtstat.mrts_wrong_if));
1.8 itojun 203: printf("\t%lu datagram%s dropped due to upcall Q overflow\n",
1.1 deraadt 204: mrtstat.mrts_upq_ovflw, plural(mrtstat.mrts_upq_ovflw));
1.8 itojun 205: printf("\t%lu datagram%s dropped due to upcall socket overflow\n",
1.1 deraadt 206: mrtstat.mrts_upq_sockfull, plural(mrtstat.mrts_upq_sockfull));
1.8 itojun 207: printf("\t%lu datagram%s cleaned up by the cache\n",
1.1 deraadt 208: mrtstat.mrts_cache_cleanups, plural(mrtstat.mrts_cache_cleanups));
1.8 itojun 209: printf("\t%lu datagram%s dropped selectively by ratelimiter\n",
1.1 deraadt 210: mrtstat.mrts_drop_sel, plural(mrtstat.mrts_drop_sel));
1.8 itojun 211: printf("\t%lu datagram%s dropped - bucket Q overflow\n",
1.1 deraadt 212: mrtstat.mrts_q_overflow, plural(mrtstat.mrts_q_overflow));
1.8 itojun 213: printf("\t%lu datagram%s dropped - larger than bkt size\n",
1.1 deraadt 214: mrtstat.mrts_pkt2large, plural(mrtstat.mrts_pkt2large));
215: }