summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2022-06-22 08:12:04 -0400
committerDonald Sharp <sharpd@nvidia.com>2022-06-23 13:29:19 -0400
commit75700af6027073a2ede58b429ec49b6beb05dcb3 (patch)
tree18a84e3f929f681e2c2232fca177a72f49febdc6
parent8b5153aab09695f19eed74b141919487369b58c2 (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.h1
-rw-r--r--pimd/pim_nht.c25
-rw-r--r--pimd/pim_rpf.c9
-rw-r--r--pimd/pim_zebra.c1
-rw-r--r--pimd/pim_zlookup.c2
-rw-r--r--pimd/pimd.c1
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