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