File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / pimd / mrt.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jun 12 07:59:37 2017 UTC (7 years ago) by misho
Branches: pimd, MAIN
CVS tags: v2_3_2, HEAD
pimd 2.3.2

    1: /*
    2:  * Copyright (c) 1998-2001
    3:  * University of Southern California/Information Sciences Institute.
    4:  * All rights reserved.
    5:  *
    6:  * Redistribution and use in source and binary forms, with or without
    7:  * modification, are permitted provided that the following conditions
    8:  * are met:
    9:  * 1. Redistributions of source code must retain the above copyright
   10:  *    notice, this list of conditions and the following disclaimer.
   11:  * 2. Redistributions in binary form must reproduce the above copyright
   12:  *    notice, this list of conditions and the following disclaimer in the
   13:  *    documentation and/or other materials provided with the distribution.
   14:  * 3. Neither the name of the project nor the names of its contributors
   15:  *    may be used to endorse or promote products derived from this software
   16:  *    without specific prior written permission.
   17:  *
   18:  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
   19:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   20:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   21:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
   22:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   23:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   24:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   25:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   26:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   27:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   28:  * SUCH DAMAGE.
   29:  */
   30: /*
   31:  *  $Id: mrt.h,v 1.1.1.1 2017/06/12 07:59:37 misho 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>