File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / mrouted / mrinfo.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:10:48 2012 UTC (12 years, 3 months ago) by misho
Branches: mrouted, MAIN
CVS tags: v3_9_6p0, v3_9_6, v3_9_5, HEAD
mrouted

    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>