From: Claudio Jeker Subject: bgpd: simplify IMSG_CTL_KROUTE To: tech@openbsd.org Date: Mon, 8 Jan 2024 15:43:58 +0100 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 {