Annotation of embedaddon/pimdd/mrt.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: mrt.h,v 1.11 1998/05/29 21:58:23 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: #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>