diff options
Diffstat (limited to 'pimd/pim_rpf.c')
| -rw-r--r-- | pimd/pim_rpf.c | 22 |
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; } |
