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>