Annotation of embedaddon/pimd/pimd.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:  *  $Id: pimd.h,v 1.27 2003/05/21 10:40:28 pavlin 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>