On Thu, Oct 19, 2023 at 10:41:07AM +0200, Claudio Jeker wrote:
> More ibuf cleanup. rtr_proto.c still uses ibuf_add() where it could use
> the new functions.
>
> Two bits I'm unsure about:
> - I had to change some sizeof() to use native types (I especially dislike
> the sizeof(struct rtr_header).
Yes, that's not very nice.
> - ibuf_add_nXX() can fail if the value is too large. Which should be
> impossible but still maybe it would be better to check for errors.
While it should be impossible, the length calculations are non-trivial,
so it seems wiser to check.
It's a bit longer than what you have now, but maybe it's an option
to combine the length calculation with the errs += idiom.
len += sizeof(rs->version);
len += sizeof(type);
len += sizeof(session_id);
len += sizeof(len);
if ((buf = ibuf_open(len)) == NULL)
return NULL;
errs += ibuf_add_n8(buf, rs->version);
errs += ibuf_add_n8(buf, type);
errs += ibuf_add_n16(buf, session_id);
errs += ibuf_add_n32(buf, len);
if (errs) {
ibuf_free(ibuf);
return NULL;
}
I'm ok with the diff as it is and you can ponder how you want to shave
this particular Yak.
>
> --
> :wq Claudio
>
> Index: rtr_proto.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/rtr_proto.c,v
> retrieving revision 1.17
> diff -u -p -r1.17 rtr_proto.c
> --- rtr_proto.c 16 Aug 2023 08:26:35 -0000 1.17
> +++ rtr_proto.c 19 Oct 2023 08:35:49 -0000
> @@ -233,24 +233,21 @@ rtr_newmsg(struct rtr_session *rs, enum
> uint16_t session_id)
> {
> struct ibuf *buf;
> - struct rtr_header rh;
>
> if (len > RTR_MAX_LEN) {
> errno = ERANGE;
> return NULL;
> }
> - len += sizeof(rh);
> + len += sizeof(struct rtr_header);
> if ((buf = ibuf_open(len)) == NULL)
> return NULL;
>
> - memset(&rh, 0, sizeof(rh));
> - rh.version = rs->version;
> - rh.type = type;
> - rh.session_id = htons(session_id);
> - rh.length = htonl(len);
> -
> /* cannot fail with fixed buffers */
> - ibuf_add(buf, &rh, sizeof(rh));
> + ibuf_add_n8(buf, rs->version);
> + ibuf_add_n8(buf, type);
> + ibuf_add_n16(buf, session_id);
> + ibuf_add_n32(buf, len);
> +
> return buf;
> }
>
> @@ -264,7 +261,6 @@ rtr_send_error(struct rtr_session *rs, e
> {
> struct ibuf *buf;
> size_t mlen = 0;
> - uint32_t hdrlen;
>
> rs->last_sent_error = err;
> if (msg) {
> @@ -273,7 +269,7 @@ rtr_send_error(struct rtr_session *rs, e
> } else
> memset(rs->last_sent_msg, 0, sizeof(rs->last_sent_msg));
>
> - buf = rtr_newmsg(rs, ERROR_REPORT, 2 * sizeof(hdrlen) + len + mlen,
> + buf = rtr_newmsg(rs, ERROR_REPORT, 2 * sizeof(uint32_t) + len + mlen,
> err);
> if (buf == NULL) {
> log_warn("rtr %s: send error report", log_rtr(rs));
> @@ -281,11 +277,9 @@ rtr_send_error(struct rtr_session *rs, e
> }
>
> /* cannot fail with fixed buffers */
> - hdrlen = ntohl(len);
> - ibuf_add(buf, &hdrlen, sizeof(hdrlen));
> + ibuf_add_n32(buf, len);
> ibuf_add(buf, pdu, len);
> - hdrlen = ntohl(mlen);
> - ibuf_add(buf, &hdrlen, sizeof(hdrlen));
> + ibuf_add_n32(buf, mlen);
> ibuf_add(buf, msg, mlen);
> ibuf_close(&rs->w, buf);
>
> @@ -313,9 +307,8 @@ static void
> rtr_send_serial_query(struct rtr_session *rs)
> {
> struct ibuf *buf;
> - uint32_t s;
>
> - buf = rtr_newmsg(rs, SERIAL_QUERY, sizeof(s), rs->session_id);
> + buf = rtr_newmsg(rs, SERIAL_QUERY, sizeof(uint32_t), rs->session_id);
> if (buf == NULL) {
> log_warn("rtr %s: send serial query", log_rtr(rs));
> rtr_send_error(rs, INTERNAL_ERROR, "out of memory", NULL, 0);
> @@ -323,8 +316,7 @@ rtr_send_serial_query(struct rtr_session
> }
>
> /* cannot fail with fixed buffers */
> - s = htonl(rs->serial);
> - ibuf_add(buf, &s, sizeof(s));
> + ibuf_add_n32(buf, rs->serial);
> ibuf_close(&rs->w, buf);
> }
>
>