When introducing prefix_nhvalid(p) the code in network_dump_upcall()
was not correctly adjusted:

Before:
        if (prefix_nexthop(p) == NULL ||
            prefix_nexthop(p)->state != NEXTHOP_REACH)
                kf.nexthop.aid = kf.prefix.aid;
        else
                kf.nexthop = prefix_nexthop(p)->true_nexthop;

Now:
        if (prefix_nhvalid(p))
                kf.nexthop.aid = kf.prefix.aid;
        else
                kf.nexthop = prefix_nexthop(p)->true_nexthop;

What it should be:

        if (prefix_nhvalid(p) &&  prefix_nexthop(p) != NULL)
                kf.nexthop = prefix_nexthop(p)->exit_nexthop;
        else
                kf.nexthop.aid = kf.prefix.aid;

If the nexthop is valid we want to show it but in most cases the nexthop
of announced networks is NULL so make sure we don't dereference NULL.
Also I think it makes more sense to show the exit_nexthop (which is what
is shown in show rib output by default). It is also what will be sent to
the peers.

While there adjust the code to be a bit more logical and modern.
-- 
:wq Claudio

Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.560
diff -u -p -r1.560 rde.c
--- rde.c       28 Jul 2022 13:11:50 -0000      1.560
+++ rde.c       10 Aug 2022 09:56:51 -0000
@@ -4247,14 +4247,13 @@ network_dump_upcall(struct rib_entry *re
                        continue;
                pt_getaddr(p->pt, &addr);
 
-               bzero(&kf, sizeof(kf));
-               memcpy(&kf.prefix, &addr, sizeof(kf.prefix));
-               if (prefix_nhvalid(p))
-                       kf.nexthop.aid = kf.prefix.aid;
-               else
-                       memcpy(&kf.nexthop, &prefix_nexthop(p)->true_nexthop,
-                           sizeof(kf.nexthop));
+               memset(&kf, 0, sizeof(kf));
+               kf.prefix = addr;
                kf.prefixlen = p->pt->prefixlen;
+               if (prefix_nhvalid(p) && prefix_nexthop(p) != NULL)
+                       kf.nexthop = prefix_nexthop(p)->exit_nexthop;
+               else
+                       kf.nexthop.aid = kf.prefix.aid;
                if ((asp->flags & F_ANN_DYNAMIC) == 0)
                        kf.flags = F_STATIC;
                if (imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_NETWORK, 0,

Reply via email to