Index | Thread | Search

From:
Claudio Jeker <cjeker@diehard.n-r-g.com>
Subject:
bgpd: simplify IMSG_CTL_KROUTE
To:
tech@openbsd.org
Date:
Mon, 8 Jan 2024 15:43:58 +0100

Download raw body.

Thread
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 {