Download raw body.
bgpd: session IMSG_UPDATE convert to new imsg API
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)
bgpd: session IMSG_UPDATE convert to new imsg API