mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-28 07:40:02 +00:00
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>
This commit is contained in:
parent
497bb82b62
commit
1073f44d4d
@ -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);
|
||||
|
@ -27,22 +27,30 @@
|
||||
#define MSG_PROTOCOL_BGP4MP_ET 17
|
||||
|
||||
/* subtype value */
|
||||
#define BGP4MP_STATE_CHANGE 0
|
||||
#define BGP4MP_MESSAGE 1
|
||||
#define BGP4MP_ENTRY 2
|
||||
#define BGP4MP_SNAPSHOT 3
|
||||
#define BGP4MP_MESSAGE_AS4 4
|
||||
#define BGP4MP_STATE_CHANGE_AS4 5
|
||||
#define BGP4MP_STATE_CHANGE 0
|
||||
#define BGP4MP_MESSAGE 1
|
||||
#define BGP4MP_ENTRY 2
|
||||
#define BGP4MP_SNAPSHOT 3
|
||||
#define BGP4MP_MESSAGE_AS4 4
|
||||
#define BGP4MP_STATE_CHANGE_AS4 5
|
||||
#define BGP4MP_MESSAGE_ADDPATH 8
|
||||
#define BGP4MP_MESSAGE_AS4_ADDPATH 9
|
||||
#define BGP4MP_MESSAGE_LOCAL_ADDPATH 10
|
||||
#define BGP4MP_MESSAGE_AS4_LOCAL_ADDPATH 11
|
||||
|
||||
#define BGP_DUMP_HEADER_SIZE 12
|
||||
#define BGP_DUMP_MSG_HEADER 40
|
||||
|
||||
#define TABLE_DUMP_V2_PEER_INDEX_TABLE 1
|
||||
#define TABLE_DUMP_V2_RIB_IPV4_UNICAST 2
|
||||
#define TABLE_DUMP_V2_PEER_INDEX_TABLE 1
|
||||
#define TABLE_DUMP_V2_RIB_IPV4_UNICAST 2
|
||||
#define TABLE_DUMP_V2_RIB_IPV4_MULTICAST 3
|
||||
#define TABLE_DUMP_V2_RIB_IPV6_UNICAST 4
|
||||
#define TABLE_DUMP_V2_RIB_IPV6_UNICAST 4
|
||||
#define TABLE_DUMP_V2_RIB_IPV6_MULTICAST 5
|
||||
#define TABLE_DUMP_V2_RIB_GENERIC 6
|
||||
#define TABLE_DUMP_V2_RIB_IPV4_UNICAST_ADDPATH 8
|
||||
#define TABLE_DUMP_V2_RIB_IPV4_MULTICAST_ADDPATH 9
|
||||
#define TABLE_DUMP_V2_RIB_IPV6_UNICAST_ADDPATH 10
|
||||
#define TABLE_DUMP_V2_RIB_IPV6_MULTICAST_ADDPATH 11
|
||||
#define TABLE_DUMP_V2_RIB_GENERIC_ADDPATH 12
|
||||
|
||||
#define TABLE_DUMP_V2_PEER_INDEX_TABLE_IP 0
|
||||
#define TABLE_DUMP_V2_PEER_INDEX_TABLE_IP6 1
|
||||
|
Loading…
Reference in New Issue
Block a user