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); diff --git a/bgpd/bgp_dump.h b/bgpd/bgp_dump.h index 86c80d481c..a8cbd8ed2c 100644 --- a/bgpd/bgp_dump.h +++ b/bgpd/bgp_dump.h @@ -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