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;
                                }

Reply via email to