summaryrefslogtreecommitdiff
path: root/pimd/pim_zlookup.c
diff options
context:
space:
mode:
authorDonald Sharp <donaldsharp72@gmail.com>2025-01-15 10:20:24 -0500
committerGitHub <noreply@github.com>2025-01-15 10:20:24 -0500
commit5867c3216169d44e7a9538e824f1e4a1e1e0466e (patch)
treec58778ae604bbddec6c336fd9b4562f4c8191304 /pimd/pim_zlookup.c
parent5e41d30b44177b932e40dc7eb70f7c5e0913d446 (diff)
parentf75ec46dfb1f925824e9f6a8ca3a254485dd88f0 (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.c26
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(