diff options
| author | Donald Sharp <donaldsharp72@gmail.com> | 2025-01-15 10:20:24 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-15 10:20:24 -0500 | 
| commit | 5867c3216169d44e7a9538e824f1e4a1e1e0466e (patch) | |
| tree | c58778ae604bbddec6c336fd9b4562f4c8191304 /pimd/pim_zlookup.c | |
| parent | 5e41d30b44177b932e40dc7eb70f7c5e0913d446 (diff) | |
| parent | f75ec46dfb1f925824e9f6a8ca3a254485dd88f0 (diff) | |
Merge pull request #17776 from nabahr/group-rpf-mode
PIMD: RPF lookup mode per-group, per-source
Diffstat (limited to 'pimd/pim_zlookup.c')
| -rw-r--r-- | pimd/pim_zlookup.c | 26 | 
1 files changed, 13 insertions, 13 deletions
diff --git a/pimd/pim_zlookup.c b/pimd/pim_zlookup.c index febc595ad4..4ffb5bac17 100644 --- a/pimd/pim_zlookup.c +++ b/pimd/pim_zlookup.c @@ -375,12 +375,16 @@ static int zclient_rib_lookup(struct pim_instance *pim, struct pim_zlookup_nexth  static int zclient_lookup_nexthop_once(struct pim_instance *pim,  				       struct pim_zlookup_nexthop nexthop_tab[], const int tab_size, -				       pim_addr addr) +				       pim_addr addr, pim_addr group)  { -	if (pim->rpf_mode == MCAST_MRIB_ONLY) +	enum pim_rpf_lookup_mode mode; + +	mode = pim_get_lookup_mode(pim, group, addr); + +	if (mode == MCAST_MRIB_ONLY)  		return zclient_rib_lookup(pim, nexthop_tab, tab_size, addr, SAFI_MULTICAST); -	if (pim->rpf_mode == MCAST_URIB_ONLY) +	if (mode == MCAST_URIB_ONLY)  		return zclient_rib_lookup(pim, nexthop_tab, tab_size, addr, SAFI_UNICAST);  	/* All other modes require looking up both tables and making a choice */ @@ -420,15 +424,14 @@ static int zclient_lookup_nexthop_once(struct pim_instance *pim,  	/* Both tables have results, so compare them. Distance and prefix length are the same for all  	 * nexthops, so only compare the first in the list  	 */ -	if (pim->rpf_mode == MCAST_MIX_DISTANCE && +	if (mode == MCAST_MIX_DISTANCE &&  	    mrib_tab[0].protocol_distance > urib_tab[0].protocol_distance) {  		if (PIM_DEBUG_PIM_NHT_DETAIL)  			zlog_debug("%s: addr=%pPAs(%s), URIB has shortest distance", __func__,  				   &addr, pim->vrf->name);  		memcpy(nexthop_tab, urib_tab, sizeof(struct pim_zlookup_nexthop) * tab_size);  		return urib_num; -	} else if (pim->rpf_mode == MCAST_MIX_PFXLEN && -		   mrib_tab[0].prefix_len < urib_tab[0].prefix_len) { +	} else if (mode == MCAST_MIX_PFXLEN && mrib_tab[0].prefix_len < urib_tab[0].prefix_len) {  		if (PIM_DEBUG_PIM_NHT_DETAIL)  			zlog_debug("%s: addr=%pPAs(%s), URIB has lengthest prefix length", __func__,  				   &addr, pim->vrf->name); @@ -459,15 +462,13 @@ void zclient_lookup_read_pipe(struct event *thread)  		return;  	} -	zclient_lookup_nexthop_once(pim, nexthop_tab, 10, l); +	zclient_lookup_nexthop_once(pim, nexthop_tab, 10, l, PIMADDR_ANY);  	event_add_timer(router->master, zclient_lookup_read_pipe, zlookup, 60,  			&zlookup_read);  } -int zclient_lookup_nexthop(struct pim_instance *pim, -			   struct pim_zlookup_nexthop nexthop_tab[], -			   const int tab_size, pim_addr addr, -			   int max_lookup) +int zclient_lookup_nexthop(struct pim_instance *pim, struct pim_zlookup_nexthop nexthop_tab[], +			   const int tab_size, pim_addr addr, pim_addr group, int max_lookup)  {  	int lookup;  	uint32_t route_metric = 0xFFFFFFFF; @@ -480,8 +481,7 @@ int zclient_lookup_nexthop(struct pim_instance *pim,  		int first_ifindex;  		pim_addr nexthop_addr; -		num_ifindex = zclient_lookup_nexthop_once(pim, nexthop_tab, -							  tab_size, addr); +		num_ifindex = zclient_lookup_nexthop_once(pim, nexthop_tab, tab_size, addr, group);  		if (num_ifindex < 1) {  			if (PIM_DEBUG_PIM_NHT_DETAIL)  				zlog_debug(  | 
