Do not leak the address family specific struct kroute into bgpctl if there is struct kroute_full which is address family independent. The result is mostly minus because the code no longer needs address family specific code paths. This changes 'bgpctl show nexthop' but not its output.
OK? -- :wq Claudio Index: bgpctl/output.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpctl/output.c,v retrieving revision 1.21 diff -u -p -r1.21 output.c --- bgpctl/output.c 15 Jun 2022 10:10:50 -0000 1.21 +++ bgpctl/output.c 22 Jun 2022 14:04:35 -0000 @@ -480,8 +480,6 @@ show_fib_table(struct ktable *kt) static void show_nexthop(struct ctl_show_nexthop *nh) { - struct kroute *k; - struct kroute6 *k6; char *s; printf("%s %-15s ", nh->valid ? "*" : " ", log_addr(&nh->addr)); @@ -489,33 +487,15 @@ show_nexthop(struct ctl_show_nexthop *nh printf("\n"); return; } - switch (nh->addr.aid) { - case AID_INET: - k = &nh->kr.kr4; - if (asprintf(&s, "%s/%u", inet_ntoa(k->prefix), - k->prefixlen) == -1) - err(1, NULL); - printf("%-20s", s); - free(s); - printf("%3i %-15s ", k->priority, - k->flags & F_CONNECTED ? "connected" : - inet_ntoa(k->nexthop)); - break; - case AID_INET6: - k6 = &nh->kr.kr6; - if (asprintf(&s, "%s/%u", log_in6addr(&k6->prefix), - k6->prefixlen) == -1) - err(1, NULL); - printf("%-20s", s); - free(s); - printf("%3i %-15s ", k6->priority, - k6->flags & F_CONNECTED ? "connected" : - log_in6addr(&k6->nexthop)); - break; - default: - printf("unknown address family\n"); - return; - } + if (asprintf(&s, "%s/%u", log_addr(&nh->kr.prefix), + nh->kr.prefixlen) == -1) + err(1, NULL); + printf("%-20s", s); + free(s); + printf("%3i %-15s ", nh->kr.priority, + nh->kr.flags & F_CONNECTED ? "connected" : + log_addr(&nh->kr.nexthop)); + if (nh->iface.ifname[0]) { printf("%s (%s, %s)", nh->iface.ifname, nh->iface.is_up ? "UP" : "DOWN", Index: bgpctl/output_json.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpctl/output_json.c,v retrieving revision 1.15 diff -u -p -r1.15 output_json.c --- bgpctl/output_json.c 15 Jun 2022 10:10:50 -0000 1.15 +++ bgpctl/output_json.c 22 Jun 2022 14:06:05 -0000 @@ -414,9 +414,6 @@ json_do_interface(struct ctl_show_interf static void json_nexthop(struct ctl_show_nexthop *nh) { - struct kroute *k; - struct kroute6 *k6; - json_do_array("nexthops"); json_do_object("nexthop"); @@ -427,27 +424,11 @@ json_nexthop(struct ctl_show_nexthop *nh if (!nh->krvalid) goto done; - switch (nh->addr.aid) { - case AID_INET: - k = &nh->kr.kr4; - json_do_printf("prefix", "%s/%u", inet_ntoa(k->prefix), - k->prefixlen); - json_do_uint("priority", k->priority); - json_do_bool("connected", k->flags & F_CONNECTED); - json_do_printf("nexthop", "%s", inet_ntoa(k->nexthop)); - break; - case AID_INET6: - k6 = &nh->kr.kr6; - json_do_printf("prefix", "%s/%u", log_in6addr(&k6->prefix), - k6->prefixlen); - json_do_uint("priority", k6->priority); - json_do_bool("connected", k6->flags & F_CONNECTED); - json_do_printf("nexthop", "%s", log_in6addr(&k6->nexthop)); - break; - default: - warnx("nexthop: unknown address family"); - goto done; - } + json_do_printf("prefix", "%s/%u", log_addr(&nh->kr.prefix), + nh->kr.prefixlen); + json_do_uint("priority", nh->kr.priority); + json_do_bool("connected", nh->kr.flags & F_CONNECTED); + json_do_printf("nexthop", "%s", log_addr(&nh->kr.nexthop)); if (nh->iface.ifname[0]) json_do_interface(&nh->iface); done: Index: bgpd/bgpd.h =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v retrieving revision 1.432 diff -u -p -r1.432 bgpd.h --- bgpd/bgpd.h 19 Jun 2022 10:30:09 -0000 1.432 +++ bgpd/bgpd.h 22 Jun 2022 14:01:53 -0000 @@ -769,10 +769,7 @@ struct ctl_show_interface { struct ctl_show_nexthop { struct bgpd_addr addr; struct ctl_show_interface iface; - union { - struct kroute kr4; - struct kroute6 kr6; - } kr; + struct kroute_full kr; uint8_t valid; uint8_t krvalid; }; Index: bgpd/kroute.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v retrieving revision 1.261 diff -u -p -r1.261 kroute.c --- bgpd/kroute.c 22 Jun 2022 12:28:33 -0000 1.261 +++ bgpd/kroute.c 22 Jun 2022 14:04:07 -0000 @@ -1149,16 +1149,14 @@ kr_show_route(struct imsg *imsg) kr = h->kroute; snh.valid = kroute_validate(&kr->r); snh.krvalid = 1; - memcpy(&snh.kr.kr4, &kr->r, - sizeof(snh.kr.kr4)); + snh.kr = *kr_tofull(&kr->r); ifindex = kr->r.ifindex; break; case AID_INET6: kr6 = h->kroute; snh.valid = kroute6_validate(&kr6->r); snh.krvalid = 1; - memcpy(&snh.kr.kr6, &kr6->r, - sizeof(snh.kr.kr6)); + snh.kr = *kr6_tofull(&kr6->r); ifindex = kr6->r.ifindex; break; }