0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-23 02:01:55 +00:00
bird/proto/bmp/bmp.h
Maria Matejka cc0c8ce992 BMP: Fixing corner cases
Protocol state propagation collision, shutdown collision.
2024-12-10 23:41:48 +01:00

141 lines
4.6 KiB
C

/*
* BIRD -- The BGP Monitoring Protocol (BMP)
*
* (c) 2020 Akamai Technologies, Inc. (Pawel Maslanka, pmaslank@akamai.com)
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
#ifndef _BIRD_BMP_H_
#define _BIRD_BMP_H_
#include "nest/bird.h"
#include "nest/protocol.h"
#include "lib/lists.h"
#include "lib/tlists.h"
#include "nest/route.h"
#include "lib/event.h"
#include "lib/hash.h"
#include "lib/socket.h"
#include "proto/bgp/bgp.h"
// Max length of MIB-II description object
#define MIB_II_STR_LEN 255
// Total size of Common Header
#define BMP_COMMON_HDR_SIZE 6
/* BMP Per-Peer Header [RFC 7854 - Section 4.2] */
// Total size of Per-Peer Header
#define BMP_PER_PEER_HDR_SIZE 42
// Maximum length of BMP message altogether
#define BMP_MSGBUF_LEN (BGP_MAX_EXT_MSG_LENGTH + BMP_PER_PEER_HDR_SIZE + BMP_COMMON_HDR_SIZE + 1)
// The following fields of this structure controls whether there will be put
// specific routes into Route Monitoring message and send to BMP collector
struct monitoring_rib {
bool in_pre_policy; // Monitoring pre-policy Adj-Rib-In
bool in_post_policy; // Monitoring post-policy Adj-Rib-In
bool local; // Monitoring Local Rib
};
struct bmp_config {
struct proto_config c;
const char *sys_descr; // sysDescr MIB-II [RFC1213] object
const char *sys_name; // sysName MIB-II [RFC1213] object
ip_addr local_addr; // Local IP address
ip_addr station_ip; // Monitoring station address
u16 station_port; // Monitoring station TCP port
bool monitoring_rib_in_pre_policy; // Route monitoring pre-policy Adj-Rib-In
bool monitoring_rib_in_post_policy; // Route monitoring post-policy Adj-Rib-In
uint tx_pending_limit; // Maximum on pending TX buffer count
};
struct bmp_proto {
struct proto p; // Parent proto
const struct bmp_config *cf; // Shortcut to BMP configuration
HASH(struct bmp_peer) peer_map;
HASH(struct bmp_stream) stream_map;
HASH(struct bmp_table) table_map;
sock *sk; // TCP connection
event *tx_ev; // TX event
event *update_ev; // Update event
char sys_descr[MIB_II_STR_LEN]; // sysDescr MIB-II [RFC1213] object
char sys_name[MIB_II_STR_LEN]; // sysName MIB-II [RFC1213] object
ip_addr local_addr; // Source local IP address
ip_addr station_ip; // Monitoring station IP address
u16 station_port; // Monitoring station TCP port
struct monitoring_rib monitoring_rib;
// Below fields are for internal use
struct bmp_tx_buffer *tx_pending;// This buffer waits for socket to flush
struct bmp_tx_buffer *tx_last; // This buffer is the last to flush
uint tx_pending_count; // How many buffers waiting for flush
uint tx_pending_limit; // Maximum on buffer count
u64 tx_sent; // Amount of data sent
u64 tx_sent_total; // Amount of data sent accumulated over reconnections
event *tx_overflow_event; // Too many buffers waiting for flush
timer *connect_retry_timer; // Timer for retrying connection to the BMP collector
bool started; // Flag that stores running status of BMP instance
int sock_err; // Last socket error code
struct lfjour_recipient proto_state_reader; // Reader of protocol states
event proto_state_changed;
byte msgbuf[BMP_MSGBUF_LEN]; // Buffer for preparing the messages before sending them out
};
struct bmp_stream {
TLIST_NODE(bmp_peer_stream, struct bmp_stream) peer_node;
TLIST_NODE(bmp_table_stream, struct bmp_stream) table_node;
bool sync;
bool shutting_down;
struct bmp_stream *next;
struct bmp_stream_info {
u32 channel_id;
ea_list *channel_state;
const char *channel_name;
u32 afi;
enum bmp_stream_policy {
BMP_STREAM_PRE_POLICY = 1,
BMP_STREAM_POST_POLICY,
} mode;
} info;
};
#define TLIST_PREFIX bmp_peer_stream
#define TLIST_TYPE struct bmp_stream
#define TLIST_ITEM peer_node
#define TLIST_WANT_ADD_TAIL
#include "lib/tlists.h"
#define TLIST_PREFIX bmp_table_stream
#define TLIST_TYPE struct bmp_stream
#define TLIST_ITEM table_node
#define TLIST_WANT_ADD_TAIL
#include "lib/tlists.h"
struct bmp_peer {
struct bmp_peer *next;
struct bmp_peer_info {
u32 proto_id;
ea_list *proto_state;
const char *proto_name;
} info;
TLIST_LIST(bmp_peer_stream) streams;
};
struct bmp_table {
struct bmp_table *next;
struct bmp_proto *p;
rtable *table;
struct rt_export_request out_req;
event event;
TLIST_LIST(bmp_table_stream) streams;
};
#endif /* _BIRD_BMP_H_ */