From: Claudio Jeker Subject: bgpd: increase ibuf message size to 128k To: tech@openbsd.org Date: Mon, 2 Dec 2024 14:57:01 +0100 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) {