summaryrefslogtreecommitdiff
path: root/proto/bmp/bmp.h
blob: 03c5f5299011e5572ef80beb0c666d3cefd509e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
 *	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 "nest/route.h"
#include "lib/event.h"
#include "lib/hash.h"
#include "lib/socket.h"
#include "proto/bmp/map.h"

#include <stdbool.h>

// Max length of MIB-II description object
#define MIB_II_STR_LEN 255

enum bmp_peer_down {
  // Value of packet size of 'pkt_size' argument of bmp_peer_down() function
  // used for pointing out that there was not any packet to pass
  BMP_PEER_DOWN_NULL_PKT_SIZE = 0
};

// 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;
  char *sys_descr;                    // sysDescr MIB-II [RFC1213] object
  char *sys_name;                     // sysName MIB-II [RFC1213] object
  ip_addr station_ip;                 // Monitoring station address
  u16 station_port;                   // Monitoring station TCP port
  bool disabled;                      // Manually disabled
  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
  bool monitoring_rib_local;          // Route monitoring Local Rib
};

/* Forward declarations */
struct bgp_proto;
struct bmp_proto;

struct bmp_conn {
  struct bmp_proto *bmp;
  struct birdsock *sk;
  event *tx_ev;
};

// Stores sent and received BGP OPEN MSGs
struct bmp_peer_open_msg {
  struct bmp_peer_map tx_msg;
  struct bmp_peer_map rx_msg;
};

// Keeps necessary information during composing BGP UPDATE MSG which is going
// to be sent to the BMP collector
struct rt_table_info {
  list update_msg_queue;         // Stores all composed BGP UPDATE MSGs
  size_t update_msg_size;        // Size of all BGP UPDATE MSGs
  struct timeval update_begin_time; // Keeps timestamp of starting BGP UPDATE MSGs composing
  bool update_in_progress;       // Holds information whether composing process is still in progress
};

struct bmp_proto {
  struct proto p;                  // Parent proto
  const struct bmp_config *cf;     // Shortcut to BMP configuration
  struct bmp_conn *conn;           // Connection we have established
  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 station_ip;              // Monitoring station IP address
  u16 station_port;                // Monitoring station TCP port
  bool disabled;                   // Manually disabled
  struct monitoring_rib monitoring_rib;
  // Below fields are for internal use
  int station_socket;              // Socket associated with the BMP collector
  struct bmp_peer_map bgp_peers;   // Stores 'bgp_proto' structure per BGP peer
  struct bmp_peer_open_msg peer_open_msg; // Stores sent and received BGP OPEN MSG per BGP peer
  pool *buffer_mpool;              // Memory pool used for BMP buffer allocations
  pool *map_mem_pool;              // Memory pool used for BMP map allocations
  pool *tx_mem_pool;               // Memory pool used for packet allocations designated to BMP collector
  pool *update_msg_mem_pool;       // Memory pool used for BPG UPDATE MSG allocations
  list tx_queue;                   // Stores queued packets going to be sent
  timer *connect_retry_timer;      // Timer for retrying connection to the BMP collector
  struct rt_table_info rt_table_in_pre_policy; // Pre-policy route import table
  bool station_connected;          // Flag that stores connection status with BMP station
  bool started;                    // Flag that stores running status of BMP instance
};

/**
 * bmp_put_sent_bgp_open_msg - save sent BGP OPEN msg packet in BMP implementation.
 * NOTE: If there has been passed sent and received BGP OPEN MSGs to the BMP
 *       implementation, then there is going to be send BMP Peer Up Notification
 *       message to the BMP collector.
 */
void
bmp_put_sent_bgp_open_msg(const struct bgp_proto *bgp, const byte* pkt,
  const size_t pkt_size);

/**
 * bmp_put_recv_bgp_open_msg - save received BGP OPEN msg packet in BMP implementation.
 * NOTE: If there has been passed sent and received BGP OPEN MSGs to the BMP
 *       implementation, then there is going to be send BMP Peer Up Notification
 *       message to the BMP collector.
 */
void
bmp_put_recv_bgp_open_msg(const struct bgp_proto *bgp, const byte* pkt,
  const size_t pkt_size);

/**
 * The following 4 functions create BMP Route Monitoring message based on
 * pre-policy Adj-RIB-In. Composing Route Monitoring message consist of few
 * stages. First of all call bmp_route_monitor_update_in_pre_begin() in order
 * to start composing message. As a second step, call
 * bmp_route_monitor_put_update_in_pre_msg() in order to save BGP UPDATE msg.
 * As a third step call bmp_route_monitor_update_in_pre_commit() in order to
 * send BMP Route Monitoring message to the BMP collector. As a last step,
 * call bmp_route_monitor_update_in_pre_end() in order to release resources.
 */
void
bmp_route_monitor_update_in_pre_begin(void);

void
bmp_route_monitor_put_update_in_pre_msg(const byte *data, const size_t data_size);

void
bmp_route_monitor_update_in_pre_commit(const struct bgp_proto *bgp);

void
bmp_route_monitor_update_in_pre_end(void);

/**
 * bmp_peer_down - send notification that BGP peer connection is not in
 * established state
 */
void
bmp_peer_down(const struct bgp_proto *bgp, const int err_class, const byte *pkt,
  size_t pkt_size);

#endif	/* _BIRD_BMP_H_ */