2010-01-03 11:17:52 +00:00
|
|
|
/*
|
2015-11-12 12:07:04 +00:00
|
|
|
* BIRD -- Multi-Threaded Routing Toolkit (MRT) Routing Information Export Format
|
2010-01-03 11:17:52 +00:00
|
|
|
*
|
2015-11-12 12:07:04 +00:00
|
|
|
* (c) 2015 CZ.NIC z.s.p.o.
|
2010-01-03 11:17:52 +00:00
|
|
|
*
|
|
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
|
|
*/
|
|
|
|
|
2015-11-12 12:07:04 +00:00
|
|
|
#ifndef _BIRD_MRTDUMP_H_
|
|
|
|
#define _BIRD_MRTDUMP_H_
|
|
|
|
|
|
|
|
#include <limits.h>
|
|
|
|
|
2010-01-03 11:17:52 +00:00
|
|
|
#include "nest/protocol.h"
|
2015-11-12 12:07:04 +00:00
|
|
|
#include "lib/lists.h"
|
|
|
|
#include "nest/route.h"
|
|
|
|
#include "lib/event.h"
|
|
|
|
|
|
|
|
#define MRT_HDR_LENGTH 12 /* MRT Timestamp + MRT Type + MRT Subtype + MRT Load Length */
|
|
|
|
#define MRT_PEER_TYPE_32BIT_ASN 2 /* MRT Table Dump: Peer Index Table: Peer Type: Use 32bit ASN */
|
|
|
|
#define MRT_PEER_TYPE_IPV6 1 /* MRT Table Dump: Peer Index Table: Peer Type: Use IPv6 IP Address */
|
2010-01-03 11:17:52 +00:00
|
|
|
|
2015-11-12 12:07:04 +00:00
|
|
|
#ifdef PATH_MAX
|
|
|
|
#define BIRD_PATH_MAX PATH_MAX
|
|
|
|
#else
|
|
|
|
#define BIRD_PATH_MAX 4096
|
|
|
|
#endif
|
2010-01-03 11:17:52 +00:00
|
|
|
|
2015-11-12 12:07:04 +00:00
|
|
|
/* MRT Types */
|
|
|
|
#define MRT_TABLE_DUMP_V2 13
|
|
|
|
#define MRT_BGP4MP 16
|
2010-01-03 11:17:52 +00:00
|
|
|
|
2015-11-12 12:07:04 +00:00
|
|
|
/* MRT Table Dump v2 Subtypes */
|
|
|
|
#define MRT_PEER_INDEX_TABLE 1
|
|
|
|
#define MRT_RIB_IPV4_UNICAST 2
|
|
|
|
#define MRT_RIB_IPV4_MULTICAST 3
|
|
|
|
#define MRT_RIB_IPV6_UNICAST 4
|
|
|
|
#define MRT_RIB_IPV6_MULTICAST 5
|
|
|
|
#define MRT_RIB_GENERIC 6
|
2016-01-05 18:48:35 +00:00
|
|
|
#define MRT_RIB_IPV4_UNICAST_ADDPATH 8 /* Experimental draft-petrie-grow-mrt-add-paths */
|
|
|
|
#define MRT_RIB_IPV4_MULTICAST_ADDPATH 9 /* Experimental draft-petrie-grow-mrt-add-paths */
|
|
|
|
#define MRT_RIB_IPV6_UNICAST_ADDPATH 10 /* Experimental draft-petrie-grow-mrt-add-paths */
|
|
|
|
#define MRT_RIB_IPV6_MULTICAST_ADDPATH 11 /* Experimental draft-petrie-grow-mrt-add-paths */
|
|
|
|
#define MRT_RIB_GENERIC_ADDPATH 12 /* Experimental draft-petrie-grow-mrt-add-paths */
|
|
|
|
#define MRT_RIB_NO_ADDPATH 0
|
|
|
|
#define MRT_RIB_ADDPATH 1
|
2010-01-06 15:57:20 +00:00
|
|
|
|
2015-11-12 12:07:04 +00:00
|
|
|
/* MRT BGP4MP Subtypes */
|
|
|
|
#define MRT_BGP4MP_MESSAGE 1
|
|
|
|
#define MRT_BGP4MP_MESSAGE_AS4 4
|
2016-01-05 16:53:58 +00:00
|
|
|
#define MRT_BGP4MP_STATE_CHANGE_AS4 5
|
|
|
|
#define MRT_BGP4MP_MESSAGE_ADDPATH 8 /* Experimental draft-petrie-grow-mrt-add-paths */
|
|
|
|
#define MRT_BGP4MP_MESSAGE_AS4_ADDPATH 9 /* Experimental draft-petrie-grow-mrt-add-paths */
|
2010-01-03 11:17:52 +00:00
|
|
|
|
2015-11-12 12:07:04 +00:00
|
|
|
struct mrt_buffer
|
|
|
|
{
|
|
|
|
byte *msg; /* Buffer with final formatted data */
|
|
|
|
size_t msg_length; /* Size of used buffer */
|
|
|
|
size_t msg_capacity; /* Number of allocated bytes in msg */
|
|
|
|
#define MRT_BUFFER_DEFAULT_CAPACITY 64 /* Size in bytes */
|
|
|
|
};
|
2010-01-06 15:57:20 +00:00
|
|
|
|
2015-11-12 12:07:04 +00:00
|
|
|
struct mrt_peer_index_table
|
|
|
|
{
|
|
|
|
struct mrt_buffer msg;
|
|
|
|
u16 peer_count; /* Datatype u16 should fit with the size 16bit in MRT packet */
|
|
|
|
u32 peer_count_offset;
|
|
|
|
};
|
2010-01-03 11:17:52 +00:00
|
|
|
|
2015-11-12 12:07:04 +00:00
|
|
|
struct mrt_rib_table
|
|
|
|
{
|
|
|
|
struct mrt_buffer msg;
|
|
|
|
int subtype; /* RIB_IPV4_UNICAST or RIB_IPV6_UNICAST */
|
|
|
|
u16 entry_count; /* Number of RIB Entries */
|
|
|
|
u32 entry_count_offset; /* Offset in msg->msg[?] to position where start the entries count */
|
|
|
|
};
|
2010-01-03 11:17:52 +00:00
|
|
|
|
2015-11-12 12:07:04 +00:00
|
|
|
struct mrt_rib_entry
|
|
|
|
{
|
|
|
|
u16 peer_index;
|
|
|
|
u32 originated_time;
|
2016-01-05 18:48:35 +00:00
|
|
|
u32 path_id; /* draft-petrie-grow-mrt-add-paths */
|
2015-11-12 12:07:04 +00:00
|
|
|
u16 attributes_length;
|
|
|
|
byte *attributes; /* encoded BGP attributes */
|
|
|
|
};
|
2010-01-03 11:17:52 +00:00
|
|
|
|
2015-11-12 12:07:04 +00:00
|
|
|
struct mrt_table_dump_ctx {
|
|
|
|
struct rtable *rtable;
|
|
|
|
struct fib_iterator fit;
|
|
|
|
struct mrt_rib_table rib_table;
|
|
|
|
u32 rib_sequence_number;
|
|
|
|
struct rfile *rfile; /* tracking for mrt table dump file */
|
|
|
|
char *file_path; /* full path for mrt table dump file */
|
|
|
|
byte state;
|
|
|
|
#define MRT_STATE_RUNNING 0
|
|
|
|
#define MRT_STATE_COMPLETED 1
|
|
|
|
event *step;
|
|
|
|
struct mrt_table_individual_config config; /* Own special configuration of MRT */
|
|
|
|
};
|
|
|
|
|
|
|
|
void mrt_buffer_alloc(struct mrt_buffer *buf);
|
|
|
|
void mrt_buffer_free(struct mrt_buffer *buf);
|
|
|
|
|
|
|
|
void mrt_peer_index_table_header(struct mrt_peer_index_table *state, u32 collector_bgp_id, const char *name);
|
|
|
|
void mrt_peer_index_table_add_peer(struct mrt_peer_index_table *state, u32 peer_bgp_id, u32 peer_as, ip_addr peer_ip_addr);
|
|
|
|
void mrt_peer_index_table_dump(struct mrt_peer_index_table *state, int file_descriptor);
|
|
|
|
|
|
|
|
void mrt_rib_table_alloc(struct mrt_rib_table *state);
|
2016-01-05 18:48:35 +00:00
|
|
|
void mrt_rib_table_header(struct mrt_rib_table *state, u32 sequence_number, u8 prefix_length, ip_addr prefix, uint is_addpath);
|
2015-11-12 12:07:04 +00:00
|
|
|
void mrt_rib_table_add_entry(struct mrt_rib_table *state, const struct mrt_rib_entry *entry);
|
|
|
|
|
|
|
|
/* implemented in sysdep */
|
|
|
|
void mrt_dump_message_proto(struct proto *p, u16 type, u16 subtype, byte *buf, u32 len);
|
|
|
|
void mrt_dump_message(int file_descriptor, u16 type, u16 subtype, byte *buf, u32 len);
|
2010-01-03 11:17:52 +00:00
|
|
|
|
2015-11-12 12:07:04 +00:00
|
|
|
#endif /* _BIRD_MRTDUMP_H_ */
|