diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c index b86975949b..f0ea4a03a1 100644 --- a/pimd/pim6_cmd.c +++ b/pimd/pim6_cmd.c @@ -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.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; } diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index ba39593603..2deb6e0952 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -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.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.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 : "", nexthop.mrib_route_metric, nexthop.mrib_metric_preference); diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c index f7cd0dceab..dfba369e5b 100644 --- a/pimd/pim_cmd_common.c +++ b/pimd/pim_cmd_common.c @@ -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_addr, rpf_addr_str, sizeof(rpf_addr_str)); - pim_addr_dump("", - &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("", - &rpf->source_nexthop.mrib_nexthop_addr, - rpf_nexthop_str, sizeof(rpf_nexthop_str)); pim_addr_dump("", &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); } } diff --git a/pimd/pim_igmp_mtrace.c b/pimd/pim_igmp_mtrace.c index 11bb2db7eb..9148d1050a 100644 --- a/pimd/pim_igmp_mtrace.c +++ b/pimd/pim_igmp_mtrace.c @@ -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) diff --git a/pimd/pim_msdp.c b/pimd/pim_msdp.c index 7c1c80f71a..10e515cb56 100644 --- a/pimd/pim_msdp.c +++ b/pimd/pim_msdp.c @@ -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; } diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index 106bce61db..eec763a4ff 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -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_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 = diff --git a/pimd/pim_rpf.c b/pimd/pim_rpf.c index cee542aa13..4e812ae3f0 100644 --- a/pimd/pim_rpf.c +++ b/pimd/pim_rpf.c @@ -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 : "", @@ -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 diff --git a/pimd/pim_rpf.h b/pimd/pim_rpf.h index 74aca43d54..40cd066bd1 100644 --- a/pimd/pim_rpf.h +++ b/pimd/pim_rpf.h @@ -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; diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 2b5b4bcf53..3817d5d9e1 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -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 = diff --git a/pimd/pim_zlookup.c b/pimd/pim_zlookup.c index 5d99f131a8..c3f0b44431 100644 --- a/pimd/pim_zlookup.c +++ b/pimd/pim_zlookup.c @@ -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_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_str, sizeof(addr_str)); - pim_inet4_dump("", 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_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_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_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_str, - sizeof(addr_str)); - pim_addr_dump("", &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) */ diff --git a/pimd/pim_zlookup.h b/pimd/pim_zlookup.h index c3818dbdbc..4ea865a7e7 100644 --- a/pimd/pim_zlookup.h +++ b/pimd/pim_zlookup.h @@ -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;