Statistics
| Branch: | Revision:

iof-bird-daemon / proto / bgp / bgp.h @ bf47fe4b

History | View | Annotate | Download (11.9 KB)

1
/*
2
 *        BIRD -- The Border Gateway Protocol
3
 *
4
 *        (c) 2000 Martin Mares <mj@ucw.cz>
5
 *
6
 *        Can be freely distributed and used under the terms of the GNU GPL.
7
 */
8

    
9
#ifndef _BIRD_BGP_H_
10
#define _BIRD_BGP_H_
11

    
12
#include <stdint.h>
13
#include "nest/route.h"
14

    
15
struct linpool;
16
struct eattr;
17

    
18
struct bgp_config {
19
  struct proto_config c;
20
  u32 local_as, remote_as;
21
  ip_addr remote_ip;
22
  int multihop;                                /* Number of hops if multihop */
23
  ip_addr multihop_via;                        /* Multihop: address to route to */
24
  ip_addr source_addr;                        /* Source address to use */
25
  int next_hop_self;                        /* Always set next hop to local IP address */
26
  int missing_lladdr;                        /* What we will do when we don' know link-local addr, see MLL_* */
27
  int compare_path_lengths;                /* Use path lengths when selecting best route */
28
  int prefer_older;                        /* Prefer older routes according to RFC 5004 */
29
  u32 default_local_pref;                /* Default value for LOCAL_PREF attribute */
30
  u32 default_med;                        /* Default value for MULTI_EXIT_DISC attribute */
31
  int capabilities;                        /* Enable capability handshake [RFC3392] */
32
  int enable_refresh;                        /* Enable local support for route refresh [RFC2918] */
33
  int enable_as4;                        /* Enable local support for 4B AS numbers [RFC4893] */
34
  u32 rr_cluster_id;                        /* Route reflector cluster ID, if different from local ID */
35
  int rr_client;                        /* Whether neighbor is RR client of me */
36
  int rs_client;                        /* Whether neighbor is RS client of me */
37
  int advertise_ipv4;                        /* Whether we should add IPv4 capability advertisement to OPEN message */
38
  u32 route_limit;                        /* Number of routes that may be imported, 0 means disable limit */
39
  int passive;                                /* Do not initiate outgoing connection */
40
  unsigned connect_retry_time;
41
  unsigned hold_time, initial_hold_time;
42
  unsigned keepalive_time;
43
  unsigned start_delay_time;                /* Minimum delay between connects */
44
  unsigned error_amnesia_time;                /* Errors are forgotten after */
45
  unsigned error_delay_time_min;        /* Time to wait after an error is detected */
46
  unsigned error_delay_time_max;
47
  unsigned disable_after_error;                /* Disable the protocol when error is detected */
48
  char *password;                        /* Password used for MD5 authentication */
49
};
50

    
51
#define MLL_SELF 1
52
#define MLL_DROP 2
53
#define MLL_IGNORE 3
54

    
55
struct bgp_conn {
56
  struct bgp_proto *bgp;
57
  struct birdsock *sk;
58
  unsigned int state;                        /* State of connection state machine */
59
  struct timer *connect_retry_timer;
60
  struct timer *hold_timer;
61
  struct timer *keepalive_timer;
62
  struct event *tx_ev;
63
  int packets_to_send;                        /* Bitmap of packet types to be sent */
64
  int notify_code, notify_subcode, notify_size;
65
  byte *notify_data;
66
  u32 advertised_as;                        /* Temporary value for AS number received */
67
  int start_state;                        /* protocol start_state snapshot when connection established */
68
  int want_as4_support;                        /* Connection tries to establish AS4 session */
69
  int peer_as4_support;                        /* Peer supports 4B AS numbers [RFC4893] */
70
  int peer_refresh_support;                /* Peer supports route refresh [RFC2918] */
71
  unsigned hold_time, keepalive_time;        /* Times calculated from my and neighbor's requirements */
72
};
73

    
74
struct bgp_proto {
75
  struct proto p;
76
  struct bgp_config *cf;                /* Shortcut to BGP configuration */
77
  u32 local_as, remote_as;
78
  int start_state;                        /* Substates that partitions BS_START */
79
  int is_internal;                        /* Internal BGP connection (local_as == remote_as) */
80
  int as4_session;                        /* Session uses 4B AS numbers in AS_PATH (both sides support it) */
81
  u32 local_id;                                /* BGP identifier of this router */
82
  u32 remote_id;                        /* BGP identifier of the neighbor */
83
  u32 rr_cluster_id;                        /* Route reflector cluster ID */
84
  int rr_client;                        /* Whether neighbor is RR client of me */
85
  int rs_client;                        /* Whether neighbor is RS client of me */
86
  struct bgp_conn *conn;                /* Connection we have established */
87
  struct bgp_conn outgoing_conn;        /* Outgoing connection we're working with */
88
  struct bgp_conn incoming_conn;        /* Incoming connection we have neither accepted nor rejected yet */
89
  struct object_lock *lock;                /* Lock for neighbor connection */
90
  ip_addr next_hop;                        /* Either the peer or multihop_via */
91
  struct neighbor *neigh;                /* Neighbor entry corresponding to next_hop */
92
  ip_addr local_addr;                        /* Address of the local end of the link to next_hop */
93
  ip_addr source_addr;                        /* Address used as advertised next hop, usually local_addr */
94
  struct event *event;                        /* Event for respawning and shutting process */
95
  struct timer *startup_timer;                /* Timer used to delay protocol startup due to previous errors (startup_delay) */
96
  struct bgp_bucket **bucket_hash;        /* Hash table of attribute buckets */
97
  unsigned int hash_size, hash_count, hash_limit;
98
  struct fib prefix_fib;                /* Prefixes to be sent */
99
  list bucket_queue;                        /* Queue of buckets to send */
100
  struct bgp_bucket *withdraw_bucket;        /* Withdrawn routes */
101
  unsigned startup_delay;                /* Time to delay protocol startup by due to errors */
102
  bird_clock_t last_proto_error;        /* Time of last error that leads to protocol stop */
103
  u8 last_error_class;                         /* Error class of last error */
104
  u32 last_error_code;                        /* Error code of last error. BGP protocol errors
105
                                           are encoded as (bgp_err_code << 16 | bgp_err_subcode) */
106
#ifdef IPV6
107
  byte *mp_reach_start, *mp_unreach_start; /* Multiprotocol BGP attribute notes */
108
  unsigned mp_reach_len, mp_unreach_len;
109
  ip_addr local_link;                        /* Link-level version of local_addr */
110
#endif
111
};
112

    
113
struct bgp_prefix {
114
  struct fib_node n;                        /* Node in prefix fib */
115
  node bucket_node;                        /* Node in per-bucket list */
116
};
117

    
118
struct bgp_bucket {
119
  node send_node;                        /* Node in send queue */
120
  struct bgp_bucket *hash_next, *hash_prev;        /* Node in bucket hash table */
121
  unsigned hash;                        /* Hash over extended attributes */
122
  list prefixes;                        /* Prefixes in this buckets */
123
  ea_list eattrs[0];                        /* Per-bucket extended attributes */
124
};
125

    
126
#define BGP_PORT                179
127
#define BGP_VERSION                4
128
#define BGP_HEADER_LENGTH        19
129
#define BGP_MAX_PACKET_LENGTH        4096
130
#define BGP_RX_BUFFER_SIZE        4096
131
#define BGP_TX_BUFFER_SIZE        BGP_MAX_PACKET_LENGTH
132

    
133
extern struct linpool *bgp_linpool;
134

    
135
extern int bgp_as4_support;
136

    
137

    
138
void bgp_start_timer(struct timer *t, int value);
139
void bgp_check(struct bgp_config *c);
140
void bgp_error(struct bgp_conn *c, unsigned code, unsigned subcode, byte *data, int len);
141
void bgp_close_conn(struct bgp_conn *c);
142
void bgp_update_startup_delay(struct bgp_proto *p);
143
void bgp_conn_enter_established_state(struct bgp_conn *conn);
144
void bgp_conn_enter_close_state(struct bgp_conn *conn);
145
void bgp_conn_enter_idle_state(struct bgp_conn *conn);
146
void bgp_store_error(struct bgp_proto *p, struct bgp_conn *c, u8 class, u32 code);
147
int bgp_apply_limits(struct bgp_proto *p);
148
void bgp_stop(struct bgp_proto *p, unsigned subcode);
149

    
150

    
151

    
152
#ifdef LOCAL_DEBUG
153
#define BGP_FORCE_DEBUG 1
154
#else
155
#define BGP_FORCE_DEBUG 0
156
#endif
157
#define BGP_TRACE(flags, msg, args...) do { if ((p->p.debug & flags) || BGP_FORCE_DEBUG) \
158
        log(L_TRACE "%s: " msg, p->p.name , ## args ); } while(0)
159

    
160
#define BGP_TRACE_RL(rl, flags, msg, args...) do { if ((p->p.debug & flags) || BGP_FORCE_DEBUG) \
161
        log_rl(rl, L_TRACE "%s: " msg, p->p.name , ## args ); } while(0)
162

    
163

    
164
/* attrs.c */
165

    
166
/* Hack: although BA_NEXT_HOP attribute has type EAF_TYPE_IP_ADDRESS, in IPv6
167
 * we store two addesses in it - a global address and a link local address.
168
 */
169
#ifdef IPV6
170
#define NEXT_HOP_LENGTH (2*sizeof(ip_addr))
171
static inline void set_next_hop(byte *b, ip_addr addr) { ((ip_addr *) b)[0] = addr; ((ip_addr *) b)[1] = IPA_NONE; }
172
#else
173
#define NEXT_HOP_LENGTH sizeof(ip_addr)
174
static inline void set_next_hop(byte *b, ip_addr addr) { ((ip_addr *) b)[0] = addr; }
175
#endif
176

    
177
void bgp_attach_attr(struct ea_list **to, struct linpool *pool, unsigned attr, uintptr_t val);
178
byte *bgp_attach_attr_wa(struct ea_list **to, struct linpool *pool, unsigned attr, unsigned len);
179
struct rta *bgp_decode_attrs(struct bgp_conn *conn, byte *a, unsigned int len, struct linpool *pool, int mandatory);
180
int bgp_get_attr(struct eattr *e, byte *buf, int buflen);
181
int bgp_rte_better(struct rte *, struct rte *);
182
void bgp_rt_notify(struct proto *, struct network *, struct rte *, struct rte *, struct ea_list *);
183
int bgp_import_control(struct proto *, struct rte **, struct ea_list **, struct linpool *);
184
void bgp_attr_init(struct bgp_proto *);
185
unsigned int bgp_encode_attrs(struct bgp_proto *p, byte *w, ea_list *attrs, int remains);
186
void bgp_free_bucket(struct bgp_proto *p, struct bgp_bucket *buck);
187
void bgp_get_route_info(struct rte *, byte *buf, struct ea_list *attrs);
188

    
189
inline static void bgp_attach_attr_ip(struct ea_list **to, struct linpool *pool, unsigned attr, ip_addr a)
190
{ *(ip_addr *) bgp_attach_attr_wa(to, pool, attr, sizeof(ip_addr)) = a; }
191

    
192
/* packets.c */
193

    
194
void bgp_schedule_packet(struct bgp_conn *conn, int type);
195
void bgp_kick_tx(void *vconn);
196
void bgp_tx(struct birdsock *sk);
197
int bgp_rx(struct birdsock *sk, int size);
198
const byte * bgp_error_dsc(byte *buff, unsigned code, unsigned subcode);
199
void bgp_log_error(struct bgp_proto *p, u8 class, char *msg, unsigned code, unsigned subcode, byte *data, unsigned len);
200

    
201
/* Packet types */
202

    
203
#define PKT_OPEN                0x01
204
#define PKT_UPDATE                0x02
205
#define PKT_NOTIFICATION        0x03
206
#define PKT_KEEPALIVE                0x04
207
#define PKT_ROUTE_REFRESH        0x05
208
#define PKT_SCHEDULE_CLOSE        0x1f        /* Used internally to schedule socket close */
209

    
210
/* Attributes */
211

    
212
#define BAF_OPTIONAL                0x80
213
#define BAF_TRANSITIVE                0x40
214
#define BAF_PARTIAL                0x20
215
#define BAF_EXT_LEN                0x10
216

    
217
#define BA_ORIGIN                0x01        /* [RFC1771] */                /* WM */
218
#define BA_AS_PATH                0x02                                /* WM */
219
#define BA_NEXT_HOP                0x03                                /* WM */
220
#define BA_MULTI_EXIT_DISC        0x04                                /* ON */
221
#define BA_LOCAL_PREF                0x05                                /* WD */
222
#define BA_ATOMIC_AGGR                0x06                                /* WD */
223
#define BA_AGGREGATOR                0x07                                /* OT */
224
#define BA_COMMUNITY                0x08        /* [RFC1997] */                /* OT */
225
#define BA_ORIGINATOR_ID        0x09        /* [RFC1966] */                /* ON */
226
#define BA_CLUSTER_LIST                0x0a                                /* ON */
227
/* We don't support these: */
228
#define BA_DPA                        0x0b        /* ??? */
229
#define BA_ADVERTISER                0x0c        /* [RFC1863] */
230
#define BA_RCID_PATH                0x0d
231
#define BA_MP_REACH_NLRI        0x0e        /* [RFC2283] */
232
#define BA_MP_UNREACH_NLRI        0x0f
233
#define BA_EXTENDED_COMM        0x10        /* draft-ramachandra-bgp-ext-communities */
234
#define BA_AS4_PATH             0x11    /* [RFC4893] */
235
#define BA_AS4_AGGREGATOR       0x12
236

    
237
/* BGP connection states */
238

    
239
#define BS_IDLE                        0
240
#define BS_CONNECT                1        /* Attempting to connect */
241
#define BS_ACTIVE                2        /* Waiting for connection retry & listening */
242
#define BS_OPENSENT                3
243
#define BS_OPENCONFIRM                4
244
#define BS_ESTABLISHED                5
245
#define BS_CLOSE                6        /* Used during transition to BS_IDLE */
246

    
247
/* BGP start states
248
 * 
249
 * Used in PS_START for fine-grained specification of starting state.
250
 *
251
 * When BGP protocol is started by core, it goes to BSS_PREPARE. When BGP protocol
252
 * done what is neccessary to start itself (like acquiring the lock), it goes to BSS_CONNECT.
253
 * When some connection attempt failed because of option or capability error, it goes to
254
 * BSS_CONNECT_NOCAP.
255
 */
256

    
257
#define BSS_PREPARE                0        /* Used before ordinary BGP started, i. e. waiting for lock */
258
#define BSS_DELAY                1        /* Startup delay due to previous errors */
259
#define BSS_CONNECT                2        /* Ordinary BGP connecting */
260
#define BSS_CONNECT_NOCAP        3        /* Legacy BGP connecting (without capabilities) */
261

    
262
/* Error classes */
263

    
264
#define BE_NONE                        0
265
#define BE_MISC                        1        /* Miscellaneous error */
266
#define BE_SOCKET                2        /* Socket error */
267
#define BE_BGP_RX                3        /* BGP protocol error notification received */
268
#define BE_BGP_TX                4        /* BGP protocol error notification sent */
269
#define BE_AUTO_DOWN                5        /* Automatic shutdown */
270
#define BE_MAN_DOWN                6        /* Manual shutdown */
271

    
272
/* Misc error codes */
273

    
274
#define BEM_NEIGHBOR_LOST        1
275
#define BEM_INVALID_NEXT_HOP        2
276
#define BEM_INVALID_MD5                3        /* MD5 authentication kernel request failed (possibly not supported) */
277

    
278
/* Automatic shutdown error codes */
279

    
280
#define BEA_ROUTE_LIMIT_EXCEEDED 1
281

    
282
/* Well-known communities */
283

    
284
#define BGP_COMM_NO_EXPORT                0xffffff01        /* Don't export outside local AS / confed. */
285
#define BGP_COMM_NO_ADVERTISE                0xffffff02        /* Don't export at all */
286
#define BGP_COMM_NO_EXPORT_SUBCONFED        0xffffff03        /* NO_EXPORT even in local confederation */
287

    
288
/* Origins */
289

    
290
#define ORIGIN_IGP                0
291
#define ORIGIN_EGP                1
292
#define ORIGIN_INCOMPLETE        2
293

    
294
/* Address families */
295

    
296
#define BGP_AF_IPV4                1
297
#define BGP_AF_IPV6                2
298

    
299
#endif