Merge pull request #10424 from patrasar/master_pimv6_nht

This commit is contained in:
David Lamparter 2022-02-28 17:50:42 +01:00 committed by GitHub
commit ee95029ac4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 99 additions and 136 deletions

View File

@ -42,6 +42,7 @@
#include "pim_zebra.h" #include "pim_zebra.h"
#include "pim_zlookup.h" #include "pim_zlookup.h"
#include "pim_rp.h" #include "pim_rp.h"
#include "pim_addr.h"
/** /**
* pim_sendmsg_zebra_rnh -- Format and send a nexthop register/Unregister * pim_sendmsg_zebra_rnh -- Format and send a nexthop register/Unregister
@ -75,10 +76,7 @@ struct pim_nexthop_cache *pim_nexthop_cache_find(struct pim_instance *pim,
struct pim_nexthop_cache *pnc = NULL; struct pim_nexthop_cache *pnc = NULL;
struct pim_nexthop_cache lookup; struct pim_nexthop_cache lookup;
lookup.rpf.rpf_addr.family = rpf->rpf_addr.family; lookup.rpf.rpf_addr = rpf->rpf_addr;
lookup.rpf.rpf_addr.prefixlen = rpf->rpf_addr.prefixlen;
lookup.rpf.rpf_addr.u.prefix4.s_addr = rpf->rpf_addr.u.prefix4.s_addr;
pnc = hash_lookup(pim->rpf_hash, &lookup); pnc = hash_lookup(pim->rpf_hash, &lookup);
return pnc; return pnc;
@ -92,10 +90,7 @@ static struct pim_nexthop_cache *pim_nexthop_cache_add(struct pim_instance *pim,
pnc = XCALLOC(MTYPE_PIM_NEXTHOP_CACHE, pnc = XCALLOC(MTYPE_PIM_NEXTHOP_CACHE,
sizeof(struct pim_nexthop_cache)); sizeof(struct pim_nexthop_cache));
pnc->rpf.rpf_addr.family = rpf_addr->rpf_addr.family; pnc->rpf.rpf_addr = rpf_addr->rpf_addr;
pnc->rpf.rpf_addr.prefixlen = rpf_addr->rpf_addr.prefixlen;
pnc->rpf.rpf_addr.u.prefix4.s_addr =
rpf_addr->rpf_addr.u.prefix4.s_addr;
pnc = hash_get(pim->rpf_hash, pnc, hash_alloc_intern); pnc = hash_get(pim->rpf_hash, pnc, hash_alloc_intern);
@ -119,9 +114,7 @@ static struct pim_nexthop_cache *pim_nht_get(struct pim_instance *pim,
zclient = pim_zebra_zclient_get(); zclient = pim_zebra_zclient_get();
memset(&rpf, 0, sizeof(struct pim_rpf)); memset(&rpf, 0, sizeof(struct pim_rpf));
rpf.rpf_addr.family = addr->family; rpf.rpf_addr = *addr;
rpf.rpf_addr.prefixlen = addr->prefixlen;
rpf.rpf_addr.u.prefix4 = addr->u.prefix4;
pnc = pim_nexthop_cache_find(pim, &rpf); pnc = pim_nexthop_cache_find(pim, &rpf);
if (!pnc) { if (!pnc) {
@ -409,8 +402,8 @@ bool pim_nht_bsr_rpf_check(struct pim_instance *pim, struct in_addr bsr_addr,
void pim_rp_nexthop_del(struct rp_info *rp_info) void pim_rp_nexthop_del(struct rp_info *rp_info)
{ {
rp_info->rp.source_nexthop.interface = NULL; rp_info->rp.source_nexthop.interface = NULL;
rp_info->rp.source_nexthop.mrib_nexthop_addr.u.prefix4.s_addr = pim_addr_to_prefix(&rp_info->rp.source_nexthop.mrib_nexthop_addr,
PIM_NET_INADDR_ANY; PIMADDR_ANY);
rp_info->rp.source_nexthop.mrib_metric_preference = rp_info->rp.source_nexthop.mrib_metric_preference =
router->infinite_assert_metric.metric_preference; router->infinite_assert_metric.metric_preference;
rp_info->rp.source_nexthop.mrib_route_metric = rp_info->rp.source_nexthop.mrib_route_metric =
@ -523,6 +516,9 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,
uint32_t hash_val = 0, mod_val = 0; uint32_t hash_val = 0, mod_val = 0;
uint8_t nh_iter = 0, found = 0; uint8_t nh_iter = 0, found = 0;
uint32_t i, num_nbrs = 0; uint32_t i, num_nbrs = 0;
pim_addr nh_addr = pim_addr_from_prefix(&(nexthop->mrib_nexthop_addr));
pim_addr src_addr = pim_addr_from_prefix(src);
pim_addr grp_addr = pim_addr_from_prefix(grp);
if (!pnc || !pnc->nexthop_num || !nexthop) if (!pnc || !pnc->nexthop_num || !nexthop)
return 0; return 0;
@ -530,10 +526,10 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,
memset(&nbrs, 0, sizeof(nbrs)); memset(&nbrs, 0, sizeof(nbrs));
memset(&ifps, 0, sizeof(ifps)); memset(&ifps, 0, sizeof(ifps));
// Current Nexthop is VALID, check to stay on the current path. // Current Nexthop is VALID, check to stay on the current path.
if (nexthop->interface && nexthop->interface->info if (nexthop->interface && nexthop->interface->info &&
&& nexthop->mrib_nexthop_addr.u.prefix4.s_addr (!pim_addr_is_any(nh_addr))) {
!= PIM_NET_INADDR_ANY) {
/* User configured knob to explicitly switch /* User configured knob to explicitly switch
to new path is disabled or current path to new path is disabled or current path
metric is less than nexthop update. metric is less than nexthop update.
@ -573,23 +569,13 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,
pnc->distance; pnc->distance;
nexthop->mrib_route_metric = nexthop->mrib_route_metric =
pnc->metric; pnc->metric;
if (PIM_DEBUG_PIM_NHT) { if (PIM_DEBUG_PIM_NHT)
char src_str[INET_ADDRSTRLEN];
pim_inet4_dump("<addr?>",
src->u.prefix4,
src_str,
sizeof(src_str));
char grp_str[INET_ADDRSTRLEN];
pim_inet4_dump("<addr?>",
grp->u.prefix4,
grp_str,
sizeof(grp_str));
zlog_debug( zlog_debug(
"%s: (%s,%s)(%s) current nexthop %s is valid, skipping new path selection", "%s: (%pPA,%pPA)(%s) current nexthop %s is valid, skipping new path selection",
__func__, src_str, __func__, &src_addr,
grp_str, pim->vrf->name, &grp_addr,
pim->vrf->name,
nexthop->interface->name); nexthop->interface->name);
}
return 1; return 1;
} }
} }
@ -612,7 +598,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,
#endif #endif
nbrs[i] = pim_neighbor_find(ifps[i], nhaddr); nbrs[i] = pim_neighbor_find(ifps[i], nhaddr);
if (nbrs[i] || if (nbrs[i] ||
pim_if_connected_to_source(ifps[i], src->u.prefix4)) pim_if_connected_to_source(ifps[i], src_addr))
num_nbrs++; num_nbrs++;
} }
} }
@ -635,38 +621,30 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,
first_ifindex = nh_node->ifindex; first_ifindex = nh_node->ifindex;
ifp = ifps[nh_iter]; ifp = ifps[nh_iter];
if (!ifp) { if (!ifp) {
if (PIM_DEBUG_PIM_NHT) { if (PIM_DEBUG_PIM_NHT)
char addr_str[INET_ADDRSTRLEN];
pim_inet4_dump("<addr?>", src->u.prefix4,
addr_str, sizeof(addr_str));
zlog_debug( zlog_debug(
"%s %s: could not find interface for ifindex %d (address %s(%s))", "%s %s: could not find interface for ifindex %d (address %pPA(%s))",
__FILE__, __func__, first_ifindex, __FILE__, __func__, first_ifindex,
addr_str, pim->vrf->name); &src_addr, pim->vrf->name);
}
if (nh_iter == mod_val) if (nh_iter == mod_val)
mod_val++; // Select nexthpath mod_val++; // Select nexthpath
nh_iter++; nh_iter++;
continue; continue;
} }
if (!ifp->info) { if (!ifp->info) {
if (PIM_DEBUG_PIM_NHT) { if (PIM_DEBUG_PIM_NHT)
char addr_str[INET_ADDRSTRLEN];
pim_inet4_dump("<addr?>", src->u.prefix4,
addr_str, sizeof(addr_str));
zlog_debug( zlog_debug(
"%s: multicast not enabled on input interface %s(%s) (ifindex=%d, RPF for source %s)", "%s: multicast not enabled on input interface %s(%s) (ifindex=%d, RPF for source %pPA)",
__func__, ifp->name, pim->vrf->name, __func__, ifp->name, pim->vrf->name,
first_ifindex, addr_str); first_ifindex, &src_addr);
}
if (nh_iter == mod_val) if (nh_iter == mod_val)
mod_val++; // Select nexthpath mod_val++; // Select nexthpath
nh_iter++; nh_iter++;
continue; continue;
} }
if (neighbor_needed if (neighbor_needed &&
&& !pim_if_connected_to_source(ifp, src->u.prefix4)) { !pim_if_connected_to_source(ifp, src_addr)) {
nbr = nbrs[nh_iter]; nbr = nbrs[nh_iter];
if (!nbr && !if_is_loopback(ifp)) { if (!nbr && !if_is_loopback(ifp)) {
if (PIM_DEBUG_PIM_NHT) if (PIM_DEBUG_PIM_NHT)
@ -683,34 +661,27 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,
if (nh_iter == mod_val) { if (nh_iter == mod_val) {
nexthop->interface = ifp; nexthop->interface = ifp;
nexthop->mrib_nexthop_addr.family = AF_INET; nexthop->mrib_nexthop_addr.family = PIM_AF;
nexthop->mrib_nexthop_addr.prefixlen = IPV4_MAX_BITLEN; nexthop->mrib_nexthop_addr.prefixlen = PIM_MAX_BITLEN;
#if PIM_IPV == 4
nexthop->mrib_nexthop_addr.u.prefix4 = nexthop->mrib_nexthop_addr.u.prefix4 =
nh_node->gate.ipv4; nh_node->gate.ipv4;
#else
nexthop->mrib_nexthop_addr.u.prefix6 =
nh_node->gate->ipv6;
#endif
nexthop->mrib_metric_preference = pnc->distance; nexthop->mrib_metric_preference = pnc->distance;
nexthop->mrib_route_metric = pnc->metric; nexthop->mrib_route_metric = pnc->metric;
nexthop->last_lookup = src->u.prefix4; nexthop->last_lookup = src_addr;
nexthop->last_lookup_time = pim_time_monotonic_usec(); nexthop->last_lookup_time = pim_time_monotonic_usec();
nexthop->nbr = nbr; nexthop->nbr = nbr;
found = 1; found = 1;
if (PIM_DEBUG_PIM_NHT) { if (PIM_DEBUG_PIM_NHT)
char buf[INET_ADDRSTRLEN];
char buf2[INET_ADDRSTRLEN];
char buf3[INET_ADDRSTRLEN];
pim_inet4_dump("<src?>", src->u.prefix4, buf2,
sizeof(buf2));
pim_inet4_dump("<grp?>", grp->u.prefix4, buf3,
sizeof(buf3));
pim_inet4_dump(
"<rpf?>",
nexthop->mrib_nexthop_addr.u.prefix4,
buf, sizeof(buf));
zlog_debug( zlog_debug(
"%s: (%s,%s)(%s) selected nhop interface %s addr %s mod_val %u iter %d ecmp %d", "%s: (%pPA,%pPA)(%s) selected nhop interface %s addr %pPAs mod_val %u iter %d ecmp %d",
__func__, buf2, buf3, pim->vrf->name, __func__, &src_addr, &grp_addr,
ifp->name, buf, mod_val, nh_iter, pim->vrf->name, ifp->name, &nh_addr,
pim->ecmp_enable); mod_val, nh_iter, pim->ecmp_enable);
}
} }
nh_iter++; nh_iter++;
} }
@ -784,9 +755,15 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS)
* RPF address from nexthop cache (i.e. * RPF address from nexthop cache (i.e.
* destination) as PIM nexthop. * destination) as PIM nexthop.
*/ */
#if PIM_IPV == 4
nexthop->type = NEXTHOP_TYPE_IPV4_IFINDEX; nexthop->type = NEXTHOP_TYPE_IPV4_IFINDEX;
nexthop->gate.ipv4 = nexthop->gate.ipv4 =
pnc->rpf.rpf_addr.u.prefix4; pnc->rpf.rpf_addr.u.prefix4;
#else
nexthop->type = NEXTHOP_TYPE_IPV6_IFINDEX;
nexthop->gate.ipv6 =
pnc->rpf.rpf_addr.u.prefix6;
#endif
break; break;
case NEXTHOP_TYPE_IPV6_IFINDEX: case NEXTHOP_TYPE_IPV6_IFINDEX:
ifp1 = if_lookup_by_index(nexthop->ifindex, ifp1 = if_lookup_by_index(nexthop->ifindex,
@ -806,8 +783,11 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS)
else { else {
// Mark nexthop address to 0 until PIM // Mark nexthop address to 0 until PIM
// Nbr is resolved. // Nbr is resolved.
nexthop->gate.ipv4.s_addr = #if PIM_IPV == 4
PIM_NET_INADDR_ANY; nexthop->gate.ipv4 = PIMADDR_ANY;
#else
nexthop->gate.ipv6 = PIMADDR_ANY;
#endif
} }
break; break;
@ -917,20 +897,14 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
uint8_t i = 0; uint8_t i = 0;
uint32_t hash_val = 0, mod_val = 0; uint32_t hash_val = 0, mod_val = 0;
uint32_t num_nbrs = 0; uint32_t num_nbrs = 0;
char addr_str[PREFIX_STRLEN]; pim_addr src_addr = pim_addr_from_prefix(src);
if (PIM_DEBUG_PIM_NHT) { if (PIM_DEBUG_PIM_NHT)
pim_inet4_dump("<addr?>", src->u.prefix4, addr_str, zlog_debug("%s: Looking up: %pPA(%s), last lookup time: %lld",
sizeof(addr_str)); __func__, &src_addr, pim->vrf->name,
zlog_debug("%s: Looking up: %s(%s), last lookup time: %lld",
__func__, addr_str, pim->vrf->name,
nexthop->last_lookup_time); nexthop->last_lookup_time);
}
memset(&rpf, 0, sizeof(struct pim_rpf)); rpf.rpf_addr = *src;
rpf.rpf_addr.family = AF_INET;
rpf.rpf_addr.prefixlen = IPV4_MAX_BITLEN;
rpf.rpf_addr.u.prefix4 = src->u.prefix4;
pnc = pim_nexthop_cache_find(pim, &rpf); pnc = pim_nexthop_cache_find(pim, &rpf);
if (pnc) { if (pnc) {
@ -941,14 +915,13 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
memset(nexthop_tab, 0, memset(nexthop_tab, 0,
sizeof(struct pim_zlookup_nexthop) * MULTIPATH_NUM); sizeof(struct pim_zlookup_nexthop) * MULTIPATH_NUM);
num_ifindex = num_ifindex = zclient_lookup_nexthop(pim, nexthop_tab, MULTIPATH_NUM,
zclient_lookup_nexthop(pim, nexthop_tab, MULTIPATH_NUM, src_addr, PIM_NEXTHOP_LOOKUP_MAX);
src->u.prefix4, PIM_NEXTHOP_LOOKUP_MAX);
if (num_ifindex < 1) { if (num_ifindex < 1) {
if (PIM_DEBUG_PIM_NHT) if (PIM_DEBUG_PIM_NHT)
zlog_warn( zlog_warn(
"%s: could not find nexthop ifindex for address %s(%s)", "%s: could not find nexthop ifindex for address %pPA(%s)",
__func__, addr_str, pim->vrf->name); __func__, &src_addr, pim->vrf->name);
return 0; return 0;
} }
@ -965,9 +938,8 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
if (ifps[i]) { if (ifps[i]) {
nbrs[i] = pim_neighbor_find_prefix( nbrs[i] = pim_neighbor_find_prefix(
ifps[i], &nexthop_tab[i].nexthop_addr); ifps[i], &nexthop_tab[i].nexthop_addr);
if (nbrs[i] if (nbrs[i] ||
|| pim_if_connected_to_source(ifps[i], pim_if_connected_to_source(ifps[i], src_addr))
src->u.prefix4))
num_nbrs++; num_nbrs++;
} }
} }
@ -997,9 +969,9 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
if (!ifp) { if (!ifp) {
if (PIM_DEBUG_PIM_NHT) if (PIM_DEBUG_PIM_NHT)
zlog_debug( zlog_debug(
"%s %s: could not find interface for ifindex %d (address %s(%s))", "%s %s: could not find interface for ifindex %d (address %pPA(%s))",
__FILE__, __func__, first_ifindex, __FILE__, __func__, first_ifindex,
addr_str, pim->vrf->name); &src_addr, pim->vrf->name);
if (i == mod_val) if (i == mod_val)
mod_val++; mod_val++;
i++; i++;
@ -1009,16 +981,16 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
if (!ifp->info) { if (!ifp->info) {
if (PIM_DEBUG_PIM_NHT) if (PIM_DEBUG_PIM_NHT)
zlog_debug( zlog_debug(
"%s: multicast not enabled on input interface %s(%s) (ifindex=%d, RPF for source %s)", "%s: multicast not enabled on input interface %s(%s) (ifindex=%d, RPF for source %pPA)",
__func__, ifp->name, pim->vrf->name, __func__, ifp->name, pim->vrf->name,
first_ifindex, addr_str); first_ifindex, &src_addr);
if (i == mod_val) if (i == mod_val)
mod_val++; mod_val++;
i++; i++;
continue; continue;
} }
if (neighbor_needed if (neighbor_needed &&
&& !pim_if_connected_to_source(ifp, src->u.prefix4)) { !pim_if_connected_to_source(ifp, src_addr)) {
nbr = nbrs[i]; nbr = nbrs[i];
if (PIM_DEBUG_PIM_NHT_DETAIL) if (PIM_DEBUG_PIM_NHT_DETAIL)
zlog_debug("ifp name: %s(%s), pim nbr: %p", zlog_debug("ifp name: %s(%s), pim nbr: %p",
@ -1029,9 +1001,9 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
i++; i++;
if (PIM_DEBUG_PIM_NHT) if (PIM_DEBUG_PIM_NHT)
zlog_debug( zlog_debug(
"%s: NBR not found on input interface %s(%s) (RPF for source %s)", "%s: NBR not found on input interface %s(%s) (RPF for source %pPA)",
__func__, ifp->name, __func__, ifp->name,
pim->vrf->name, addr_str); pim->vrf->name, &src_addr);
continue; continue;
} }
} }
@ -1044,8 +1016,8 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
&nexthop_tab[i].nexthop_addr, &nexthop_tab[i].nexthop_addr,
nexthop_str, sizeof(nexthop_str)); nexthop_str, sizeof(nexthop_str));
zlog_debug( zlog_debug(
"%s: found nhop %s for addr %s interface %s(%s) metric %d dist %d", "%s: found nhop %s for addr %pPA interface %s(%s) metric %d dist %d",
__func__, nexthop_str, addr_str, __func__, nexthop_str, &src_addr,
ifp->name, pim->vrf->name, ifp->name, pim->vrf->name,
nexthop_tab[i].route_metric, nexthop_tab[i].route_metric,
nexthop_tab[i].protocol_distance); nexthop_tab[i].protocol_distance);
@ -1058,7 +1030,8 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
nexthop_tab[i].protocol_distance; nexthop_tab[i].protocol_distance;
nexthop->mrib_route_metric = nexthop->mrib_route_metric =
nexthop_tab[i].route_metric; nexthop_tab[i].route_metric;
nexthop->last_lookup = src->u.prefix4; memcpy(&(nexthop->last_lookup), &(src_addr),
sizeof(pim_addr));
nexthop->last_lookup_time = pim_time_monotonic_usec(); nexthop->last_lookup_time = pim_time_monotonic_usec();
nexthop->nbr = nbr; nexthop->nbr = nbr;
found = 1; found = 1;
@ -1078,36 +1051,36 @@ int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim,
struct pim_nexthop nhop; struct pim_nexthop nhop;
int vif_index; int vif_index;
ifindex_t ifindex; ifindex_t ifindex;
char addr_str[PREFIX_STRLEN]; pim_addr src_addr;
if (PIM_DEBUG_PIM_NHT) if (PIM_DEBUG_PIM_NHT) {
pim_inet4_dump("<addr?>", src->u.prefix4, addr_str, src_addr = pim_addr_from_prefix(src);
sizeof(addr_str)); }
memset(&nhop, 0, sizeof(nhop)); memset(&nhop, 0, sizeof(nhop));
if (!pim_ecmp_nexthop_lookup(pim, &nhop, src, grp, 1)) { if (!pim_ecmp_nexthop_lookup(pim, &nhop, src, grp, 1)) {
if (PIM_DEBUG_PIM_NHT) if (PIM_DEBUG_PIM_NHT)
zlog_debug( zlog_debug(
"%s: could not find nexthop ifindex for address %s(%s)", "%s: could not find nexthop ifindex for address %pPA(%s)",
__func__, addr_str, pim->vrf->name); __func__, &src_addr, pim->vrf->name);
return -1; return -1;
} }
ifindex = nhop.interface->ifindex; ifindex = nhop.interface->ifindex;
if (PIM_DEBUG_PIM_NHT) if (PIM_DEBUG_PIM_NHT)
zlog_debug( zlog_debug(
"%s: found nexthop ifindex=%d (interface %s(%s)) for address %s", "%s: found nexthop ifindex=%d (interface %s(%s)) for address %pPA",
__func__, ifindex, __func__, ifindex,
ifindex2ifname(ifindex, pim->vrf->vrf_id), ifindex2ifname(ifindex, pim->vrf->vrf_id),
pim->vrf->name, addr_str); pim->vrf->name, &src_addr);
vif_index = pim_if_find_vifindex_by_ifindex(pim, ifindex); vif_index = pim_if_find_vifindex_by_ifindex(pim, ifindex);
if (vif_index < 0) { if (vif_index < 0) {
if (PIM_DEBUG_PIM_NHT) { if (PIM_DEBUG_PIM_NHT) {
zlog_debug( zlog_debug(
"%s: low vif_index=%d(%s) < 1 nexthop for address %s", "%s: low vif_index=%d(%s) < 1 nexthop for address %pPA",
__func__, vif_index, pim->vrf->name, addr_str); __func__, vif_index, pim->vrf->name, &src_addr);
} }
return -2; return -2;
} }

View File

@ -36,6 +36,7 @@
#include "pim_str.h" #include "pim_str.h"
#include "pim_oil.h" #include "pim_oil.h"
#include "pim_zlookup.h" #include "pim_zlookup.h"
#include "pim_addr.h"
static struct zclient *zlookup = NULL; static struct zclient *zlookup = NULL;
struct thread *zlookup_read; struct thread *zlookup_read;
@ -411,15 +412,11 @@ int zclient_lookup_nexthop(struct pim_instance *pim,
num_ifindex = zclient_lookup_nexthop_once(pim, nexthop_tab, num_ifindex = zclient_lookup_nexthop_once(pim, nexthop_tab,
tab_size, addr); tab_size, addr);
if (num_ifindex < 1) { if (num_ifindex < 1) {
if (PIM_DEBUG_PIM_NHT) { if (PIM_DEBUG_PIM_NHT)
char addr_str[INET_ADDRSTRLEN];
pim_inet4_dump("<addr?>", addr, addr_str,
sizeof(addr_str));
zlog_debug( zlog_debug(
"%s: lookup=%d/%d: could not find nexthop ifindex for address %s(%s)", "%s: lookup=%d/%d: could not find nexthop ifindex for address %pPA(%s)",
__func__, lookup, max_lookup, addr_str, __func__, lookup, max_lookup, &addr,
pim->vrf->name); pim->vrf->name);
}
return -1; return -1;
} }
@ -448,23 +445,19 @@ int zclient_lookup_nexthop(struct pim_instance *pim,
if (lookup > 0) { if (lookup > 0) {
/* Report non-recursive success after first /* Report non-recursive success after first
* lookup */ * lookup */
if (PIM_DEBUG_PIM_NHT) { if (PIM_DEBUG_PIM_NHT)
char addr_str[INET_ADDRSTRLEN];
pim_inet4_dump("<addr?>", addr,
addr_str,
sizeof(addr_str));
zlog_debug( zlog_debug(
"%s: lookup=%d/%d: found non-recursive ifindex=%d for address %s(%s) dist=%d met=%d", "%s: lookup=%d/%d: found non-recursive ifindex=%d for address %pPA(%s) dist=%d met=%d",
__func__, lookup, max_lookup, __func__, lookup, max_lookup,
first_ifindex, addr_str, first_ifindex, &addr,
pim->vrf->name, pim->vrf->name,
nexthop_tab[0] nexthop_tab[0]
.protocol_distance, .protocol_distance,
nexthop_tab[0].route_metric); nexthop_tab[0].route_metric);
}
/* use last address as nexthop address */ /* use last address as nexthop address */
nexthop_tab[0].nexthop_addr.u.prefix4 = addr; pim_addr_to_prefix(
&(nexthop_tab[0].nexthop_addr), addr);
/* report original route metric/distance */ /* report original route metric/distance */
nexthop_tab[0].route_metric = route_metric; nexthop_tab[0].route_metric = route_metric;
@ -483,25 +476,22 @@ int zclient_lookup_nexthop(struct pim_instance *pim,
pim_addr_dump("<nexthop?>", &nexthop_addr, nexthop_str, pim_addr_dump("<nexthop?>", &nexthop_addr, nexthop_str,
sizeof(nexthop_str)); sizeof(nexthop_str));
zlog_debug( zlog_debug(
"%s: lookup=%d/%d: zebra returned recursive nexthop %s for address %s(%s) dist=%d met=%d", "%s: lookup=%d/%d: zebra returned recursive nexthop %s for address %pPA(%s) dist=%d met=%d",
__func__, lookup, max_lookup, nexthop_str, __func__, lookup, max_lookup, nexthop_str,
addr_str, pim->vrf->name, &addr, pim->vrf->name,
nexthop_tab[0].protocol_distance, nexthop_tab[0].protocol_distance,
nexthop_tab[0].route_metric); nexthop_tab[0].route_metric);
} }
addr = nexthop_addr.u.prefix4; /* use nexthop addr for addr = pim_addr_from_prefix(&(nexthop_addr)); /* use nexthop
recursive lookup */ addr for recursive lookup */
} /* for (max_lookup) */ } /* for (max_lookup) */
if (PIM_DEBUG_PIM_NHT) { if (PIM_DEBUG_PIM_NHT)
char addr_str[INET_ADDRSTRLEN];
pim_inet4_dump("<addr?>", addr, addr_str, sizeof(addr_str));
zlog_warn( zlog_warn(
"%s: lookup=%d/%d: failure searching recursive nexthop ifindex for address %s(%s)", "%s: lookup=%d/%d: failure searching recursive nexthop ifindex for address %pPA(%s)",
__func__, lookup, max_lookup, addr_str, pim->vrf->name); __func__, lookup, max_lookup, &addr, pim->vrf->name);
}
return -2; return -2;
} }