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.c35
1 files changed, 15 insertions, 20 deletions
diff --git a/pimd/pim_rpf.c b/pimd/pim_rpf.c
index d383ef5249..1eb5006b94 100644
--- a/pimd/pim_rpf.c
+++ b/pimd/pim_rpf.c
@@ -195,7 +195,8 @@ static int nexthop_mismatch(const struct pim_nexthop *nh1,
}
enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
- struct pim_upstream *up, struct pim_rpf *old)
+ struct pim_upstream *up, struct pim_rpf *old,
+ const char *caller)
{
struct pim_rpf *rpf = &up->rpf;
struct pim_rpf saved;
@@ -207,13 +208,17 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
return PIM_RPF_OK;
if (up->upstream_addr.s_addr == INADDR_ANY) {
- zlog_debug("%s: RP is not configured yet for %s",
- __PRETTY_FUNCTION__, up->sg_str);
+ zlog_debug("%s(%s): RP is not configured yet for %s",
+ __func__, caller, up->sg_str);
return PIM_RPF_OK;
}
saved.source_nexthop = rpf->source_nexthop;
saved.rpf_addr = rpf->rpf_addr;
+ if (old) {
+ old->source_nexthop = saved.source_nexthop;
+ old->rpf_addr = saved.rpf_addr;
+ }
nht_p.family = AF_INET;
nht_p.prefixlen = IPV4_MAX_BITLEN;
@@ -238,8 +243,8 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
rpf->rpf_addr.u.prefix4 = pim_rpf_find_rpf_addr(up);
if (pim_rpf_addr_is_inaddr_any(rpf) && PIM_DEBUG_ZEBRA) {
/* RPF'(S,G) not found */
- zlog_debug("%s %s: RPF'%s not found: won't send join upstream",
- __FILE__, __PRETTY_FUNCTION__, up->sg_str);
+ zlog_debug("%s(%s): RPF'%s not found: won't send join upstream",
+ __func__, caller, up->sg_str);
/* warning only */
}
@@ -251,8 +256,8 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
pim_addr_dump("<addr?>",
&rpf->source_nexthop.mrib_nexthop_addr,
nhaddr_str, sizeof(nhaddr_str));
- zlog_debug("%s %s: (S,G)=%s source nexthop now is: interface=%s address=%s pref=%d metric=%d",
- __FILE__, __PRETTY_FUNCTION__,
+ zlog_debug("%s(%s): (S,G)=%s source nexthop now is: interface=%s address=%s pref=%d metric=%d",
+ __func__, caller,
up->sg_str,
rpf->source_nexthop.interface ? rpf->source_nexthop.interface->name : "<ifname?>",
nhaddr_str,
@@ -269,8 +274,8 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
if (saved.source_nexthop.interface != rpf->source_nexthop.interface) {
if (PIM_DEBUG_ZEBRA) {
- zlog_debug("%s %s: (S,G)=%s RPF_interface(S) changed from %s to %s",
- __FILE__, __PRETTY_FUNCTION__,
+ zlog_debug("%s(%s): (S,G)=%s RPF_interface(S) changed from %s to %s",
+ __func__, caller,
up->sg_str,
saved.source_nexthop.interface ? saved.source_nexthop.interface->name : "<oldif?>",
rpf->source_nexthop.interface ? rpf->source_nexthop.interface->name : "<newif?>");
@@ -286,11 +291,6 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
|| saved.source_nexthop
.interface != rpf->source_nexthop.interface) {
- /* return old rpf to caller ? */
- if (old) {
- old->source_nexthop = saved.source_nexthop;
- old->rpf_addr = saved.rpf_addr;
- }
return PIM_RPF_CHANGED;
}
@@ -307,12 +307,6 @@ void pim_upstream_rpf_clear(struct pim_instance *pim,
struct pim_upstream *up)
{
if (up->rpf.source_nexthop.interface) {
- if (up->channel_oil)
- pim_channel_oil_change_iif(pim, up->channel_oil,
- MAXVIFS,
- __PRETTY_FUNCTION__);
-
- pim_upstream_switch(pim, up, PIM_UPSTREAM_NOTJOINED);
up->rpf.source_nexthop.interface = NULL;
up->rpf.source_nexthop.mrib_nexthop_addr.u.prefix4.s_addr =
PIM_NET_INADDR_ANY;
@@ -321,6 +315,7 @@ void pim_upstream_rpf_clear(struct pim_instance *pim,
up->rpf.source_nexthop.mrib_route_metric =
router->infinite_assert_metric.route_metric;
up->rpf.rpf_addr.u.prefix4.s_addr = PIM_NET_INADDR_ANY;
+ pim_upstream_mroute_iif_update(up->channel_oil, __func__);
}
}