Annotation of embedaddon/mrouted/mrinfo.c, revision 1.1.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>