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,