From: Claudio Jeker Subject: bgpd: session IMSG_UPDATE convert to new imsg API To: tech@openbsd.org Date: Thu, 18 Jan 2024 15:28:38 +0100 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)