summaryrefslogtreecommitdiff
path: root/pimd/pim_rp.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_rp.c')
-rw-r--r--pimd/pim_rp.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c
index d8d25712a3..49be9c0a73 100644
--- a/pimd/pim_rp.c
+++ b/pimd/pim_rp.c
@@ -543,6 +543,9 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group,
pim_zebra_update_all_interfaces(pim);
pim_rp_check_interfaces(pim, rp_all);
+ if (rp_all->i_am_rp && PIM_DEBUG_PIM_NHT_RP)
+ zlog_debug("new RP %pPA for %pFX is ourselves",
+ &rp_all->rp.rpf_addr, &rp_all->group);
pim_rp_refresh_group_to_rp_mapping(pim);
pim_find_or_track_nexthop(pim, nht_p, NULL, rp_all,
NULL);
@@ -634,6 +637,9 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group,
pim_zebra_update_all_interfaces(pim);
pim_rp_check_interfaces(pim, rp_info);
+ if (rp_info->i_am_rp && PIM_DEBUG_PIM_NHT_RP)
+ zlog_debug("new RP %pPA for %pFX is ourselves",
+ &rp_info->rp.rpf_addr, &rp_info->group);
pim_rp_refresh_group_to_rp_mapping(pim);
/* Register addr with Zebra NHT */
@@ -1101,16 +1107,17 @@ int pim_rp_set_upstream_addr(struct pim_instance *pim, pim_addr *up,
pim_addr source, pim_addr group)
{
struct rp_info *rp_info;
- struct prefix g;
+ struct prefix g = {};
- memset(&g, 0, sizeof(g));
+ if (!pim_addr_is_any(source)) {
+ *up = source;
+ return 1;
+ }
pim_addr_to_prefix(&g, group);
-
rp_info = pim_rp_find_match_group(pim, &g);
- if (!rp_info || ((pim_rpf_addr_is_inaddr_any(&rp_info->rp)) &&
- (pim_addr_is_any(source)))) {
+ if (!rp_info || pim_rpf_addr_is_inaddr_any(&rp_info->rp)) {
if (PIM_DEBUG_PIM_NHT_RP)
zlog_debug("%s: Received a (*,G) with no RP configured",
__func__);
@@ -1118,11 +1125,7 @@ int pim_rp_set_upstream_addr(struct pim_instance *pim, pim_addr *up,
return 0;
}
- if (pim_addr_is_any(source))
- *up = rp_info->rp.rpf_addr;
- else
- *up = source;
-
+ *up = rp_info->rp.rpf_addr;
return 1;
}