2018-11-21 00:38:19 +08:00
|
|
|
/*
|
|
|
|
* BIRD -- Multi-Threaded Routing Toolkit (MRT) Protocol
|
|
|
|
*
|
|
|
|
* (c) 2017--2018 Ondrej Zajicek <santiago@crfreenet.org>
|
|
|
|
* (c) 2017--2018 CZ.NIC z.s.p.o.
|
|
|
|
*
|
|
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _BIRD_MRT_H_
|
|
|
|
#define _BIRD_MRT_H_
|
|
|
|
|
|
|
|
#include "nest/bird.h"
|
|
|
|
#include "nest/protocol.h"
|
|
|
|
#include "lib/lists.h"
|
|
|
|
#include "nest/route.h"
|
|
|
|
#include "lib/event.h"
|
|
|
|
#include "lib/hash.h"
|
|
|
|
|
|
|
|
|
|
|
|
struct mrt_config {
|
|
|
|
struct proto_config c;
|
|
|
|
|
|
|
|
struct rtable_config *table_cf;
|
|
|
|
const char *table_expr;
|
2019-02-15 20:53:17 +08:00
|
|
|
const struct filter *filter;
|
2018-11-21 00:38:19 +08:00
|
|
|
const char *filename;
|
|
|
|
uint period;
|
|
|
|
int always_add_path;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mrt_proto {
|
|
|
|
struct proto p;
|
|
|
|
timer *timer;
|
|
|
|
event *event;
|
|
|
|
|
|
|
|
struct mrt_target *file;
|
|
|
|
struct mrt_table_dump_state *table_dump;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mrt_dump_data {
|
|
|
|
const char *table_expr;
|
|
|
|
struct rtable *table_ptr;
|
2019-02-15 20:53:17 +08:00
|
|
|
const struct filter *filter;
|
2020-04-09 04:25:15 +08:00
|
|
|
const char *filename;
|
2018-11-21 00:38:19 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct mrt_peer_entry {
|
|
|
|
u32 index;
|
|
|
|
u32 peer_id;
|
|
|
|
u32 peer_as;
|
|
|
|
ip_addr peer_ip;
|
|
|
|
struct mrt_peer_entry *next;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mrt_table_dump_state {
|
|
|
|
struct mrt_proto *proto; /* Protocol for regular MRT dumps (or NULL) */
|
|
|
|
struct cli *cli; /* CLI for irregular MRT dumps (or NULL) */
|
|
|
|
struct config *config; /* Config valid during start of dump, locked */
|
|
|
|
|
|
|
|
/* Configuration information */
|
|
|
|
const char *table_expr; /* Wildcard for table name (or NULL) */
|
|
|
|
struct rtable *table_ptr; /* Explicit table (or NULL) */
|
2019-02-15 20:53:17 +08:00
|
|
|
const struct filter *filter; /* Optional filter */
|
2018-11-21 00:38:19 +08:00
|
|
|
const char *filename; /* Filename pattern */
|
|
|
|
int always_add_path; /* Always use *_ADDPATH message subtypes */
|
|
|
|
|
|
|
|
/* Allocated by mrt_table_dump_init() */
|
|
|
|
pool *pool; /* Pool for table dump */
|
|
|
|
linpool *linpool; /* Temporary linear pool */
|
|
|
|
linpool *peer_lp; /* Linear pool for peer entries in peer_hash */
|
|
|
|
buffer buf; /* Buffer for MRT messages */
|
|
|
|
|
|
|
|
HASH(struct mrt_peer_entry) peer_hash; /* Hash for peers to find the index */
|
|
|
|
|
|
|
|
struct rtable *table; /* Processed table, NULL initially */
|
|
|
|
struct fib_iterator fit; /* Iterator in processed table */
|
|
|
|
int table_open; /* Whether iterator is linked */
|
|
|
|
|
|
|
|
int ipv4; /* Processed table is IPv4 */
|
|
|
|
int add_path; /* Current message subtype is *_ADDPATH */
|
|
|
|
int want_add_path; /* Want *_ADDPATH message later */
|
|
|
|
int max; /* Decreasing counter of dumped routes */
|
|
|
|
u32 seqnum; /* MRT message sequence number */
|
|
|
|
btime time_offset; /* Time offset between monotonic and real time */
|
|
|
|
struct bgp_write_state *bws; /* */
|
|
|
|
|
|
|
|
u16 peer_count; /* Number of peers */
|
|
|
|
u32 peer_count_offset; /* Buffer offset to store peer_count later */
|
|
|
|
u16 entry_count; /* Number of RIB Entries */
|
|
|
|
u32 entry_count_offset; /* Buffer offset to store entry_count later */
|
|
|
|
|
|
|
|
struct rfile *file; /* tracking for mrt table dump file */
|
|
|
|
int fd;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mrt_bgp_data {
|
|
|
|
uint peer_as;
|
|
|
|
uint local_as;
|
|
|
|
uint index;
|
|
|
|
uint af;
|
|
|
|
ip_addr peer_ip;
|
|
|
|
ip_addr local_ip;
|
|
|
|
byte *message;
|
|
|
|
uint msg_len;
|
|
|
|
uint old_state;
|
|
|
|
uint new_state;
|
|
|
|
u8 as4;
|
|
|
|
u8 add_path;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#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 */
|
|
|
|
|
|
|
|
#define MRT_ATTR_BUFFER_SIZE 65536
|
|
|
|
|
|
|
|
/* MRT Types */
|
|
|
|
#define MRT_TABLE_DUMP_V2 13
|
|
|
|
#define MRT_BGP4MP 16
|
|
|
|
|
|
|
|
/* 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
|
|
|
|
#define MRT_RIB_IPV4_UNICAST_ADDPATH 8
|
|
|
|
#define MRT_RIB_IPV4_MULTICAST_ADDPATH 9
|
|
|
|
#define MRT_RIB_IPV6_UNICAST_ADDPATH 10
|
|
|
|
#define MRT_RIB_IPV6_MULTICAST_ADDPATH 11
|
|
|
|
#define MRT_RIB_GENERIC_ADDPATH 12
|
|
|
|
|
|
|
|
/* MRT BGP4MP Subtypes */
|
|
|
|
#define MRT_BGP4MP_MESSAGE 1
|
|
|
|
#define MRT_BGP4MP_MESSAGE_AS4 4
|
|
|
|
#define MRT_BGP4MP_STATE_CHANGE_AS4 5
|
|
|
|
#define MRT_BGP4MP_MESSAGE_LOCAL 6
|
|
|
|
#define MRT_BGP4MP_MESSAGE_AS4_LOCAL 7
|
|
|
|
#define MRT_BGP4MP_MESSAGE_ADDPATH 8
|
|
|
|
#define MRT_BGP4MP_MESSAGE_AS4_ADDPATH 9
|
|
|
|
#define MRT_BGP4MP_MESSAGE_LOCAL_ADDPATH 10
|
|
|
|
#define MRT_BGP4MP_MESSAGE_AS4_LOCAL_ADDPATH 11
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_MRT
|
|
|
|
void mrt_dump_cmd(struct mrt_dump_data *d);
|
|
|
|
void mrt_dump_bgp_message(struct mrt_bgp_data *d);
|
|
|
|
void mrt_dump_bgp_state_change(struct mrt_bgp_data *d);
|
|
|
|
void mrt_check_config(struct proto_config *C);
|
|
|
|
#else
|
|
|
|
static inline void mrt_dump_bgp_message(struct mrt_bgp_data *d UNUSED) { }
|
|
|
|
static inline void mrt_dump_bgp_state_change(struct mrt_bgp_data *d UNUSED) { }
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* _BIRD_MRT_H_ */
|