diff options
| author | Donald Sharp <sharpd@nvidia.com> | 2022-06-22 08:12:04 -0400 | 
|---|---|---|
| committer | Donald Sharp <sharpd@nvidia.com> | 2022-06-23 13:29:19 -0400 | 
| commit | 75700af6027073a2ede58b429ec49b6beb05dcb3 (patch) | |
| tree | 18a84e3f929f681e2c2232fca177a72f49febdc6 | |
| parent | 8b5153aab09695f19eed74b141919487369b58c2 (diff) | |
pimd: Limit pim's ecmp to what zebra tells us is the multipath
Zebra can be setup to use a value that is less than MULTIPATH_NUM.
When pimd connects to zebra, zebra will inform pim about the MULTIPATH_NUM
used.  Let's use that value for figuring out our multipath value.
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
| -rw-r--r-- | pimd/pim_instance.h | 1 | ||||
| -rw-r--r-- | pimd/pim_nht.c | 25 | ||||
| -rw-r--r-- | pimd/pim_rpf.c | 9 | ||||
| -rw-r--r-- | pimd/pim_zebra.c | 1 | ||||
| -rw-r--r-- | pimd/pim_zlookup.c | 2 | ||||
| -rw-r--r-- | pimd/pimd.c | 1 | 
6 files changed, 22 insertions, 17 deletions
diff --git a/pimd/pim_instance.h b/pimd/pim_instance.h index b19e8208ba..23b9df4aff 100644 --- a/pimd/pim_instance.h +++ b/pimd/pim_instance.h @@ -88,6 +88,7 @@ struct pim_router {  	uint32_t register_suppress_time;  	int packet_process;  	uint32_t register_probe_time; +	uint16_t multipath;  	/*  	 * What is the default vrf that we work in diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index 22716c2a92..564d16a60b 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -304,15 +304,15 @@ bool pim_nht_bsr_rpf_check(struct pim_instance *pim, struct in_addr bsr_addr,  		 * "check cache or get immediate result." But until that can  		 * be worked in, here's a copy of the code below :(  		 */ -		struct pim_zlookup_nexthop nexthop_tab[MULTIPATH_NUM]; +		struct pim_zlookup_nexthop nexthop_tab[router->multipath];  		ifindex_t i;  		struct interface *ifp = NULL;  		int num_ifindex;  		memset(nexthop_tab, 0, sizeof(nexthop_tab)); -		num_ifindex = zclient_lookup_nexthop(pim, nexthop_tab, -						     MULTIPATH_NUM, bsr_addr, -						     PIM_NEXTHOP_LOOKUP_MAX); +		num_ifindex = zclient_lookup_nexthop( +			pim, nexthop_tab, router->multipath, bsr_addr, +			PIM_NEXTHOP_LOOKUP_MAX);  		if (num_ifindex <= 0)  			return false; @@ -501,8 +501,8 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,  				   struct prefix *src, struct prefix *grp,  				   int neighbor_needed)  { -	struct pim_neighbor *nbrs[MULTIPATH_NUM], *nbr = NULL; -	struct interface *ifps[MULTIPATH_NUM]; +	struct pim_neighbor *nbrs[router->multipath], *nbr = NULL; +	struct interface *ifps[router->multipath];  	struct nexthop *nh_node = NULL;  	ifindex_t first_ifindex;  	struct interface *ifp = NULL; @@ -888,11 +888,11 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,  			    struct prefix *grp, int neighbor_needed)  {  	struct pim_nexthop_cache *pnc; -	struct pim_zlookup_nexthop nexthop_tab[MULTIPATH_NUM]; -	struct pim_neighbor *nbrs[MULTIPATH_NUM], *nbr = NULL; +	struct pim_zlookup_nexthop nexthop_tab[router->multipath]; +	struct pim_neighbor *nbrs[router->multipath], *nbr = NULL;  	struct pim_rpf rpf;  	int num_ifindex; -	struct interface *ifps[MULTIPATH_NUM], *ifp; +	struct interface *ifps[router->multipath], *ifp;  	int first_ifindex;  	int found = 0;  	uint8_t i = 0; @@ -915,9 +915,10 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,  	}  	memset(nexthop_tab, 0, -	       sizeof(struct pim_zlookup_nexthop) * MULTIPATH_NUM); -	num_ifindex = zclient_lookup_nexthop(pim, nexthop_tab, MULTIPATH_NUM, -					     src_addr, PIM_NEXTHOP_LOOKUP_MAX); +	       sizeof(struct pim_zlookup_nexthop) * router->multipath); +	num_ifindex = +		zclient_lookup_nexthop(pim, nexthop_tab, router->multipath, +				       src_addr, PIM_NEXTHOP_LOOKUP_MAX);  	if (num_ifindex < 1) {  		if (PIM_DEBUG_PIM_NHT)  			zlog_warn( diff --git a/pimd/pim_rpf.c b/pimd/pim_rpf.c index c470bcd4d7..bd4dd31a2c 100644 --- a/pimd/pim_rpf.c +++ b/pimd/pim_rpf.c @@ -54,7 +54,7 @@ void pim_rpf_set_refresh_time(struct pim_instance *pim)  bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,  			pim_addr addr, int neighbor_needed)  { -	struct pim_zlookup_nexthop nexthop_tab[MULTIPATH_NUM]; +	struct pim_zlookup_nexthop nexthop_tab[router->multipath];  	struct pim_neighbor *nbr = NULL;  	int num_ifindex;  	struct interface *ifp = NULL; @@ -92,9 +92,10 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,  	}  	memset(nexthop_tab, 0, -	       sizeof(struct pim_zlookup_nexthop) * MULTIPATH_NUM); -	num_ifindex = zclient_lookup_nexthop(pim, nexthop_tab, MULTIPATH_NUM, -					     addr, PIM_NEXTHOP_LOOKUP_MAX); +	       sizeof(struct pim_zlookup_nexthop) * router->multipath); +	num_ifindex = +		zclient_lookup_nexthop(pim, nexthop_tab, router->multipath, +				       addr, PIM_NEXTHOP_LOOKUP_MAX);  	if (num_ifindex < 1) {  		zlog_warn(  			"%s %s: could not find nexthop ifindex for address %pPAs", diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index 4135ae0408..7f217d9c2e 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -452,6 +452,7 @@ static void pim_zebra_connected(struct zclient *zclient)  static void pim_zebra_capabilities(struct zclient_capabilities *cap)  {  	router->mlag_role = cap->role; +	router->multipath = cap->ecmp;  }  static zclient_handler *const pim_handlers[] = { diff --git a/pimd/pim_zlookup.c b/pimd/pim_zlookup.c index a3978bd0d2..28777e4947 100644 --- a/pimd/pim_zlookup.c +++ b/pimd/pim_zlookup.c @@ -211,7 +211,7 @@ static int zclient_read_nexthop(struct pim_instance *pim,  	metric = stream_getl(s);  	nexthop_num = stream_getc(s); -	if (nexthop_num < 1) { +	if (nexthop_num < 1 || nexthop_num > router->multipath) {  		if (PIM_DEBUG_PIM_NHT_DETAIL)  			zlog_debug("%s: socket %d bad nexthop_num=%d", __func__,  				   zlookup->sock, nexthop_num); diff --git a/pimd/pimd.c b/pimd/pimd.c index 58e874fd11..a3be3f66e1 100644 --- a/pimd/pimd.c +++ b/pimd/pimd.c @@ -100,6 +100,7 @@ void pim_router_init(void)  	router->debugs = 0;  	router->master = frr_init();  	router->t_periodic = PIM_DEFAULT_T_PERIODIC; +	router->multipath = MULTIPATH_NUM;  	/*  	  RFC 4601: 4.6.3.  Assert Metrics  | 
