[BACK]Return to mroute.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / netstat

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: }