diff options
| author | David Lamparter <equinox@opensourcerouting.org> | 2021-06-25 10:53:26 +0200 | 
|---|---|---|
| committer | David Lamparter <equinox@opensourcerouting.org> | 2021-11-17 11:17:44 +0100 | 
| commit | 4efdb9c6282485e48ffd387e10b0a0e116de0bb9 (patch) | |
| tree | c3c3e250a1f9c4365913a5e7e545b6ae8da463cb /pimd/pim_rp.c | |
| parent | 1ee6df336315cfe47a54fa95579812dfb845bc7f (diff) | |
pimd: clean up BSR NHT & fix parallel links
The Bootstrap message RX path needs a RPF check for the BSR address,
and this is implemented both incorrectly as well as quite ugly.
Clean up and fix case when we have multiple interfaces to the same LAN
and/or ECMP nexthops (both would cause message duplication, the former
can even cause BSM forwarding loops.)
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'pimd/pim_rp.c')
| -rw-r--r-- | pimd/pim_rp.c | 20 | 
1 files changed, 9 insertions, 11 deletions
diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 1651387384..7ad95d9f6a 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -392,7 +392,7 @@ void pim_upstream_update(struct pim_instance *pim, struct pim_upstream *up)  			zlog_debug(  				"%s: Deregister upstream %s addr %pFX with Zebra NHT",  				__func__, up->sg_str, &nht_p); -		pim_delete_tracked_nexthop(pim, &nht_p, up, NULL, false); +		pim_delete_tracked_nexthop(pim, &nht_p, up, NULL);  	}  	/* Update the upstream address */ @@ -555,7 +555,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,  			pim_rp_check_interfaces(pim, rp_all);  			pim_rp_refresh_group_to_rp_mapping(pim);  			pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_all, -						  false, NULL); +						  NULL);  			if (!pim_ecmp_nexthop_lookup(pim,  						     &rp_all->rp.source_nexthop, @@ -649,7 +649,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,  	if (PIM_DEBUG_PIM_NHT_RP)  		zlog_debug("%s: NHT Register RP addr %pFX grp %pFX with Zebra ",  			   __func__, &nht_p, &rp_info->group); -	pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, false, NULL); +	pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, NULL);  	if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop, &nht_p,  				     &rp_info->group, 1))  		return PIM_RP_NO_PATH; @@ -757,7 +757,7 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr,  	if (PIM_DEBUG_PIM_NHT_RP)  		zlog_debug("%s: Deregister RP addr %pFX with Zebra ", __func__,  			   &nht_p); -	pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info, false); +	pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info);  	if (!str2prefix("224.0.0.0/4", &g_all))  		return PIM_RP_BAD_ADDRESS; @@ -886,7 +886,7 @@ int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr,  		if (PIM_DEBUG_PIM_NHT_RP)  			zlog_debug("%s: Deregister RP addr %pFX with Zebra ",  				   __func__, &nht_p); -		pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info, false); +		pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info);  	}  	pim_rp_nexthop_del(rp_info); @@ -919,7 +919,7 @@ int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr,  		zlog_debug("%s: NHT Register RP addr %pFX grp %pFX with Zebra ",  			   __func__, &nht_p, &rp_info->group); -	pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, false, NULL); +	pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, NULL);  	if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop, &nht_p,  				     &rp_info->group, 1)) {  		route_unlock_node(rn); @@ -949,8 +949,7 @@ void pim_rp_setup(struct pim_instance *pim)  		nht_p.prefixlen = IPV4_MAX_BITLEN;  		nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4; -		pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, false, -					  NULL); +		pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, NULL);  		if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop,  					     &nht_p, &rp_info->group, 1))  			if (PIM_DEBUG_PIM_NHT_RP) @@ -1097,8 +1096,7 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, struct in_addr group)  			zlog_debug(  				"%s: NHT Register RP addr %pFX grp %pFX with Zebra",  				__func__, &nht_p, &rp_info->group); -		pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, false, -					  NULL); +		pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, NULL);  		pim_rpf_set_refresh_time(pim);  		(void)pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop,  					      &nht_p, &rp_info->group, 1); @@ -1328,7 +1326,7 @@ void pim_resolve_rp_nh(struct pim_instance *pim, struct pim_neighbor *nbr)  		nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4;  		memset(&pnc, 0, sizeof(struct pim_nexthop_cache));  		if (!pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, -					       false, &pnc)) +					       &pnc))  			continue;  		for (nh_node = pnc.nexthop; nh_node; nh_node = nh_node->next) {  | 
