Download raw body.
bgpd: simplify IMSG_CTL_KROUTE
This diff replaces the strange encoding of IMSG_CTL_KROUTE with
a struct that holds the flags and af field. This will allow to use
imsg_get_data() instead (which is the next diff).
--
:wq Claudio
Index: usr.sbin/bgpctl/bgpctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/bgpctl.c,v
diff -u -p -r1.298 bgpctl.c
--- usr.sbin/bgpctl/bgpctl.c 20 Nov 2023 14:41:55 -0000 1.298
+++ usr.sbin/bgpctl/bgpctl.c 8 Jan 2024 14:37:15 -0000
@@ -194,19 +194,13 @@ main(int argc, char *argv[])
break;
case SHOW_FIB:
if (!res->addr.aid) {
- struct ibuf *msg;
- sa_family_t af;
+ struct ctl_kroute_req req = { 0 };
- af = aid2af(res->aid);
- if ((msg = imsg_create(imsgbuf, IMSG_CTL_KROUTE,
- res->rtableid, 0, sizeof(res->flags) +
- sizeof(af))) == NULL)
- errx(1, "imsg_create failure");
- if (imsg_add(msg, &res->flags, sizeof(res->flags)) ==
- -1 ||
- imsg_add(msg, &af, sizeof(af)) == -1)
- errx(1, "imsg_add failure");
- imsg_close(imsgbuf, msg);
+ req.af = aid2af(res->aid);
+ req.flags = res->flags;
+
+ imsg_compose(imsgbuf, IMSG_CTL_KROUTE, res->rtableid,
+ 0, -1, &req, sizeof(req));
} else
imsg_compose(imsgbuf, IMSG_CTL_KROUTE_ADDR,
res->rtableid, 0, -1,
Index: usr.sbin/bgpd/bgpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
diff -u -p -r1.478 bgpd.h
--- usr.sbin/bgpd/bgpd.h 16 Oct 2023 10:25:45 -0000 1.478
+++ usr.sbin/bgpd/bgpd.h 8 Jan 2024 14:38:50 -0000
@@ -974,6 +974,11 @@ struct ctl_show_rib_request {
uint8_t aid;
};
+struct ctl_kroute_req {
+ int flags;
+ sa_family_t af;
+};
+
enum filter_actions {
ACTION_NONE,
ACTION_ALLOW,
Index: usr.sbin/bgpd/kroute.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v
diff -u -p -r1.307 kroute.c
--- usr.sbin/bgpd/kroute.c 17 Oct 2023 17:59:59 -0000 1.307
+++ usr.sbin/bgpd/kroute.c 8 Jan 2024 14:41:05 -0000
@@ -884,8 +884,7 @@ kr_show_route(struct imsg *imsg)
struct kroute6 *kr6, *kn6;
struct kroute_full *kf;
struct bgpd_addr *addr;
- int flags;
- sa_family_t af;
+ struct ctl_kroute_req req;
struct ctl_show_nexthop snh;
struct knexthop *h;
struct kif *kif;
@@ -894,8 +893,7 @@ kr_show_route(struct imsg *imsg)
switch (imsg->hdr.type) {
case IMSG_CTL_KROUTE:
- if (imsg->hdr.len != IMSG_HEADER_SIZE + sizeof(flags) +
- sizeof(af)) {
+ if (imsg->hdr.len != IMSG_HEADER_SIZE + sizeof(req)) {
log_warnx("%s: wrong imsg len", __func__);
break;
}
@@ -905,11 +903,10 @@ kr_show_route(struct imsg *imsg)
imsg->hdr.peerid);
break;
}
- memcpy(&flags, imsg->data, sizeof(flags));
- memcpy(&af, (char *)imsg->data + sizeof(flags), sizeof(af));
- if (!af || af == AF_INET)
+ memcpy(&req, imsg->data, sizeof(req));
+ if (!req.af || req.af == AF_INET)
RB_FOREACH(kr, kroute_tree, &kt->krt) {
- if (flags && (kr->flags & flags) == 0)
+ if (req.flags && (kr->flags & req.flags) == 0)
continue;
kn = kr;
do {
@@ -919,9 +916,9 @@ kr_show_route(struct imsg *imsg)
imsg->hdr.pid, kf, sizeof(*kf));
} while ((kn = kn->next) != NULL);
}
- if (!af || af == AF_INET6)
+ if (!req.af || req.af == AF_INET6)
RB_FOREACH(kr6, kroute6_tree, &kt->krt6) {
- if (flags && (kr6->flags & flags) == 0)
+ if (req.flags && (kr6->flags & req.flags) == 0)
continue;
kn6 = kr6;
do {
bgpd: simplify IMSG_CTL_KROUTE