Index | Thread | Search

From:
Claudio Jeker <cjeker@diehard.n-r-g.com>
Subject:
bgpd: session IMSG_UPDATE convert to new imsg API
To:
tech@openbsd.org
Date:
Thu, 18 Jan 2024 15:28:38 +0100

Download raw body.

Thread
This converts IMSG_UPDATE and session_update() to use struct ibuf.
Doing this in the RDE will be a lot bigger :)

-- 
:wq Claudio

Index: session.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/session.c,v
diff -u -p -r1.460 session.c
--- session.c	16 Jan 2024 13:15:31 -0000	1.460
+++ session.c	18 Jan 2024 14:09:03 -0000
@@ -73,7 +73,7 @@ struct bgp_msg	*session_newmsg(enum msg_
 int	session_sendmsg(struct bgp_msg *, struct peer *);
 void	session_open(struct peer *);
 void	session_keepalive(struct peer *);
-void	session_update(uint32_t, void *, size_t);
+void	session_update(uint32_t, struct ibuf *);
 void	session_notification(struct peer *, uint8_t, uint8_t, struct ibuf *);
 void	session_notification_data(struct peer *, uint8_t, uint8_t, void *,
 	    size_t);
@@ -1640,7 +1640,7 @@ session_keepalive(struct peer *p)
 }
 
 void
-session_update(uint32_t peerid, void *data, size_t datalen)
+session_update(uint32_t peerid, struct ibuf *ibuf)
 {
 	struct peer		*p;
 	struct bgp_msg		*buf;
@@ -1653,12 +1653,13 @@ session_update(uint32_t peerid, void *da
 	if (p->state != STATE_ESTABLISHED)
 		return;
 
-	if ((buf = session_newmsg(UPDATE, MSGSIZE_HEADER + datalen)) == NULL) {
+	if ((buf = session_newmsg(UPDATE, MSGSIZE_HEADER + ibuf_size(ibuf))) ==
+	    NULL) {
 		bgp_fsm(p, EVNT_CON_FATAL);
 		return;
 	}
 
-	if (ibuf_add(buf->buf, data, datalen)) {
+	if (ibuf_add_buf(buf->buf, ibuf)) {
 		ibuf_free(buf->buf);
 		free(buf);
 		bgp_fsm(p, EVNT_CON_FATAL);
@@ -2973,6 +2974,7 @@ session_dispatch_imsg(struct imsgbuf *im
 	struct listen_addr	*la, *next, nla;
 	struct session_dependon	 sdon;
 	struct bgpd_config	 tconf;
+	size_t			 len;
 	uint32_t		 peerid;
 	int			 n, fd, depend_ok, restricted;
 	uint16_t		 t;
@@ -3251,14 +3253,13 @@ session_dispatch_imsg(struct imsgbuf *im
 		case IMSG_UPDATE:
 			if (idx != PFD_PIPE_ROUTE)
 				fatalx("update request not from RDE");
-			if (imsg.hdr.len > IMSG_HEADER_SIZE +
-			    MAX_PKTSIZE - MSGSIZE_HEADER ||
-			    imsg.hdr.len < IMSG_HEADER_SIZE +
-			    MSGSIZE_UPDATE_MIN - MSGSIZE_HEADER)
+			len = imsg_get_len(&imsg);
+			if (imsg_get_ibuf(&imsg, &ibuf) == -1 ||
+			    len > MAX_PKTSIZE - MSGSIZE_HEADER ||
+			    len < MSGSIZE_UPDATE_MIN - MSGSIZE_HEADER)
 				log_warnx("RDE sent invalid update");
 			else
-				session_update(imsg.hdr.peerid, imsg.data,
-				    imsg.hdr.len - IMSG_HEADER_SIZE);
+				session_update(peerid, &ibuf);
 			break;
 		case IMSG_UPDATE_ERR:
 			if (idx != PFD_PIPE_ROUTE)