diff options
| author | David Teach <dteach@routeviews.org> | 2021-02-11 20:44:00 +0000 |
|---|---|---|
| committer | dteach <dteach@uoreogn.edu> | 2021-02-11 16:51:41 -0800 |
| commit | 1073f44d4de3db2b80a569c171d07ad1e46b44af (patch) | |
| tree | fe199f2d6460270c2c02eb1d42809c5ea752c607 /bgpd/bgp_dump.c | |
| parent | 497bb82b623579ade9fb54b7a32d0e8f7f3b4c74 (diff) | |
bgpd: Add Support for rfc 8050 MRT add-path
- Rfc 8050 adds support for BGP NLRI that carry path identifiers. this commit adds that support to FRR
- Updated bgp_dump.h to include new sub-type values
- Updated bgp_dump.c to check for add_path af_caps in the peer struct.
- Updated bgp_dump.c to use the proper sub-type values upon detection of add-path af_caps
- Updated bgp_dump.c to properly dump the path_id wen present.
Signed-off-by: David Teach <dteach@routeviews.org>
Diffstat (limited to 'bgpd/bgp_dump.c')
| -rw-r--r-- | bgpd/bgp_dump.c | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/bgpd/bgp_dump.c b/bgpd/bgp_dump.c index 975bba9314..944a5848ec 100644 --- a/bgpd/bgp_dump.c +++ b/bgpd/bgp_dump.c @@ -300,6 +300,13 @@ static void bgp_dump_routes_index_table(struct bgp *bgp) fflush(bgp_dump_routes.fp); } +static int bgp_addpath_encode_rx(struct peer *peer, afi_t afi, safi_t safi) +{ + + return (CHECK_FLAG(peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) + && CHECK_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ADDPATH_AF_TX_RCV)); +} static struct bgp_path_info * bgp_dump_route_node_record(int afi, struct bgp_dest *dest, @@ -308,16 +315,27 @@ bgp_dump_route_node_record(int afi, struct bgp_dest *dest, struct stream *obuf; size_t sizep; size_t endp; + int addpath_encoded; const struct prefix *p = bgp_dest_get_prefix(dest); obuf = bgp_dump_obuf; stream_reset(obuf); + addpath_encoded = bgp_addpath_encode_rx(path->peer, afi, SAFI_UNICAST); + /* MRT header */ - if (afi == AFI_IP) + if (afi == AFI_IP && addpath_encoded) + bgp_dump_header(obuf, MSG_TABLE_DUMP_V2, + TABLE_DUMP_V2_RIB_IPV4_UNICAST_ADDPATH, + BGP_DUMP_ROUTES); + else if (afi == AFI_IP) bgp_dump_header(obuf, MSG_TABLE_DUMP_V2, TABLE_DUMP_V2_RIB_IPV4_UNICAST, BGP_DUMP_ROUTES); + else if (afi == AFI_IP6 && addpath_encoded) + bgp_dump_header(obuf, MSG_TABLE_DUMP_V2, + TABLE_DUMP_V2_RIB_IPV6_UNICAST_ADDPATH, + BGP_DUMP_ROUTES); else if (afi == AFI_IP6) bgp_dump_header(obuf, MSG_TABLE_DUMP_V2, TABLE_DUMP_V2_RIB_IPV6_UNICAST, @@ -361,6 +379,11 @@ bgp_dump_route_node_record(int afi, struct bgp_dest *dest, /* Originated */ stream_putl(obuf, time(NULL) - (bgp_clock() - path->uptime)); + /*Path Identifier*/ + if (addpath_encoded) { + stream_putl(obuf, path->addpath_rx_id); + } + /* Dump attribute. */ /* Skip prefix & AFI/SAFI for MP_NLRI */ bgp_dump_routes_attr(obuf, path->attr, p); @@ -528,19 +551,32 @@ static void bgp_dump_packet_func(struct bgp_dump *bgp_dump, struct peer *peer, struct stream *packet) { struct stream *obuf; - + int addpath_encoded = 0; /* If dump file pointer is disabled return immediately. */ if (bgp_dump->fp == NULL) return; + if (peer->su.sa.sa_family == AF_INET) { + addpath_encoded = + bgp_addpath_encode_rx(peer, AFI_IP, SAFI_UNICAST); + } else if (peer->su.sa.sa_family == AF_INET6) { + addpath_encoded = + bgp_addpath_encode_rx(peer, AFI_IP6, SAFI_UNICAST); + } /* Make dump stream. */ obuf = bgp_dump_obuf; stream_reset(obuf); /* Dump header and common part. */ - if (CHECK_FLAG(peer->cap, PEER_CAP_AS4_RCV)) { + if (CHECK_FLAG(peer->cap, PEER_CAP_AS4_RCV) && addpath_encoded) { + bgp_dump_header(obuf, MSG_PROTOCOL_BGP4MP, + BGP4MP_MESSAGE_AS4_ADDPATH, bgp_dump->type); + } else if (CHECK_FLAG(peer->cap, PEER_CAP_AS4_RCV)) { bgp_dump_header(obuf, MSG_PROTOCOL_BGP4MP, BGP4MP_MESSAGE_AS4, bgp_dump->type); + } else if (addpath_encoded) { + bgp_dump_header(obuf, MSG_PROTOCOL_BGP4MP, + BGP4MP_MESSAGE_ADDPATH, bgp_dump->type); } else { bgp_dump_header(obuf, MSG_PROTOCOL_BGP4MP, BGP4MP_MESSAGE, bgp_dump->type); |
