summaryrefslogtreecommitdiff
path: root/pimd/pim_rpf.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_rpf.c')
-rw-r--r--pimd/pim_rpf.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/pimd/pim_rpf.c b/pimd/pim_rpf.c
index da14e8b3eb..b02102c8fd 100644
--- a/pimd/pim_rpf.c
+++ b/pimd/pim_rpf.c
@@ -203,6 +203,7 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
struct prefix nht_p;
struct pim_nexthop_cache pnc;
struct prefix src, grp;
+ bool neigh_needed = true;
saved.source_nexthop = rpf->source_nexthop;
saved.rpf_addr = rpf->rpf_addr;
@@ -226,23 +227,20 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
grp.prefixlen = IPV4_MAX_BITLEN;
grp.u.prefix4 = up->sg.grp;
memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
+
+ if ((up->sg.src.s_addr == INADDR_ANY && I_am_RP(pim, up->sg.grp)) ||
+ PIM_UPSTREAM_FLAG_TEST_FHR(up->flags))
+ neigh_needed = FALSE;
if (pim_find_or_track_nexthop(pim, &nht_p, up, NULL, &pnc)) {
if (pnc.nexthop_num) {
- if (!pim_ecmp_nexthop_search(
- pim, &pnc, &up->rpf.source_nexthop, &src,
- &grp,
- !PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)
- && !PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(
- up->flags)))
+ if (!pim_ecmp_nexthop_search(pim, &pnc,
+ &up->rpf.source_nexthop,
+ &src, &grp, neigh_needed))
return PIM_RPF_FAILURE;
}
} else {
- if (!pim_ecmp_nexthop_lookup(
- pim, &rpf->source_nexthop, up->upstream_addr, &src,
- &grp,
- !PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)
- && !PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(
- up->flags)))
+ if (!pim_ecmp_nexthop_lookup(pim, &rpf->source_nexthop, &src,
+ &grp, neigh_needed))
return PIM_RPF_FAILURE;
}