mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-11 16:39:33 +00:00
Merge pull request #10712 from patrasar/pim_nexthop_prefix_to_pimaddr
This commit is contained in:
commit
d1b7dfbe08
@ -1541,7 +1541,6 @@ DEFPY (show_ipv6_pim_nexthop_lookup,
|
||||
pim_addr vif_source;
|
||||
struct prefix grp;
|
||||
struct pim_nexthop nexthop;
|
||||
char nexthop_addr_str[PIM_ADDRSTRLEN];
|
||||
struct vrf *v;
|
||||
|
||||
v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
|
||||
@ -1564,10 +1563,8 @@ DEFPY (show_ipv6_pim_nexthop_lookup,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
pim_addr_dump("<nexthop?>", &nexthop.mrib_nexthop_addr,
|
||||
nexthop_addr_str, sizeof(nexthop_addr_str));
|
||||
vty_out(vty, "Group %s --- Nexthop %s Interface %s\n", group_str,
|
||||
nexthop_addr_str, nexthop.interface->name);
|
||||
vty_out(vty, "Group %s --- Nexthop %pPAs Interface %s\n", group_str,
|
||||
&nexthop.mrib_nexthop_addr, nexthop.interface->name);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
@ -3525,7 +3525,6 @@ DEFPY (show_ip_pim_nexthop_lookup,
|
||||
pim_addr vif_source;
|
||||
struct prefix grp;
|
||||
struct pim_nexthop nexthop;
|
||||
char nexthop_addr_str[PREFIX_STRLEN];
|
||||
struct vrf *v;
|
||||
|
||||
v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
|
||||
@ -3560,10 +3559,8 @@ DEFPY (show_ip_pim_nexthop_lookup,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
pim_addr_dump("<nexthop?>", &nexthop.mrib_nexthop_addr,
|
||||
nexthop_addr_str, sizeof(nexthop_addr_str));
|
||||
vty_out(vty, "Group %s --- Nexthop %s Interface %s \n", group_str,
|
||||
nexthop_addr_str, nexthop.interface->name);
|
||||
vty_out(vty, "Group %s --- Nexthop %pPAs Interface %s \n", group_str,
|
||||
&nexthop.mrib_nexthop_addr, nexthop.interface->name);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
@ -4680,7 +4677,6 @@ DEFUN (show_ip_rib,
|
||||
struct in_addr addr;
|
||||
const char *addr_str;
|
||||
struct pim_nexthop nexthop;
|
||||
char nexthop_addr_str[PREFIX_STRLEN];
|
||||
int result;
|
||||
|
||||
if (!vrf)
|
||||
@ -4706,10 +4702,8 @@ DEFUN (show_ip_rib,
|
||||
vty_out(vty,
|
||||
"Address NextHop Interface Metric Preference\n");
|
||||
|
||||
pim_addr_dump("<nexthop?>", &nexthop.mrib_nexthop_addr,
|
||||
nexthop_addr_str, sizeof(nexthop_addr_str));
|
||||
|
||||
vty_out(vty, "%-15s %-15s %-9s %6d %10d\n", addr_str, nexthop_addr_str,
|
||||
vty_out(vty, "%-15s %-15pPAs %-9s %6d %10d\n", addr_str,
|
||||
&nexthop.mrib_nexthop_addr,
|
||||
nexthop.interface ? nexthop.interface->name : "<ifname?>",
|
||||
nexthop.mrib_route_metric, nexthop.mrib_metric_preference);
|
||||
|
||||
|
@ -882,15 +882,11 @@ void pim_show_rpf(struct pim_instance *pim, struct vty *vty, json_object *json)
|
||||
|
||||
frr_each (rb_pim_upstream, &pim->upstream_head, up) {
|
||||
char rpf_addr_str[PREFIX_STRLEN];
|
||||
char rib_nexthop_str[PREFIX_STRLEN];
|
||||
const char *rpf_ifname;
|
||||
struct pim_rpf *rpf = &up->rpf;
|
||||
|
||||
pim_addr_dump("<rpf?>", &rpf->rpf_addr, rpf_addr_str,
|
||||
sizeof(rpf_addr_str));
|
||||
pim_addr_dump("<nexthop?>",
|
||||
&rpf->source_nexthop.mrib_nexthop_addr,
|
||||
rib_nexthop_str, sizeof(rib_nexthop_str));
|
||||
|
||||
rpf_ifname =
|
||||
rpf->source_nexthop.interface ? rpf->source_nexthop
|
||||
@ -921,8 +917,9 @@ void pim_show_rpf(struct pim_instance *pim, struct vty *vty, json_object *json)
|
||||
rpf_ifname);
|
||||
json_object_string_add(json_row, "rpfAddress",
|
||||
rpf_addr_str);
|
||||
json_object_string_add(json_row, "ribNexthop",
|
||||
rib_nexthop_str);
|
||||
json_object_string_addf(
|
||||
json_row, "ribNexthop", "%pPAs",
|
||||
&rpf->source_nexthop.mrib_nexthop_addr);
|
||||
json_object_int_add(
|
||||
json_row, "routeMetric",
|
||||
rpf->source_nexthop.mrib_route_metric);
|
||||
@ -933,9 +930,10 @@ void pim_show_rpf(struct pim_instance *pim, struct vty *vty, json_object *json)
|
||||
|
||||
} else {
|
||||
vty_out(vty,
|
||||
"%-15pPAs %-15pPAs %-16s %-15s %-15s %6d %4d\n",
|
||||
"%-15pPAs %-15pPAs %-16s %-15s %-15pPAs %6d %4d\n",
|
||||
&up->sg.src, &up->sg.grp, rpf_ifname,
|
||||
rpf_addr_str, rib_nexthop_str,
|
||||
rpf_addr_str,
|
||||
&rpf->source_nexthop.mrib_nexthop_addr,
|
||||
rpf->source_nexthop.mrib_route_metric,
|
||||
rpf->source_nexthop.mrib_metric_preference);
|
||||
}
|
||||
@ -1519,16 +1517,12 @@ void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, bool uj)
|
||||
"Source Group RpfIface RibNextHop RpfAddress \n");
|
||||
|
||||
frr_each (rb_pim_upstream, &pim->upstream_head, up) {
|
||||
char rpf_nexthop_str[PREFIX_STRLEN];
|
||||
char rpf_addr_str[PREFIX_STRLEN];
|
||||
struct pim_rpf *rpf;
|
||||
const char *rpf_ifname;
|
||||
|
||||
rpf = &up->rpf;
|
||||
|
||||
pim_addr_dump("<nexthop?>",
|
||||
&rpf->source_nexthop.mrib_nexthop_addr,
|
||||
rpf_nexthop_str, sizeof(rpf_nexthop_str));
|
||||
pim_addr_dump("<rpf?>", &rpf->rpf_addr, rpf_addr_str,
|
||||
sizeof(rpf_addr_str));
|
||||
|
||||
@ -1559,15 +1553,17 @@ void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, bool uj)
|
||||
json_object_string_add(json_row, "group", grp_str);
|
||||
json_object_string_add(json_row, "rpfInterface",
|
||||
rpf_ifname);
|
||||
json_object_string_add(json_row, "ribNexthop",
|
||||
rpf_nexthop_str);
|
||||
json_object_string_addf(
|
||||
json_row, "ribNexthop", "%pPAs",
|
||||
&rpf->source_nexthop.mrib_nexthop_addr);
|
||||
json_object_string_add(json_row, "rpfAddress",
|
||||
rpf_addr_str);
|
||||
json_object_object_add(json_group, src_str, json_row);
|
||||
} else {
|
||||
vty_out(vty, "%-15pPAs %-15pPAs %-16s %-15s %-15s\n",
|
||||
vty_out(vty, "%-15pPAs %-15pPAs %-16s %-15pPA %-15s\n",
|
||||
&up->sg.src, &up->sg.grp, rpf_ifname,
|
||||
rpf_nexthop_str, rpf_addr_str);
|
||||
&rpf->source_nexthop.mrib_nexthop_addr,
|
||||
rpf_addr_str);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -81,11 +81,9 @@ static bool mtrace_fwd_info_weak(struct pim_instance *pim,
|
||||
zlog_debug("mtrace pim_nexthop_lookup OK");
|
||||
|
||||
if (PIM_DEBUG_MTRACE)
|
||||
zlog_debug("mtrace next_hop=%pI4",
|
||||
&nexthop.mrib_nexthop_addr.u.prefix4);
|
||||
zlog_debug("mtrace next_hop=%pPAs", &nexthop.mrib_nexthop_addr);
|
||||
|
||||
if (nexthop.mrib_nexthop_addr.family == AF_INET)
|
||||
nh_addr = nexthop.mrib_nexthop_addr.u.prefix4;
|
||||
nh_addr = nexthop.mrib_nexthop_addr;
|
||||
|
||||
ifp_in = nexthop.interface;
|
||||
|
||||
@ -134,7 +132,7 @@ static bool mtrace_fwd_info(struct pim_instance *pim,
|
||||
}
|
||||
|
||||
ifp_in = up->rpf.source_nexthop.interface;
|
||||
nh_addr = up->rpf.source_nexthop.mrib_nexthop_addr.u.prefix4;
|
||||
nh_addr = up->rpf.source_nexthop.mrib_nexthop_addr;
|
||||
total = htonl(MTRACE_UNKNOWN_COUNT);
|
||||
|
||||
if (PIM_DEBUG_MTRACE)
|
||||
|
@ -709,8 +709,8 @@ bool pim_msdp_peer_rpf_check(struct pim_msdp_peer *mp, struct in_addr rp)
|
||||
}
|
||||
|
||||
/* check if the MSDP peer is the nexthop for the RP */
|
||||
if (pim_nexthop_lookup(mp->pim, &nexthop, rp, 0)
|
||||
&& nexthop.mrib_nexthop_addr.u.prefix4.s_addr == mp->peer.s_addr) {
|
||||
if (pim_nexthop_lookup(mp->pim, &nexthop, rp, 0) &&
|
||||
nexthop.mrib_nexthop_addr.s_addr == mp->peer.s_addr) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -331,13 +331,12 @@ bool pim_nht_bsr_rpf_check(struct pim_instance *pim, struct in_addr bsr_addr,
|
||||
if (if_is_loopback(ifp) && if_is_loopback(src_ifp))
|
||||
return true;
|
||||
|
||||
nbr = pim_neighbor_find_prefix(ifp, &znh->nexthop_addr);
|
||||
nbr = pim_neighbor_find(ifp, znh->nexthop_addr);
|
||||
if (!nbr)
|
||||
continue;
|
||||
|
||||
return znh->ifindex == src_ifp->ifindex
|
||||
&& znh->nexthop_addr.u.prefix4.s_addr
|
||||
== src_ip.s_addr;
|
||||
return znh->ifindex == src_ifp->ifindex &&
|
||||
(!pim_addr_cmp(znh->nexthop_addr, src_ip));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -406,8 +405,7 @@ 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)
|
||||
{
|
||||
rp_info->rp.source_nexthop.interface = NULL;
|
||||
pim_addr_to_prefix(&rp_info->rp.source_nexthop.mrib_nexthop_addr,
|
||||
PIMADDR_ANY);
|
||||
rp_info->rp.source_nexthop.mrib_nexthop_addr = PIMADDR_ANY;
|
||||
rp_info->rp.source_nexthop.mrib_metric_preference =
|
||||
router->infinite_assert_metric.metric_preference;
|
||||
rp_info->rp.source_nexthop.mrib_route_metric =
|
||||
@ -510,7 +508,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,
|
||||
uint32_t hash_val = 0, mod_val = 0;
|
||||
uint8_t nh_iter = 0, found = 0;
|
||||
uint32_t i, num_nbrs = 0;
|
||||
pim_addr nh_addr = pim_addr_from_prefix(&(nexthop->mrib_nexthop_addr));
|
||||
pim_addr nh_addr = nexthop->mrib_nexthop_addr;
|
||||
pim_addr src_addr = pim_addr_from_prefix(src);
|
||||
pim_addr grp_addr = pim_addr_from_prefix(grp);
|
||||
|
||||
@ -546,9 +544,9 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,
|
||||
if (curr_route_valid &&
|
||||
!pim_if_connected_to_source(nexthop->interface,
|
||||
src_addr)) {
|
||||
nbr = pim_neighbor_find_prefix(
|
||||
nbr = pim_neighbor_find(
|
||||
nexthop->interface,
|
||||
&nexthop->mrib_nexthop_addr);
|
||||
nexthop->mrib_nexthop_addr);
|
||||
if (!nbr
|
||||
&& !if_is_loopback(nexthop->interface)) {
|
||||
if (PIM_DEBUG_PIM_NHT)
|
||||
@ -655,14 +653,10 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,
|
||||
|
||||
if (nh_iter == mod_val) {
|
||||
nexthop->interface = ifp;
|
||||
nexthop->mrib_nexthop_addr.family = PIM_AF;
|
||||
nexthop->mrib_nexthop_addr.prefixlen = PIM_MAX_BITLEN;
|
||||
#if PIM_IPV == 4
|
||||
nexthop->mrib_nexthop_addr.u.prefix4 =
|
||||
nh_node->gate.ipv4;
|
||||
nexthop->mrib_nexthop_addr = nh_node->gate.ipv4;
|
||||
#else
|
||||
nexthop->mrib_nexthop_addr.u.prefix6 =
|
||||
nh_node->gate.ipv6;
|
||||
nexthop->mrib_nexthop_addr = nh_node->gate.ipv6;
|
||||
#endif
|
||||
nexthop->mrib_metric_preference = pnc->distance;
|
||||
nexthop->mrib_route_metric = pnc->metric;
|
||||
@ -942,8 +936,8 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
|
||||
ifps[i] = if_lookup_by_index(nexthop_tab[i].ifindex,
|
||||
pim->vrf->vrf_id);
|
||||
if (ifps[i]) {
|
||||
nbrs[i] = pim_neighbor_find_prefix(
|
||||
ifps[i], &nexthop_tab[i].nexthop_addr);
|
||||
nbrs[i] = pim_neighbor_find(
|
||||
ifps[i], nexthop_tab[i].nexthop_addr);
|
||||
if (nbrs[i] ||
|
||||
pim_if_connected_to_source(ifps[i], src_addr))
|
||||
num_nbrs++;
|
||||
@ -1006,7 +1000,7 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
|
||||
mod_val++;
|
||||
if (PIM_DEBUG_PIM_NHT)
|
||||
zlog_debug(
|
||||
"%s: NBR (%pFXh) not found on input interface %s(%s) (RPF for source %pPA)",
|
||||
"%s: NBR (%pPA) not found on input interface %s(%s) (RPF for source %pPA)",
|
||||
__func__,
|
||||
&nexthop_tab[i].nexthop_addr,
|
||||
ifp->name, pim->vrf->name,
|
||||
@ -1017,19 +1011,13 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
|
||||
}
|
||||
|
||||
if (i == mod_val) {
|
||||
if (PIM_DEBUG_PIM_NHT) {
|
||||
char nexthop_str[PREFIX_STRLEN];
|
||||
|
||||
pim_addr_dump("<nexthop?>",
|
||||
&nexthop_tab[i].nexthop_addr,
|
||||
nexthop_str, sizeof(nexthop_str));
|
||||
if (PIM_DEBUG_PIM_NHT)
|
||||
zlog_debug(
|
||||
"%s: found nhop %s for addr %pPA interface %s(%s) metric %d dist %d",
|
||||
__func__, nexthop_str, &src_addr,
|
||||
ifp->name, pim->vrf->name,
|
||||
"%s: found nhop %pPA for addr %pPA interface %s(%s) metric %d dist %d",
|
||||
__func__, &nexthop_tab[i].nexthop_addr,
|
||||
&src_addr, ifp->name, pim->vrf->name,
|
||||
nexthop_tab[i].route_metric,
|
||||
nexthop_tab[i].protocol_distance);
|
||||
}
|
||||
/* update nexthop data */
|
||||
nexthop->interface = ifp;
|
||||
nexthop->mrib_nexthop_addr =
|
||||
|
@ -76,7 +76,7 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
|
||||
if (PIM_DEBUG_PIM_NHT)
|
||||
zlog_debug(
|
||||
"%s: Using last lookup for %pPAs at %lld, %" PRId64
|
||||
" addr %pFX",
|
||||
" addr %pPAs",
|
||||
__func__, &addr, nexthop->last_lookup_time,
|
||||
pim->last_route_change_time,
|
||||
&nexthop->mrib_nexthop_addr);
|
||||
@ -124,8 +124,8 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
|
||||
i++;
|
||||
} else if (neighbor_needed
|
||||
&& !pim_if_connected_to_source(ifp, addr)) {
|
||||
nbr = pim_neighbor_find_prefix(
|
||||
ifp, &nexthop_tab[i].nexthop_addr);
|
||||
nbr = pim_neighbor_find(ifp,
|
||||
nexthop_tab[i].nexthop_addr);
|
||||
if (PIM_DEBUG_PIM_TRACE_DETAIL)
|
||||
zlog_debug("ifp name: %s, pim nbr: %p",
|
||||
ifp->name, nbr);
|
||||
@ -140,11 +140,12 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
|
||||
if (found) {
|
||||
if (PIM_DEBUG_ZEBRA)
|
||||
zlog_debug(
|
||||
"%s %s: found nexthop %pFX for address %pPAs: interface %s ifindex=%d metric=%d pref=%d",
|
||||
"%s %s: found nexthop %pPAs for address %pPAs: interface %s ifindex=%d metric=%d pref=%d",
|
||||
__FILE__, __func__,
|
||||
&nexthop_tab[i].nexthop_addr, &addr, ifp->name,
|
||||
first_ifindex, nexthop_tab[i].route_metric,
|
||||
nexthop_tab[i].protocol_distance);
|
||||
|
||||
/* update nexthop data */
|
||||
nexthop->interface = ifp;
|
||||
nexthop->mrib_nexthop_addr = nexthop_tab[i].nexthop_addr;
|
||||
@ -162,11 +163,8 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
|
||||
static int nexthop_mismatch(const struct pim_nexthop *nh1,
|
||||
const struct pim_nexthop *nh2)
|
||||
{
|
||||
pim_addr nh_addr1 = pim_addr_from_prefix(&nh1->mrib_nexthop_addr);
|
||||
pim_addr nh_addr2 = pim_addr_from_prefix(&nh2->mrib_nexthop_addr);
|
||||
|
||||
return (nh1->interface != nh2->interface) ||
|
||||
(pim_addr_cmp(nh_addr1, nh_addr2)) ||
|
||||
(pim_addr_cmp(nh1->mrib_nexthop_addr, nh2->mrib_nexthop_addr)) ||
|
||||
(nh1->mrib_metric_preference != nh2->mrib_metric_preference) ||
|
||||
(nh1->mrib_route_metric != nh2->mrib_route_metric);
|
||||
}
|
||||
@ -257,7 +255,7 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
|
||||
if (nexthop_mismatch(&rpf->source_nexthop, &saved.source_nexthop)) {
|
||||
|
||||
if (PIM_DEBUG_ZEBRA)
|
||||
zlog_debug("%s(%s): (S,G)=%s source nexthop now is: interface=%s address=%pFX pref=%d metric=%d",
|
||||
zlog_debug("%s(%s): (S,G)=%s source nexthop now is: interface=%s address=%pPAs pref=%d metric=%d",
|
||||
__func__, caller,
|
||||
up->sg_str,
|
||||
rpf->source_nexthop.interface ? rpf->source_nexthop.interface->name : "<ifname?>",
|
||||
@ -316,8 +314,7 @@ void pim_upstream_rpf_clear(struct pim_instance *pim,
|
||||
if (up->rpf.source_nexthop.interface) {
|
||||
pim_upstream_switch(pim, up, PIM_UPSTREAM_NOTJOINED);
|
||||
up->rpf.source_nexthop.interface = NULL;
|
||||
pim_addr_to_prefix(&up->rpf.source_nexthop.mrib_nexthop_addr,
|
||||
PIMADDR_ANY);
|
||||
up->rpf.source_nexthop.mrib_nexthop_addr = PIMADDR_ANY;
|
||||
up->rpf.source_nexthop.mrib_metric_preference =
|
||||
router->infinite_assert_metric.metric_preference;
|
||||
up->rpf.source_nexthop.mrib_route_metric =
|
||||
@ -364,11 +361,8 @@ static pim_addr pim_rpf_find_rpf_addr(struct pim_upstream *up)
|
||||
|
||||
/* return NBR( RPF_interface(S), MRIB.next_hop( S ) ) */
|
||||
|
||||
pim_addr nhaddr;
|
||||
|
||||
nhaddr =
|
||||
pim_addr_from_prefix(&up->rpf.source_nexthop.mrib_nexthop_addr);
|
||||
neigh = pim_if_find_neighbor(up->rpf.source_nexthop.interface, nhaddr);
|
||||
neigh = pim_if_find_neighbor(up->rpf.source_nexthop.interface,
|
||||
up->rpf.source_nexthop.mrib_nexthop_addr);
|
||||
if (neigh)
|
||||
rpf_addr = neigh->source_addr;
|
||||
else
|
||||
|
@ -39,7 +39,7 @@ struct pim_nexthop {
|
||||
pim_addr last_lookup;
|
||||
long long last_lookup_time;
|
||||
struct interface *interface; /* RPF_interface(S) */
|
||||
struct prefix mrib_nexthop_addr; /* MRIB.next_hop(S) */
|
||||
pim_addr mrib_nexthop_addr; /* MRIB.next_hop(S) */
|
||||
uint32_t mrib_metric_preference; /* MRIB.pref(S) */
|
||||
uint32_t mrib_route_metric; /* MRIB.metric(S) */
|
||||
struct pim_neighbor *nbr;
|
||||
|
@ -838,8 +838,7 @@ void pim_upstream_fill_static_iif(struct pim_upstream *up,
|
||||
up->rpf.source_nexthop.interface = incoming;
|
||||
|
||||
/* reset other parameters to matched a connected incoming interface */
|
||||
pim_addr_to_prefix(&up->rpf.source_nexthop.mrib_nexthop_addr,
|
||||
PIMADDR_ANY);
|
||||
up->rpf.source_nexthop.mrib_nexthop_addr = PIMADDR_ANY;
|
||||
up->rpf.source_nexthop.mrib_metric_preference =
|
||||
ZEBRA_CONNECT_DISTANCE_DEFAULT;
|
||||
up->rpf.source_nexthop.mrib_route_metric = 0;
|
||||
@ -899,8 +898,7 @@ static struct pim_upstream *pim_upstream_new(struct pim_instance *pim,
|
||||
up->sptbit = PIM_UPSTREAM_SPTBIT_FALSE;
|
||||
|
||||
up->rpf.source_nexthop.interface = NULL;
|
||||
pim_addr_to_prefix(&up->rpf.source_nexthop.mrib_nexthop_addr,
|
||||
PIMADDR_ANY);
|
||||
up->rpf.source_nexthop.mrib_nexthop_addr = PIMADDR_ANY;
|
||||
up->rpf.source_nexthop.mrib_metric_preference =
|
||||
router->infinite_assert_metric.metric_preference;
|
||||
up->rpf.source_nexthop.mrib_route_metric =
|
||||
|
@ -156,7 +156,7 @@ void zclient_lookup_new(void)
|
||||
static int zclient_read_nexthop(struct pim_instance *pim,
|
||||
struct zclient *zlookup,
|
||||
struct pim_zlookup_nexthop nexthop_tab[],
|
||||
const int tab_size, struct in_addr addr)
|
||||
const int tab_size, pim_addr addr)
|
||||
{
|
||||
int num_ifindex = 0;
|
||||
struct stream *s;
|
||||
@ -165,19 +165,15 @@ static int zclient_read_nexthop(struct pim_instance *pim,
|
||||
uint8_t version;
|
||||
vrf_id_t vrf_id;
|
||||
uint16_t command = 0;
|
||||
struct in_addr raddr;
|
||||
pim_addr raddr;
|
||||
uint8_t distance;
|
||||
uint32_t metric;
|
||||
int nexthop_num;
|
||||
int i, err;
|
||||
|
||||
if (PIM_DEBUG_PIM_NHT_DETAIL) {
|
||||
char addr_str[INET_ADDRSTRLEN];
|
||||
|
||||
pim_inet4_dump("<addr?>", addr, addr_str, sizeof(addr_str));
|
||||
zlog_debug("%s: addr=%s(%s)", __func__, addr_str,
|
||||
if (PIM_DEBUG_PIM_NHT_DETAIL)
|
||||
zlog_debug("%s: addr=%pPAs(%s)", __func__, &addr,
|
||||
pim->vrf->name);
|
||||
}
|
||||
|
||||
s = zlookup->ibuf;
|
||||
|
||||
@ -201,17 +197,15 @@ static int zclient_read_nexthop(struct pim_instance *pim,
|
||||
}
|
||||
}
|
||||
|
||||
#if PIM_IPV == 4
|
||||
raddr.s_addr = stream_get_ipv4(s);
|
||||
|
||||
if (raddr.s_addr != addr.s_addr) {
|
||||
char addr_str[INET_ADDRSTRLEN];
|
||||
char raddr_str[INET_ADDRSTRLEN];
|
||||
pim_inet4_dump("<addr?>", addr, addr_str, sizeof(addr_str));
|
||||
pim_inet4_dump("<raddr?>", raddr, raddr_str, sizeof(raddr_str));
|
||||
zlog_warn("%s: address mismatch: addr=%s(%s) raddr=%s",
|
||||
__func__, addr_str, pim->vrf->name, raddr_str);
|
||||
/* warning only */
|
||||
}
|
||||
#else
|
||||
stream_get(&raddr, s, sizeof(struct in6_addr));
|
||||
#endif
|
||||
if (pim_addr_cmp(raddr, addr))
|
||||
zlog_warn("%s: address mismatch: addr=%pPAs(%s) raddr=%pPAs",
|
||||
__func__, &addr, pim->vrf->name, &raddr);
|
||||
/* warning only */
|
||||
|
||||
distance = stream_getc(s);
|
||||
metric = stream_getl(s);
|
||||
@ -233,12 +227,9 @@ static int zclient_read_nexthop(struct pim_instance *pim,
|
||||
nexthop_vrf_id = stream_getl(s);
|
||||
nexthop_type = stream_getc(s);
|
||||
if (num_ifindex >= tab_size) {
|
||||
char addr_str[INET_ADDRSTRLEN];
|
||||
pim_inet4_dump("<addr?>", addr, addr_str,
|
||||
sizeof(addr_str));
|
||||
zlog_warn(
|
||||
"%s: found too many nexthop ifindexes (%d > %d) for address %s(%s)",
|
||||
__func__, (num_ifindex + 1), tab_size, addr_str,
|
||||
"%s: found too many nexthop ifindexes (%d > %d) for address %pPAs(%s)",
|
||||
__func__, (num_ifindex + 1), tab_size, &addr,
|
||||
pim->vrf->name);
|
||||
return num_ifindex;
|
||||
}
|
||||
@ -254,32 +245,25 @@ static int zclient_read_nexthop(struct pim_instance *pim,
|
||||
* allow us to work in cases where we are
|
||||
* trying to find a route for this box.
|
||||
*/
|
||||
nexthop_tab[num_ifindex].nexthop_addr.family = AF_INET;
|
||||
nexthop_tab[num_ifindex].nexthop_addr.prefixlen =
|
||||
IPV4_MAX_BITLEN;
|
||||
nexthop_tab[num_ifindex].nexthop_addr.u.prefix4 =
|
||||
addr;
|
||||
nexthop_tab[num_ifindex].nexthop_addr = addr;
|
||||
++num_ifindex;
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
||||
case NEXTHOP_TYPE_IPV4:
|
||||
nexthop_tab[num_ifindex].nexthop_addr.family = AF_INET;
|
||||
nexthop_tab[num_ifindex].nexthop_addr.u.prefix4.s_addr =
|
||||
nexthop_tab[num_ifindex].nexthop_addr.s_addr =
|
||||
stream_get_ipv4(s);
|
||||
nexthop_tab[num_ifindex].ifindex = stream_getl(s);
|
||||
++num_ifindex;
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
||||
nexthop_tab[num_ifindex].nexthop_addr.family = AF_INET6;
|
||||
stream_get(&nexthop_tab[num_ifindex]
|
||||
.nexthop_addr.u.prefix6,
|
||||
s, sizeof(struct in6_addr));
|
||||
stream_get(&nexthop_tab[num_ifindex].nexthop_addr, s,
|
||||
sizeof(struct in6_addr));
|
||||
nexthop_tab[num_ifindex].ifindex = stream_getl(s);
|
||||
|
||||
p.family = AF_INET6;
|
||||
p.prefixlen = IPV6_MAX_BITLEN;
|
||||
memcpy(&p.u.prefix6,
|
||||
&nexthop_tab[num_ifindex].nexthop_addr.u.prefix6,
|
||||
&nexthop_tab[num_ifindex].nexthop_addr,
|
||||
sizeof(struct in6_addr));
|
||||
|
||||
/*
|
||||
@ -298,23 +282,17 @@ static int zclient_read_nexthop(struct pim_instance *pim,
|
||||
nbr = pim_neighbor_find_if(ifp);
|
||||
|
||||
if (nbr) {
|
||||
nexthop_tab[num_ifindex].nexthop_addr.family =
|
||||
AF_INET;
|
||||
pim_addr_to_prefix(
|
||||
&nexthop_tab[num_ifindex].nexthop_addr,
|
||||
nbr->source_addr);
|
||||
nexthop_tab[num_ifindex].nexthop_addr =
|
||||
nbr->source_addr;
|
||||
}
|
||||
++num_ifindex;
|
||||
break;
|
||||
default:
|
||||
/* do nothing */
|
||||
{
|
||||
char addr_str[INET_ADDRSTRLEN];
|
||||
pim_inet4_dump("<addr?>", addr, addr_str,
|
||||
sizeof(addr_str));
|
||||
zlog_warn(
|
||||
"%s: found non-ifindex nexthop type=%d for address %s(%s)",
|
||||
__func__, nexthop_type, addr_str,
|
||||
"%s: found non-ifindex nexthop type=%d for address %pPAs(%s)",
|
||||
__func__, nexthop_type, &addr,
|
||||
pim->vrf->name);
|
||||
}
|
||||
break;
|
||||
@ -326,17 +304,14 @@ static int zclient_read_nexthop(struct pim_instance *pim,
|
||||
|
||||
static int zclient_lookup_nexthop_once(struct pim_instance *pim,
|
||||
struct pim_zlookup_nexthop nexthop_tab[],
|
||||
const int tab_size, struct in_addr addr)
|
||||
const int tab_size, pim_addr addr)
|
||||
{
|
||||
struct stream *s;
|
||||
int ret;
|
||||
|
||||
if (PIM_DEBUG_PIM_NHT_DETAIL) {
|
||||
char addr_str[INET_ADDRSTRLEN];
|
||||
pim_inet4_dump("<addr?>", addr, addr_str, sizeof(addr_str));
|
||||
zlog_debug("%s: addr=%s(%s)", __func__, addr_str,
|
||||
if (PIM_DEBUG_PIM_NHT_DETAIL)
|
||||
zlog_debug("%s: addr=%pPAs(%s)", __func__, &addr,
|
||||
pim->vrf->name);
|
||||
}
|
||||
|
||||
/* Check socket. */
|
||||
if (zlookup->sock < 0) {
|
||||
@ -358,7 +333,11 @@ static int zclient_lookup_nexthop_once(struct pim_instance *pim,
|
||||
stream_reset(s);
|
||||
zclient_create_header(s, ZEBRA_IPV4_NEXTHOP_LOOKUP_MRIB,
|
||||
pim->vrf->vrf_id);
|
||||
#if PIM_IPV == 4
|
||||
stream_put_in_addr(s, &addr);
|
||||
#else
|
||||
stream_write(s, (uint8_t *)&addr, 16);
|
||||
#endif
|
||||
stream_putw_at(s, 0, stream_get_endp(s));
|
||||
|
||||
ret = writen(zlookup->sock, s->data, stream_get_endp(s));
|
||||
@ -386,7 +365,7 @@ void zclient_lookup_read_pipe(struct thread *thread)
|
||||
struct zclient *zlookup = THREAD_ARG(thread);
|
||||
struct pim_instance *pim = pim_get_pim_instance(VRF_DEFAULT);
|
||||
struct pim_zlookup_nexthop nexthop_tab[10];
|
||||
struct in_addr l = {.s_addr = INADDR_ANY};
|
||||
pim_addr l = PIMADDR_ANY;
|
||||
|
||||
if (!pim) {
|
||||
if (PIM_DEBUG_PIM_NHT_DETAIL)
|
||||
@ -413,7 +392,7 @@ int zclient_lookup_nexthop(struct pim_instance *pim,
|
||||
for (lookup = 0; lookup < max_lookup; ++lookup) {
|
||||
int num_ifindex;
|
||||
int first_ifindex;
|
||||
struct prefix nexthop_addr;
|
||||
pim_addr nexthop_addr;
|
||||
|
||||
num_ifindex = zclient_lookup_nexthop_once(pim, nexthop_tab,
|
||||
tab_size, addr);
|
||||
@ -462,8 +441,7 @@ int zclient_lookup_nexthop(struct pim_instance *pim,
|
||||
nexthop_tab[0].route_metric);
|
||||
|
||||
/* use last address as nexthop address */
|
||||
pim_addr_to_prefix(
|
||||
&(nexthop_tab[0].nexthop_addr), addr);
|
||||
nexthop_tab[0].nexthop_addr = addr;
|
||||
|
||||
/* report original route metric/distance */
|
||||
nexthop_tab[0].route_metric = route_metric;
|
||||
@ -474,23 +452,16 @@ int zclient_lookup_nexthop(struct pim_instance *pim,
|
||||
return num_ifindex;
|
||||
}
|
||||
|
||||
if (PIM_DEBUG_PIM_NHT) {
|
||||
char addr_str[INET_ADDRSTRLEN];
|
||||
char nexthop_str[PREFIX_STRLEN];
|
||||
pim_inet4_dump("<addr?>", addr, addr_str,
|
||||
sizeof(addr_str));
|
||||
pim_addr_dump("<nexthop?>", &nexthop_addr, nexthop_str,
|
||||
sizeof(nexthop_str));
|
||||
if (PIM_DEBUG_PIM_NHT)
|
||||
zlog_debug(
|
||||
"%s: lookup=%d/%d: zebra returned recursive nexthop %s for address %pPA(%s) dist=%d met=%d",
|
||||
__func__, lookup, max_lookup, nexthop_str,
|
||||
"%s: lookup=%d/%d: zebra returned recursive nexthop %pPAs for address %pPA(%s) dist=%d met=%d",
|
||||
__func__, lookup, max_lookup, &nexthop_addr,
|
||||
&addr, pim->vrf->name,
|
||||
nexthop_tab[0].protocol_distance,
|
||||
nexthop_tab[0].route_metric);
|
||||
}
|
||||
|
||||
addr = pim_addr_from_prefix(&(nexthop_addr)); /* use nexthop
|
||||
addr for recursive lookup */
|
||||
addr = nexthop_addr; /* use nexthop
|
||||
addr for recursive lookup */
|
||||
|
||||
} /* for (max_lookup) */
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
|
||||
struct pim_zlookup_nexthop {
|
||||
vrf_id_t vrf_id;
|
||||
struct prefix nexthop_addr;
|
||||
pim_addr nexthop_addr;
|
||||
ifindex_t ifindex;
|
||||
uint32_t route_metric;
|
||||
uint8_t protocol_distance;
|
||||
|
Loading…
Reference in New Issue
Block a user