File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / pimd / pimd.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 (7 years 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:  *  $Id: pimd.h,v 1.1.1.1 2017/06/12 07:59:37 misho Exp $
   32:  */
   33: 
   34: 
   35: #include <netdb.h>
   36: #include <netinet/pim.h>
   37: 
   38: #define PIM_PROTOCOL_VERSION	2
   39: #define PIMD_VERSION		PIM_PROTOCOL_VERSION
   40: #define PIMD_SUBVERSION         1
   41: #if 0
   42: #define PIM_CONSTANT            0x000eff00      /* constant portion of 'group' field */
   43: #endif
   44: #define PIM_CONSTANT            0
   45: #define PIMD_LEVEL (PIM_CONSTANT | PIMD_VERSION | (PIMD_SUBVERSION << 8))
   46: 
   47: #define INADDR_ALL_PIM_ROUTERS  (uint32_t)0xe000000D	     /* 224.0.0.13 */
   48: #if !defined(INADDR_UNSPEC_GROUP)
   49: #define INADDR_UNSPEC_GROUP     (uint32_t)0xe0000000	     /* 224.0.0.0 */
   50: #endif /* !defined(INADDR_UNSPEC_GROUP) */
   51: 
   52: 
   53: /* PIM protocol timers (in seconds) */
   54: #ifndef TIMER_INTERVAL
   55: #define TIMER_INTERVAL		          5 /* virtual timer granularity */
   56: #endif /* TIMER_INTERVAL */
   57: 
   58: #define PIM_REGISTER_SUPPRESSION_TIMEOUT 60
   59: #define PIM_REGISTER_PROBE_TIME	          5 /* Used to send NULL_REGISTER */
   60: #define PIM_DATA_TIMEOUT                210
   61: 
   62: #define PIM_TIMER_HELLO_INTERVAL         30
   63: #define PIM_JOIN_PRUNE_PERIOD	         60
   64: #define PIM_JOIN_PRUNE_HOLDTIME        (3.5 * PIM_JOIN_PRUNE_PERIOD)
   65: #define PIM_RANDOM_DELAY_JOIN_TIMEOUT   4.5
   66: 
   67: /* TODO: XXX: cannot be shorter than 10 seconds (not in the spec)
   68:  * MAX: Cisco max value (16383) for ip pim rp-candidate interval. */
   69: #define PIM_MIN_CAND_RP_ADV_PERIOD       10
   70: #define PIM_DEFAULT_CAND_RP_ADV_PERIOD   60
   71: #define PIM_MAX_CAND_RP_ADV_PERIOD       16383
   72: 
   73: /* TODO: 60 is the original value. Temporarily set to 30 for debugging.
   74: #define PIM_BOOTSTRAP_PERIOD             60 */
   75: #define PIM_BOOTSTRAP_PERIOD             30
   76: 
   77: #define PIM_BOOTSTRAP_TIMEOUT	       (2.5 * PIM_BOOTSTRAP_PERIOD + 10)
   78: #define PIM_TIMER_HELLO_HOLDTIME       (3.5 * PIM_TIMER_HELLO_INTERVAL)
   79: #define PIM_ASSERT_TIMEOUT              180
   80: 
   81: /* Misc definitions */
   82: #define PIM_DEFAULT_CAND_RP_PRIORITY      0 /* 0 is the highest. Don't know
   83: 					     * why this is the default.
   84: 					     * See the PS version (Mar' 97),
   85: 					     * pp.22 bottom of the spec.
   86: 					     */
   87: #define PIM_MAX_CAND_RP_PRIORITY        255 /* 255 is the highest. */
   88: 
   89: #define PIM_DEFAULT_BSR_PRIORITY          0 /* 0 is the lowest               */
   90: #define PIM_MAX_CAND_BSR_PRIORITY         PIM_MAX_CAND_RP_PRIORITY
   91: 
   92: #define RP_DEFAULT_IPV4_HASHMASKLEN      30 /* the default group msklen used
   93: 					     * by the hash function to 
   94: 					     * calculate the group-to-RP
   95: 					     * mapping
   96: 					     */
   97: #define SINGLE_SRC_MSKLEN	         32 /* the single source mask length */
   98: #define SINGLE_GRP_MSKLEN	         32 /* the single group mask length  */
   99: #define PIM_GROUP_PREFIX_DEFAULT_MASKLEN 16 /* The default group masklen if
  100: 					     * omitted in the config file.
  101: 					     * XXX: not set to 4, because
  102: 					     * a small mis-configuration
  103: 					     * may concentrate all multicast
  104: 					     * traffic in a single RP
  105: 					     */
  106: #define PIM_GROUP_PREFIX_MIN_MASKLEN	  4 /* group prefix minimum length */
  107: 
  108: /* Datarate related definitions */
  109: 
  110: /*
  111:  * This is the threshold for the last hop router, or the RP, to
  112:  * initiate switching to the shortest path tree.  Like Cisco we
  113:  * change to SPT on first packet to the (S,G), but only after
  114:  * 100 seconds (Xorp does this and Pavlin knows his PIM-SM-FU)
  115:  */
  116: #define SPT_THRESHOLD_DEFAULT_MODE        SPT_PACKETS
  117: #define SPT_THRESHOLD_DEFAULT_RATE        0
  118: #define SPT_THRESHOLD_DEFAULT_PACKETS     0
  119: #define SPT_THRESHOLD_MAX_PACKETS         0
  120: #define SPT_THRESHOLD_DEFAULT_INTERVAL    100
  121: 
  122: #define UCAST_ROUTING_CHECK_INTERVAL      20 /* Unfortunately, if the unicast
  123:                                               * routing changes, the kernel
  124:                                               * or any of the existing
  125:                                               * unicast routing daemons
  126:                                               * don't send us a signal.
  127:                                               * Have to ask periodically the
  128:                                               * kernel for any route changes.
  129:                                               * Default: every 20 seconds.
  130:                                               * Sigh.
  131:                                               */
  132: 
  133: 
  134: #define DEFAULT_PHY_RATE_LIMIT  0             /* default phyint rate limit  */
  135: #define DEFAULT_REG_RATE_LIMIT  0             /* default register_vif rate limit  */
  136: 
  137: /**************************************************************************
  138:  * PIM Encoded-Unicast, Encoded-Group and Encoded-Source Address formats  *
  139:  *************************************************************************/
  140: /* Address families definition */
  141: #define ADDRF_RESERVED  0
  142: #define ADDRF_IPv4      1
  143: #define ADDRF_IPv6      2
  144: #define ADDRF_NSAP      3
  145: #define ADDRF_HDLC      4
  146: #define ADDRF_BBN1822   5
  147: #define ADDRF_802       6
  148: #define ADDRF_ETHERNET  ADDRF_802
  149: #define ADDRF_E163      7
  150: #define ADDRF_E164      8
  151: #define ADDRF_SMDS      ADDRF_E164
  152: #define ADDRF_ATM       ADDRF_E164
  153: #define ADDRF_F69       9
  154: #define ADDRF_TELEX     ADDRF_F69
  155: #define ADDRF_X121      10
  156: #define ADDRF_X25       ADDRF_X121
  157: #define ADDRF_IPX       11
  158: #define ADDRF_APPLETALK 12
  159: #define ADDRF_DECNET_IV 13
  160: #define ADDRF_BANYAN    14
  161: #define ADDRF_E164_NSAP 15
  162: 
  163: /* Addresses Encoding Type (specific for each Address Family */
  164: #define ADDRT_IPv4      0
  165: 
  166: 
  167: /* Encoded-Unicast: 6 bytes long */
  168: typedef struct pim_encod_uni_addr_ {
  169:     uint8_t      addr_family;
  170:     uint8_t      encod_type;
  171:     uint32_t     unicast_addr;        /* XXX: Note the 32-bit boundary
  172: 				      * misalignment for  the unicast
  173: 				      * address when placed in the
  174: 				      * memory. Must read it byte-by-byte!
  175: 				      */
  176: } pim_encod_uni_addr_t;
  177: #define PIM_ENCODE_UNI_ADDR_LEN 6
  178: 
  179: /* Encoded-Group */
  180: typedef struct pim_encod_grp_addr_ {
  181:     uint8_t      addr_family;
  182:     uint8_t      encod_type;
  183:     uint8_t      reserved;
  184:     uint8_t      masklen;
  185:     uint32_t     mcast_addr;
  186: } pim_encod_grp_addr_t;
  187: #define PIM_ENCODE_GRP_ADDR_LEN 8
  188: 
  189: /* Encoded-Source */
  190: typedef struct pim_encod_src_addr_ {
  191:     uint8_t      addr_family;
  192:     uint8_t      encod_type;
  193:     uint8_t      flags;
  194:     uint8_t      masklen;
  195:     uint32_t     src_addr;
  196: } pim_encod_src_addr_t;
  197: #define PIM_ENCODE_SRC_ADDR_LEN 8
  198: 
  199: #define USADDR_RP_BIT 0x1
  200: #define USADDR_WC_BIT 0x2
  201: #define USADDR_S_BIT  0x4
  202: 
  203: /**************************************************************************
  204:  *                       PIM Messages formats                             *
  205:  *************************************************************************/
  206: /* TODO: XXX: some structures are probably not used at all */
  207: 
  208: typedef struct pim pim_header_t;
  209: 
  210: /* PIM Hello */
  211: typedef struct pim_hello_ {
  212:     uint16_t     option_type;   /* Option type */
  213:     uint16_t     option_length; /* Length of the Option Value field in bytes */
  214: } pim_hello_t;
  215: 
  216: /* PIM Register */
  217: typedef struct pim_register_ {
  218:     uint32_t     reg_flags;
  219: } pim_register_t;
  220: 
  221: /* PIM Register-Stop */
  222: typedef struct pim_register_stop_ {
  223:     pim_encod_grp_addr_t encod_grp;
  224:     pim_encod_uni_addr_t encod_src; /* XXX: 6 bytes long, misaligned */
  225: } pim_register_stop_t;
  226: 
  227: /* PIM Join/Prune: XXX: all 32-bit addresses misaligned! */
  228: typedef struct pim_jp_header_ {
  229:     pim_encod_uni_addr_t encod_upstream_nbr;
  230:     uint8_t     reserved;
  231:     uint8_t     num_groups;
  232:     uint16_t    holdtime;
  233: } pim_jp_header_t;
  234: 
  235: typedef struct pim_jp_encod_grp_ {
  236:     pim_encod_grp_addr_t   encod_grp;
  237:     uint16_t                number_join_src;
  238:     uint16_t                number_prune_src;
  239: } pim_jp_encod_grp_t;
  240: 
  241: #define PIM_ACTION_NOTHING 0
  242: #define PIM_ACTION_JOIN    1
  243: #define PIM_ACTION_PRUNE   2
  244: 
  245: #define PIM_IIF_SOURCE     1
  246: #define PIM_IIF_RP         2
  247: 
  248: #define PIM_ASSERT_RPT_BIT 0x80000000
  249: 
  250: 
  251: /* PIM messages type */
  252: #ifndef PIM_HELLO
  253: #define PIM_HELLO               0
  254: #endif
  255: #ifndef PIM_REGISTER
  256: #define PIM_REGISTER            1
  257: #endif
  258: #ifndef PIM_REGISTER_STOP
  259: #define PIM_REGISTER_STOP       2
  260: #endif
  261: #ifndef PIM_JOIN_PRUNE
  262: #define PIM_JOIN_PRUNE          3
  263: #endif
  264: #ifndef PIM_BOOTSTRAP
  265: #define PIM_BOOTSTRAP		4
  266: #endif
  267: #ifndef PIM_ASSERT
  268: #define PIM_ASSERT              5
  269: #endif
  270: #ifndef PIM_GRAFT
  271: #define PIM_GRAFT               6
  272: #endif
  273: #ifndef PIM_GRAFT_ACK
  274: #define PIM_GRAFT_ACK           7
  275: #endif
  276: #ifndef PIM_CAND_RP_ADV
  277: #define PIM_CAND_RP_ADV         8
  278: #endif
  279: 
  280: #define PIM_V2_HELLO            PIM_HELLO
  281: #define PIM_V2_REGISTER         PIM_REGISTER
  282: #define PIM_V2_REGISTER_STOP    PIM_REGISTER_STOP
  283: #define PIM_V2_JOIN_PRUNE       PIM_JOIN_PRUNE
  284: #define PIM_V2_BOOTSTRAP	PIM_BOOTSTRAP
  285: #define PIM_V2_ASSERT           PIM_ASSERT
  286: #define PIM_V2_GRAFT            PIM_GRAFT
  287: #define PIM_V2_GRAFT_ACK        PIM_GRAFT_ACK
  288: #define PIM_V2_CAND_RP_ADV      PIM_CAND_RP_ADV
  289: 
  290: #define PIM_V1_QUERY            0
  291: #define PIM_V1_REGISTER         1
  292: #define PIM_V1_REGISTER_STOP    2
  293: #define PIM_V1_JOIN_PRUNE       3
  294: #define PIM_V1_RP_REACHABILITY  4
  295: #define PIM_V1_ASSERT           5
  296: #define PIM_V1_GRAFT            6
  297: #define PIM_V1_GRAFT_ACK        7
  298: 
  299: /* Vartious options from PIM messages definitions */
  300: /* PIM_HELLO definitions */
  301: #define PIM_HELLO_HOLDTIME              1
  302: #define PIM_HELLO_HOLDTIME_LEN          2
  303: #define PIM_HELLO_HOLDTIME_FOREVER      0xffff
  304: 
  305: #define PIM_HELLO_DR_PRIO               19
  306: #define PIM_HELLO_DR_PRIO_LEN           4
  307: #define PIM_HELLO_DR_PRIO_DEFAULT       1
  308: 
  309: #define PIM_HELLO_GENID                 20
  310: #define PIM_HELLO_GENID_LEN             4
  311: 
  312: /* PIM_REGISTER definitions */
  313: #define PIM_REGISTER_BORDER_BIT         0x80000000
  314: #define PIM_REGISTER_NULL_REGISTER_BIT  0x40000000
  315: 
  316: 
  317: #define MASK_TO_MASKLEN(mask, masklen)                           \
  318:     do {                                                         \
  319:         uint32_t tmp_mask = ntohl((mask));                        \
  320:         uint8_t  tmp_masklen = sizeof((mask)) << 3;               \
  321:         for ( ; tmp_masklen > 0; tmp_masklen--, tmp_mask >>= 1)  \
  322:             if (tmp_mask & 0x1)                                  \
  323:                 break;                                           \
  324:         (masklen) = tmp_masklen;                                 \
  325:     } while (0)
  326: 
  327: #define MASKLEN_TO_MASK(masklen, mask)					    \
  328:   do {									    \
  329:     (mask) = masklen ? htonl(~0U << ((sizeof(mask) << 3) - (masklen))) : 0; \
  330: } while (0)
  331: 
  332: 
  333: /*
  334:  * A bunch of macros because of the lack of 32-bit boundary alignment.
  335:  * All because of one misalligned address format. Hopefully this will be
  336:  * fixed in PIMv3. (cp) must be (uint8_t *) .
  337:  */
  338: /* Originates from Eddy Rusty's (eddy@isi.edu) PIM-SM implementation for
  339:  * gated.
  340:  */
  341: 
  342: #include <sys/types.h>
  343: #ifdef HOST_OS_WINDOWS
  344: #define LITTLE_ENDIAN 1234
  345: #define BYTE_ORDER LITTLE_ENDIAN
  346: #endif /* HOST_OS_WINDOWS */
  347: 
  348: #if !defined(BYTE_ORDER)
  349: #if defined(__BYTE_ORDER)
  350: #define BYTE_ORDER	__BYTE_ORDER
  351: #define LITTLE_ENDIAN	__LITTLE_ENDIAN
  352: #define BIG_ENDIAN	__BIG_ENDIAN
  353: #else
  354: #error "BYTE_ORDER not defined! Define it to either LITTLE_ENDIAN (e.g. i386, vax) or BIG_ENDIAN (e.g.  68000, ibm, net) based on your architecture!"
  355: #endif
  356: #endif
  357: 
  358: /* PUT_NETLONG puts "network ordered" data to the datastream.
  359:  * PUT_HOSTLONG puts "host ordered" data to the datastream.
  360:  * GET_NETLONG gets the data and keeps it in "network order" in the memory
  361:  * GET_HOSTLONG gets the data, but in the memory it is in "host order"
  362:  * The same for all {PUT,GET}_{NET,HOST}{SHORT,LONG}
  363:  */
  364: #define GET_BYTE(val, cp)       ((val) = *(cp)++)
  365: #define PUT_BYTE(val, cp)       (*(cp)++ = (uint8_t)(val))
  366: 
  367: #define GET_HOSTSHORT(val, cp)                  \
  368:         do {                                    \
  369:                 uint16_t Xv;                    \
  370:                 Xv = (*(cp)++) << 8;            \
  371:                 Xv |= *(cp)++;                  \
  372:                 (val) = Xv;                     \
  373:         } while (0)
  374: 
  375: #define PUT_HOSTSHORT(val, cp)                  \
  376:         do {                                    \
  377:                 uint16_t Xv;                    \
  378:                 Xv = (uint16_t)(val);            \
  379:                 *(cp)++ = (uint8_t)(Xv >> 8);   \
  380:                 *(cp)++ = (uint8_t)Xv;          \
  381:         } while (0)
  382: 
  383: #if defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN)
  384: #define GET_NETSHORT(val, cp)                   \
  385:         do {                                    \
  386:                 uint16_t Xv;                    \
  387:                 Xv = *(cp)++;                   \
  388:                 Xv |= (*(cp)++) << 8;           \
  389:                 (val) = Xv;                     \
  390:         } while (0)
  391: #define PUT_NETSHORT(val, cp)                   \
  392:         do {                                    \
  393:                 uint16_t Xv;                    \
  394:                 Xv = (uint16_t)(val);            \
  395:                 *(cp)++ = (uint8_t)Xv;          \
  396:                 *(cp)++ = (uint8_t)(Xv >> 8);   \
  397:         } while (0)
  398: #else
  399: #define GET_NETSHORT(val, cp) GET_HOSTSHORT(val, cp)
  400: #define PUT_NETSHORT(val, cp) PUT_HOSTSHORT(val, cp)
  401: #endif /* {GET,PUT}_NETSHORT */
  402: 
  403: #define GET_HOSTLONG(val, cp)                   \
  404:         do {                                    \
  405:                 uint32_t Xv;                    \
  406:                 Xv  = (*(cp)++) << 24;          \
  407:                 Xv |= (*(cp)++) << 16;          \
  408:                 Xv |= (*(cp)++) <<  8;          \
  409:                 Xv |= *(cp)++;                  \
  410:                 (val) = Xv;                     \
  411:         } while (0)
  412: 
  413: #define PUT_HOSTLONG(val, cp)                   \
  414:         do {                                    \
  415:                 uint32_t Xv;                     \
  416:                 Xv = (uint32_t)(val);            \
  417:                 *(cp)++ = (uint8_t)(Xv >> 24);  \
  418:                 *(cp)++ = (uint8_t)(Xv >> 16);  \
  419:                 *(cp)++ = (uint8_t)(Xv >>  8);  \
  420:                 *(cp)++ = (uint8_t)Xv;          \
  421:         } while (0)
  422: 
  423: #if defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN)
  424: #define GET_NETLONG(val, cp)                    \
  425:         do {                                    \
  426:                 uint32_t Xv;                    \
  427:                 Xv  = *(cp)++;                  \
  428:                 Xv |= (*(cp)++) <<  8;          \
  429:                 Xv |= (*(cp)++) << 16;          \
  430:                 Xv |= (*(cp)++) << 24;          \
  431:                 (val) = Xv;                     \
  432:         } while (0)
  433: 
  434: #define PUT_NETLONG(val, cp)                    \
  435:         do {                                    \
  436:                 uint32_t Xv;                    \
  437:                 Xv = (uint32_t)(val);            \
  438:                 *(cp)++ = (uint8_t)Xv;          \
  439:                 *(cp)++ = (uint8_t)(Xv >>  8);  \
  440:                 *(cp)++ = (uint8_t)(Xv >> 16);  \
  441:                 *(cp)++ = (uint8_t)(Xv >> 24);  \
  442:         } while (0)
  443: #else
  444: #define GET_NETLONG(val, cp) GET_HOSTLONG(val, cp)
  445: #define PUT_NETLONG(val, cp) PUT_HOSTLONG(val, cp)
  446: #endif /* {GET,PUT}_HOSTLONG */
  447: 
  448: 
  449: #define GET_ESADDR(esa, cp)                     \
  450:         do {                                    \
  451:             (esa)->addr_family = *(cp)++;       \
  452:             (esa)->encod_type  = *(cp)++;       \
  453:             (esa)->flags       = *(cp)++;       \
  454:             (esa)->masklen     = *(cp)++;       \
  455:             GET_NETLONG((esa)->src_addr, (cp)); \
  456:         } while(0)
  457: 
  458: #define PUT_ESADDR(addr, masklen, flags, cp)    \
  459:         do {                                    \
  460:             uint32_t mask;                      \
  461:             MASKLEN_TO_MASK((masklen), mask);   \
  462:             *(cp)++ = ADDRF_IPv4; /* family */  \
  463:             *(cp)++ = ADDRT_IPv4; /* type   */  \
  464:             *(cp)++ = (flags);    /* flags  */  \
  465:             *(cp)++ = (masklen);                \
  466:             PUT_NETLONG((addr) & mask, (cp));   \
  467:         } while(0)
  468: 
  469: #define GET_EGADDR(ega, cp)                     \
  470:         do {                                    \
  471:             (ega)->addr_family = *(cp)++;       \
  472:             (ega)->encod_type  = *(cp)++;       \
  473:             (ega)->reserved    = *(cp)++;       \
  474:             (ega)->masklen     = *(cp)++;       \
  475:             GET_NETLONG((ega)->mcast_addr, (cp)); \
  476:         } while(0)
  477: 
  478: #define PUT_EGADDR(addr, masklen, reserved, cp) \
  479:         do {                                    \
  480:             uint32_t mask;                      \
  481:             MASKLEN_TO_MASK((masklen), mask);   \
  482:             *(cp)++ = ADDRF_IPv4; /* family */  \
  483:             *(cp)++ = ADDRT_IPv4; /* type   */  \
  484:             *(cp)++ = (reserved); /* reserved; should be 0 */  \
  485:             *(cp)++ = (masklen);                \
  486:             PUT_NETLONG((addr) & mask, (cp)); \
  487:         } while(0)
  488: 
  489: #define GET_EUADDR(eua, cp)                     \
  490:         do {                                    \
  491:             (eua)->addr_family = *(cp)++;       \
  492:             (eua)->encod_type  = *(cp)++;       \
  493:             GET_NETLONG((eua)->unicast_addr, (cp)); \
  494:         } while(0)
  495: 
  496: #define PUT_EUADDR(addr, cp)                    \
  497:         do {                                    \
  498:             *(cp)++ = ADDRF_IPv4; /* family */  \
  499:             *(cp)++ = ADDRT_IPv4; /* type   */  \
  500:             PUT_NETLONG((addr), (cp));          \
  501:         } while(0)
  502: 
  503: /* Check if group is in PIM-SSM range, x must be in network byte order */
  504: #define IN_PIM_SSM_RANGE(x) ((ntohl((unsigned)(x)) & 0xff000000) == 0xe8000000)
  505: 
  506: /* Check if address is in link-local range, x must be in network byte order */
  507: #define IN_LINK_LOCAL_RANGE(x) ((ntohl((unsigned)(x)) & 0xffff0000) == 0xa9fe0000)
  508:  
  509: /* TODO: Currently not used. Probably not need at all. Delete! */
  510: #if 0
  511: /* This is completely IGMP related stuff? */
  512: #define PIM_LEAF_TIMEOUT               (3.5 * IGMP_QUERY_INTERVAL)
  513: 
  514: #define PIM_REGISTER_BIT_TIMEOUT 30 	/* TODO: check if need to be 60 */
  515: 
  516: #define PIM_ASSERT_RATE_TIMER   15
  517: #endif /* 0 */
  518: 
  519: #if (defined(__bsdi__) || defined(NetBSD) || defined(OpenBSD) || defined(IRIX))
  520: /*
  521:  * Struct used to communicate from kernel to multicast router
  522:  * note the convenient similarity to an IP packet
  523:  */ 
  524: struct igmpmsg {
  525:     uint32_t        unused1;
  526:     uint32_t        unused2;
  527:     uint8_t         im_msgtype;                 /* what type of message     */
  528: #define IGMPMSG_NOCACHE         1
  529: #define IGMPMSG_WRONGVIF        2
  530: #define IGMPMSG_WHOLEPKT        3               /* used for user level encap*/
  531:     uint8_t         im_mbz;                     /* must be zero             */
  532:     uint8_t         im_vif;                     /* vif rec'd on             */
  533:     uint8_t         unused3;
  534:     struct in_addr  im_src, im_dst;
  535: };
  536: #endif

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