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