File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / pimdd / mrt.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jun 12 07:58:55 2017 UTC (7 years ago) by misho
Branches: pimdd, MAIN
CVS tags: v0_2_1p0, v0_2_1, HEAD
pimdd-dense 0.2.1.0_2

    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: mrt.h,v 1.1.1.1 2017/06/12 07:58:55 misho 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: #define MRTF_SPT                0x0001	/* iif toward source                */
   55: #define MRTF_WC                 0x0002	/* (*,G) entry                      */
   56: #define MRTF_RP                 0x0004	/* iif toward RP                    */
   57: #define MRTF_NEW                0x0008	/* new created routing entry        */
   58: #define MRTF_IIF_REGISTER	0x0020  /* ???                              */
   59: #define MRTF_REGISTER		0x0080  /* ???                              */
   60: #define MRTF_KERNEL_CACHE 	0x0200	/* a mirror for the kernel cache    */
   61: #define MRTF_NULL_OIF 		0x0400	/* null oif cache..     ???         */
   62: #define MRTF_REG_SUPP 		0x0800	/* register suppress    ???         */
   63: #define MRTF_ASSERTED		0x1000	/* upstream is not that of src ???  */
   64: #define MRTF_SG			0x2000	/* (S,G) pure, not hanging off of (*,G)*/
   65: #define MRTF_PMBR               0x4000  /* (*,*,RP) entry (for interop)     */
   66: 
   67: /* Macro to duplicate oif info (oif bits, timers) */
   68: #define VOIF_COPY(from, to)                                                \
   69: 	    do {                                                           \
   70:                 VIFM_COPY((from)->joined_oifs, (to)->joined_oifs);         \
   71:                 VIFM_COPY((from)->oifs, (to)->oifs);                       \
   72:                 VIFM_COPY((from)->leaves, (to)->leaves);                   \
   73:                 VIFM_COPY((from)->pruned_oifs, (to)->pruned_oifs);         \
   74:                 bcopy((from)->prune_timers, (to)->prune_timers,            \
   75: 		      numvifs*sizeof((from)->prune_timers[0]));            \
   76:                 bcopy((from)->prune_delay_timerids,                        \
   77: 		      (to)->prune_delay_timerids,                          \
   78: 		      numvifs*sizeof((from)->prune_delay_timerids[0]));    \
   79:                 (to)->join_delay_timerid = (from)->join_delay_timerid;     \
   80: 	    } while (0)
   81: 
   82: #ifdef SAVE_MEMORY
   83: #define FREE_MRTENTRY(mrtentry_ptr)                                        \
   84:              do {                                                          \
   85:                   u_int16 i;                                               \
   86:                   u_long *il_ptr;                                          \
   87: 		  free((char *)((mrtentry_ptr)->prune_timers));            \
   88: 		  for(i=0, il_ptr=(mrtentry_ptr)->prune_delay_timerids;    \
   89:                       i<numvifs; i++, il_ptr++)                            \
   90: 		       timer_clearTimer(*il_ptr);                          \
   91: 		  free((char *)((mrtentry_ptr)->prune_delay_timerids));    \
   92:                   timer_clearTimer((mrtentry_ptr)->join_delay_timerid);    \
   93: 		  delete_pim_graft_entry((mrtentry_ptr));                  \
   94:                   free((char *)(mrtentry_ptr));                            \
   95: 	     } while (0)
   96: #else
   97: #define FREE_MRTENTRY(mrtentry_ptr)                                        \
   98:              do {                                                          \
   99:                   u_int16 i;                                               \
  100:                   u_long *il_ptr;                                          \
  101: 		  free((char *)((mrtentry_ptr)->prune_timers));            \
  102: 		  for(i=0, il_ptr=(mrtentry_ptr)->prune_delay_timerids;    \
  103:                       i<total_interfaces; i++, il_ptr++)                   \
  104: 		       timer_clearTimer(*il_ptr);                          \
  105: 		  free((char *)((mrtentry_ptr)->prune_delay_timerids));    \
  106:                   free((char *)((mrtentry_ptr)->last_assert));             \
  107:                   free((char *)((mrtentry_ptr)->last_prune));              \
  108:                   timer_clearTimer((mrtentry_ptr)->join_delay_timerid);    \
  109: 		  delete_pim_graft_entry((mrtentry_ptr));                  \
  110:                   free((char *)(mrtentry_ptr));                            \
  111: 	     } while (0)
  112: #endif  /* SAVE_MEMORY */
  113: 
  114: typedef struct pim_nbr_entry {
  115:     struct	pim_nbr_entry *next;	  /* link to next neighbor	    */
  116:     struct	pim_nbr_entry *prev;	  /* link to prev neighbor	    */
  117:     u_int32	address;		  /* neighbor address		    */
  118:     vifi_t	vifi;			  /* which interface		    */
  119:     u_int16	timer;			  /* for timing out neighbor	    */
  120: } pim_nbr_entry_t;
  121: 
  122: 
  123: /*
  124:  * Used to get forwarded data related counts (number of packet, number of
  125:  * bits, etc)
  126:  */
  127: struct sg_count {
  128:     u_long pktcnt;     /*  Number of packets for (s,g) */
  129:     u_long bytecnt;    /*  Number of bytes for (s,g)   */
  130:     u_long wrong_if;   /*  Number of packets received on wrong iif for (s,g) */
  131: };
  132: 
  133: typedef struct mrtentry mrtentry_t;
  134: typedef struct pim_graft_entry {
  135:     struct pim_graft_entry    *next;
  136:     struct pim_graft_entry    *prev;
  137:     mrtentry_t                *mrtlink;
  138: } pim_graft_entry_t;
  139: 
  140: 
  141: typedef struct srcentry {
  142:     struct srcentry	*next;		/* link to next entry		    */
  143:     struct srcentry	*prev;		/* link to prev entry		    */
  144:     u_int32		address;	/* source or RP address 	    */
  145:     struct mrtentry	*mrtlink;	/* link to routing entries	    */
  146:     vifi_t		incoming;	/* incoming vif			    */
  147:     struct pim_nbr_entry *upstream;	/* upstream router		    */
  148:     u_int32             metric;     /* Unicast Routing Metric to the source */
  149:     u_int32		preference;	/* The metric preference (for assers)*/
  150:     u_int16		timer;		/* Entry timer??? Delete?      	    */
  151: } srcentry_t;
  152: 
  153: 
  154: typedef struct grpentry {
  155:     struct grpentry	*next;	       /* link to next entry		    */
  156:     struct grpentry	*prev;	       /* link to prev entry		    */
  157:     u_int32		group;	       /* subnet group of multicasts	    */
  158:     struct mrtentry	*mrtlink;      /* link to (S,G) routing entries	    */
  159: } grpentry_t;
  160: 
  161: struct mrtentry {
  162:     struct mrtentry	*grpnext;	/* next entry of same group	    */
  163:     struct mrtentry	*grpprev;	/* prev entry of same group	    */
  164:     struct mrtentry	*srcnext;	/* next entry of same source	    */
  165:     struct mrtentry	*srcprev;	/* prev entry of same source	    */
  166:     struct grpentry	*group;		/* pointer to group entry	    */
  167:     struct srcentry	*source;	/* pointer to source entry (or RP)  */
  168:     vifi_t              incoming;       /* the iif (either toward S or RP)  */
  169:     vifbitmap_t         oifs;           /* The current result oifs          */
  170:     vifbitmap_t         pruned_oifs;    /* The pruned oifs (Prune received) */
  171:     vifbitmap_t	        leaves;		/* Has directly connected members   */
  172:     struct pim_nbr_entry *upstream;	/* upstream router, needed because
  173: 					 * of the asserts it may be different
  174: 					 * than the source (or RP) upstream
  175: 					 * router.
  176: 					 */
  177:     u_int32             metric;         /* Metric for the upstream          */
  178:     u_int32		preference;	/* preference for the upstream      */
  179:     u_int16	        *prune_timers;  /* prune timer list		    */
  180:     u_long              *prune_delay_timerids; /* timers for LAN prunes     */
  181:     u_long              join_delay_timerid; /* timer for delay joins        */
  182:     u_int16	        flags;	        /* The MRTF_* flags                 */
  183:     u_int16	        timer;	        /* entry timer			    */
  184:     u_int	        assert_timer;
  185:     struct sg_count     sg_count;
  186:     u_long              *last_assert;   /* time for last data-driven assert */
  187:     u_long              *last_prune;    /* time for last data-driven prune  */
  188:     pim_graft_entry_t   *graft;         /* Pointer into graft entry list    */
  189: #ifdef RSRR
  190:     struct rsrr_cache   *rsrr_cache;    /* Used to save RSRR requests for
  191:                                          * routes change notification.
  192:                                          */
  193: #endif /* RSRR */
  194: };
  195: 
  196: 
  197: struct vif_count {
  198:     u_long icount;        /* Input packet count on vif            */
  199:     u_long ocount;        /* Output packet count on vif           */
  200:     u_long ibytes;        /* Input byte count on vif              */ 
  201:     u_long obytes;        /* Output byte count on vif             */ 
  202: };
  203: 

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