diff options
Diffstat (limited to 'pimd')
| -rw-r--r-- | pimd/pim_bsm.c | 41 | 
1 files changed, 22 insertions, 19 deletions
diff --git a/pimd/pim_bsm.c b/pimd/pim_bsm.c index 6c4d649235..50fe543b23 100644 --- a/pimd/pim_bsm.c +++ b/pimd/pim_bsm.c @@ -354,24 +354,29 @@ static void pim_on_g2rp_timer(struct event *t)  	bsrp = EVENT_ARG(t);  	EVENT_OFF(bsrp->g2rp_timer);  	bsgrp_node = bsrp->bsgrp_node; - -	/* elapse time is the hold time of expired node */ -	elapse = bsrp->rp_holdtime; +	pim = bsgrp_node->scope->pim;  	bsrp_addr = bsrp->rp_address; -	/* update elapse for all bsrp nodes */ -	frr_each_safe (bsm_rpinfos, bsgrp_node->bsrp_list, bsrp_node) { -		bsrp_node->elapse_time += elapse; - -		if (is_hold_time_elapsed(bsrp_node)) { -			bsm_rpinfos_del(bsgrp_node->bsrp_list, bsrp_node); -			pim_bsm_rpinfo_free(bsrp_node); +	/* +	 * Update elapse for all bsrp nodes except on the BSR itself. +	 * The timer is meant to remove any bsr RPs learned from the BSR that +	 * we don't hear from anymore. on the BSR itself, no need to do this. +	 */ +	if (pim->global_scope.state != BSR_ELECTED) { +		/* elapse time is the hold time of expired node */ +		elapse = bsrp->rp_holdtime; +		frr_each_safe (bsm_rpinfos, bsgrp_node->bsrp_list, bsrp_node) { +			bsrp_node->elapse_time += elapse; + +			if (is_hold_time_elapsed(bsrp_node)) { +				bsm_rpinfos_del(bsgrp_node->bsrp_list, bsrp_node); +				pim_bsm_rpinfo_free(bsrp_node); +			}  		}  	}  	/* Get the next elected rp node */  	bsrp = bsm_rpinfos_first(bsgrp_node->bsrp_list); -	pim = bsgrp_node->scope->pim;  	rn = route_node_lookup(pim->rp_table, &bsgrp_node->group);  	if (!rn) { @@ -386,7 +391,7 @@ static void pim_on_g2rp_timer(struct event *t)  		return;  	} -	if (rp_info->rp_src != RP_SRC_STATIC) { +	if (rp_info->rp_src == RP_SRC_BSR) {  		/* If new rp available, change it else delete the existing */  		if (bsrp) {  			pim_g2rp_timer_start( @@ -2165,6 +2170,7 @@ static void cand_addrsel_config_write(struct vty *vty,  int pim_cand_config_write(struct pim_instance *pim, struct vty *vty)  {  	struct bsm_scope *scope = &pim->global_scope; +	struct cand_rp_group *group;  	int ret = 0;  	if (scope->cand_rp_addrsel.cfg_enable) { @@ -2176,14 +2182,11 @@ int pim_cand_config_write(struct pim_instance *pim, struct vty *vty)  		cand_addrsel_config_write(vty, &scope->cand_rp_addrsel);  		vty_out(vty, "\n");  		ret++; +	} -		struct cand_rp_group *group; - -		frr_each (cand_rp_groups, scope->cand_rp_groups, group) { -			vty_out(vty, " bsr candidate-rp group %pFX\n", -				&group->p); -			ret++; -		} +	frr_each (cand_rp_groups, scope->cand_rp_groups, group) { +		vty_out(vty, " bsr candidate-rp group %pFX\n", &group->p); +		ret++;  	}  	if (scope->bsr_addrsel.cfg_enable) {  | 
