diff options
| author | Donald Sharp <sharpd@nvidia.com> | 2021-07-07 16:52:24 -0400 |
|---|---|---|
| committer | Martin Winter <mwinter@opensourcerouting.org> | 2021-07-25 15:17:37 +0200 |
| commit | 393c126db11ff03e66e5802f22150acf0452b35c (patch) | |
| tree | 48c65098ac038d38b44fd4c4300918a3c45d47c0 | |
| parent | 235bcb4b4aa8fdf12ef91858968e30daba492177 (diff) | |
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 <sharpd@nvidia.com>
| -rw-r--r-- | zebra/zapi_msg.c | 14 | ||||
| -rw-r--r-- | zebra/zebra_rnh.c | 3 | ||||
| -rw-r--r-- | 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 544bb07fbe..223a8ca438 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -681,6 +681,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; @@ -688,15 +690,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 a4382441c8..804ce733bd 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); |
