Index | Thread | Search

From:
Claudio Jeker <cjeker@diehard.n-r-g.com>
Subject:
bgpd: increase ibuf message size to 128k
To:
tech@openbsd.org
Date:
Mon, 2 Dec 2024 14:57:01 +0100

Download raw body.

Thread
To support extended bgp messages of up to 65k bump the maximum imsg size
to 128k on all channels.

On top of this remove the READ_BUF_SIZE define and replace its only use
with IBUF_READ_SIZE since the MAX_SOCK_BUF is used to scale up the imsg
socketpairs.

-- 
:wq Claudio

Index: bgpctl/bgpctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/bgpctl.c,v
diff -u -p -r1.311 bgpctl.c
--- bgpctl/bgpctl.c	21 Nov 2024 13:38:14 -0000	1.311
+++ bgpctl/bgpctl.c	2 Dec 2024 13:54:23 -0000
@@ -176,7 +176,8 @@ main(int argc, char *argv[])
 
 	if ((imsgbuf = malloc(sizeof(struct imsgbuf))) == NULL)
 		err(1, NULL);
-	if (imsgbuf_init(imsgbuf, fd) == -1)
+	if (imsgbuf_init(imsgbuf, fd) == -1 ||
+	    imsgbuf_set_maxsize(imsgbuf, MAX_BGPD_IMSGSIZE) == -1)
 		err(1, NULL);
 	done = 0;
 
Index: bgpd/bgpd.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.c,v
diff -u -p -r1.277 bgpd.c
--- bgpd/bgpd.c	21 Nov 2024 13:38:14 -0000	1.277
+++ bgpd/bgpd.c	2 Dec 2024 13:54:23 -0000
@@ -277,8 +277,11 @@ main(int argc, char *argv[])
 	    (ibuf_rtr = malloc(sizeof(struct imsgbuf))) == NULL)
 		fatal(NULL);
 	if (imsgbuf_init(ibuf_se, pipe_m2s[0]) == -1 ||
+	    imsgbuf_set_maxsize(ibuf_se, MAX_BGPD_IMSGSIZE) == -1 ||
 	    imsgbuf_init(ibuf_rde, pipe_m2r[0]) == -1 ||
-	    imsgbuf_init(ibuf_rtr, pipe_m2roa[0]) == -1)
+	    imsgbuf_set_maxsize(ibuf_rde, MAX_BGPD_IMSGSIZE) == -1 ||
+	    imsgbuf_init(ibuf_rtr, pipe_m2roa[0]) == -1 ||
+	    imsgbuf_set_maxsize(ibuf_rtr, MAX_BGPD_IMSGSIZE) == -1)
 		fatal(NULL);
 	imsgbuf_allow_fdpass(ibuf_se);
 	imsgbuf_allow_fdpass(ibuf_rde);
Index: bgpd/bgpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
diff -u -p -r1.500 bgpd.h
--- bgpd/bgpd.h	21 Nov 2024 13:29:52 -0000	1.500
+++ bgpd/bgpd.h	2 Dec 2024 13:54:23 -0000
@@ -50,8 +50,8 @@
 
 #define	MAX_PKTSIZE			4096
 #define	MIN_HOLDTIME			3
-#define	READ_BUF_SIZE			65535
-#define	MAX_SOCK_BUF			(4 * READ_BUF_SIZE)
+#define	MAX_BGPD_IMSGSIZE		(128 * 1024)
+#define	MAX_SOCK_BUF			(4 * IBUF_READ_SIZE)
 #define	RT_BUF_SIZE			16384
 #define	MAX_RTSOCK_BUF			(2 * 1024 * 1024)
 #define	MAX_COMM_MATCH			3
Index: bgpd/control.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/control.c,v
diff -u -p -r1.131 control.c
--- bgpd/control.c	21 Nov 2024 13:38:14 -0000	1.131
+++ bgpd/control.c	2 Dec 2024 13:54:23 -0000
@@ -180,8 +180,10 @@ control_accept(int listenfd, int restric
 		return (0);
 	}
 
-	if (imsgbuf_init(&ctl_conn->imsgbuf, connfd) == -1) {
+	if (imsgbuf_init(&ctl_conn->imsgbuf, connfd) == -1 ||
+	    imsgbuf_set_maxsize(&ctl_conn->imsgbuf, MAX_BGPD_IMSGSIZE) == -1) {
 		log_warn("control_accept");
+		imsgbuf_clear(&ctl_conn->imsgbuf);
 		close(connfd);
 		free(ctl_conn);
 		return (0);
Index: bgpd/rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
diff -u -p -r1.641 rde.c
--- bgpd/rde.c	2 Dec 2024 13:46:11 -0000	1.641
+++ bgpd/rde.c	2 Dec 2024 13:54:23 -0000
@@ -201,7 +201,8 @@ rde_main(int debug, int verbose)
 
 	if ((ibuf_main = malloc(sizeof(struct imsgbuf))) == NULL)
 		fatal(NULL);
-	if (imsgbuf_init(ibuf_main, 3) == -1)
+	if (imsgbuf_init(ibuf_main, 3) == -1 ||
+	    imsgbuf_set_maxsize(ibuf_main, MAX_BGPD_IMSGSIZE) == -1)
 		fatal(NULL);
 	imsgbuf_allow_fdpass(ibuf_main);
 
@@ -844,7 +845,8 @@ rde_dispatch_imsg_parent(struct imsgbuf 
 			}
 			if ((i = malloc(sizeof(struct imsgbuf))) == NULL)
 				fatal(NULL);
-			if (imsgbuf_init(i, fd) == -1)
+			if (imsgbuf_init(i, fd) == -1 ||
+			    imsgbuf_set_maxsize(i, MAX_BGPD_IMSGSIZE) == -1)
 				fatal(NULL);
 			switch (imsg_get_type(&imsg)) {
 			case IMSG_SOCKET_CONN:
Index: bgpd/rtr.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rtr.c,v
diff -u -p -r1.27 rtr.c
--- bgpd/rtr.c	21 Nov 2024 13:38:14 -0000	1.27
+++ bgpd/rtr.c	2 Dec 2024 13:54:23 -0000
@@ -219,7 +219,8 @@ rtr_main(int debug, int verbose)
 
 	if ((ibuf_main = malloc(sizeof(struct imsgbuf))) == NULL)
 		fatal(NULL);
-	if (imsgbuf_init(ibuf_main, 3) == -1)
+	if (imsgbuf_init(ibuf_main, 3) == -1 ||
+	    imsgbuf_set_maxsize(ibuf_main, MAX_BGPD_IMSGSIZE) == -1)
 		fatal(NULL);
 	imsgbuf_allow_fdpass(ibuf_main);
 
@@ -338,7 +339,9 @@ rtr_dispatch_imsg_parent(struct imsgbuf 
 			}
 			if ((ibuf_rde = malloc(sizeof(struct imsgbuf))) == NULL)
 				fatal(NULL);
-			if (imsgbuf_init(ibuf_rde, fd) == -1)
+			if (imsgbuf_init(ibuf_rde, fd) == -1 ||
+			    imsgbuf_set_maxsize(ibuf_rde, MAX_BGPD_IMSGSIZE) ==
+			    -1)
 				fatal(NULL);
 			break;
 		case IMSG_SOCKET_SETUP:
Index: bgpd/session.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/session.c,v
diff -u -p -r1.499 session.c
--- bgpd/session.c	26 Nov 2024 13:59:54 -0000	1.499
+++ bgpd/session.c	2 Dec 2024 13:54:24 -0000
@@ -240,7 +240,8 @@ session_main(int debug, int verbose)
 
 	if ((ibuf_main = malloc(sizeof(struct imsgbuf))) == NULL)
 		fatal(NULL);
-	if (imsgbuf_init(ibuf_main, 3) == -1)
+	if (imsgbuf_init(ibuf_main, 3) == -1 ||
+	    imsgbuf_set_maxsize(ibuf_main, MAX_BGPD_IMSGSIZE) == -1)
 		fatal(NULL);
 	imsgbuf_allow_fdpass(ibuf_main);
 
@@ -2851,7 +2852,8 @@ session_dispatch_imsg(struct imsgbuf *im
 			}
 			if ((i = malloc(sizeof(struct imsgbuf))) == NULL)
 				fatal(NULL);
-			if (imsgbuf_init(i, fd) == -1)
+			if (imsgbuf_init(i, fd) == -1 ||
+			    imsgbuf_set_maxsize(i, MAX_BGPD_IMSGSIZE) == -1)
 				fatal(NULL);
 			if (imsg_get_type(&imsg) == IMSG_SOCKET_CONN) {
 				if (ibuf_rde) {