Annotation of embedaddon/pimd/mrt.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: mrt.h,v 1.16 2001/09/10 20:31:36 pavlin Exp $
        !            32:  */
        !            33: 
        !            34: #define MRTF_SPT               0x0001  /* iif toward source                */
        !            35: #define MRTF_WC                        0x0002  /* (*,G) entry                      */
        !            36: #define MRTF_RP                        0x0004  /* iif toward RP                    */
        !            37: #define MRTF_NEW               0x0008  /* new created routing entry        */
        !            38: #define MRTF_IIF_REGISTER      0x0020  /* ???                              */
        !            39: #define MRTF_REGISTER          0x0080  /* ???                              */
        !            40: #define MRTF_KERNEL_CACHE      0x0200  /* a mirror for the kernel cache    */
        !            41: #define MRTF_NULL_OIF          0x0400  /* null oif cache..     ???         */
        !            42: #define MRTF_REG_SUPP          0x0800  /* register suppress    ???         */
        !            43: #define MRTF_ASSERTED          0x1000  /* upstream is not that of src ???  */
        !            44: #define MRTF_SG                        0x2000  /* (S,G) pure, not hanging off of (*,G)*/
        !            45: #define MRTF_PMBR              0x4000  /* (*,*,RP) entry (for interop)     */
        !            46: #define MRTF_MFC_CLONE_SG      0x8000  /* clone (S,G) MFC from (*,G) or (*,*,RP) */
        !            47: 
        !            48: /* Macro to duplicate oif info (oif bits, timers) */
        !            49: #define VOIF_COPY(from, to)                                            \
        !            50:     do {                                                               \
        !            51:        VIFM_COPY((from)->joined_oifs, (to)->joined_oifs);              \
        !            52:        VIFM_COPY((from)->oifs, (to)->oifs);                            \
        !            53:        VIFM_COPY((from)->leaves, (to)->leaves);                        \
        !            54:        VIFM_COPY((from)->pruned_oifs, (to)->pruned_oifs);              \
        !            55:        VIFM_COPY((from)->asserted_oifs, (to)->asserted_oifs);          \
        !            56:        memcpy((to)->vif_timers, (from)->vif_timers,                    \
        !            57:               numvifs * sizeof((from)->vif_timers[0]));                \
        !            58:        memcpy((to)->vif_deletion_delay, (from)->vif_deletion_delay,    \
        !            59:               numvifs * sizeof((from)->vif_deletion_delay[0]));        \
        !            60:     } while (0)
        !            61: 
        !            62: #define FREE_MRTENTRY(mrtentry_ptr)                            \
        !            63:     do {                                                       \
        !            64:        kernel_cache_t *curr;                                   \
        !            65:        kernel_cache_t *next;                                   \
        !            66:                                                                \
        !            67:        if ((mrtentry_ptr)->vif_timers)                         \
        !            68:            free((mrtentry_ptr)->vif_timers);                   \
        !            69:        if ((mrtentry_ptr)->vif_deletion_delay)                 \
        !            70:            free((mrtentry_ptr)->vif_deletion_delay);           \
        !            71:        curr = (mrtentry_ptr)->kernel_cache;                    \
        !            72:        while (curr) {                                          \
        !            73:            next = curr->next;                                  \
        !            74:            free(curr);                                         \
        !            75:            curr = next;                                        \
        !            76:        }                                                       \
        !            77:        free(mrtentry_ptr);                                     \
        !            78:     } while (0)
        !            79: 
        !            80: 
        !            81: /*
        !            82:  * The complicated structure used by the more complicated Join/Prune
        !            83:  * message building
        !            84:  */
        !            85: typedef struct build_jp_message_ {
        !            86:     struct build_jp_message_ *next; /* Used to chain the free entries       */
        !            87:     uint8_t *jp_message;       /* The Join/Prune message                     */
        !            88:     uint32_t jp_message_size;  /* Size of the Join/Prune message (in bytes)  */
        !            89:     uint16_t holdtime;       /* Join/Prune message holdtime field          */
        !            90:     uint32_t curr_group;             /* Current group address                      */
        !            91:     uint8_t  curr_group_msklen;/* Current group masklen                            */
        !            92:     uint8_t *join_list;              /* The working area for the join addresses    */
        !            93:     uint32_t join_list_size;   /* The size of the join_list (in bytes)       */
        !            94:     uint16_t join_addr_number; /* Number of the join addresses in join_list  */
        !            95:     uint8_t *prune_list;       /* The working area for the prune addresses   */
        !            96:     uint32_t prune_list_size;  /* The size of the prune_list (in bytes)      */
        !            97:     uint16_t prune_addr_number;/* Number of the prune addresses in prune_list*/
        !            98:     uint8_t *rp_list_join;     /* The working area for RP join addresses     */
        !            99:     uint32_t rp_list_join_size;/* The size of the rp_list_join (in bytes)    */
        !           100:     uint16_t rp_list_join_number;/* Number of RP addresses in rp_list_join   */
        !           101:     uint8_t *rp_list_prune;     /* The working area for RP prune addresses   */
        !           102:     uint32_t rp_list_prune_size;/* The size of the rp_list_prune (in bytes)  */
        !           103:     uint16_t rp_list_prune_number;/* Number of RP addresses in rp_list_prune */
        !           104:     uint8_t *num_groups_ptr;   /* Pointer to number_of_groups in jp_message  */
        !           105: } build_jp_message_t;
        !           106: 
        !           107: 
        !           108: typedef struct pim_nbr_entry {
        !           109:     struct pim_nbr_entry *next;                  /* link to next neighbor          */
        !           110:     struct pim_nbr_entry *prev;                  /* link to prev neighbor          */
        !           111:     uint32_t             address;        /* neighbor address               */
        !           112:     int8_t                dr_prio_present;/* If set, this neighbor has prio */
        !           113:     uint32_t              dr_prio;       /* DR priority: 1 (default)       */
        !           114:     uint32_t              genid;         /* Cached generation ID           */
        !           115:     vifi_t               vifi;           /* which interface                */
        !           116:     uint16_t             timer;          /* for timing out neighbor        */
        !           117:     build_jp_message_t *build_jp_message; /* A structure for fairly
        !           118:                                           * complicated Join/Prune
        !           119:                                           * message construction.
        !           120:                                           */
        !           121: } pim_nbr_entry_t;
        !           122: 
        !           123: 
        !           124: typedef struct srcentry {
        !           125:     struct srcentry     *next;         /* link to next entry               */
        !           126:     struct srcentry     *prev;         /* link to prev entry               */
        !           127:     uint32_t             address;      /* source or RP address             */
        !           128:     struct mrtentry     *mrtlink;      /* link to routing entries          */
        !           129:     vifi_t               incoming;     /* incoming vif                     */
        !           130:     struct pim_nbr_entry *upstream;    /* upstream router                  */
        !           131:     uint32_t             metric;       /* Unicast Routing Metric to the source */
        !           132:     uint32_t             preference;   /* The metric preference (for assers)*/
        !           133:     uint16_t             timer;        /* Entry timer??? Delete?           */
        !           134:     struct cand_rp      *cand_rp;      /* Used if this is rpentry_t        */
        !           135: } srcentry_t;
        !           136: typedef srcentry_t rpentry_t;
        !           137: 
        !           138: 
        !           139: /* (RP<->group) matching table related structures */
        !           140: typedef struct cand_rp {
        !           141:     struct cand_rp     *next;         /* Next candidate RP                 */
        !           142:     struct cand_rp     *prev;         /* Previous candidate RP             */
        !           143:     struct rp_grp_entry *rp_grp_next;  /* The rp_grp_entry chain for that RP*/
        !           144:     rpentry_t          *rpentry;      /* Pointer to the RP entry           */
        !           145: } cand_rp_t;
        !           146: 
        !           147: typedef struct grp_mask {
        !           148:     struct grp_mask    *next;
        !           149:     struct grp_mask    *prev;
        !           150:     struct rp_grp_entry *grp_rp_next;
        !           151:     uint32_t            group_addr;
        !           152:     uint32_t            group_mask;
        !           153:     uint32_t            hash_mask;
        !           154:     uint16_t            fragment_tag;    /* Used for garbage collection    */
        !           155:     uint8_t             group_rp_number; /* Used when assembling segments  */
        !           156: } grp_mask_t;
        !           157: 
        !           158: typedef struct rp_grp_entry {
        !           159:     struct rp_grp_entry *rp_grp_next; /* Next entry for same RP                 */
        !           160:     struct rp_grp_entry *rp_grp_prev; /* Prev entry for same RP                 */
        !           161:     struct rp_grp_entry *grp_rp_next; /* Next entry for same grp prefix         */
        !           162:     struct rp_grp_entry *grp_rp_prev; /* Prev entry for same grp prefix         */
        !           163:     struct grpentry    *grplink;     /* Link to all grps via this entry */
        !           164:     uint16_t            holdtime;    /* The RP holdtime                 */
        !           165:     uint16_t            fragment_tag; /* The fragment tag from the
        !           166:                                        * received BSR message           */
        !           167:     uint8_t             priority;    /* The RP priority                 */
        !           168:     grp_mask_t         *group;       /* Pointer to (group,mask) entry   */
        !           169:     cand_rp_t          *rp;          /* Pointer to the RP               */
        !           170: } rp_grp_entry_t;
        !           171: 
        !           172: 
        !           173: typedef struct grpentry {
        !           174:     struct grpentry    *next;         /* link to next entry                */
        !           175:     struct grpentry    *prev;         /* link to prev entry                */
        !           176:     struct grpentry    *rpnext;       /* next grp for the same RP          */
        !           177:     struct grpentry    *rpprev;       /* prev grp for the same RP          */
        !           178:     uint32_t            group;        /* subnet group of multicasts        */
        !           179:     uint32_t            rpaddr;       /* The IP address of the RP          */
        !           180:     struct mrtentry    *mrtlink;      /* link to (S,G) routing entries     */
        !           181:     rp_grp_entry_t     *active_rp_grp;/* Pointer to the active rp_grp entry*/
        !           182:     struct mrtentry    *grp_route;    /* Pointer to the (*,G) routing entry*/
        !           183: } grpentry_t;
        !           184: 
        !           185: typedef struct mrtentry {
        !           186:     struct mrtentry      *grpnext;     /* next entry of same group         */
        !           187:     struct mrtentry      *grpprev;     /* prev entry of same group         */
        !           188:     struct mrtentry      *srcnext;     /* next entry of same source        */
        !           189:     struct mrtentry      *srcprev;     /* prev entry of same source        */
        !           190:     struct grpentry      *group;       /* pointer to group entry           */
        !           191:     struct srcentry      *source;      /* pointer to source entry (or RP)  */
        !           192:     vifi_t               incoming;     /* the iif (either toward S or RP)  */
        !           193:     vifbitmap_t                  oifs;         /* The current result oifs          */
        !           194:     vifbitmap_t                  joined_oifs;  /* The joined oifs (Join received)  */
        !           195:     vifbitmap_t                  pruned_oifs;  /* The pruned oifs (Prune received) */
        !           196:     vifbitmap_t                  asserted_oifs;/* The asserted oifs (lost Assert)  */
        !           197:     vifbitmap_t                  leaves;       /* Has directly connected members   */
        !           198:     struct pim_nbr_entry *upstream;    /* upstream router, needed because
        !           199:                                         * of the asserts it may be different
        !           200:                                         * than the source (or RP) upstream
        !           201:                                         * router.
        !           202:                                         */
        !           203:     uint32_t            metric;        /* Routing Metric for this entry    */
        !           204:     uint32_t            preference;    /* The metric preference value      */
        !           205:     uint32_t            pmbr_addr;     /* The PMBR address (for interop)   */
        !           206:     uint16_t           *vif_timers;    /* vifs timer list                  */
        !           207:     uint16_t           *vif_deletion_delay; /* vifs deletion delay list    */
        !           208:     uint16_t            flags;         /* The MRTF_* flags                 */
        !           209:     uint16_t            timer;         /* entry timer                      */
        !           210:     uint16_t            jp_timer;      /* The Join/Prune timer             */
        !           211:     uint16_t            rs_timer;      /* Register-Suppression Timer       */
        !           212:     u_int               assert_timer;
        !           213:     u_int               assert_rate_timer;
        !           214:     struct kernel_cache *kernel_cache; /* List of the kernel cache entries */
        !           215: #ifdef RSRR
        !           216:     struct rsrr_cache  *rsrr_cache;    /* Used to save RSRR requests for
        !           217:                                         * route change notification. */
        !           218: #endif /* RSRR */
        !           219: } mrtentry_t;
        !           220: 
        !           221: 
        !           222: /*
        !           223:  * Used to get forwarded data related counts (number of packet, number of
        !           224:  * bits, etc)
        !           225:  */
        !           226: struct sg_count {
        !           227:     uint32_t  pktcnt;     /*  Number of packets for (s,g) */
        !           228:     uint32_t  bytecnt;    /*  Number of bytes for (s,g)   */
        !           229:     uint32_t  wrong_if;   /*  Number of packets received on wrong iif for (s,g) */
        !           230: };
        !           231: 
        !           232: struct vif_count {
        !           233:     uint32_t  icount;     /* Input packet count on vif    */
        !           234:     uint32_t  ocount;     /* Output packet count on vif   */
        !           235:     uint32_t  ibytes;     /* Input byte count on vif      */
        !           236:     uint32_t  obytes;     /* Output byte count on vif     */
        !           237: };
        !           238: 
        !           239: /*
        !           240:  * Structure to keep track of existing (S,G) MFC entries in the kernel
        !           241:  * for particular (*,G) or (*,*,RP) entry. We must keep track for
        !           242:  * each active source which doesn't have (S,G) entry in the daemon's
        !           243:  * routing table. We need to keep track of such sources for two reasons:
        !           244:  *
        !           245:  *    (1) If the kernel does not support (*,G) MFC entries (currently, the
        !           246:  * "official" mcast code doesn't), we must know all installed (s,G) entries
        !           247:  * in the kernel and modify them if the iif or oif for the (*,G) changes.
        !           248:  *
        !           249:  *    (2) By checking periodically the traffic coming from the shared tree,
        !           250:  * we can either delete the idle sources or switch to the shortest path.
        !           251:  *
        !           252:  * Note that even if we have (*,G) implemented in the kernel, we still
        !           253:  * need to have this structure because of (2)
        !           254:  */
        !           255: typedef struct kernel_cache {
        !           256:     struct kernel_cache *next;
        !           257:     struct kernel_cache *prev;
        !           258:     uint32_t            source;
        !           259:     uint32_t            group;
        !           260:     struct sg_count      sg_count; /* The (s,g) data retated counters (see above) */
        !           261: } kernel_cache_t;
        !           262: 
        !           263: /**
        !           264:  * Local Variables:
        !           265:  *  version-control: t
        !           266:  *  indent-tabs-mode: t
        !           267:  *  c-file-style: "ellemtel"
        !           268:  *  c-basic-offset: 4
        !           269:  * End:
        !           270:  */

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