In bgpd we do not follow the RFC8050 encoding for RIB_GENERIC_ADDPATH. Mainly because it does not fit the way the code works and also because the only other BGP implementation that seems to care about RIB_GENERIC_ADDPATH does it the same way.
Because of this it makes no sense to parse RIB_GENERIC_ADDPATH strictly per RFC8050 but instead parse it the way it is implemented. While there cleanup some unused variables. -- :wq Claudio Index: mrtparser.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpctl/mrtparser.c,v retrieving revision 1.15 diff -u -p -r1.15 mrtparser.c --- mrtparser.c 27 Jul 2021 07:42:37 -0000 1.15 +++ mrtparser.c 22 Sep 2021 10:22:54 -0000 @@ -103,10 +103,8 @@ mrt_parse(int fd, struct mrt_parser *p, struct mrt_bgp_state *s; struct mrt_bgp_msg *m; void *msg; - int addpath; while ((msg = mrt_read_msg(fd, &h))) { - addpath = 0; switch (ntohs(h.type)) { case MSG_NULL: case MSG_START: @@ -376,7 +374,7 @@ mrt_parse_v2_rib(struct mrt_hdr *hdr, vo u_int32_t snum, path_id = 0; u_int16_t cnt, i, afi; u_int8_t safi, aid; - int ret, addpath = 0; + int ret; if (len < sizeof(snum) + 1) return NULL; @@ -417,6 +415,11 @@ mrt_parse_v2_rib(struct mrt_hdr *hdr, vo goto fail; break; case MRT_DUMP_V2_RIB_GENERIC_ADDPATH: + /* + * RFC8050 handling for add-path has special handling for + * RIB_GENERIC_ADDPATH but nobody implements it that way. + * So just use the same way as for the other _ADDPATH types. + */ r->add_path = 1; /* FALLTHROUGH */ case MRT_DUMP_V2_RIB_GENERIC: @@ -434,16 +437,6 @@ mrt_parse_v2_rib(struct mrt_hdr *hdr, vo if ((aid = mrt_afi2aid(afi, safi, verbose)) == AID_UNSPEC) goto fail; - /* RFC8050 handling for add-path */ - if (r->add_path) { - if (len < sizeof(path_id)) - goto fail; - memcpy(&path_id, b, sizeof(path_id)); - b += sizeof(path_id); - len -= sizeof(path_id); - path_id = ntohl(path_id); - } - /* prefix */ ret = mrt_extract_prefix(b, len, aid, &r->prefix, &r->prefixlen, verbose); @@ -487,12 +480,9 @@ mrt_parse_v2_rib(struct mrt_hdr *hdr, vo len -= sizeof(otm); entries[i].originated = ntohl(otm); - /* RFC8050 handling for add-path */ - if (r->add_path && - ntohs(hdr->subtype) != MRT_DUMP_V2_RIB_GENERIC_ADDPATH) { + if (r->add_path) { if (len < sizeof(path_id) + sizeof(alen)) goto fail; - addpath = 0; memcpy(&path_id, b, sizeof(path_id)); b += sizeof(path_id); len -= sizeof(path_id);