Annotation of embedaddon/pimdd/pimdd.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  *  Copyright (c) 1998 by the University of Oregon.
        !             3:  *  All rights reserved.
        !             4:  *
        !             5:  *  Permission to use, copy, modify, and distribute this software and
        !             6:  *  its documentation in source and binary forms for lawful
        !             7:  *  purposes and without fee is hereby granted, provided
        !             8:  *  that the above copyright notice appear in all copies and that both
        !             9:  *  the copyright notice and this permission notice appear in supporting
        !            10:  *  documentation, and that any documentation, advertising materials,
        !            11:  *  and other materials related to such distribution and use acknowledge
        !            12:  *  that the software was developed by the University of Oregon.
        !            13:  *  The name of the University of Oregon may not be used to endorse or 
        !            14:  *  promote products derived from this software without specific prior 
        !            15:  *  written permission.
        !            16:  *
        !            17:  *  THE UNIVERSITY OF OREGON DOES NOT MAKE ANY REPRESENTATIONS
        !            18:  *  ABOUT THE SUITABILITY OF THIS SOFTWARE FOR ANY PURPOSE.  THIS SOFTWARE IS
        !            19:  *  PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
        !            20:  *  INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            21:  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND 
        !            22:  *  NON-INFRINGEMENT.
        !            23:  *
        !            24:  *  IN NO EVENT SHALL UO, OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
        !            25:  *  SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, WHETHER IN CONTRACT,
        !            26:  *  TORT, OR OTHER FORM OF ACTION, ARISING OUT OF OR IN CONNECTION WITH,
        !            27:  *  THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            28:  *
        !            29:  *  Other copyrights might apply to parts of this software and are so
        !            30:  *  noted when applicable.
        !            31:  */
        !            32: /*
        !            33:  *  Questions concerning this software should be directed to 
        !            34:  *  Kurt Windisch (kurtw@antc.uoregon.edu)
        !            35:  *
        !            36:  *  $Id: pimdd.h,v 1.6 1998/12/22 21:50:18 kurtw Exp $
        !            37:  */
        !            38: /*
        !            39:  * Part of this program has been derived from PIM sparse-mode pimd.
        !            40:  * The pimd program is covered by the license in the accompanying file
        !            41:  * named "LICENSE.pimd".
        !            42:  *  
        !            43:  * The pimd program is COPYRIGHT 1998 by University of Southern California.
        !            44:  *
        !            45:  * Part of this program has been derived from mrouted.
        !            46:  * The mrouted program is covered by the license in the accompanying file
        !            47:  * named "LICENSE.mrouted".
        !            48:  * 
        !            49:  * The mrouted program is COPYRIGHT 1989 by The Board of Trustees of
        !            50:  * Leland Stanford Junior University.
        !            51:  *
        !            52:  */
        !            53: 
        !            54: #include <netinet/pim.h>
        !            55: 
        !            56: #define PIM_PROTOCOL_VERSION   2
        !            57: #define PIMD_VERSION           PIM_PROTOCOL_VERSION
        !            58: #define PIMD_SUBVERSION         1
        !            59: #if 0
        !            60: #define PIM_CONSTANT            0x000eff00      /* constant portion of 'group' field */
        !            61: #endif
        !            62: #define PIM_CONSTANT            0
        !            63: #define PIMD_LEVEL (PIM_CONSTANT | PIMD_VERSION | (PIMD_SUBVERSION << 8))
        !            64: 
        !            65: #define INADDR_ALL_PIM_ROUTERS  (u_int32)0xe000000D         /* 224.0.0.13 */
        !            66: 
        !            67: 
        !            68: /* PIM protocol timers (in seconds) */
        !            69: #ifndef TIMER_INTERVAL
        !            70: #define TIMER_INTERVAL                   5 /* virtual timer granularity */
        !            71: #endif /* TIMER_INTERVAL */
        !            72: 
        !            73: #define PIM_DATA_TIMEOUT                210
        !            74: #define PIM_TIMER_HELLO_PERIOD                  30
        !            75: #define PIM_JOIN_PRUNE_HOLDTIME         210
        !            76: #define PIM_RANDOM_DELAY_JOIN_TIMEOUT     3
        !            77: #define PIM_GRAFT_RETRANS_PERIOD          3
        !            78: #define PIM_TIMER_HELLO_HOLDTIME       (3.5 * PIM_TIMER_HELLO_PERIOD)
        !            79: #define PIM_ASSERT_TIMEOUT              210
        !            80: 
        !            81: 
        !            82: /* Misc definitions */
        !            83: #define SINGLE_SRC_MSKLEN               32 /* the single source mask length */
        !            84: #define SINGLE_GRP_MSKLEN               32 /* the single group mask length  */
        !            85: /* TODO: change? */
        !            86: #define PIM_GROUP_PREFIX_DEFAULT_MASKLEN 16 /* The default group masklen if
        !            87:                                             * omitted in the config file.
        !            88:                                             */
        !            89: 
        !            90: #define UCAST_ROUTING_CHECK_INTERVAL       20 /* Unfortunately, if the unicast
        !            91:                                               * routing changes, the kernel
        !            92:                                               * or any of the existing
        !            93:                                               * unicast routing daemons
        !            94:                                               * don't send us a signal.
        !            95:                                               * Have to ask periodically the
        !            96:                                               * kernel for any route changes.
        !            97:                                               * Default: every 20 seconds.
        !            98:                                               * Sigh.
        !            99:                                               */
        !           100: 
        !           101: 
        !           102: #define DEFAULT_PHY_RATE_LIMIT  0             /* default phyint rate limit  */
        !           103: 
        !           104: #define DEFAULT_LOCAL_PREF      101           /* Default assert preference */
        !           105: #define DEFAULT_LOCAL_METRIC    1024          /* Default assert metric */
        !           106: 
        !           107: /**************************************************************************
        !           108:  * PIM Encoded-Unicast, Encoded-Group and Encoded-Source Address formats  *
        !           109:  *************************************************************************/
        !           110: /* Address families definition */
        !           111: #define ADDRF_RESERVED  0
        !           112: #define ADDRF_IPv4      1
        !           113: #define ADDRF_IPv6      2
        !           114: #define ADDRF_NSAP      3
        !           115: #define ADDRF_HDLC      4
        !           116: #define ADDRF_BBN1822   5
        !           117: #define ADDRF_802       6
        !           118: #define ADDRF_ETHERNET  ADDRF_802
        !           119: #define ADDRF_E163      7
        !           120: #define ADDRF_E164      8
        !           121: #define ADDRF_SMDS      ADDRF_E164
        !           122: #define ADDRF_ATM       ADDRF_E164
        !           123: #define ADDRF_F69       9
        !           124: #define ADDRF_TELEX     ADDRF_F69
        !           125: #define ADDRF_X121      10
        !           126: #define ADDRF_X25       ADDRF_X121
        !           127: #define ADDRF_IPX       11
        !           128: #define ADDRF_APPLETALK 12
        !           129: #define ADDRF_DECNET_IV 13
        !           130: #define ADDRF_BANYAN    14
        !           131: #define ADDRF_E164_NSAP 15
        !           132: 
        !           133: /* Addresses Encoding Type (specific for each Address Family */
        !           134: #define ADDRT_IPv4      0
        !           135: 
        !           136: 
        !           137: /* Encoded-Unicast: 6 bytes long */
        !           138: typedef struct pim_encod_uni_addr_ {
        !           139:     u_int8      addr_family;
        !           140:     u_int8      encod_type;
        !           141:     u_int32     unicast_addr;        /* XXX: Note the 32-bit boundary
        !           142:                                      * misalignment for  the unicast
        !           143:                                      * address when placed in the
        !           144:                                      * memory. Must read it byte-by-byte!
        !           145:                                      */
        !           146: } pim_encod_uni_addr_t;
        !           147: 
        !           148: /* Encoded-Group */
        !           149: typedef struct pim_encod_grp_addr_ {
        !           150:     u_int8      addr_family;
        !           151:     u_int8      encod_type;
        !           152:     u_int8      reserved;
        !           153:     u_int8      masklen;
        !           154:     u_int32     mcast_addr;
        !           155: } pim_encod_grp_addr_t;
        !           156: 
        !           157: /* Encoded-Source */
        !           158: typedef struct pim_encod_src_addr_ {
        !           159:     u_int8      addr_family;
        !           160:     u_int8      encod_type;
        !           161:     u_int8      flags;
        !           162:     u_int8      masklen;
        !           163:     u_int32     src_addr;
        !           164: } pim_encod_src_addr_t;
        !           165: #define USADDR_RP_BIT 0x1
        !           166: #define USADDR_WC_BIT 0x2
        !           167: #define USADDR_S_BIT  0x4
        !           168: 
        !           169: /**************************************************************************
        !           170:  *                       PIM Messages formats                             *
        !           171:  *************************************************************************/
        !           172: /* TODO: XXX: some structures are probably not used at all */
        !           173: 
        !           174: typedef struct pim pim_header_t;
        !           175: 
        !           176: /* PIM Hello */
        !           177: typedef struct pim_hello_ {
        !           178:     u_int16     option_type;   /* Option type */
        !           179:     u_int16     option_length; /* Length of the Option Value field in bytes */
        !           180: } pim_hello_t;
        !           181: 
        !           182: /* PIM Join/Prune: XXX: all 32-bit addresses misaligned! */
        !           183: typedef struct pim_jp_header_ {
        !           184:     pim_encod_uni_addr_t encod_upstream_nbr;
        !           185:     u_int8     reserved;
        !           186:     u_int8     num_groups;
        !           187:     u_int16    holdtime;
        !           188: } pim_jp_header_t;
        !           189: 
        !           190: typedef struct pim_jp_encod_grp_ {
        !           191:     pim_encod_grp_addr_t   encod_grp;
        !           192:     u_int16                number_join_src;
        !           193:     u_int16                number_prune_src;
        !           194: } pim_jp_encod_grp_t;
        !           195: 
        !           196: #define PIM_ACTION_NOTHING 0
        !           197: #define PIM_ACTION_JOIN    1
        !           198: #define PIM_ACTION_PRUNE   2
        !           199: 
        !           200: #define PIM_IIF_SOURCE     1
        !           201: #define PIM_IIF_RP         2
        !           202: 
        !           203: #define PIM_ASSERT_RPT_BIT 0x80000000
        !           204: 
        !           205: 
        !           206: /* PIM messages type */
        !           207: #define PIM_HELLO               0
        !           208: #ifndef PIM_REGISTER
        !           209: #define PIM_REGISTER            1
        !           210: #endif
        !           211: #define PIM_REGISTER_STOP       2
        !           212: #define PIM_JOIN_PRUNE          3
        !           213: #define PIM_BOOTSTRAP          4
        !           214: #define PIM_ASSERT              5
        !           215: #define PIM_GRAFT               6
        !           216: #define PIM_GRAFT_ACK           7
        !           217: #define PIM_CAND_RP_ADV         8
        !           218: 
        !           219: #define PIM_V2_HELLO            PIM_HELLO
        !           220: #define PIM_V2_REGISTER         PIM_REGISTER
        !           221: #define PIM_V2_REGISTER_STOP    PIM_REGISTER_STOP
        !           222: #define PIM_V2_JOIN_PRUNE       PIM_JOIN_PRUNE
        !           223: #define PIM_V2_BOOTSTRAP       PIM_BOOTSTRAP
        !           224: #define PIM_V2_ASSERT           PIM_ASSERT
        !           225: #define PIM_V2_GRAFT            PIM_GRAFT
        !           226: #define PIM_V2_GRAFT_ACK        PIM_GRAFT_ACK
        !           227: #define PIM_V2_CAND_RP_ADV      PIM_CAND_RP_ADV
        !           228: 
        !           229: #define PIM_V1_QUERY            0
        !           230: #define PIM_V1_REGISTER         1
        !           231: #define PIM_V1_REGISTER_STOP    2
        !           232: #define PIM_V1_JOIN_PRUNE       3
        !           233: #define PIM_V1_RP_REACHABILITY  4
        !           234: #define PIM_V1_ASSERT           5
        !           235: #define PIM_V1_GRAFT            6
        !           236: #define PIM_V1_GRAFT_ACK        7
        !           237: 
        !           238: /* Vartious options from PIM messages definitions */
        !           239: /* PIM_HELLO definitions */
        !           240: #define PIM_MESSAGE_HELLO_HOLDTIME              1
        !           241: #define PIM_MESSAGE_HELLO_HOLDTIME_LENGTH       2
        !           242: #define PIM_MESSAGE_HELLO_HOLDTIME_FOREVER      0xffff
        !           243: 
        !           244: 
        !           245: #define MASK_TO_MASKLEN(mask, masklen)                           \
        !           246:     do {                                                         \
        !           247:         register u_int32 tmp_mask = ntohl((mask));               \
        !           248:         register u_int8  tmp_masklen = sizeof((mask)) << 3;      \
        !           249:         for ( ; tmp_masklen > 0; tmp_masklen--, tmp_mask >>= 1)  \
        !           250:             if (tmp_mask & 0x1)                                  \
        !           251:                 break;                                           \
        !           252:         (masklen) = tmp_masklen;                                 \
        !           253:     } while (0)
        !           254: 
        !           255: #define MASKLEN_TO_MASK(masklen, mask)                                       \
        !           256: do {                                                                         \
        !           257:     (mask) = (masklen)? htonl(~0 << ((sizeof((mask)) << 3) - (masklen))) : 0;\
        !           258: } while (0)
        !           259: 
        !           260: 
        !           261: /*
        !           262:  * A bunch of macros because of the lack of 32-bit boundary alignment.
        !           263:  * All because of one misalligned address format. Hopefully this will be
        !           264:  * fixed in PIMv3. (cp) must be (u_int8 *) .
        !           265:  */
        !           266: /* Originates from Eddy Rusty's (eddy@isi.edu) PIM-SM implementation for
        !           267:  * gated.
        !           268:  */
        !           269: 
        !           270: /* PUT_NETLONG puts "network ordered" data to the datastream.
        !           271:  * PUT_HOSTLONG puts "host ordered" data to the datastream.
        !           272:  * GET_NETLONG gets the data and keeps it in "network order" in the memory
        !           273:  * GET_HOSTLONG gets the data, but in the memory it is in "host order"
        !           274:  * The same for all {PUT,GET}_{NET,HOST}{SHORT,LONG}
        !           275:  */
        !           276: #define GET_BYTE(val, cp)       ((val) = *(cp)++)
        !           277: #define PUT_BYTE(val, cp)       (*(cp)++ = (u_int8)(val))
        !           278: 
        !           279: #define GET_HOSTSHORT(val, cp)                  \
        !           280:         do {                                    \
        !           281:                 register u_int16 Xv;            \
        !           282:                 Xv = (*(cp)++) << 8;            \
        !           283:                 Xv |= *(cp)++;                  \
        !           284:                 (val) = Xv;                     \
        !           285:         } while (0)
        !           286: 
        !           287: #define PUT_HOSTSHORT(val, cp)                  \
        !           288:         do {                                    \
        !           289:                 register u_int16 Xv;            \
        !           290:                 Xv = (u_int16)(val);            \
        !           291:                 *(cp)++ = (u_int8)(Xv >> 8);    \
        !           292:                 *(cp)++ = (u_int8)Xv;           \
        !           293:         } while (0)
        !           294: 
        !           295: #if defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN)
        !           296: #define GET_NETSHORT(val, cp)                   \
        !           297:         do {                                    \
        !           298:                 register u_int16 Xv;            \
        !           299:                 Xv = *(cp)++;                   \
        !           300:                 Xv |= (*(cp)++) << 8;           \
        !           301:                 (val) = Xv;                     \
        !           302:         } while (0)
        !           303: #define PUT_NETSHORT(val, cp)                   \
        !           304:         do {                                    \
        !           305:                 register u_int16 Xv;            \
        !           306:                 Xv = (u_int16)(val);            \
        !           307:                 *(cp)++ = (u_int8)Xv;           \
        !           308:                 *(cp)++ = (u_int8)(Xv >> 8);    \
        !           309:         } while (0)
        !           310: #else
        !           311: #define GET_NETSHORT(val, cp) GET_HOSTSHORT(val, cp)
        !           312: #define PUT_NETSHORT(val, cp) PUT_HOSTSHORT(val, cp)
        !           313: #endif /* {GET,PUT}_NETSHORT */
        !           314: 
        !           315: #define GET_HOSTLONG(val, cp)                   \
        !           316:         do {                                    \
        !           317:                 register u_long Xv;             \
        !           318:                 Xv  = (*(cp)++) << 24;          \
        !           319:                 Xv |= (*(cp)++) << 16;          \
        !           320:                 Xv |= (*(cp)++) <<  8;          \
        !           321:                 Xv |= *(cp)++;                  \
        !           322:                 (val) = Xv;                     \
        !           323:         } while (0)
        !           324: 
        !           325: #define PUT_HOSTLONG(val, cp)                   \
        !           326:         do {                                    \
        !           327:                 register u_int32 Xv;            \
        !           328:                 Xv = (u_int32)(val);            \
        !           329:                 *(cp)++ = (u_int8)(Xv >> 24);   \
        !           330:                 *(cp)++ = (u_int8)(Xv >> 16);   \
        !           331:                 *(cp)++ = (u_int8)(Xv >>  8);   \
        !           332:                 *(cp)++ = (u_int8)Xv;           \
        !           333:         } while (0)
        !           334: 
        !           335: #if defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN)
        !           336: #define GET_NETLONG(val, cp)                    \
        !           337:         do {                                    \
        !           338:                 register u_long Xv;             \
        !           339:                 Xv  = *(cp)++;                  \
        !           340:                 Xv |= (*(cp)++) <<  8;          \
        !           341:                 Xv |= (*(cp)++) << 16;          \
        !           342:                 Xv |= (*(cp)++) << 24;          \
        !           343:                 (val) = Xv;                     \
        !           344:         } while (0)
        !           345: 
        !           346: #define PUT_NETLONG(val, cp)                    \
        !           347:         do {                                    \
        !           348:                 register u_int32 Xv;            \
        !           349:                 Xv = (u_int32)(val);            \
        !           350:                 *(cp)++ = (u_int8)Xv;           \
        !           351:                 *(cp)++ = (u_int8)(Xv >>  8);   \
        !           352:                 *(cp)++ = (u_int8)(Xv >> 16);   \
        !           353:                 *(cp)++ = (u_int8)(Xv >> 24);   \
        !           354:         } while (0)
        !           355: #else
        !           356: #define GET_NETLONG(val, cp) GET_HOSTLONG(val, cp)
        !           357: #define PUT_NETLONG(val, cp) PUT_HOSTLONG(val, cp)
        !           358: #endif /* {GET,PUT}_HOSTLONG */
        !           359: 
        !           360: 
        !           361: #define GET_ESADDR(esa, cp)                     \
        !           362:         do {                                    \
        !           363:             (esa)->addr_family = *(cp)++;       \
        !           364:             (esa)->encod_type  = *(cp)++;       \
        !           365:             (esa)->flags       = *(cp)++;       \
        !           366:             (esa)->masklen     = *(cp)++;       \
        !           367:             GET_NETLONG((esa)->src_addr, (cp)); \
        !           368:         } while(0)
        !           369: 
        !           370: #define PUT_ESADDR(addr, masklen, flags, cp)    \
        !           371:         do {                                    \
        !           372:             u_int32 mask;                       \
        !           373:             MASKLEN_TO_MASK((masklen), mask);   \
        !           374:             *(cp)++ = ADDRF_IPv4; /* family */  \
        !           375:             *(cp)++ = ADDRT_IPv4; /* type   */  \
        !           376:             *(cp)++ = (flags);    /* flags  */  \
        !           377:             *(cp)++ = (masklen);                \
        !           378:             PUT_NETLONG((addr) & mask, (cp));   \
        !           379:         } while(0)
        !           380: 
        !           381: #define GET_EGADDR(ega, cp)                     \
        !           382:         do {                                    \
        !           383:             (ega)->addr_family = *(cp)++;       \
        !           384:             (ega)->encod_type  = *(cp)++;       \
        !           385:             (ega)->reserved    = *(cp)++;       \
        !           386:             (ega)->masklen     = *(cp)++;       \
        !           387:             GET_NETLONG((ega)->mcast_addr, (cp)); \
        !           388:         } while(0)
        !           389: 
        !           390: #define PUT_EGADDR(addr, masklen, reserved, cp) \
        !           391:         do {                                    \
        !           392:             u_int32 mask;                       \
        !           393:             MASKLEN_TO_MASK((masklen), mask);   \
        !           394:             *(cp)++ = ADDRF_IPv4; /* family */  \
        !           395:             *(cp)++ = ADDRT_IPv4; /* type   */  \
        !           396:             *(cp)++ = (reserved); /* reserved; should be 0 */  \
        !           397:             *(cp)++ = (masklen);                \
        !           398:             PUT_NETLONG((addr) & mask, (cp)); \
        !           399:         } while(0)
        !           400: 
        !           401: #define GET_EUADDR(eua, cp)                     \
        !           402:         do {                                    \
        !           403:             (eua)->addr_family = *(cp)++;       \
        !           404:             (eua)->encod_type  = *(cp)++;       \
        !           405:             GET_NETLONG((eua)->unicast_addr, (cp)); \
        !           406:         } while(0)
        !           407: 
        !           408: #define PUT_EUADDR(addr, cp)                    \
        !           409:         do {                                    \
        !           410:             *(cp)++ = ADDRF_IPv4; /* family */  \
        !           411:             *(cp)++ = ADDRT_IPv4; /* type   */  \
        !           412:             PUT_NETLONG((addr), (cp));          \
        !           413:         } while(0)
        !           414: 
        !           415: 
        !           416: /* TODO: Currently not used. Probably not need at all. Delete! */
        !           417: #ifdef NOSUCHDEF
        !           418: /* This is completely IGMP related stuff? */
        !           419: #define PIM_LEAF_TIMEOUT               (3.5 * IGMP_QUERY_INTERVAL)
        !           420: #endif /* NOSUCHDEF */
        !           421: 
        !           422: #if (defined(BSDI) || defined(NetBSD) || defined(IRIX))
        !           423: /*
        !           424:  * Struct used to communicate from kernel to multicast router
        !           425:  * note the convenient similarity to an IP packet
        !           426:  */ 
        !           427: struct igmpmsg {
        !           428:     u_long          unused1;
        !           429:     u_long          unused2;
        !           430:     u_char          im_msgtype;                 /* what type of message     */
        !           431: #define IGMPMSG_NOCACHE         1
        !           432: #define IGMPMSG_WRONGVIF        2
        !           433: #define IGMPMSG_WHOLEPKT        3               /* used for user level encap*/
        !           434:     u_char          im_mbz;                     /* must be zero             */
        !           435:     u_char          im_vif;                     /* vif rec'd on             */
        !           436:     u_char          unused3;
        !           437:     struct in_addr  im_src, im_dst;
        !           438: };
        !           439: #endif

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