Annotation of embedaddon/mrouted/mrinfo.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * This tool requests configuration info from a multicast router
        !             3:  * and prints the reply (if any).  Invoke it as:
        !             4:  *
        !             5:  *     mrinfo router-name-or-address
        !             6:  *
        !             7:  * Written Wed Mar 24 1993 by Van Jacobson (adapted from the
        !             8:  * multicast mapper written by Pavel Curtis).
        !             9:  *
        !            10:  * The lawyers insist we include the following UC copyright notice.
        !            11:  * The mapper from which this is derived contained a Xerox copyright
        !            12:  * notice which follows the UC one.  Try not to get depressed noting
        !            13:  * that the legal gibberish is larger than the program.
        !            14:  *
        !            15:  * Copyright (c) 1993 Regents of the University of California.
        !            16:  * All rights reserved.
        !            17:  *
        !            18:  * Redistribution and use in source and binary forms, with or without
        !            19:  * modification, are permitted provided that the following conditions
        !            20:  * are met:
        !            21:  * 1. Redistributions of source code must retain the above copyright
        !            22:  *    notice, this list of conditions and the following disclaimer.
        !            23:  * 2. Redistributions in binary form must reproduce the above copyright
        !            24:  *    notice, this list of conditions and the following disclaimer in the
        !            25:  *    documentation and/or other materials provided with the distribution.
        !            26:  * 3. All advertising materials mentioning features or use of this software
        !            27:  *    must display the following acknowledgement:
        !            28:  *     This product includes software developed by the Computer Systems
        !            29:  *     Engineering Group at Lawrence Berkeley Laboratory.
        !            30:  * 4. Neither the name of the University nor of the Laboratory may be used
        !            31:  *    to endorse or promote products derived from this software without
        !            32:  *    specific prior written permission.
        !            33:  *
        !            34:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            35:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            36:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            37:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            38:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            39:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            40:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            41:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            42:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            43:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            44:  * SUCH DAMAGE.
        !            45:  * ---------------------------------
        !            46:  * Copyright (c) 1992, 2001 Xerox Corporation.  All rights reserved.
        !            47:  *
        !            48:  * Redistribution and use in source and binary forms, with or without modification,
        !            49:  * are permitted provided that the following conditions are met:
        !            50:  *
        !            51:  * Redistributions of source code must retain the above copyright notice,
        !            52:  * this list of conditions and the following disclaimer.
        !            53:  *
        !            54:  * Redistributions in binary form must reproduce the above copyright notice,
        !            55:  * this list of conditions and the following disclaimer in the documentation
        !            56:  * and/or other materials provided with the distribution.
        !            57: 
        !            58:  * Neither name of the Xerox, PARC, nor the names of its contributors may be used
        !            59:  * to endorse or promote products derived from this software
        !            60:  * without specific prior written permission.
        !            61:  *
        !            62:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
        !            63:  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
        !            64:  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        !            65:  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE XEROX CORPORATION OR CONTRIBUTORS
        !            66:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            67:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        !            68:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
        !            69:  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
        !            70:  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
        !            71:  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
        !            72:  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            73:  */
        !            74: 
        !            75: #include <arpa/inet.h>
        !            76: #include <err.h>
        !            77: #include <netdb.h>
        !            78: #include <stdarg.h>
        !            79: #include <sys/time.h>
        !            80: #include <unistd.h>
        !            81: 
        !            82: #include "defs.h"
        !            83: 
        !            84: #define DEFAULT_TIMEOUT        4       /* How long to wait before retrying requests */
        !            85: #define DEFAULT_RETRIES 3      /* How many times to ask each router */
        !            86: 
        !            87: u_int32        our_addr, target_addr = 0;      /* in NET order */
        !            88: int     debug = 0;
        !            89: int    nflag = 0;
        !            90: int     retries = DEFAULT_RETRIES;
        !            91: int     timeout = DEFAULT_TIMEOUT;
        !            92: int    target_level = 0;
        !            93: vifi_t  numvifs;               /* to keep loader happy */
        !            94:                                /* (see COPY_TABLES macro called in kern.c) */
        !            95: 
        !            96: char * inet_name(u_int32 addr);
        !            97: void   ask(u_int32 dst);
        !            98: void   ask2(u_int32 dst);
        !            99: u_int32        host_addr(char *name);
        !           100: void   usage(void);
        !           101: 
        !           102: char *inet_name(u_int32 addr)
        !           103: {
        !           104:        struct hostent *e;
        !           105:        struct in_addr in;
        !           106: 
        !           107:        if (addr == 0)
        !           108:                return "local";
        !           109: 
        !           110:        if (nflag ||
        !           111:            (e = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET)) == NULL) {
        !           112:                in.s_addr = addr;
        !           113:                return (inet_ntoa(in));
        !           114:        }
        !           115:        return (e->h_name);
        !           116: }
        !           117: 
        !           118: /*
        !           119:  * Log errors and other messages to stderr, according to the severity of the
        !           120:  * message and the current debug level.  For errors of severity LOG_ERR or
        !           121:  * worse, terminate the program.
        !           122:  */
        !           123: void logit(int severity, int syserr, const char *format, ...)
        !           124: {
        !           125:        va_list ap;
        !           126: 
        !           127:        switch (debug) {
        !           128:        case 0:
        !           129:                if (severity > LOG_WARNING)
        !           130:                        return;
        !           131:        case 1:
        !           132:                if (severity > LOG_NOTICE)
        !           133:                        return;
        !           134:        case 2:
        !           135:                if (severity > LOG_INFO)
        !           136:                        return;
        !           137:        default:
        !           138:                if (severity == LOG_WARNING)
        !           139:                        fprintf(stderr, "warning - ");
        !           140:                va_start(ap, format);
        !           141:                vfprintf(stderr, format, ap);
        !           142:                va_end(ap);
        !           143:                if (syserr == 0)
        !           144:                        fprintf(stderr, "\n");
        !           145:                else
        !           146:                        fprintf(stderr, ": %s\n", strerror(syserr));
        !           147:        }
        !           148: 
        !           149:        if (severity <= LOG_ERR)
        !           150:                exit(1);
        !           151: }
        !           152: 
        !           153: /*
        !           154:  * Send a neighbors-list request.
        !           155:  */
        !           156: void ask(u_int32 dst)
        !           157: {
        !           158:        send_igmp(our_addr, dst, IGMP_DVMRP, DVMRP_ASK_NEIGHBORS,
        !           159:                        htonl(MROUTED_LEVEL), 0);
        !           160: }
        !           161: 
        !           162: void ask2(u_int32 dst)
        !           163: {
        !           164:        send_igmp(our_addr, dst, IGMP_DVMRP, DVMRP_ASK_NEIGHBORS2,
        !           165:                        htonl(MROUTED_LEVEL), 0);
        !           166: }
        !           167: 
        !           168: /*
        !           169:  * Process an incoming neighbor-list message.
        !           170:  */
        !           171: void accept_neighbors(u_int32 src, u_int32 UNUSED dst, u_char *p, size_t datalen, u_int32 UNUSED level)
        !           172: {
        !           173:        u_char *ep = p + datalen;
        !           174: #define GET_ADDR(a) (a = ((u_int32)*p++ << 24), a += ((u_int32)*p++ << 16),\
        !           175:                     a += ((u_int32)*p++ << 8), a += *p++)
        !           176: 
        !           177:        printf("%s (%s):\n", inet_fmt(src, s1, sizeof(s1)), inet_name(src));
        !           178:        while (p < ep) {
        !           179:                u_int32 laddr;
        !           180:                u_char metric;
        !           181:                u_char thresh;
        !           182:                int ncount;
        !           183: 
        !           184:                GET_ADDR(laddr);
        !           185:                laddr = htonl(laddr);
        !           186:                metric = *p++;
        !           187:                thresh = *p++;
        !           188:                ncount = *p++;
        !           189:                while (--ncount >= 0) {
        !           190:                        u_int32 neighbor;
        !           191:                        GET_ADDR(neighbor);
        !           192:                        neighbor = htonl(neighbor);
        !           193:                        printf("  %s -> ", inet_fmt(laddr, s1, sizeof(s1)));
        !           194:                        printf("%s (%s) [%d/%d]\n", inet_fmt(neighbor, s1, sizeof(s1)),
        !           195:                               inet_name(neighbor), metric, thresh);
        !           196:                }
        !           197:        }
        !           198: }
        !           199: 
        !           200: void accept_neighbors2(u_int32 src, u_int32 UNUSED dst, u_char *p, size_t datalen, u_int32 level)
        !           201: {
        !           202:        u_char *ep = p + datalen;
        !           203:        u_int broken_cisco = ((level & 0xffff) == 0x020a); /* 10.2 */
        !           204:        /* well, only possibly_broken_cisco, but that's too long to type. */
        !           205:        u_int majvers = level & 0xff;
        !           206:        u_int minvers = (level >> 8) & 0xff;
        !           207: 
        !           208:        printf("%s (%s) [", inet_fmt(src, s1, sizeof(s1)), inet_name(src));
        !           209:        if (majvers == 3 && minvers == 0xff)
        !           210:                printf("DVMRPv3 compliant");
        !           211:        else
        !           212:                printf("version %d.%d", majvers, minvers);
        !           213:        printf ("]:\n");
        !           214: 
        !           215:        while (p < ep) {
        !           216:                u_char metric;
        !           217:                u_char thresh;
        !           218:                u_char flags;
        !           219:                int ncount;
        !           220:                u_int32 laddr = *(u_int32*)p;
        !           221: 
        !           222:                p += 4;
        !           223:                metric = *p++;
        !           224:                thresh = *p++;
        !           225:                flags = *p++;
        !           226:                ncount = *p++;
        !           227:                if (broken_cisco && ncount == 0)        /* dumb Ciscos */
        !           228:                        ncount = 1;
        !           229:                if (broken_cisco && ncount > 15)        /* dumb Ciscos */
        !           230:                        ncount = ncount & 0xf;
        !           231:                while (--ncount >= 0 && p < ep) {
        !           232:                        u_int32 neighbor = *(u_int32*)p;
        !           233:                        p += 4;
        !           234:                        printf("  %s -> ", inet_fmt(laddr, s1, sizeof(s1)));
        !           235:                        printf("%s (%s) [%d/%d", inet_fmt(neighbor, s1, sizeof(s1)),
        !           236:                               inet_name(neighbor), metric, thresh);
        !           237:                        if (flags & DVMRP_NF_TUNNEL)
        !           238:                                printf("/tunnel");
        !           239:                        if (flags & DVMRP_NF_SRCRT)
        !           240:                                printf("/srcrt");
        !           241:                        if (flags & DVMRP_NF_PIM)
        !           242:                                printf("/pim");
        !           243:                        if (flags & DVMRP_NF_QUERIER)
        !           244:                                printf("/querier");
        !           245:                        if (flags & DVMRP_NF_DISABLED)
        !           246:                                printf("/disabled");
        !           247:                        if (flags & DVMRP_NF_DOWN)
        !           248:                                printf("/down");
        !           249:                        if (flags & DVMRP_NF_LEAF)
        !           250:                                printf("/leaf");
        !           251:                        printf("]\n");
        !           252:                }
        !           253:        }
        !           254: }
        !           255: 
        !           256: void usage(void)
        !           257: {
        !           258:     extern char *__progname;
        !           259: 
        !           260:     fprintf(stderr,
        !           261:            "Usage: %s [-hn] [-d [level]] [-r count] [-t seconds] [router]\n", __progname);
        !           262: 
        !           263:     exit(1);
        !           264: }
        !           265: 
        !           266: int main(int argc, char *argv[])
        !           267: {
        !           268:        int tries, trynew, curaddr, ch;
        !           269:        struct timeval et;
        !           270:        struct hostent *hp;
        !           271:        struct hostent bogus;
        !           272:        char *host;
        !           273:        uid_t uid;
        !           274:        const char *errstr;
        !           275: 
        !           276:        while ((ch = getopt(argc, argv, "d::hnr:t:")) != -1) {
        !           277:                switch (ch) {
        !           278:                case 'd':
        !           279:                        if (!optarg)
        !           280:                                debug = DEFAULT_DEBUG;
        !           281:                        else {
        !           282:                                debug = strtonum(optarg, 0, 3, &errstr);
        !           283:                                if (errstr) {
        !           284:                                        warnx("debug level %s", errstr);
        !           285:                                        debug = DEFAULT_DEBUG;
        !           286:                                }
        !           287:                        }
        !           288:                        break;
        !           289:                case 'h':
        !           290:                        usage();
        !           291:                        break;
        !           292:                case 'n':
        !           293:                        ++nflag;
        !           294:                        break;
        !           295:                case 'r':
        !           296:                        retries = strtonum(optarg, 0, INT_MAX, &errstr);
        !           297:                        if (errstr) {
        !           298:                                warnx("retries %s", errstr);
        !           299:                                usage();
        !           300:                        }
        !           301:                        break;
        !           302:                case 't':
        !           303:                        timeout = strtonum(optarg, 0, INT_MAX, &errstr);
        !           304:                        if (errstr) {
        !           305:                                warnx("timeout %s", errstr);
        !           306:                                usage();
        !           307:                        }
        !           308:                        break;
        !           309:                default:
        !           310:                        usage();
        !           311:                }
        !           312:        }
        !           313:        argc -= optind;
        !           314:        argv += optind;
        !           315: 
        !           316:        if (geteuid() != 0) {
        !           317:                fprintf(stderr, "mrinfo: must be root\n");
        !           318:                exit(1);
        !           319:        }
        !           320: 
        !           321:        init_igmp();
        !           322: 
        !           323:        uid = getuid();
        !           324:        if (setuid(uid) == -1)
        !           325:                err(1, "setuid");
        !           326: 
        !           327: 
        !           328:        setlinebuf(stderr);
        !           329: 
        !           330:        if (argc > 1)
        !           331:                usage();
        !           332:        if (argc == 1)
        !           333:                host = argv[0];
        !           334:        else
        !           335:                host = "127.0.0.1";
        !           336: 
        !           337:        if ((target_addr = inet_addr(host)) != INADDR_NONE) {
        !           338:                hp = &bogus;
        !           339:                hp->h_length = sizeof(target_addr);
        !           340:                if (!(hp->h_addr_list = (char **)calloc(2, sizeof(char *))))
        !           341:                        err(1, "Not enough memory");
        !           342:                if (!(hp->h_addr_list[0] = malloc(hp->h_length)))
        !           343:                        err(1, "Not enough memory");
        !           344:                memcpy(hp->h_addr_list[0], &target_addr, hp->h_length);
        !           345:                hp->h_addr_list[1] = 0;
        !           346:        } else
        !           347:                hp = gethostbyname(host);
        !           348: 
        !           349:        if (hp == NULL || hp->h_length != sizeof(target_addr)) {
        !           350:                fprintf(stderr, "mrinfo: %s: no such host\n", argv[0]);
        !           351:                exit(1);
        !           352:        }
        !           353:        if (debug)
        !           354:                fprintf(stderr, "Debug level %u\n", debug);
        !           355: 
        !           356:        /* Check all addresses; mrouters often have unreachable interfaces */
        !           357:        for (curaddr = 0; hp->h_addr_list[curaddr] != NULL; curaddr++) {
        !           358:            memcpy(&target_addr, hp->h_addr_list[curaddr], hp->h_length);
        !           359:            {                   /* Find a good local address for us. */
        !           360:                int     udp;
        !           361:                struct sockaddr_in addr;
        !           362:                socklen_t addrlen = sizeof(addr);
        !           363: 
        !           364:                memset(&addr, 0, sizeof addr);
        !           365:                addr.sin_family = AF_INET;
        !           366: #ifdef HAVE_SA_LEN
        !           367:                addr.sin_len = sizeof(addr);
        !           368: #endif
        !           369:                addr.sin_addr.s_addr = target_addr;
        !           370:                addr.sin_port = htons(2000); /* any port over 1024 will do... */
        !           371:                if ((udp = socket(AF_INET, SOCK_DGRAM, 0)) < 0
        !           372:                || connect(udp, (struct sockaddr *) & addr, sizeof(addr)) < 0
        !           373:                    || getsockname(udp, (struct sockaddr *) & addr, &addrlen) < 0) {
        !           374:                        perror("Determining local address");
        !           375:                        exit(1);
        !           376:                }
        !           377:                close(udp);
        !           378:                our_addr = addr.sin_addr.s_addr;
        !           379:            }
        !           380: 
        !           381:            tries = 0;
        !           382:            trynew = 1;
        !           383:            /*
        !           384:             * New strategy: send 'ask2' for two timeouts, then fall back
        !           385:             * to 'ask', since it's not very likely that we are going to
        !           386:             * find someone who only responds to 'ask' these days
        !           387:             */
        !           388:            ask2(target_addr);
        !           389: 
        !           390:            gettimeofday(&et, 0);
        !           391:            et.tv_sec += timeout;
        !           392: 
        !           393:            /* Main receive loop */
        !           394:            for (;;) {
        !           395:                fd_set  fds;
        !           396:                struct timeval tv, now;
        !           397:                int     count;
        !           398:                ssize_t recvlen;
        !           399:                socklen_t dummy = 0;
        !           400:                u_int32 src, dst, group;
        !           401:                struct ip *ip;
        !           402:                struct igmp *igmp;
        !           403:                size_t ipdatalen, iphdrlen, igmpdatalen;
        !           404: 
        !           405:                FD_ZERO(&fds);
        !           406:                if (igmp_socket >= (int)FD_SETSIZE)
        !           407:                        logit(LOG_ERR, 0, "Descriptor too big");
        !           408:                FD_SET(igmp_socket, &fds);
        !           409: 
        !           410:                gettimeofday(&now, 0);
        !           411:                tv.tv_sec = et.tv_sec - now.tv_sec;
        !           412:                tv.tv_usec = et.tv_usec - now.tv_usec;
        !           413: 
        !           414:                if (tv.tv_usec < 0) {
        !           415:                        tv.tv_usec += 1000000L;
        !           416:                        --tv.tv_sec;
        !           417:                }
        !           418:                if (tv.tv_sec < 0)
        !           419:                        tv.tv_sec = tv.tv_usec = 0;
        !           420: 
        !           421:                count = select(igmp_socket + 1, &fds, 0, 0, &tv);
        !           422: 
        !           423:                if (count < 0) {
        !           424:                        if (errno != EINTR)
        !           425:                                perror("select");
        !           426:                        continue;
        !           427:                } else if (count == 0) {
        !           428:                        logit(LOG_DEBUG, 0, "Timed out receiving neighbor lists");
        !           429:                        if (++tries > retries)
        !           430:                                break;
        !           431:                        /* If we've tried ASK_NEIGHBORS2 twice with
        !           432:                         * no response, fall back to ASK_NEIGHBORS
        !           433:                         */
        !           434:                        if (tries == 2 && target_level == 0)
        !           435:                                trynew = 0;
        !           436:                        if (target_level == 0 && trynew == 0)
        !           437:                                ask(target_addr);
        !           438:                        else
        !           439:                                ask2(target_addr);
        !           440:                        gettimeofday(&et, 0);
        !           441:                        et.tv_sec += timeout;
        !           442:                        continue;
        !           443:                }
        !           444:                recvlen = recvfrom(igmp_socket, recv_buf, RECV_BUF_SIZE,
        !           445:                                   0, NULL, &dummy);
        !           446:                if (recvlen <= 0) {
        !           447:                        if (recvlen && errno != EINTR)
        !           448:                                perror("recvfrom");
        !           449:                        continue;
        !           450:                }
        !           451: 
        !           452:                if (recvlen < (ssize_t)sizeof(struct ip)) {
        !           453:                        logit(LOG_WARNING, 0,
        !           454:                            "packet too short (%u bytes) for IP header",
        !           455:                            recvlen);
        !           456:                        continue;
        !           457:                }
        !           458:                ip = (struct ip *) recv_buf;
        !           459:                if (ip->ip_p == 0)
        !           460:                        continue;       /* Request to install cache entry */
        !           461:                src = ip->ip_src.s_addr;
        !           462:                dst = ip->ip_dst.s_addr;
        !           463:                iphdrlen = ip->ip_hl << 2;
        !           464:                ipdatalen = ntohs(ip->ip_len) - iphdrlen;
        !           465:                if (iphdrlen + ipdatalen != (size_t)recvlen) {
        !           466:                    logit(LOG_WARNING, 0,
        !           467:                      "packet shorter (%u bytes) than hdr+data length (%u+%u)",
        !           468:                      recvlen, iphdrlen, ipdatalen);
        !           469:                    continue;
        !           470:                }
        !           471:                igmp = (struct igmp *) (recv_buf + iphdrlen);
        !           472:                group = igmp->igmp_group.s_addr;
        !           473:                if (ipdatalen < IGMP_MINLEN) {
        !           474:                    logit(LOG_WARNING, 0,
        !           475:                        "IP data field too short (%u bytes) for IGMP, from %s",
        !           476:                        ipdatalen, inet_fmt(src, s1, sizeof(s1)));
        !           477:                    continue;
        !           478:                }
        !           479:                igmpdatalen = ipdatalen - IGMP_MINLEN;
        !           480:                if (igmp->igmp_type != IGMP_DVMRP)
        !           481:                        continue;
        !           482: 
        !           483:                switch (igmp->igmp_code) {
        !           484:                case DVMRP_NEIGHBORS:
        !           485:                case DVMRP_NEIGHBORS2:
        !           486:                        if (src != target_addr) {
        !           487:                                fprintf(stderr, "mrinfo: got reply from %s",
        !           488:                                        inet_fmt(src, s1, sizeof(s1)));
        !           489:                                fprintf(stderr, " instead of %s\n",
        !           490:                                        inet_fmt(target_addr, s1, sizeof(s1)));
        !           491:                                /*continue;*/
        !           492:                        }
        !           493:                        break;
        !           494:                default:
        !           495:                        continue;       /* ignore all other DVMRP messages */
        !           496:                }
        !           497: 
        !           498:                switch (igmp->igmp_code) {
        !           499: 
        !           500:                case DVMRP_NEIGHBORS:
        !           501:                        if (group) {
        !           502:                                /* knows about DVMRP_NEIGHBORS2 msg */
        !           503:                                if (target_level == 0) {
        !           504:                                        target_level = ntohl(group);
        !           505:                                        ask2(target_addr);
        !           506:                                }
        !           507:                        } else {
        !           508:                                accept_neighbors(src, dst, (u_char *)(igmp + 1),
        !           509:                                                 igmpdatalen, ntohl(group));
        !           510:                                exit(0);
        !           511:                        }
        !           512:                        break;
        !           513: 
        !           514:                case DVMRP_NEIGHBORS2:
        !           515:                        accept_neighbors2(src, dst, (u_char *)(igmp + 1),
        !           516:                                          igmpdatalen, ntohl(group));
        !           517:                        exit(0);
        !           518:                }
        !           519:            }
        !           520:        }
        !           521:        exit(1);
        !           522: }
        !           523: 
        !           524: /* dummies */
        !           525: void accept_probe(u_int32 UNUSED src, u_int32 UNUSED dst, char UNUSED *p, size_t UNUSED datalen, u_int32 UNUSED level)
        !           526: {
        !           527: }
        !           528: void accept_group_report(u_int32 UNUSED src, u_int32 UNUSED dst, u_int32 UNUSED group, int UNUSED r_type)
        !           529: {
        !           530: }
        !           531: void accept_report(u_int32 UNUSED src, u_int32 UNUSED dst, char UNUSED *p, size_t UNUSED datalen, u_int32 UNUSED level)
        !           532: {
        !           533: }
        !           534: void accept_neighbor_request(u_int32 UNUSED src, u_int32 UNUSED dst)
        !           535: {
        !           536: }
        !           537: void accept_neighbor_request2(u_int32 UNUSED src, u_int32 UNUSED dst)
        !           538: {
        !           539: }
        !           540: void accept_prune(u_int32 UNUSED src, u_int32 UNUSED dst, char UNUSED *p, size_t UNUSED datalen)
        !           541: {
        !           542: }
        !           543: void accept_graft(u_int32 UNUSED src, u_int32 UNUSED dst, char UNUSED *p, size_t UNUSED datalen)
        !           544: {
        !           545: }
        !           546: void accept_g_ack(u_int32 UNUSED src, u_int32 UNUSED dst, char UNUSED *p, size_t UNUSED datalen)
        !           547: {
        !           548: }
        !           549: void add_table_entry(u_int32 UNUSED origin, u_int32 UNUSED mcastgrp)
        !           550: {
        !           551: }
        !           552: void check_vif_state(void)
        !           553: {
        !           554: }
        !           555: void accept_leave_message(u_int32 UNUSED src, u_int32 UNUSED dst, u_int32 UNUSED group)
        !           556: {
        !           557: }
        !           558: void accept_mtrace(u_int32 UNUSED src, u_int32 UNUSED dst, u_int32 UNUSED group, char UNUSED *data, u_int8_t UNUSED no, size_t UNUSED datalen)
        !           559: {
        !           560: }
        !           561: void accept_membership_query(u_int32 UNUSED src, u_int32 UNUSED dst, u_int32 UNUSED group, int UNUSED tmo)
        !           562: {
        !           563: }
        !           564: void accept_info_request(u_int32 UNUSED src, u_int32 UNUSED dst, u_char UNUSED *p, size_t UNUSED datalen)
        !           565: {
        !           566: }
        !           567: void accept_info_reply(u_int32 UNUSED src, u_int32 UNUSED dst, u_char UNUSED *p, size_t UNUSED datalen)
        !           568: {
        !           569: }
        !           570: 
        !           571: /**
        !           572:  * Local Variables:
        !           573:  *  version-control: t
        !           574:  *  indent-tabs-mode: t
        !           575:  *  c-file-style: "ellemtel"
        !           576:  *  c-basic-offset: 4
        !           577:  * End:
        !           578:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>