From b59839af7d4e6d26795d5c36aa31043d633c9a6d Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 7 Jul 2021 16:52:24 -0400 Subject: [PATCH] zebra: When passing lookup information back pass the fully resolved In the reachability code we auto pass back the fully resolved nexthops. Modify the ZEBRA_IPV4_NEXTHOP_LOOKUP_MRIB code to do the exact same thing so that the zclient_lookup_nexthop code does not need to recursively look for the data that zebra already has. Signed-off-by: Donald Sharp --- zebra/zapi_msg.c | 14 ++++++-------- zebra/zebra_rnh.c | 3 +-- zebra/zebra_rnh.h | 3 +++ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c index 8f2aa2fb09..4ef4bc6722 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -682,6 +682,8 @@ static int zsend_ipv4_nexthop_lookup_mrib(struct zserv *client, stream_put_in_addr(s, &addr); if (re) { + struct nexthop_group *nhg; + stream_putc(s, re->distance); stream_putl(s, re->metric); num = 0; @@ -689,15 +691,11 @@ static int zsend_ipv4_nexthop_lookup_mrib(struct zserv *client, nump = stream_get_endp(s); /* reserve room for nexthop_num */ stream_putc(s, 0); - /* - * Only non-recursive routes are elegible to resolve the - * nexthop we are looking up. Therefore, we will just iterate - * over the top chain of nexthops. - */ - for (nexthop = re->nhe->nhg.nexthop; nexthop; - nexthop = nexthop->next) - if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE)) + nhg = rib_get_fib_nhg(re); + for (ALL_NEXTHOPS_PTR(nhg, nexthop)) { + if (rnh_nexthop_valid(re, nexthop)) num += zserv_encode_nexthop(s, nexthop); + } /* store nexthop_num */ stream_putc_at(s, nump, num); diff --git a/zebra/zebra_rnh.c b/zebra/zebra_rnh.c index 41d55c2e6c..017a4aae7f 100644 --- a/zebra/zebra_rnh.c +++ b/zebra/zebra_rnh.c @@ -598,8 +598,7 @@ static const int RNH_INVALID_NH_FLAGS = (NEXTHOP_FLAG_RECURSIVE | NEXTHOP_FLAG_DUPLICATE | NEXTHOP_FLAG_RNH_FILTERED); -static bool rnh_nexthop_valid(const struct route_entry *re, - const struct nexthop *nh) +bool rnh_nexthop_valid(const struct route_entry *re, const struct nexthop *nh) { return (CHECK_FLAG(re->status, ROUTE_ENTRY_INSTALLED) && CHECK_FLAG(nh->flags, NEXTHOP_FLAG_ACTIVE) diff --git a/zebra/zebra_rnh.h b/zebra/zebra_rnh.h index 4897a6af30..24ee6d0bd9 100644 --- a/zebra/zebra_rnh.h +++ b/zebra/zebra_rnh.h @@ -64,6 +64,9 @@ extern void zebra_print_rnh_table(vrf_id_t vrfid, afi_t afi, struct vty *vty, extern int rnh_resolve_via_default(struct zebra_vrf *zvrf, int family); +extern bool rnh_nexthop_valid(const struct route_entry *re, + const struct nexthop *nh); + /* UI control to avoid notifications if backup nexthop status changes */ void rnh_set_hide_backups(bool hide_p); bool rnh_get_hide_backups(void); -- 2.39.5