This diff changes some parts of eigrpd to use the new ibuf API. There is one ibuf_seek() left in packet.c since the changes done to the header there are not as trivial as in any other daemon. So that part I left out for now. The suggested changes on the other hand are simple.
Again if someone uses eigrpd please test. -- :wq Claudio Index: packet.c =================================================================== RCS file: /cvs/src/usr.sbin/eigrpd/packet.c,v retrieving revision 1.20 diff -u -p -r1.20 packet.c --- packet.c 19 Jan 2021 11:49:26 -0000 1.20 +++ packet.c 26 Jun 2023 10:21:00 -0000 @@ -172,12 +172,11 @@ send_packet(struct eigrp_iface *ei, stru eigrp_hdr->ack_num = htonl(nbr->recv_seq); rtp_ack_stop_timer(nbr); } - if (flags) { - eigrp_hdr->flags = ntohl(eigrp_hdr->flags) | flags; - eigrp_hdr->flags = htonl(eigrp_hdr->flags); - } + if (flags) + eigrp_hdr->flags |= htonl(flags); + eigrp_hdr->chksum = 0; - eigrp_hdr->chksum = in_cksum(buf->buf, ibuf_size(buf)); + eigrp_hdr->chksum = in_cksum(ibuf_data(buf), ibuf_size(buf)); /* log packet being sent */ if (eigrp_hdr->opcode != EIGRP_OPC_HELLO) { Index: tlv.c =================================================================== RCS file: /cvs/src/usr.sbin/eigrpd/tlv.c,v retrieving revision 1.16 diff -u -p -r1.16 tlv.c --- tlv.c 3 Nov 2021 13:48:46 -0000 1.16 +++ tlv.c 16 Jun 2023 10:24:17 -0000 @@ -19,6 +19,7 @@ #include <sys/types.h> #include <sys/utsname.h> +#include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -51,13 +52,14 @@ gen_parameter_tlv(struct ibuf *buf, stru int gen_sequence_tlv(struct ibuf *buf, struct seq_addr_head *seq_addr_list) { - struct tlv tlv, *tlvp; + struct tlv tlv; struct seq_addr_entry *sa; uint8_t alen; uint16_t len = TLV_HDR_LEN; - size_t original_size = ibuf_size(buf); + size_t off; tlv.type = htons(TLV_TYPE_SEQ); + off = ibuf_size(buf) + offsetof(struct tlv, length); if (ibuf_add(buf, &tlv, sizeof(tlv))) { log_warn("%s: ibuf_add failed", __func__); return (-1); @@ -85,9 +87,8 @@ gen_sequence_tlv(struct ibuf *buf, struc } /* adjust tlv length */ - if ((tlvp = ibuf_seek(buf, original_size, sizeof(*tlvp))) == NULL) - fatalx("gen_sequence_tlv: buf_seek failed"); - tlvp->length = htons(len); + if (ibuf_set_n16(buf, off, len) == -1) + fatalx("gen_sequence_tlv: buf_set_n16 failed"); return (0); } @@ -158,13 +159,13 @@ len_route_tlv(struct rinfo *ri) int gen_route_tlv(struct ibuf *buf, struct rinfo *ri) { - struct tlv tlv, *tlvp; + struct tlv tlv; struct in_addr addr; struct classic_metric metric; struct classic_emetric emetric; uint16_t tlvlen; uint8_t pflen; - size_t original_size = ibuf_size(buf); + size_t off; switch (ri->af) { case AF_INET: @@ -189,6 +190,7 @@ gen_route_tlv(struct ibuf *buf, struct r } tlv.type = htons(tlv.type); + off = ibuf_size(buf) + offsetof(struct tlv, length); if (ibuf_add(buf, &tlv, sizeof(tlv))) return (-1); tlvlen = TLV_HDR_LEN; @@ -251,9 +253,8 @@ gen_route_tlv(struct ibuf *buf, struct r tlvlen += sizeof(pflen) + pflen; /* adjust tlv length */ - if ((tlvp = ibuf_seek(buf, original_size, sizeof(*tlvp))) == NULL) - fatalx("gen_route_tlv: buf_seek failed"); - tlvp->length = htons(tlvlen); + if (ibuf_set_n16(buf, off, tlvlen) == -1) + fatalx("gen_route_tlv: buf_set_n16 failed"); return (0); }