Annotation of embedaddon/pimd/defs.h, revision 1.1

1.1     ! misho       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>