From 578a5ec29a14969d84cbe12ef2a2fc25ad14ac51 Mon Sep 17 00:00:00 2001 From: Ken Keys Date: Mon, 7 Dec 2020 16:21:51 -0800 Subject: [PATCH] Implement RFC 8050/7911 MRT Additional Path extension --- lib/bgpstream_bgpdump.c | 13 +++++++++++-- lib/bgpstream_elem.c | 5 +++++ lib/bgpstream_elem.h | 9 +++++++++ lib/formats/bs_format_mrt.c | 6 ++++++ lib/formats/libparsebgp | 2 +- tools/bgpreader.c | 4 ++-- 6 files changed, 34 insertions(+), 5 deletions(-) diff --git a/lib/bgpstream_bgpdump.c b/lib/bgpstream_bgpdump.c index 5101b564..33c766aa 100644 --- a/lib/bgpstream_bgpdump.c +++ b/lib/bgpstream_bgpdump.c @@ -70,12 +70,14 @@ char *bgpstream_record_elem_bgpdump_snprintf(char *buf, size_t len, /* Record type */ switch (elem->type) { case BGPSTREAM_ELEM_TYPE_RIB: - c = snprintf(buf_p, B_REMAIN, "TABLE_DUMP2|%" PRIu32, record->time_sec); + c = snprintf(buf_p, B_REMAIN, "TABLE_DUMP2%s|%" PRIu32, + elem->has_addl_path_id ? "_AP" : "", record->time_sec); break; case BGPSTREAM_ELEM_TYPE_ANNOUNCEMENT: case BGPSTREAM_ELEM_TYPE_WITHDRAWAL: case BGPSTREAM_ELEM_TYPE_PEERSTATE: - c = snprintf(buf_p, B_REMAIN, "BGP4MP|%" PRIu32, record->time_sec); + c = snprintf(buf_p, B_REMAIN, "BGP4MP%s|%" PRIu32, + elem->has_addl_path_id ? "_AP" : "", record->time_sec); break; default: c = 0; @@ -132,6 +134,13 @@ char *bgpstream_record_elem_bgpdump_snprintf(char *buf, size_t len, SEEK_STR_END; ADD_PIPE; + if (elem->has_addl_path_id) { + c = snprintf(buf_p, B_REMAIN, "%" PRIu32, elem->addl_path_id); + written += c; + buf_p += c; + ADD_PIPE; + } + /* AS PATH */ c = bgpstream_as_path_snprintf(buf_p, B_REMAIN, elem->as_path); written += c; diff --git a/lib/bgpstream_elem.c b/lib/bgpstream_elem.c index 9f28b671..a1bc5c5a 100644 --- a/lib/bgpstream_elem.c +++ b/lib/bgpstream_elem.c @@ -272,6 +272,11 @@ char *bgpstream_elem_custom_snprintf(char *buf, size_t len, return NULL; } SEEK_STR_END; + if (elem->has_addl_path_id) { + c = snprintf(buf_p, B_REMAIN, "#%" PRIu32, elem->addl_path_id); + written += c; + buf_p += c; + } ADD_PIPE; /* NEXT HOP */ diff --git a/lib/bgpstream_elem.h b/lib/bgpstream_elem.h index 9ffc65b1..a27e2992 100644 --- a/lib/bgpstream_elem.h +++ b/lib/bgpstream_elem.h @@ -203,6 +203,15 @@ typedef struct bgpstream_elem { */ bgpstream_pfx_t prefix; + /** Additional Path Identifier (RFC 7911) + * + * Available only for RIB, Announcement and Withdrawal elem types + */ + uint32_t addl_path_id; + + /** Set if the addl_path_id field is valid */ + uint8_t has_addl_path_id; + /** Next hop * * Available only for RIB and Announcement elem types diff --git a/lib/formats/bs_format_mrt.c b/lib/formats/bs_format_mrt.c index e6302fc8..eca7af7d 100644 --- a/lib/formats/bs_format_mrt.c +++ b/lib/formats/bs_format_mrt.c @@ -89,6 +89,8 @@ static int handle_table_dump(rec_data_t *rd, parsebgp_mrt_msg_t *mrt) el->type = BGPSTREAM_ELEM_TYPE_RIB; el->orig_time_sec = td->originated_time; el->orig_time_usec = 0; + el->has_addl_path_id = 0; + el->addl_path_id = 0; COPY_IP(&el->peer_ip, mrt->subtype, &td->peer_ip, return -1); @@ -122,6 +124,8 @@ static int handle_td2_rib_entry(rec_data_t *rd, khash_t(td2_peer) * peer_table, rd->elem->orig_time_sec = re->originated_time; rd->elem->orig_time_usec = 0; + rd->elem->has_addl_path_id = re->has_addl_path_id; + rd->elem->addl_path_id = re->addl_path_id; // look the peer up in the peer index table if ((k = kh_get(td2_peer, peer_table, re->peer_index)) == @@ -202,9 +206,11 @@ static int handle_table_dump_v2(rec_data_t *rd, khash_t(td2_peer) * peer_table, break; case PARSEBGP_MRT_TABLE_DUMP_V2_RIB_IPV4_UNICAST: + case PARSEBGP_MRT_TABLE_DUMP_V2_RIB_IPV4_UNICAST_ADDPATH: return handle_td2_afi_safi_rib(rd, peer_table, mrt, PARSEBGP_BGP_AFI_IPV4, &td2->afi_safi_rib); case PARSEBGP_MRT_TABLE_DUMP_V2_RIB_IPV6_UNICAST: + case PARSEBGP_MRT_TABLE_DUMP_V2_RIB_IPV6_UNICAST_ADDPATH: return handle_td2_afi_safi_rib(rd, peer_table, mrt, PARSEBGP_BGP_AFI_IPV6, &td2->afi_safi_rib); diff --git a/lib/formats/libparsebgp b/lib/formats/libparsebgp index effa7f09..7b2875ec 160000 --- a/lib/formats/libparsebgp +++ b/lib/formats/libparsebgp @@ -1 +1 @@ -Subproject commit effa7f0956a13f9e8db8c36707c6b34163c7a677 +Subproject commit 7b2875ec52f4c798bc84c5d13f057d50d815a960 diff --git a/tools/bgpreader.c b/tools/bgpreader.c index c6a66da6..1a842094 100644 --- a/tools/bgpreader.c +++ b/tools/bgpreader.c @@ -62,8 +62,8 @@ "# Elem format:\n" \ "# " \ "||.|||<" \ - "router>|||||||" \ - "|||\n" \ + "router>||||[#]|"\ + "|||||\n" \ "#\n" \ "# : R RIB, U Update\n" \ "# : R RIB, A announcement, W withdrawal, S state message\n" \