/* * 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 * non-commercial 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. * * Questions concerning this software should be directed to * Kurt Windisch (kurtw@antc.uoregon.edu) at the University of Oregon's * Advanced Network Technology Center (ANTC). * * Portions of this code are derived from the PIMSM implementation * for GateD by George Eddy (eddy@isi.edu). * * $Id: pimdm.h,v 1.12 1998/06/22 14:40:03 kurtw Exp $ */ #ifdef PROTO_PIMDM PROTOTYPE (pimdm_init, extern void, (void)); PROTOTYPE (pimdm_var_init, extern void, (void)); PROTOTYPE (pimdm_reinit, extern void, (task *)); PROTOTYPE (pimdm_flash, void, (task *, rt_list *)); PROTOTYPE (pimdm_nbr_timeout, void, (if_addr *, pimnbr_t *aged)); PROTOTYPE (pimdm_new_nbr, void, (if_addr *)); PROTOTYPE (pimdm_dump, void, (task *, FILE *)); PROTOTYPE (pimdm_shutdown, void, (task *)); PROTOTYPE (pimdm_sg_rl_add_ifap, void, (if_addr *)); PROTOTYPE (pimdm_sg_rl_delete_ifap, void, (if_addr *)); #define PIMDM_CONFIG_ENABLE 1 #define PIMDM_CONFIG_DISABLE 2 #define PIM_ANYONE 0x00000000 /* 0.0.0.0 */ #define PIMDM_JOIN_DELAY 3 /* 3 second delay when pruning * on a LAN */ #define PIMDM_GRAFT_RETRANS_PERIOD 3 /* 3 second delay between graft * retransmissions */ extern int pimdm_config_status; /* if PIM DM is enabled in new config */ #include "pim.h" /* Sender is member heuristic for multicast interoperability: * See draft-thaler-multicast-interop-02.txt */ extern int pimdm_default_sender_is_member; /* Join/Prune Scheduling for LAN interfaces */ typedef struct _pimdm_scheduled_jp { struct _pimdm_scheduled_jp *forw; struct _pimdm_scheduled_jp *back; if_addr *ifap; /* Interface to prune */ source_t *src; /* The source entry */ task_timer *ttp; /* Individual timer */ int jp; /* JOIN or PRUNE */ time_t holdtime; /* Prune message holdtime */ sockaddr_un *addr; /* Address field of for the JP */ } pimdm_scheduled_jp_t; #define SCHED_JP_ENQ(elem, pred) { \ register pimdm_scheduled_jp_t *Xe = (pimdm_scheduled_jp_t *) (elem); \ register pimdm_scheduled_jp_t *Xp = (pimdm_scheduled_jp_t *) (pred); \ Xp->forw = (Xe->forw = (Xe->back = Xp)->forw)->back = Xe; \ } #define SCHED_JP_DEQ(elem) { \ register pimdm_scheduled_jp_t *Xe = elem; \ (Xe->back->forw = Xe->forw)->back = Xe->back; \ } #define SCHED_JP_LIST(gp, list) { for (gp = (list)->forw; gp != list; gp = gp->forw) #define SCHED_JP_LIST_END(gp, list) if (gp == (list)) gp = (pimdm_scheduled_jp_t *) 0; } #define SCHED_JP_ISNULL(list) (list == list->forw) /* rate limit asserts and prunes sent in response to data to 1 per second * per (S,G) per interface */ typedef struct _pimdm_rate_limit_times { struct _pimdm_rate_limit_times *forw; /* list of ifaps for this (S,G) */ struct _pimdm_rate_limit_times *back; if_addr *ifap; /* times are for this ifap */ time_t last_assert; /* time last assert sent */ time_t last_prune; /* time last prune sent */ } pimdm_rate_limit_times_t; #define PIMDM_RATE_LIMIT_ENQ(elem, pred) { \ register pimdm_rate_limit_times_t *Xe = (pimdm_rate_limit_times_t *) (elem); \ register pimdm_rate_limit_times_t *Xp = (pimdm_rate_limit_times_t *) (pred); \ Xp->forw = (Xe->forw = (Xe->back = Xp)->forw)->back = Xe; \ } #define PIMDM_RATE_LIMIT_DEQ(elem) { \ register pimdm_rate_limit_times_t *Xe = elem; \ (Xe->back->forw = Xe->forw)->back = Xe->back; \ } /* PIMDM-specific data in an MRT entry */ typedef struct _pimdm_source { /* list of pruned downstrea interfaces */ downstream_t *src_prune; /* LAN interface joins and prunes that are scheduled for this source */ pimdm_scheduled_jp_t *src_scheduled_jp; /* PIM assert timeout. 0 if there is no assert state. */ time_t src_assert_timeout; /* Rate limiting times - last times asserts or prunes were sent */ pimdm_rate_limit_times_t *src_rlt; /* a mrt_src_list contains the list of all sources that are * grafting. This is a pointer into that list for this source. * Null if the source is not grafting. */ mrt_src_list_t *src_graft; } pimdm_source_t; #define PIMDM_SRC_PRUNE(Xs) (((pimdm_source_t*)Xs->src_data[0])->src_prune) #define PIMDM_SRC_SCHED_JP(Xs) (((pimdm_source_t*)Xs->src_data[0])->src_scheduled_jp) #define PIMDM_SRC_ASSERT_TIMEOUT(Xs) (((pimdm_source_t*)Xs->src_data[0])->src_assert_timeout) #define PIMDM_SRC_RATE_LIMITS(Xs) (((pimdm_source_t*)Xs->src_data[0])->src_rlt) #define PIMDM_SRC_GRAFT_RETRANS(Xs) (((pimdm_source_t*)Xs->src_data[0])->src_graft) #endif /*PROTO_PIMDM*/