File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / pimd / defs.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jun 12 07:59:37 2017 UTC (6 years, 11 months ago) by misho
Branches: pimd, MAIN
CVS tags: v2_3_2, HEAD
pimd 2.3.2

    1: /*
    2:  * Copyright (c) 1998-2001
    3:  * University of Southern California/Information Sciences Institute.
    4:  * All rights reserved.
    5:  *
    6:  * Redistribution and use in source and binary forms, with or without
    7:  * modification, are permitted provided that the following conditions
    8:  * are met:
    9:  * 1. Redistributions of source code must retain the above copyright
   10:  *    notice, this list of conditions and the following disclaimer.
   11:  * 2. Redistributions in binary form must reproduce the above copyright
   12:  *    notice, this list of conditions and the following disclaimer in the
   13:  *    documentation and/or other materials provided with the distribution.
   14:  * 3. Neither the name of the project nor the names of its contributors
   15:  *    may be used to endorse or promote products derived from this software
   16:  *    without specific prior written permission.
   17:  *
   18:  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
   19:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   20:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   21:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
   22:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   23:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   24:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   25:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   26:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   27:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   28:  * SUCH DAMAGE.
   29:  */
   30: /*
   31:  * Part of this program has been derived from mrouted.
   32:  * The mrouted program is covered by the license in the accompanying file
   33:  * named "LICENSE.mrouted".
   34:  *
   35:  * The mrouted program is COPYRIGHT 1989 by The Board of Trustees of
   36:  * Leland Stanford Junior University.
   37:  *
   38:  */
   39: #ifndef __PIMD_DEFS_H__
   40: #define __PIMD_DEFS_H__
   41: 
   42: #ifndef __linux__
   43: # include <sys/cdefs.h>	/* Defines __BSD_VISIBLE, needed for arc4random() etc. */
   44: #endif
   45: 
   46: #include <stdio.h>
   47: #include <stdlib.h>
   48: #include <stdint.h>
   49: #include <unistd.h> 
   50: #include <ctype.h>
   51: #include <errno.h>
   52: #include <syslog.h>
   53: #include <signal.h> 
   54: #include <string.h> 
   55: #include <sys/param.h>
   56: #include <sys/types.h>
   57: #include <sys/socket.h>
   58: #include <sys/ioctl.h>
   59: #include <fcntl.h>
   60: #if ((defined(SYSV)) || (defined(__bsdi__)) || ((defined SunOS) && (SunOS < 50)))
   61: #include <sys/sockio.h>
   62: #endif /* SYSV || bsdi || SunOS 4.x */
   63: #include <time.h>
   64: #include <sys/time.h>
   65: #include <net/if.h>
   66: #include <netinet/in.h>
   67: #include <arpa/inet.h>
   68: #include <netinet/in_systm.h>
   69: #include <netinet/ip.h>
   70: #include <netinet/igmp.h>
   71: #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
   72: #include <osreldate.h>
   73: #endif /* __FreeBSD__ */
   74: #if defined(__bsdi__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
   75: #define rtentry kernel_rtentry
   76: #include <net/route.h>
   77: #undef rtentry
   78: #endif /* bsdi or __FreeBSD_version >= 220000 */
   79: #ifdef __linux__
   80: #define _LINUX_IN_H             /* For Linux <= 2.6.25 */
   81: #include <linux/types.h>
   82: #include <linux/mroute.h>
   83: #else
   84: #include <netinet/ip_mroute.h>
   85: #endif /* __linux__ */
   86: 
   87: /* If using any of the BSD distributions of UNIX the configure script
   88:  * links with -lutil, but on Linux we link with -lite.  All required
   89:  * APIs are forward declared in lite.h, so we can use it everywhere. */
   90: #include "libite/lite.h"
   91: 
   92: #include <strings.h>
   93: #ifdef RSRR
   94: #include <sys/un.h>
   95: #endif /* RSRR */
   96: 
   97: #ifndef BYTE_ORDER
   98: #if (BSD >= 199103)
   99: #include <machine/endian.h>
  100: #else
  101: #ifdef __linux__
  102: #include <endian.h>
  103: #else
  104: #define LITTLE_ENDIAN	1234	/* least-significant byte first (vax, pc) */
  105: #define BIG_ENDIAN	4321	/* most-significant byte first (IBM, net) */
  106: #define PDP_ENDIAN	3412	/* LSB first in word, MSW first in long (pdp) */
  107: 
  108: #if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \
  109:     defined(__ia64) || \
  110:     defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \
  111:     defined(__alpha__) || defined(__alpha)
  112: #define BYTE_ORDER	LITTLE_ENDIAN
  113: #endif
  114: 
  115: #if defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \
  116:     defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \
  117:     defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\
  118:     defined(apollo) || defined(__convex__) || defined(_CRAY) || \
  119:     defined(__hppa) || defined(__hp9000) || \
  120:     defined(__hp9000s300) || defined(__hp9000s700) || \
  121:     defined(BIT_ZERO_ON_LEFT) || defined(m68k)
  122: #define BYTE_ORDER	BIG_ENDIAN
  123: #endif
  124: #endif /* linux */
  125: #endif /* BSD */
  126: #endif /* BYTE_ORDER */
  127: 
  128: typedef void (*cfunc_t) (void *);
  129: typedef void (*ihfunc_t) (int, fd_set *);
  130: 
  131: #include "dvmrp.h"     /* Added for further compatibility and convenience */
  132: #include "pimd.h"
  133: #include "mrt.h"
  134: #include "igmpv2.h"
  135: #include "igmpv3.h"
  136: #include "vif.h"
  137: #include "debug.h"
  138: #include "pathnames.h"
  139: #ifdef RSRR
  140: #include "rsrr.h"
  141: #include "rsrr_var.h"
  142: #endif /* RSRR */
  143: 
  144: /*
  145:  * Miscellaneous constants and macros
  146:  */
  147: 
  148: #define ENABLINGSTR(val)        (val) ? "enabling" : "disabling"
  149: 
  150: /*
  151:  * Various definitions to make it working for different platforms
  152:  */
  153: /* The old style sockaddr definition doesn't have sa_len */
  154: #if defined(_AIX) || (defined(BSD) && (BSD >= 199006)) /* sa_len was added with 4.3-Reno */
  155: #define HAVE_SA_LEN
  156: #endif
  157: 
  158: /* Versions of Solaris older than 2.6 don't have routing sockets. */
  159: /* XXX TODO: check FreeBSD version and add all other platforms */
  160: #if defined(__linux__)    || (defined(SunOS) && SunOS >=56) || \
  161:     defined (IRIX)        || defined (__bsdi__)             || \
  162:     defined (__FreeBSD__) || defined(__FreeBSD_kernel__)    || \
  163:     defined(NetBSD)       || defined(OpenBSD)
  164: #define HAVE_ROUTING_SOCKETS	1
  165: #endif
  166: 
  167: /* Older versions of UNIX don't really give us true raw sockets.
  168:  * Instead, they expect ip_len and ip_off in host byte order, and also
  169:  * provide them to us in that format when receiving raw frames.
  170:  *
  171:  * This list could probably be made longer, e.g., SunOS and __bsdi__
  172:  */
  173: #if defined(__NetBSD__) ||					\
  174:     (defined(__FreeBSD__) && (__FreeBSD_version < 1100030)) ||	\
  175:     (defined(__OpenBSD__) && (OpenBSD < 200311))
  176: #define HAVE_IP_HDRINCL_BSD_ORDER
  177: #endif
  178: 
  179: #define TRUE			1
  180: #define FALSE			0
  181: 
  182: #ifndef MAX
  183: #define MAX(a,b) (((a) >= (b))? (a) : (b))
  184: #define MIN(a,b) (((a) <= (b))? (a) : (b))
  185: #endif /* MAX & MIN */
  186: 
  187: #define CREATE                  TRUE
  188: #define DONT_CREATE             FALSE
  189: 
  190: #define MFC_MOVE_FORCE		0x1
  191: #define MFC_UPDATE_FORCE	0x2
  192: 
  193: #define EQUAL(s1, s2)		(strcmp((s1), (s2)) == 0)
  194: #define ARRAY_LEN(a)            (sizeof((a)) / sizeof((a)[0]))
  195: 
  196: #define JAN_1970                2208988800UL    /* 1970 - 1900 in seconds */
  197: 
  198: #define MINTTL			1  /* min TTL in the packets send locally */
  199: 
  200: #define MAX_IP_PACKET_LEN       576
  201: #define MIN_IP_HEADER_LEN       20 /* sizeof(struct ip) */
  202: #define IP_IGMP_HEADER_LEN      24 /* MIN + Router Alert */
  203: #define MAX_IP_HEADER_LEN       60
  204: 
  205: 
  206: /*
  207:  * The IGMPv2 <netinet/in.h> defines INADDR_ALLRTRS_GROUP, but earlier
  208:  * ones don't, so we define it conditionally here.
  209:  */
  210: #ifndef INADDR_ALLRTRS_GROUP
  211: 					/* address for multicast mtrace msg */
  212: #define INADDR_ALLRTRS_GROUP	(uint32_t)0xe0000002	/* 224.0.0.2 */
  213: #endif
  214: 
  215: #ifndef INADDR_ALLRPTS_GROUP
  216: #define INADDR_ALLRPTS_GROUP    ((in_addr_t)0xe0000016) /* 224.0.0.22, IGMPv3 */
  217: #endif
  218: 
  219: #ifndef INADDR_MAX_LOCAL_GROUP
  220: #define INADDR_MAX_LOCAL_GROUP	(uint32_t)0xe00000ff	/* 224.0.0.255 */
  221: #endif
  222: 
  223: #define INADDR_ANY_N            (uint32_t)0x00000000     /* INADDR_ANY in
  224: 							 * network order */
  225: #define CLASSD_PREFIX           (uint32_t)0xe0000000     /* 224.0.0.0 */
  226: #define STAR_STAR_RP_MSKLEN     4                       /* Masklen for
  227: 							 * 224.0.0.0 :
  228: 							 * to encode (*,*,RP)
  229: 							 */
  230: #define ALL_MCAST_GROUPS_ADDR   (uint32_t)0xe0000000     /* 224.0.0.0 */
  231: #define ALL_MCAST_GROUPS_LEN    4
  232: 
  233: /* Used by DVMRP */
  234: #define DEFAULT_METRIC		1	/* default subnet/tunnel metric     */
  235: #define DEFAULT_THRESHOLD	1	/* default subnet/tunnel threshold  */
  236: 
  237: /* Used if no relaible unicast routing information available */
  238: #define UCAST_DEFAULT_ROUTE_DISTANCE   101
  239: #define UCAST_DEFAULT_ROUTE_METRIC     1024
  240: 
  241: #define TIMER_INTERVAL		5	/* 5 sec virtual timer granularity  */
  242: 
  243: /*
  244:  * TODO: recalculate the messages sizes, probably with regard to the MTU
  245:  * TODO: cleanup
  246:  */
  247: #define MAX_JP_MESSAGE_SIZE     8192
  248: #define MAX_JP_MESSAGE_POOL_NUMBER 8
  249: #define MAX_JOIN_LIST_SIZE      1500
  250: #define MAX_PRUNE_LIST_SIZE     1500
  251: 
  252: 
  253: #ifdef RSRR
  254: #define BIT_ZERO(X)		((X) = 0)
  255: #define BIT_SET(X,n)		((X) |= 1 << (n))
  256: #define BIT_CLR(X,n)		((X) &= ~(1 << (n)))
  257: #define BIT_TST(X,n)		((X) & 1 << (n))
  258: #endif /* RSRR */
  259: 
  260: #ifndef __linux__
  261: #define RANDOM()                arc4random()
  262: #else
  263: #define RANDOM()                (uint32_t)random()
  264: #endif
  265: 
  266: /* NetBSD 6.1, for instance, does not have IPOPT_RA defined. */
  267: #ifndef IPOPT_RA
  268: #define IPOPT_RA                148
  269: #endif
  270: 
  271: /*
  272:  * External declarations for global variables and functions.
  273:  */
  274: #define			SEND_BUF_SIZE (128*1024)  /* Maximum buff size to
  275: 						   * send a packet */
  276: #define			RECV_BUF_SIZE (128*1024)  /* Maximum buff size to
  277: 						   * receive a packet */
  278: #define                 SO_SEND_BUF_SIZE_MAX (256*1024)
  279: #define                 SO_SEND_BUF_SIZE_MIN (48*1024)
  280: #define                 SO_RECV_BUF_SIZE_MAX (256*1024)
  281: #define                 SO_RECV_BUF_SIZE_MIN (48*1024)
  282: 
  283: 
  284: /*
  285:  * Global settings, from config.c
  286:  */
  287: extern uint16_t         pim_timer_hello_interval;
  288: extern uint16_t         pim_timer_hello_holdtime;
  289: 
  290: /* TODO: describe the variables and clean up */
  291: extern char		*igmp_recv_buf;
  292: extern char		*igmp_send_buf;
  293: extern char		*pim_recv_buf;
  294: extern char		*pim_send_buf;
  295: extern int		igmp_socket;
  296: extern int		pim_socket;
  297: extern uint32_t		allhosts_group;
  298: extern uint32_t		allrouters_group;
  299: extern uint32_t		allreports_group;
  300: extern uint32_t		allpimrouters_group;
  301: extern build_jp_message_t *build_jp_message_pool;
  302: extern int		build_jp_message_pool_counter;
  303: 
  304: extern uint32_t		virtual_time;
  305: extern char	       *config_file;
  306: extern int              haveterminal;
  307: extern char            *__progname;
  308: 
  309: extern struct cand_rp_adv_message_ {
  310:     uint8_t  *buffer;
  311:     uint8_t  *insert_data_ptr;
  312:     uint8_t  *prefix_cnt_ptr;
  313:     uint16_t  message_size;
  314: } cand_rp_adv_message;
  315: 
  316: extern int disable_all_by_default;
  317: extern int mrt_table_id;
  318: 
  319: /*
  320:  * Used to contol the switching to the shortest path:
  321:  */
  322: typedef enum {
  323:     SPT_RATE,
  324:     SPT_PACKETS,
  325:     SPT_INF
  326: } spt_mode_t;
  327: 
  328: typedef struct {
  329:     uint8_t   mode;
  330:     uint32_t  bytes;
  331:     uint32_t  packets;
  332:     uint32_t  interval;
  333: } spt_threshold_t;
  334: extern spt_threshold_t  spt_threshold;
  335: 
  336: extern cand_rp_t        *cand_rp_list;
  337: extern grp_mask_t       *grp_mask_list;
  338: extern cand_rp_t        *segmented_cand_rp_list;
  339: extern grp_mask_t       *segmented_grp_mask_list;
  340: 
  341: extern uint16_t          curr_bsr_fragment_tag;
  342: extern uint8_t           curr_bsr_priority;
  343: extern uint32_t          curr_bsr_address;
  344: extern uint32_t          curr_bsr_hash_mask;
  345: extern uint8_t		 cand_bsr_flag;		   /* candidate BSR flag */
  346: extern uint8_t           my_bsr_priority;
  347: extern uint32_t          my_bsr_address;
  348: extern uint32_t          my_bsr_hash_mask;
  349: extern uint8_t           cand_rp_flag;              /* Candidate RP flag */
  350: extern uint32_t          my_cand_rp_address;
  351: extern uint8_t           my_cand_rp_priority;
  352: extern uint16_t          my_cand_rp_holdtime;
  353: extern uint16_t          my_cand_rp_adv_period;     /* The locally configured
  354: 						    * Cand-RP adv. period.
  355: 						    */
  356: extern uint16_t          pim_bootstrap_timer;
  357: extern uint32_t          rp_my_ipv4_hashmask;
  358: extern uint16_t          pim_cand_rp_adv_timer;
  359: 
  360: /* route.c */
  361: extern uint32_t		default_route_metric;
  362: extern uint32_t		default_route_distance;
  363: 
  364: /* igmp_proto.c */
  365: extern uint32_t		igmp_query_interval;
  366: extern uint32_t		igmp_querier_timeout;
  367: 
  368: /* mrt.c */
  369: extern srcentry_t 	*srclist;
  370: extern grpentry_t 	*grplist;
  371: 
  372: /* vif.c */
  373: extern struct uvif	uvifs[MAXVIFS];
  374: extern vifi_t		numvifs;
  375: extern int              total_interfaces;
  376: extern vifi_t		reg_vif_num;
  377: extern int              phys_vif;
  378: extern int		udp_socket;
  379: 
  380: extern int		vifs_down;
  381: 
  382: #define MAX_INET_BUF_LEN 19
  383: extern char		s1[MAX_INET_BUF_LEN];
  384: extern char		s2[MAX_INET_BUF_LEN];
  385: extern char		s3[MAX_INET_BUF_LEN];
  386: extern char		s4[MAX_INET_BUF_LEN];
  387: 
  388: #if !((defined(BSD) && (BSD >= 199103)) || (defined(__linux__)))
  389: extern int		errno;
  390: #endif
  391: 
  392: 
  393: #ifndef IGMP_MEMBERSHIP_QUERY
  394: #define IGMP_MEMBERSHIP_QUERY		IGMP_HOST_MEMBERSHIP_QUERY
  395: #if !(defined(NetBSD) || defined(OpenBSD) || defined(__FreeBSD__))
  396: #define IGMP_V1_MEMBERSHIP_REPORT	IGMP_HOST_MEMBERSHIP_REPORT
  397: #define IGMP_V2_MEMBERSHIP_REPORT	IGMP_HOST_NEW_MEMBERSHIP_REPORT
  398: #else
  399: #define IGMP_V1_MEMBERSHIP_REPORT	IGMP_v1_HOST_MEMBERSHIP_REPORT
  400: #define IGMP_V2_MEMBERSHIP_REPORT	IGMP_v2_HOST_MEMBERSHIP_REPORT
  401: #endif
  402: #define IGMP_V2_LEAVE_GROUP		IGMP_HOST_LEAVE_MESSAGE
  403: #endif
  404: #if defined(__FreeBSD__)		/* From FreeBSD 8.x */
  405: #define IGMP_V3_MEMBERSHIP_REPORT       IGMP_v3_HOST_MEMBERSHIP_REPORT
  406: #else
  407: #define IGMP_V3_MEMBERSHIP_REPORT	0x22	/* Ver. 3 membership report */
  408: #endif
  409: 
  410: #if defined(NetBSD) || defined(OpenBSD) || defined(__FreeBSD__)
  411: #define IGMP_MTRACE_RESP		IGMP_MTRACE_REPLY
  412: #define IGMP_MTRACE			IGMP_MTRACE_QUERY
  413: #endif
  414: 
  415: /* For timeout. The timers count down */
  416: #define SET_TIMER(timer, value) (timer) = (value)
  417: #define RESET_TIMER(timer) (timer) = 0
  418: #define COPY_TIMER(timer_1, timer_2) (timer_2) = (timer_1)
  419: #define IF_TIMER_SET(timer) if ((timer) > 0)
  420: #define IF_TIMER_NOT_SET(timer) if ((timer) <= 0)
  421: #define FIRE_TIMER(timer)       (timer) = 0
  422: 
  423: #define IF_TIMEOUT(timer)		\
  424: 	if (!((timer) -= (MIN(timer, TIMER_INTERVAL))))
  425: 
  426: #define IF_NOT_TIMEOUT(timer)		\
  427: 	if ((timer) -= (MIN(timer, TIMER_INTERVAL)))
  428: 
  429: #define TIMEOUT(timer)			\
  430: 	(!((timer) -= (MIN(timer, TIMER_INTERVAL))))
  431: 
  432: #define NOT_TIMEOUT(timer)		\
  433: 	((timer) -= (MIN(timer, TIMER_INTERVAL)))
  434: 
  435: #define ELSE else           /* To make emacs cc-mode happy */      
  436: 
  437: #define MASK_TO_VAL(x, i) {		   \
  438: 	uint32_t _x = ntohl(x);		   \
  439: 	(i) = 1;			   \
  440: 	while ((_x) <<= 1)		   \
  441: 	    (i)++;			   \
  442:     };
  443: 
  444: #define VAL_TO_MASK(x, i) {			\
  445: 	x = htonl(~((1 << (32 - (i))) - 1));	\
  446:     };
  447: 
  448: /*
  449:  * External function definitions
  450:  */
  451: 
  452: /* callout.c */
  453: extern void	callout_init		(void);
  454: extern void	free_all_callouts	(void);
  455: extern void	age_callout_queue	(int);
  456: extern int	timer_nextTimer		(void);
  457: extern int	timer_setTimer		(int, cfunc_t, void *);
  458: extern void	timer_clearTimer	(int);
  459: extern int	timer_leftTimer		(int);
  460: 
  461: /* config.c */
  462: extern void	config_vifs_from_kernel	(void);
  463: extern void	config_vifs_from_file	(void);
  464: 
  465: /* debug.c */
  466: extern char	*packet_kind		(int proto, int type, int code);
  467: extern int	debug_kind		(int proto, int type, int code);
  468: extern void	logit			(int, int, const char *, ...);
  469: extern void	dump_frame		(char *desc, void *dump, size_t len);
  470: extern int	log_level		(int proto, int type, int code);
  471: extern void	dump			(int i);
  472: extern void	fdump			(int i);
  473: extern void	cdump			(int i);
  474: extern void	dump_vifs		(FILE *fp);
  475: extern void	dump_pim_mrt		(FILE *fp);
  476: extern int	dump_rp_set		(FILE *fp);
  477: 
  478: /* dvmrp_proto.c */
  479: extern void	dvmrp_accept_probe	(uint32_t src, uint32_t dst, uint8_t *p, int datalen, uint32_t level);
  480: extern void	dvmrp_accept_report	(uint32_t src, uint32_t dst, uint8_t *p, int datalen, uint32_t level);
  481: extern void	dvmrp_accept_info_request (uint32_t src, uint32_t dst, uint8_t *p, int datalen);
  482: extern void	dvmrp_accept_info_reply	(uint32_t src, uint32_t dst, uint8_t *p, int datalen);
  483: extern void	dvmrp_accept_neighbors	(uint32_t src, uint32_t dst, uint8_t *p, int datalen, uint32_t level);
  484: extern void	dvmrp_accept_neighbors2	(uint32_t src, uint32_t dst, uint8_t *p, int datalen, uint32_t level);
  485: extern void	dvmrp_accept_prune	(uint32_t src, uint32_t dst, uint8_t *p, int datalen);
  486: extern void	dvmrp_accept_graft	(uint32_t src, uint32_t dst, uint8_t *p, int datalen);
  487: extern void	dvmrp_accept_g_ack	(uint32_t src, uint32_t dst, uint8_t *p, int datalen);
  488: 
  489: /* igmp.c */
  490: extern void	init_igmp		(void);
  491: extern void	send_igmp		(char *buf, uint32_t src, uint32_t dst, int type, int code, uint32_t group, int datalen);
  492: 
  493: /* igmp_proto.c */
  494: extern void	query_groups		(struct uvif *v);
  495: extern void	accept_membership_query	(uint32_t src, uint32_t dst, uint32_t group, int tmo, int igmp_version);
  496: extern void	accept_group_report	(uint32_t src, uint32_t dst, uint32_t group, int r_type);
  497: extern void	accept_leave_message	(uint32_t src, uint32_t dst, uint32_t group);
  498: extern void     accept_membership_report(uint32_t src, uint32_t dst, struct igmpv3_report *report, ssize_t reportlen);
  499: 
  500: /* inet.c */
  501: extern int	inet_cksum		(uint16_t *addr, u_int len);
  502: extern int	inet_valid_host		(uint32_t naddr);
  503: extern int	inet_valid_mask		(uint32_t mask);
  504: extern int	inet_valid_subnet	(uint32_t nsubnet, uint32_t nmask);
  505: extern char	*inet_fmt		(uint32_t addr, char *s, size_t len);
  506: extern char	*netname		(uint32_t addr, uint32_t mask);
  507: extern uint32_t	inet_parse		(char *s, int n);
  508: 
  509: /* kern.c */
  510: extern void	k_set_sndbuf		(int socket, int bufsize, int minsize);
  511: extern void	k_set_rcvbuf		(int socket, int bufsize, int minsize);
  512: extern void	k_hdr_include		(int socket, int val);
  513: extern void	k_set_ttl		(int socket, int t);
  514: extern void	k_set_loop		(int socket, int l);
  515: extern void	k_set_if		(int socket, uint32_t ifa);
  516: extern void	k_set_router_alert	(int socket);
  517: extern void	k_join			(int socket, uint32_t grp, struct uvif *v);
  518: extern void	k_leave			(int socket, uint32_t grp, struct uvif *v);
  519: extern void	k_init_pim		(int socket);
  520: extern void	k_stop_pim		(int socket);
  521: extern int	k_del_mfc		(int socket, uint32_t source, uint32_t group);
  522: extern int	k_chg_mfc		(int socket, uint32_t source, uint32_t group, vifi_t iif, vifbitmap_t oifs,
  523:                                          uint32_t rp_addr);
  524: extern void	k_add_vif		(int socket, vifi_t vifi, struct uvif *v);
  525: extern void	k_del_vif		(int socket, vifi_t vifi, struct uvif *v);
  526: extern int	k_get_vif_count		(vifi_t vifi, struct vif_count *retval);
  527: extern int	k_get_sg_cnt		(int socket, uint32_t source, uint32_t group, struct sg_count *retval);
  528: 
  529: /* main.c */
  530: extern int	register_input_handler	(int fd, ihfunc_t func);
  531: 
  532: /* mrt.c */
  533: extern void	init_pim_mrt		(void);
  534: extern mrtentry_t *find_route		(uint32_t source, uint32_t group, uint16_t flags, char create);
  535: extern grpentry_t *find_group		(uint32_t group);
  536: extern srcentry_t *find_source		(uint32_t source);
  537: extern void	delete_mrtentry		(mrtentry_t *mrtentry_ptr);
  538: extern void	delete_srcentry		(srcentry_t *srcentry_ptr);
  539: extern void	delete_grpentry		(grpentry_t *grpentry_ptr);
  540: extern void	delete_mrtentry_all_kernel_cache (mrtentry_t *mrtentry_ptr);
  541: extern void	delete_single_kernel_cache (mrtentry_t *mrtentry_ptr, kernel_cache_t *kernel_cache_ptr);
  542: extern void	delete_single_kernel_cache_addr (mrtentry_t *mrtentry_ptr, uint32_t source, uint32_t group);
  543: extern void	add_kernel_cache	(mrtentry_t *mrtentry_ptr, uint32_t source, uint32_t group, uint16_t flags);
  544: /* pim.c */
  545: extern void	init_pim		(void);
  546: extern void	send_pim		(char *buf, uint32_t src, uint32_t dst, int type, size_t len);
  547: extern void	send_pim_unicast	(char *buf, int mtu, uint32_t src, uint32_t dst, int type, size_t len);
  548: 
  549: /* pim_proto.c */
  550: extern int	receive_pim_hello	(uint32_t src, uint32_t dst, char *msg, size_t len);
  551: extern int	send_pim_hello		(struct uvif *v, uint16_t holdtime);
  552: extern void	delete_pim_nbr		(pim_nbr_entry_t *nbr_delete);
  553: extern int	receive_pim_register	(uint32_t src, uint32_t dst, char *msg, size_t len);
  554: extern int	send_pim_null_register	(mrtentry_t *r);
  555: extern int	receive_pim_register_stop (uint32_t src, uint32_t dst, char *msg, size_t len);
  556: extern int	send_pim_register	(char *pkt);
  557: extern int	receive_pim_join_prune	(uint32_t src, uint32_t dst, char *msg, size_t len);
  558: extern int	join_or_prune		(mrtentry_t *mrtentry_ptr, pim_nbr_entry_t *upstream_router);
  559: extern int	receive_pim_assert	(uint32_t src, uint32_t dst, char *msg, size_t len);
  560: extern int	send_pim_assert		(uint32_t source, uint32_t group, vifi_t vifi, mrtentry_t *mrtentry_ptr);
  561: extern int	send_periodic_pim_join_prune (vifi_t vifi, pim_nbr_entry_t *pim_nbr, uint16_t holdtime);
  562: extern int	add_jp_entry		(pim_nbr_entry_t *pim_nbr, uint16_t holdtime, uint32_t group, uint8_t grp_msklen,
  563:                                          uint32_t source, uint8_t src_msklen,  uint16_t addr_flags, uint8_t join_prune);
  564: extern void	pack_and_send_jp_message (pim_nbr_entry_t *pim_nbr);
  565: extern int	receive_pim_cand_rp_adv	(uint32_t src, uint32_t dst, char *msg, size_t len);
  566: extern int	receive_pim_bootstrap	(uint32_t src, uint32_t dst, char *msg, size_t len);
  567: extern int	send_pim_cand_rp_adv	(void);
  568: extern void	send_pim_bootstrap	(void);
  569: 
  570: /* route.c */
  571: extern int	set_incoming		(srcentry_t *srcentry_ptr, int srctype);
  572: extern vifi_t	get_iif			(uint32_t source);
  573: extern pim_nbr_entry_t *find_pim_nbr	(uint32_t source);
  574: extern int	add_sg_oif		(mrtentry_t *mrtentry_ptr, vifi_t vifi, uint16_t holdtime, int update_holdtime);
  575: extern void	add_leaf		(vifi_t vifi, uint32_t source, uint32_t group);
  576: extern void	delete_leaf		(vifi_t vifi, uint32_t source, uint32_t group);
  577: extern int	change_interfaces	(mrtentry_t *mrtentry_ptr,  vifi_t new_iif,
  578:                                          vifbitmap_t new_joined_oifs_, vifbitmap_t new_pruned_oifs,
  579:                                          vifbitmap_t new_leaves_, vifbitmap_t new_asserted_oifs, uint16_t flags);
  580: extern void	calc_oifs		(mrtentry_t *mrtentry_ptr, vifbitmap_t *oifs_ptr);
  581: extern void	process_kernel_call	(void);
  582: extern int	delete_vif_from_mrt	(vifi_t vifi);
  583: extern mrtentry_t *switch_shortest_path	(uint32_t source, uint32_t group);
  584: 
  585: /* routesock.c and netlink.c */
  586: extern int	k_req_incoming		(uint32_t source, struct rpfctl *rpfp);
  587: extern int	init_routesock		(void);
  588: extern int	routing_socket;
  589: 
  590: /* rp.c */
  591: extern void	init_rp_and_bsr		(void);
  592: extern uint16_t	bootstrap_initial_delay (void);
  593: extern rp_grp_entry_t *add_rp_grp_entry (cand_rp_t  **used_cand_rp_list,
  594:                                          grp_mask_t **used_grp_mask_list,
  595:                                          uint32_t rp_addr,
  596:                                          uint8_t  rp_priority,
  597:                                          uint16_t rp_holdtime,
  598:                                          uint32_t group_addr,
  599:                                          uint32_t group_mask,
  600:                                          uint32_t bsr_hash_mask,
  601:                                          uint16_t fragment_tag);
  602: extern void	delete_rp_grp_entry	(cand_rp_t  **used_cand_rp_list, grp_mask_t **used_grp_mask_list,
  603:                                          rp_grp_entry_t *rp_grp_entry_delete);
  604: extern void	delete_grp_mask		(cand_rp_t  **used_cand_rp_list, grp_mask_t **used_grp_mask_list,
  605:                                          uint32_t group_addr, uint32_t group_mask);
  606: extern void	delete_rp		(cand_rp_t  **used_cand_rp_list, grp_mask_t **used_grp_mask_list,
  607:                                          uint32_t rp_addr);
  608: extern void	delete_rp_list		(cand_rp_t  **used_cand_rp_list, grp_mask_t **used_grp_mask_list);
  609: extern rpentry_t *rp_match		(uint32_t group);
  610: extern rp_grp_entry_t *rp_grp_match	(uint32_t group);
  611: extern rpentry_t *rp_find		(uint32_t rp_address);
  612: extern int	remap_grpentry		(grpentry_t *grpentry_ptr);
  613: extern int	create_pim_bootstrap_message (char *send_buff);
  614: extern int	check_mrtentry_rp	(mrtentry_t *mrtentry_ptr, uint32_t rp_addr);
  615: 
  616: #ifdef RSRR
  617: #ifdef PIM
  618: #define gtable				mrtentry
  619: #endif /* PIM */
  620: #define RSRR_NOTIFICATION_OK		TRUE
  621: #define RSRR_NOTIFICATION_FALSE		FALSE
  622: 
  623: /* rsrr.c */
  624: extern void	rsrr_init		(void);
  625: extern void	rsrr_clean		(void);
  626: extern void	rsrr_cache_send		(struct gtable *, int);
  627: extern void	rsrr_cache_clean	(struct gtable *);
  628: extern void	rsrr_cache_bring_up	(struct gtable *);
  629: #endif /* RSRR */
  630: 
  631: /* timer.c */
  632: extern void	init_timers		(void);
  633: extern void	age_vifs		(void);
  634: extern void	age_routes		(void);
  635: extern void	age_misc		(void);
  636: extern int	unicast_routing_changes	(srcentry_t *src_ent);
  637: extern int	clean_srclist		(void);
  638: 
  639: /* trace.c */
  640: /* u_int is promoted uint8_t */
  641: extern void	accept_mtrace		(uint32_t src, uint32_t dst, uint32_t group, char *data, u_int no, int datalen);
  642: extern void	accept_neighbor_request	(uint32_t src, uint32_t dst);
  643: extern void	accept_neighbor_request2 (uint32_t src, uint32_t dst);
  644: 
  645: /* vif.c */
  646: extern void	init_vifs		(void);
  647: extern void	zero_vif		(struct uvif *, int);
  648: extern void	stop_all_vifs		(void);
  649: extern void	check_vif_state		(void);
  650: extern vifi_t	local_address		(uint32_t src);
  651: extern vifi_t	find_vif_direct		(uint32_t src);
  652: extern vifi_t	find_vif_direct_local	(uint32_t src);
  653: extern uint32_t	max_local_address	(void);
  654: 
  655: struct rp_hold {
  656: 	struct rp_hold *next;
  657: 	uint32_t	address;
  658: 	uint32_t	group;
  659: 	uint32_t	mask;
  660: 	uint8_t	priority;
  661: };
  662: 
  663: #endif /* __PIMD_DEFS_H__ */
  664: 
  665: /**
  666:  * Local Variables:
  667:  *  version-control: t
  668:  *  indent-tabs-mode: t
  669:  *  c-file-style: "ellemtel"
  670:  *  c-basic-offset: 4
  671:  * End:
  672:  */

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