/*
* Copyright (c) 1998 by the University of Oregon.
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software and
* its documentation in source and binary forms for lawful
* purposes and without fee is hereby granted, provided
* that the above copyright notice appear in all copies and that both
* the copyright notice and this permission notice appear in supporting
* documentation, and that any documentation, advertising materials,
* and other materials related to such distribution and use acknowledge
* that the software was developed by the University of Oregon.
* The name of the University of Oregon may not be used to endorse or
* promote products derived from this software without specific prior
* written permission.
*
* THE UNIVERSITY OF OREGON DOES NOT MAKE ANY REPRESENTATIONS
* ABOUT THE SUITABILITY OF THIS SOFTWARE FOR ANY PURPOSE. THIS SOFTWARE IS
* PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND
* NON-INFRINGEMENT.
*
* IN NO EVENT SHALL UO, OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, WHETHER IN CONTRACT,
* TORT, OR OTHER FORM OF ACTION, ARISING OUT OF OR IN CONNECTION WITH,
* THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Other copyrights might apply to parts of this software and are so
* noted when applicable.
*/
/*
* Questions concerning this software should be directed to
* Kurt Windisch (kurtw@antc.uoregon.edu)
*
* $Id: mrt.h,v 1.1.1.1 2017/06/12 07:58:55 misho Exp $
*/
/*
* Part of this program has been derived from PIM sparse-mode pimd.
* The pimd program is covered by the license in the accompanying file
* named "LICENSE.pimd".
*
* The pimd program is COPYRIGHT 1998 by University of Southern California.
*
* Part of this program has been derived from mrouted.
* The mrouted program is covered by the license in the accompanying file
* named "LICENSE.mrouted".
*
* The mrouted program is COPYRIGHT 1989 by The Board of Trustees of
* Leland Stanford Junior University.
*
*/
#define MRTF_SPT 0x0001 /* iif toward source */
#define MRTF_WC 0x0002 /* (*,G) entry */
#define MRTF_RP 0x0004 /* iif toward RP */
#define MRTF_NEW 0x0008 /* new created routing entry */
#define MRTF_IIF_REGISTER 0x0020 /* ??? */
#define MRTF_REGISTER 0x0080 /* ??? */
#define MRTF_KERNEL_CACHE 0x0200 /* a mirror for the kernel cache */
#define MRTF_NULL_OIF 0x0400 /* null oif cache.. ??? */
#define MRTF_REG_SUPP 0x0800 /* register suppress ??? */
#define MRTF_ASSERTED 0x1000 /* upstream is not that of src ??? */
#define MRTF_SG 0x2000 /* (S,G) pure, not hanging off of (*,G)*/
#define MRTF_PMBR 0x4000 /* (*,*,RP) entry (for interop) */
/* Macro to duplicate oif info (oif bits, timers) */
#define VOIF_COPY(from, to) \
do { \
VIFM_COPY((from)->joined_oifs, (to)->joined_oifs); \
VIFM_COPY((from)->oifs, (to)->oifs); \
VIFM_COPY((from)->leaves, (to)->leaves); \
VIFM_COPY((from)->pruned_oifs, (to)->pruned_oifs); \
bcopy((from)->prune_timers, (to)->prune_timers, \
numvifs*sizeof((from)->prune_timers[0])); \
bcopy((from)->prune_delay_timerids, \
(to)->prune_delay_timerids, \
numvifs*sizeof((from)->prune_delay_timerids[0])); \
(to)->join_delay_timerid = (from)->join_delay_timerid; \
} while (0)
#ifdef SAVE_MEMORY
#define FREE_MRTENTRY(mrtentry_ptr) \
do { \
u_int16 i; \
u_long *il_ptr; \
free((char *)((mrtentry_ptr)->prune_timers)); \
for(i=0, il_ptr=(mrtentry_ptr)->prune_delay_timerids; \
i<numvifs; i++, il_ptr++) \
timer_clearTimer(*il_ptr); \
free((char *)((mrtentry_ptr)->prune_delay_timerids)); \
timer_clearTimer((mrtentry_ptr)->join_delay_timerid); \
delete_pim_graft_entry((mrtentry_ptr)); \
free((char *)(mrtentry_ptr)); \
} while (0)
#else
#define FREE_MRTENTRY(mrtentry_ptr) \
do { \
u_int16 i; \
u_long *il_ptr; \
free((char *)((mrtentry_ptr)->prune_timers)); \
for(i=0, il_ptr=(mrtentry_ptr)->prune_delay_timerids; \
i<total_interfaces; i++, il_ptr++) \
timer_clearTimer(*il_ptr); \
free((char *)((mrtentry_ptr)->prune_delay_timerids)); \
free((char *)((mrtentry_ptr)->last_assert)); \
free((char *)((mrtentry_ptr)->last_prune)); \
timer_clearTimer((mrtentry_ptr)->join_delay_timerid); \
delete_pim_graft_entry((mrtentry_ptr)); \
free((char *)(mrtentry_ptr)); \
} while (0)
#endif /* SAVE_MEMORY */
typedef struct pim_nbr_entry {
struct pim_nbr_entry *next; /* link to next neighbor */
struct pim_nbr_entry *prev; /* link to prev neighbor */
u_int32 address; /* neighbor address */
vifi_t vifi; /* which interface */
u_int16 timer; /* for timing out neighbor */
} pim_nbr_entry_t;
/*
* Used to get forwarded data related counts (number of packet, number of
* bits, etc)
*/
struct sg_count {
u_long pktcnt; /* Number of packets for (s,g) */
u_long bytecnt; /* Number of bytes for (s,g) */
u_long wrong_if; /* Number of packets received on wrong iif for (s,g) */
};
typedef struct mrtentry mrtentry_t;
typedef struct pim_graft_entry {
struct pim_graft_entry *next;
struct pim_graft_entry *prev;
mrtentry_t *mrtlink;
} pim_graft_entry_t;
typedef struct srcentry {
struct srcentry *next; /* link to next entry */
struct srcentry *prev; /* link to prev entry */
u_int32 address; /* source or RP address */
struct mrtentry *mrtlink; /* link to routing entries */
vifi_t incoming; /* incoming vif */
struct pim_nbr_entry *upstream; /* upstream router */
u_int32 metric; /* Unicast Routing Metric to the source */
u_int32 preference; /* The metric preference (for assers)*/
u_int16 timer; /* Entry timer??? Delete? */
} srcentry_t;
typedef struct grpentry {
struct grpentry *next; /* link to next entry */
struct grpentry *prev; /* link to prev entry */
u_int32 group; /* subnet group of multicasts */
struct mrtentry *mrtlink; /* link to (S,G) routing entries */
} grpentry_t;
struct mrtentry {
struct mrtentry *grpnext; /* next entry of same group */
struct mrtentry *grpprev; /* prev entry of same group */
struct mrtentry *srcnext; /* next entry of same source */
struct mrtentry *srcprev; /* prev entry of same source */
struct grpentry *group; /* pointer to group entry */
struct srcentry *source; /* pointer to source entry (or RP) */
vifi_t incoming; /* the iif (either toward S or RP) */
vifbitmap_t oifs; /* The current result oifs */
vifbitmap_t pruned_oifs; /* The pruned oifs (Prune received) */
vifbitmap_t leaves; /* Has directly connected members */
struct pim_nbr_entry *upstream; /* upstream router, needed because
* of the asserts it may be different
* than the source (or RP) upstream
* router.
*/
u_int32 metric; /* Metric for the upstream */
u_int32 preference; /* preference for the upstream */
u_int16 *prune_timers; /* prune timer list */
u_long *prune_delay_timerids; /* timers for LAN prunes */
u_long join_delay_timerid; /* timer for delay joins */
u_int16 flags; /* The MRTF_* flags */
u_int16 timer; /* entry timer */
u_int assert_timer;
struct sg_count sg_count;
u_long *last_assert; /* time for last data-driven assert */
u_long *last_prune; /* time for last data-driven prune */
pim_graft_entry_t *graft; /* Pointer into graft entry list */
#ifdef RSRR
struct rsrr_cache *rsrr_cache; /* Used to save RSRR requests for
* routes change notification.
*/
#endif /* RSRR */
};
struct vif_count {
u_long icount; /* Input packet count on vif */
u_long ocount; /* Output packet count on vif */
u_long ibytes; /* Input byte count on vif */
u_long obytes; /* Output byte count on vif */
};
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>