]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: When passing lookup information back pass the fully resolved
authorDonald Sharp <sharpd@nvidia.com>
Wed, 7 Jul 2021 20:52:24 +0000 (16:52 -0400)
committerDonald Sharp <sharpd@nvidia.com>
Thu, 15 Jul 2021 12:50:09 +0000 (08:50 -0400)
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>
zebra/zapi_msg.c
zebra/zebra_rnh.c
zebra/zebra_rnh.h

index 8f2aa2fb09e596bf7cba50db4894fef067dc43a7..4ef4bc67225b97921ca2e7e287c1dd30d2af93c9 100644 (file)
@@ -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);
index 41d55c2e6c1a99c8ed78a71d50b6c5494c8041cc..017a4aae7f7da8455c239e1265959f6f6cee3905 100644 (file)
@@ -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)
index 4897a6af300b2fa54a4199c70c2a52560662cc7e..24ee6d0bd9a44dcb6edb910c863d7bfccf419ec8 100644 (file)
@@ -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);