]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: When passing lookup information back pass the fully resolved 9179/head
authorDonald Sharp <sharpd@nvidia.com>
Wed, 7 Jul 2021 20:52:24 +0000 (16:52 -0400)
committerMartin Winter <mwinter@opensourcerouting.org>
Sun, 25 Jul 2021 13:17:37 +0000 (15:17 +0200)
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 544bb07fbef42fc93e94e3bf8629ff32db99a82c..223a8ca4389fb13da3d61995c31487ac9293c913 100644 (file)
@@ -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);
index a4382441c862c1a6243d24938baa1f3205ba5bd1..804ce733bd69f5d150ed240edb333601061e22f2 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);