xref: /openbsd/usr.sbin/bgpd/bgpd.h (revision 17df1aa7)
1 /*	$OpenBSD: bgpd.h,v 1.258 2010/05/03 13:09:38 claudio Exp $ */
2 
3 /*
4  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 #ifndef __BGPD_H__
19 #define	__BGPD_H__
20 
21 #include <sys/types.h>
22 #include <sys/socket.h>
23 #include <sys/queue.h>
24 #include <net/route.h>
25 #include <netinet/in.h>
26 #include <arpa/inet.h>
27 #include <net/if.h>
28 #include <net/pfkeyv2.h>
29 
30 #include <poll.h>
31 #include <stdarg.h>
32 
33 #include <imsg.h>
34 
35 #define	BGP_VERSION			4
36 #define	BGP_PORT			179
37 #define	CONFFILE			"/etc/bgpd.conf"
38 #define	BGPD_USER			"_bgpd"
39 #define	PEER_DESCR_LEN			32
40 #define	PFTABLE_LEN			16
41 #define	TCP_MD5_KEY_LEN			80
42 #define	IPSEC_ENC_KEY_LEN		32
43 #define	IPSEC_AUTH_KEY_LEN		20
44 
45 #define	MAX_PKTSIZE			4096
46 #define	MIN_HOLDTIME			3
47 #define	READ_BUF_SIZE			65535
48 #define	RT_BUF_SIZE			16384
49 #define	MAX_RTSOCK_BUF			128 * 1024
50 
51 #define	BGPD_OPT_VERBOSE		0x0001
52 #define	BGPD_OPT_VERBOSE2		0x0002
53 #define	BGPD_OPT_NOACTION		0x0004
54 #define	BGPD_OPT_FORCE_DEMOTE		0x0008
55 
56 #define	BGPD_FLAG_NO_EVALUATE		0x0002
57 #define	BGPD_FLAG_REFLECTOR		0x0004
58 #define	BGPD_FLAG_REDIST_STATIC		0x0008
59 #define	BGPD_FLAG_REDIST_CONNECTED	0x0010
60 #define	BGPD_FLAG_REDIST6_STATIC	0x0020
61 #define	BGPD_FLAG_REDIST6_CONNECTED	0x0040
62 #define	BGPD_FLAG_NEXTHOP_BGP		0x0080
63 #define	BGPD_FLAG_NEXTHOP_DEFAULT	0x1000
64 #define	BGPD_FLAG_DECISION_MASK		0x0f00
65 #define	BGPD_FLAG_DECISION_ROUTEAGE	0x0100
66 #define	BGPD_FLAG_DECISION_TRANS_AS	0x0200
67 #define	BGPD_FLAG_DECISION_MED_ALWAYS	0x0400
68 
69 #define	BGPD_LOG_UPDATES		0x0001
70 
71 #define	SOCKET_NAME			"/var/run/bgpd.sock"
72 
73 #define	F_BGPD_INSERTED		0x0001
74 #define	F_KERNEL		0x0002
75 #define	F_CONNECTED		0x0004
76 #define	F_NEXTHOP		0x0008
77 #define	F_DOWN			0x0010
78 #define	F_STATIC		0x0020
79 #define	F_DYNAMIC		0x0040
80 #define	F_REJECT		0x0080
81 #define	F_BLACKHOLE		0x0100
82 #define	F_LONGER		0x0200
83 #define	F_CTL_DETAIL		0x1000	/* only used by bgpctl */
84 #define	F_CTL_ADJ_IN		0x2000
85 #define	F_CTL_ADJ_OUT		0x4000
86 
87 /*
88  * Limit the number of control messages generated by the RDE and queued in
89  * session engine. The RDE limit defines how many imsg are generated in
90  * one poll round. Then if the SE limit is hit the RDE control socket will no
91  * longer be polled.
92  */
93 #define RDE_RUNNER_ROUNDS	100
94 #define SESSION_CTL_QUEUE_MAX	10000
95 
96 enum {
97 	PROC_MAIN,
98 	PROC_SE,
99 	PROC_RDE
100 } bgpd_process;
101 
102 enum reconf_action {
103 	RECONF_NONE,
104 	RECONF_KEEP,
105 	RECONF_REINIT,
106 	RECONF_DELETE
107 };
108 
109 /* Address Family Numbers as per RFC 1700 */
110 #define	AFI_UNSPEC	0
111 #define	AFI_IPv4	1
112 #define	AFI_IPv6	2
113 
114 /* Subsequent Address Family Identifier as per RFC 4760 */
115 #define	SAFI_NONE	0
116 #define	SAFI_UNICAST	1
117 #define	SAFI_MULTICAST	2
118 #define	SAFI_MPLS	4
119 #define	SAFI_MPLSVPN	128
120 
121 struct aid {
122 	u_int16_t	 afi;
123 	sa_family_t	 af;
124 	u_int8_t	 safi;
125 	char		*name;
126 };
127 
128 extern const struct aid aid_vals[];
129 
130 #define	AID_UNSPEC	0
131 #define	AID_INET	1
132 #define	AID_INET6	2
133 #define	AID_VPN_IPv4	3
134 #define	AID_MAX		4
135 
136 #define AID_VALS	{					\
137 	/* afi, af, safii, name */				\
138 	{ AFI_UNSPEC, AF_UNSPEC, SAFI_NONE, "unspec"},		\
139 	{ AFI_IPv4, AF_INET, SAFI_UNICAST, "IPv4 unicast" },	\
140 	{ AFI_IPv6, AF_INET6, SAFI_UNICAST, "IPv6 unicast" },	\
141 	{ AFI_IPv4, AF_INET, SAFI_MPLSVPN, "IPv4 vpn" }		\
142 }
143 
144 #define AID_PTSIZE	{				\
145 	0,						\
146 	sizeof(struct pt_entry4), 			\
147 	sizeof(struct pt_entry6),			\
148 	sizeof(struct pt_entry_vpn4)			\
149 }
150 
151 struct vpn4_addr {
152 	u_int64_t	rd;
153 	struct in_addr	addr;
154 	u_int8_t	labelstack[21];	/* max that makes sense */
155 	u_int8_t	labellen;
156 	u_int8_t	pad1;
157 	u_int8_t	pad2;
158 };
159 
160 #define BGP_MPLS_BOS	0x01
161 
162 struct bgpd_addr {
163 	union {
164 		struct in_addr		v4;
165 		struct in6_addr		v6;
166 		struct vpn4_addr	vpn4;
167 		/* maximum size for a prefix is 256 bits */
168 		u_int8_t		addr8[32];
169 		u_int16_t		addr16[16];
170 		u_int32_t		addr32[8];
171 	} ba;		    /* 128-bit address */
172 	u_int32_t	scope_id;	/* iface scope id for v6 */
173 	u_int8_t	aid;
174 #define	v4	ba.v4
175 #define	v6	ba.v6
176 #define	vpn4	ba.vpn4
177 #define	addr8	ba.addr8
178 #define	addr16	ba.addr16
179 #define	addr32	ba.addr32
180 };
181 
182 #define	DEFAULT_LISTENER	0x01
183 #define	LISTENER_LISTENING	0x02
184 
185 struct listen_addr {
186 	TAILQ_ENTRY(listen_addr)	 entry;
187 	struct sockaddr_storage		 sa;
188 	int				 fd;
189 	enum reconf_action		 reconf;
190 	u_int8_t			 flags;
191 };
192 
193 TAILQ_HEAD(listen_addrs, listen_addr);
194 TAILQ_HEAD(filter_set_head, filter_set);
195 
196 struct bgpd_config {
197 	struct filter_set_head			 connectset;
198 	struct filter_set_head			 connectset6;
199 	struct filter_set_head			 staticset;
200 	struct filter_set_head			 staticset6;
201 	struct listen_addrs			*listen_addrs;
202 	char					*csock;
203 	char					*rcsock;
204 	int					 opts;
205 	int					 flags;
206 	int					 log;
207 	u_int					 rtableid;
208 	u_int32_t				 bgpid;
209 	u_int32_t				 clusterid;
210 	u_int32_t				 as;
211 	u_int16_t				 short_as;
212 	u_int16_t				 holdtime;
213 	u_int16_t				 min_holdtime;
214 	u_int16_t				 connectretry;
215 };
216 
217 enum announce_type {
218 	ANNOUNCE_UNDEF,
219 	ANNOUNCE_SELF,
220 	ANNOUNCE_NONE,
221 	ANNOUNCE_DEFAULT_ROUTE,
222 	ANNOUNCE_ALL
223 };
224 
225 enum enforce_as {
226 	ENFORCE_AS_UNDEF,
227 	ENFORCE_AS_OFF,
228 	ENFORCE_AS_ON
229 };
230 
231 enum auth_method {
232 	AUTH_NONE,
233 	AUTH_MD5SIG,
234 	AUTH_IPSEC_MANUAL_ESP,
235 	AUTH_IPSEC_MANUAL_AH,
236 	AUTH_IPSEC_IKE_ESP,
237 	AUTH_IPSEC_IKE_AH
238 };
239 
240 struct peer_auth {
241 	char			md5key[TCP_MD5_KEY_LEN];
242 	char			auth_key_in[IPSEC_AUTH_KEY_LEN];
243 	char			auth_key_out[IPSEC_AUTH_KEY_LEN];
244 	char			enc_key_in[IPSEC_ENC_KEY_LEN];
245 	char			enc_key_out[IPSEC_ENC_KEY_LEN];
246 	u_int32_t		spi_in;
247 	u_int32_t		spi_out;
248 	enum auth_method	method;
249 	u_int8_t		md5key_len;
250 	u_int8_t		auth_alg_in;
251 	u_int8_t		auth_alg_out;
252 	u_int8_t		auth_keylen_in;
253 	u_int8_t		auth_keylen_out;
254 	u_int8_t		enc_alg_in;
255 	u_int8_t		enc_alg_out;
256 	u_int8_t		enc_keylen_in;
257 	u_int8_t		enc_keylen_out;
258 };
259 
260 struct capabilities {
261 	int8_t	mp[AID_MAX];	/* multiprotocol extensions, RFC 4760 */
262 	int8_t	refresh;	/* route refresh, RFC 2918 */
263 	int8_t	restart;	/* graceful restart, RFC 4724 */
264 	int8_t	as4byte;	/* draft-ietf-idr-as4bytes-13 */
265 };
266 
267 struct peer_config {
268 	struct bgpd_addr	 remote_addr;
269 	struct bgpd_addr	 local_addr;
270 	struct peer_auth	 auth;
271 	struct capabilities	 capabilities;
272 	char			 group[PEER_DESCR_LEN];
273 	char			 descr[PEER_DESCR_LEN];
274 	char			 rib[PEER_DESCR_LEN];
275 	char			 if_depend[IFNAMSIZ];
276 	char			 demote_group[IFNAMSIZ];
277 	u_int32_t		 id;
278 	u_int32_t		 groupid;
279 	u_int32_t		 remote_as;
280 	u_int32_t		 local_as;
281 	u_int32_t		 max_prefix;
282 	enum announce_type	 announce_type;
283 	enum enforce_as		 enforce_as;
284 	enum reconf_action	 reconf_action;
285 	u_int16_t		 max_prefix_restart;
286 	u_int16_t		 holdtime;
287 	u_int16_t		 min_holdtime;
288 	u_int16_t		 local_short_as;
289 	u_int8_t		 template;
290 	u_int8_t		 remote_masklen;
291 	u_int8_t		 cloned;
292 	u_int8_t		 ebgp;		/* 1 = ebgp, 0 = ibgp */
293 	u_int8_t		 distance;	/* 1 = direct, >1 = multihop */
294 	u_int8_t		 passive;
295 	u_int8_t		 down;
296 	u_int8_t		 announce_capa;
297 	u_int8_t		 reflector_client;
298 	u_int8_t		 softreconfig_in;
299 	u_int8_t		 softreconfig_out;
300 	u_int8_t		 ttlsec;	/* TTL security hack */
301 	u_int8_t		 flags;
302 	u_int8_t		 pad[3];
303 };
304 
305 #define PEERFLAG_TRANS_AS	0x01
306 
307 struct network_config {
308 	struct bgpd_addr	prefix;
309 	struct filter_set_head	attrset;
310 	u_int8_t		prefixlen;
311 };
312 
313 TAILQ_HEAD(network_head, network);
314 
315 struct network {
316 	struct network_config	net;
317 	TAILQ_ENTRY(network)	entry;
318 };
319 
320 enum imsg_type {
321 	IMSG_NONE,
322 	IMSG_CTL_END,
323 	IMSG_CTL_RELOAD,
324 	IMSG_CTL_FIB_COUPLE,
325 	IMSG_CTL_FIB_DECOUPLE,
326 	IMSG_CTL_NEIGHBOR_UP,
327 	IMSG_CTL_NEIGHBOR_DOWN,
328 	IMSG_CTL_NEIGHBOR_CLEAR,
329 	IMSG_CTL_NEIGHBOR_RREFRESH,
330 	IMSG_CTL_KROUTE,
331 	IMSG_CTL_KROUTE_ADDR,
332 	IMSG_CTL_RESULT,
333 	IMSG_CTL_SHOW_NEIGHBOR,
334 	IMSG_CTL_SHOW_NEXTHOP,
335 	IMSG_CTL_SHOW_INTERFACE,
336 	IMSG_CTL_SHOW_RIB,
337 	IMSG_CTL_SHOW_RIB_AS,
338 	IMSG_CTL_SHOW_RIB_PREFIX,
339 	IMSG_CTL_SHOW_RIB_ATTR,
340 	IMSG_CTL_SHOW_RIB_COMMUNITY,
341 	IMSG_CTL_SHOW_NETWORK,
342 	IMSG_CTL_SHOW_RIB_MEM,
343 	IMSG_CTL_SHOW_TERSE,
344 	IMSG_CTL_SHOW_TIMER,
345 	IMSG_CTL_LOG_VERBOSE,
346 	IMSG_CTL_SHOW_FIB_TABLES,
347 	IMSG_NETWORK_ADD,
348 	IMSG_NETWORK_REMOVE,
349 	IMSG_NETWORK_FLUSH,
350 	IMSG_NETWORK_DONE,
351 	IMSG_FILTER_SET,
352 	IMSG_RECONF_CONF,
353 	IMSG_RECONF_RIB,
354 	IMSG_RECONF_PEER,
355 	IMSG_RECONF_FILTER,
356 	IMSG_RECONF_LISTENER,
357 	IMSG_RECONF_DONE,
358 	IMSG_UPDATE,
359 	IMSG_UPDATE_ERR,
360 	IMSG_SESSION_ADD,
361 	IMSG_SESSION_UP,
362 	IMSG_SESSION_DOWN,
363 	IMSG_MRT_OPEN,
364 	IMSG_MRT_REOPEN,
365 	IMSG_MRT_CLOSE,
366 	IMSG_KROUTE_CHANGE,
367 	IMSG_KROUTE_DELETE,
368 	IMSG_NEXTHOP_ADD,
369 	IMSG_NEXTHOP_REMOVE,
370 	IMSG_NEXTHOP_UPDATE,
371 	IMSG_PFTABLE_ADD,
372 	IMSG_PFTABLE_REMOVE,
373 	IMSG_PFTABLE_COMMIT,
374 	IMSG_REFRESH,
375 	IMSG_IFINFO,
376 	IMSG_DEMOTE
377 };
378 
379 struct demote_msg {
380 	char		 demote_group[IFNAMSIZ];
381 	int		 level;
382 };
383 
384 enum ctl_results {
385 	CTL_RES_OK,
386 	CTL_RES_NOSUCHPEER,
387 	CTL_RES_DENIED,
388 	CTL_RES_NOCAP,
389 	CTL_RES_PARSE_ERROR,
390 	CTL_RES_NOMEM
391 };
392 
393 /* needed for session.h parse prototype */
394 LIST_HEAD(mrt_head, mrt);
395 
396 /* error codes and subcodes needed in SE and RDE */
397 enum err_codes {
398 	ERR_HEADER = 1,
399 	ERR_OPEN,
400 	ERR_UPDATE,
401 	ERR_HOLDTIMEREXPIRED,
402 	ERR_FSM,
403 	ERR_CEASE
404 };
405 
406 enum suberr_update {
407 	ERR_UPD_UNSPECIFIC,
408 	ERR_UPD_ATTRLIST,
409 	ERR_UPD_UNKNWN_WK_ATTR,
410 	ERR_UPD_MISSNG_WK_ATTR,
411 	ERR_UPD_ATTRFLAGS,
412 	ERR_UPD_ATTRLEN,
413 	ERR_UPD_ORIGIN,
414 	ERR_UPD_LOOP,
415 	ERR_UPD_NEXTHOP,
416 	ERR_UPD_OPTATTR,
417 	ERR_UPD_NETWORK,
418 	ERR_UPD_ASPATH
419 };
420 
421 enum suberr_cease {
422 	ERR_CEASE_MAX_PREFIX = 1,
423 	ERR_CEASE_ADMIN_DOWN,
424 	ERR_CEASE_PEER_UNCONF,
425 	ERR_CEASE_ADMIN_RESET,
426 	ERR_CEASE_CONN_REJECT,
427 	ERR_CEASE_OTHER_CHANGE,
428 	ERR_CEASE_COLLISION,
429 	ERR_CEASE_RSRC_EXHAUST
430 };
431 
432 struct kroute_node;
433 struct kroute6_node;
434 struct knexthop_node;
435 struct redist_node;
436 RB_HEAD(kroute_tree, kroute_node);
437 RB_HEAD(kroute6_tree, kroute6_node);
438 RB_HEAD(knexthop_tree, knexthop_node);
439 
440 struct ktable {
441 	char			 descr[PEER_DESCR_LEN];
442 	char			 ifmpe[IFNAMSIZ];
443 	struct kroute_tree	 krt;
444 	struct kroute6_tree	 krt6;
445 	struct knexthop_tree	 knt;
446 	struct network_head	 krn;
447 	LIST_HEAD(, redist_node) redistlist;
448 	u_int			 rtableid;
449 	u_int			 nhtableid; /* rdomain id for nexthop lookup */
450 	u_int			 ifindex;   /* ifindex of ifmpe */
451 	int			 nhrefcnt;  /* refcnt for nexthop table */
452 	enum reconf_action	 state;
453 	u_int8_t		 fib_conf;  /* configured FIB sync flag */
454 	u_int8_t		 fib_sync;  /* is FIB synced with kernel? */
455 };
456 
457 struct kroute_full {
458 	struct bgpd_addr	prefix;
459 	struct bgpd_addr	nexthop;
460 	char			label[RTLABEL_LEN];
461 	u_int16_t		flags;
462 	u_short			ifindex;
463 	u_int8_t		prefixlen;
464 	u_int8_t		priority;
465 };
466 
467 struct kroute {
468 	struct in_addr	prefix;
469 	struct in_addr	nexthop;
470 	u_int16_t	flags;
471 	u_int16_t	labelid;
472 	u_short		ifindex;
473 	u_int8_t	prefixlen;
474 	u_int8_t	priority;
475 };
476 
477 struct kroute6 {
478 	struct in6_addr	prefix;
479 	struct in6_addr	nexthop;
480 	u_int16_t	flags;
481 	u_int16_t	labelid;
482 	u_short		ifindex;
483 	u_int8_t	prefixlen;
484 	u_int8_t	priority;
485 };
486 
487 struct kroute_nexthop {
488 	struct bgpd_addr	nexthop;
489 	struct bgpd_addr	gateway;
490 	struct bgpd_addr	net;
491 	u_int8_t		valid;
492 	u_int8_t		connected;
493 	u_int8_t		netlen;
494 };
495 
496 struct kif {
497 	char			 ifname[IFNAMSIZ];
498 	u_int64_t		 baudrate;
499 	int			 flags;
500 	u_short			 ifindex;
501 	u_int8_t		 media_type;
502 	u_int8_t		 link_state;
503 	u_int8_t		 nh_reachable;	/* for nexthop verification */
504 };
505 
506 struct session_up {
507 	struct bgpd_addr	local_addr;
508 	struct bgpd_addr	remote_addr;
509 	struct capabilities	capa;
510 	u_int32_t		remote_bgpid;
511 	u_int16_t		short_as;
512 };
513 
514 struct pftable_msg {
515 	struct bgpd_addr	addr;
516 	char			pftable[PFTABLE_LEN];
517 	u_int8_t		len;
518 };
519 
520 struct ctl_show_nexthop {
521 	struct bgpd_addr	addr;
522 	struct kif		kif;
523 	union {
524 		struct kroute		kr4;
525 		struct kroute6		kr6;
526 	} kr;
527 	u_int8_t		valid;
528 	u_int8_t		krvalid;;
529 };
530 
531 struct ctl_neighbor {
532 	struct bgpd_addr	addr;
533 	char			descr[PEER_DESCR_LEN];
534 	int			show_timers;
535 };
536 
537 #define	F_PREF_ELIGIBLE	0x01
538 #define	F_PREF_ACTIVE	0x02
539 #define	F_PREF_INTERNAL	0x04
540 #define	F_PREF_ANNOUNCE	0x08
541 
542 struct ctl_show_rib {
543 	struct bgpd_addr	true_nexthop;
544 	struct bgpd_addr	exit_nexthop;
545 	struct bgpd_addr	prefix;
546 	struct bgpd_addr	remote_addr;
547 	char			descr[PEER_DESCR_LEN];
548 	time_t			lastchange;
549 	u_int32_t		remote_id;
550 	u_int32_t		local_pref;
551 	u_int32_t		med;
552 	u_int32_t		prefix_cnt;
553 	u_int32_t		active_cnt;
554 	u_int32_t		rib_cnt;
555 	u_int16_t		aspath_len;
556 	u_int16_t		flags;
557 	u_int8_t		prefixlen;
558 	u_int8_t		origin;
559 	/* plus a aspath_len bytes long aspath */
560 };
561 
562 struct ctl_show_rib_prefix {
563 	struct bgpd_addr	prefix;
564 	time_t			lastchange;
565 	u_int16_t		flags;
566 	u_int8_t		prefixlen;
567 };
568 
569 enum as_spec {
570 	AS_NONE,
571 	AS_ALL,
572 	AS_SOURCE,
573 	AS_TRANSIT,
574 	AS_PEER,
575 	AS_EMPTY
576 };
577 
578 struct filter_as {
579 	u_int32_t	as;
580 	u_int16_t	flags;
581 	enum as_spec	type;
582 };
583 
584 #define AS_FLAG_NEIGHBORAS	0x01
585 
586 struct filter_community {
587 	int			as;
588 	int			type;
589 };
590 
591 struct filter_extcommunity {
592 	u_int16_t	flags;
593 	u_int8_t	type;
594 	u_int8_t	subtype;	/* if extended type */
595 	union {
596 		struct ext_as {
597 			u_int16_t	as;
598 			u_int32_t	val;
599 		}		ext_as;
600 		struct ext_as4 {
601 			u_int32_t	as4;
602 			u_int16_t	val;
603 		}		ext_as4;
604 		struct ext_ip {
605 			struct in_addr	addr;
606 			u_int16_t	val;
607 		}		ext_ip;
608 		u_int64_t	ext_opaq;	/* only 48 bits */
609 	}		data;
610 };
611 
612 
613 struct ctl_show_rib_request {
614 	char			rib[PEER_DESCR_LEN];
615 	struct ctl_neighbor	neighbor;
616 	struct bgpd_addr	prefix;
617 	struct filter_as	as;
618 	struct filter_community community;
619 	u_int32_t		peerid;
620 	pid_t			pid;
621 	u_int16_t		flags;
622 	enum imsg_type		type;
623 	u_int8_t		prefixlen;
624 	u_int8_t		aid;
625 };
626 
627 enum filter_actions {
628 	ACTION_NONE,
629 	ACTION_ALLOW,
630 	ACTION_DENY
631 };
632 
633 enum directions {
634 	DIR_IN = 1,
635 	DIR_OUT
636 };
637 
638 enum from_spec {
639 	FROM_ALL,
640 	FROM_ADDRESS,
641 	FROM_DESCR,
642 	FROM_GROUP
643 };
644 
645 enum comp_ops {
646 	OP_NONE,
647 	OP_RANGE,
648 	OP_XRANGE,
649 	OP_EQ,
650 	OP_NE,
651 	OP_LE,
652 	OP_LT,
653 	OP_GE,
654 	OP_GT
655 };
656 
657 struct filter_peers {
658 	u_int32_t	peerid;
659 	u_int32_t	groupid;
660 	u_int16_t	ribid;
661 };
662 
663 /* special community type */
664 #define	COMMUNITY_ERROR			-1
665 #define	COMMUNITY_ANY			-2
666 #define	COMMUNITY_NEIGHBOR_AS		-3
667 #define	COMMUNITY_UNSET			-4
668 #define	COMMUNITY_WELLKNOWN		0xffff
669 #define	COMMUNITY_NO_EXPORT		0xff01
670 #define	COMMUNITY_NO_ADVERTISE		0xff02
671 #define	COMMUNITY_NO_EXPSUBCONFED	0xff03
672 #define	COMMUNITY_NO_PEER		0xff04	/* RFC 3765 */
673 
674 /* extended community definitions */
675 #define EXT_COMMUNITY_IANA		0x80
676 #define EXT_COMMUNITY_TRANSITIVE	0x40
677 #define EXT_COMMUNITY_VALUE		0x3f
678 /* extended types */
679 #define EXT_COMMUNITY_TWO_AS		0	/* 2 octet AS specific */
680 #define EXT_COMMUNITY_IPV4		1	/* IPv4 specific */
681 #define EXT_COMMUNITY_FOUR_AS		2	/* 4 octet AS specific */
682 #define EXT_COMMUNITY_OPAQUE		3	/* opaque ext community */
683 /* sub types */
684 #define EXT_COMMUNITY_ROUTE_TGT		2	/* RFC 4360 & RFC4364 */
685 #define EXT_CUMMUNITY_ROUTE_ORIG	3	/* RFC 4360 & RFC4364 */
686 #define EXT_COMMUNITY_OSPF_DOM_ID	5	/* RFC 4577 */
687 #define EXT_COMMUNITY_OSPF_RTR_TYPE	6	/* RFC 4577 */
688 #define EXT_COMMUNITY_OSPF_RTR_ID	7	/* RFC 4577 */
689 #define EXT_COMMUNITY_BGP_COLLECT	8	/* RFC 4384 */
690 /* other handy defines */
691 #define EXT_COMMUNITY_OPAQUE_MAX	0xffffffffffffULL
692 #define EXT_COMMUNITY_FLAG_VALID	0x01
693 
694 struct ext_comm_pairs {
695 	u_int8_t	type;
696 	u_int8_t	subtype;
697 	u_int8_t	transitive;	/* transitive bit needs to be set */
698 };
699 
700 #define IANA_EXT_COMMUNITIES	{					\
701 	{ EXT_COMMUNITY_TWO_AS, EXT_COMMUNITY_ROUTE_TGT, 0 },		\
702 	{ EXT_COMMUNITY_TWO_AS, EXT_CUMMUNITY_ROUTE_ORIG, 0 },		\
703 	{ EXT_COMMUNITY_TWO_AS, EXT_COMMUNITY_OSPF_DOM_ID, 0 },		\
704 	{ EXT_COMMUNITY_TWO_AS, EXT_COMMUNITY_BGP_COLLECT, 0 },		\
705 	{ EXT_COMMUNITY_FOUR_AS, EXT_COMMUNITY_ROUTE_TGT, 0 },		\
706 	{ EXT_COMMUNITY_FOUR_AS, EXT_CUMMUNITY_ROUTE_ORIG, 0 },		\
707 	{ EXT_COMMUNITY_IPV4, EXT_COMMUNITY_ROUTE_TGT, 0 },		\
708 	{ EXT_COMMUNITY_IPV4, EXT_CUMMUNITY_ROUTE_ORIG, 0 },		\
709 	{ EXT_COMMUNITY_IPV4, EXT_COMMUNITY_OSPF_RTR_ID, 0 },		\
710 	{ EXT_COMMUNITY_OPAQUE, EXT_COMMUNITY_OSPF_RTR_TYPE, 0 }	\
711 }
712 
713 
714 struct filter_prefix {
715 	struct bgpd_addr	addr;
716 	u_int8_t		len;
717 };
718 
719 struct filter_prefixlen {
720 	enum comp_ops		op;
721 	u_int8_t		aid;
722 	u_int8_t		len_min;
723 	u_int8_t		len_max;
724 };
725 
726 struct filter_match {
727 	struct filter_prefix		prefix;
728 	struct filter_prefixlen		prefixlen;
729 	struct filter_as		as;
730 	struct filter_community		community;
731 	struct filter_extcommunity	ext_community;
732 };
733 
734 TAILQ_HEAD(filter_head, filter_rule);
735 
736 struct filter_rule {
737 	TAILQ_ENTRY(filter_rule)	entry;
738 	char				rib[PEER_DESCR_LEN];
739 	struct filter_peers		peer;
740 	struct filter_match		match;
741 	struct filter_set_head		set;
742 	enum filter_actions		action;
743 	enum directions			dir;
744 	u_int8_t			quick;
745 };
746 
747 enum action_types {
748 	ACTION_SET_LOCALPREF,
749 	ACTION_SET_RELATIVE_LOCALPREF,
750 	ACTION_SET_MED,
751 	ACTION_SET_RELATIVE_MED,
752 	ACTION_SET_WEIGHT,
753 	ACTION_SET_RELATIVE_WEIGHT,
754 	ACTION_SET_PREPEND_SELF,
755 	ACTION_SET_PREPEND_PEER,
756 	ACTION_SET_NEXTHOP,
757 	ACTION_SET_NEXTHOP_REJECT,
758 	ACTION_SET_NEXTHOP_BLACKHOLE,
759 	ACTION_SET_NEXTHOP_NOMODIFY,
760 	ACTION_SET_NEXTHOP_SELF,
761 	ACTION_SET_COMMUNITY,
762 	ACTION_DEL_COMMUNITY,
763 	ACTION_SET_EXT_COMMUNITY,
764 	ACTION_DEL_EXT_COMMUNITY,
765 	ACTION_PFTABLE,
766 	ACTION_PFTABLE_ID,
767 	ACTION_RTLABEL,
768 	ACTION_RTLABEL_ID,
769 	ACTION_SET_ORIGIN
770 };
771 
772 struct filter_set {
773 	TAILQ_ENTRY(filter_set)		entry;
774 	union {
775 		u_int8_t		prepend;
776 		u_int16_t		id;
777 		u_int32_t		metric;
778 		int32_t			relative;
779 		struct bgpd_addr	nexthop;
780 		struct filter_community	community;
781 		struct filter_extcommunity	ext_community;
782 		char			pftable[PFTABLE_LEN];
783 		char			rtlabel[RTLABEL_LEN];
784 		u_int8_t		origin;
785 	} action;
786 	enum action_types		type;
787 };
788 
789 struct rde_rib {
790 	SIMPLEQ_ENTRY(rde_rib)	entry;
791 	char			name[PEER_DESCR_LEN];
792 	u_int			rtableid;
793 	u_int16_t		id;
794 	u_int16_t		flags;
795 };
796 SIMPLEQ_HEAD(rib_names, rde_rib);
797 extern struct rib_names ribnames;
798 
799 /* rde_rib flags */
800 #define F_RIB_ENTRYLOCK		0x0001
801 #define F_RIB_NOEVALUATE	0x0002
802 #define F_RIB_NOFIB		0x0004
803 #define F_RIB_NOFIBSYNC		0x0008
804 #define F_RIB_HASNOFIB		(F_RIB_NOFIB | F_RIB_NOEVALUATE)
805 
806 /* 4-byte magic AS number */
807 #define AS_TRANS	23456
808 
809 struct rde_memstats {
810 	int64_t		path_cnt;
811 	int64_t		prefix_cnt;
812 	int64_t		rib_cnt;
813 	int64_t		pt_cnt[AID_MAX];
814 	int64_t		nexthop_cnt;
815 	int64_t		aspath_cnt;
816 	int64_t		aspath_size;
817 	int64_t		aspath_refs;
818 	int64_t		attr_cnt;
819 	int64_t		attr_refs;
820 	int64_t		attr_data;
821 	int64_t		attr_dcnt;
822 };
823 
824 /* prototypes */
825 /* bgpd.c */
826 void		 send_nexthop_update(struct kroute_nexthop *);
827 void		 send_imsg_session(int, pid_t, void *, u_int16_t);
828 int		 bgpd_redistribute(int, struct kroute *, struct kroute6 *);
829 int		 bgpd_filternexthop(struct kroute *, struct kroute6 *);
830 
831 /* log.c */
832 void		 log_init(int);
833 void		 log_verbose(int);
834 void		 vlog(int, const char *, va_list);
835 void		 log_peer_warn(const struct peer_config *, const char *, ...);
836 void		 log_peer_warnx(const struct peer_config *, const char *, ...);
837 void		 log_warn(const char *, ...);
838 void		 log_warnx(const char *, ...);
839 void		 log_info(const char *, ...);
840 void		 log_debug(const char *, ...);
841 void		 fatal(const char *) __dead;
842 void		 fatalx(const char *) __dead;
843 
844 /* parse.y */
845 int	 cmdline_symset(char *);
846 
847 /* config.c */
848 int	 host(const char *, struct bgpd_addr *, u_int8_t *);
849 
850 /* kroute.c */
851 int		 kr_init(void);
852 int		 ktable_update(struct rde_rib *);
853 void		 ktable_preload(void);
854 void		 ktable_postload(void);
855 int		 ktable_exists(u_int, u_int *);
856 int		 kr_change(u_int, struct kroute_full *);
857 int		 kr_delete(u_int, struct kroute_full *);
858 void		 kr_shutdown(void);
859 void		 kr_fib_couple(u_int);
860 void		 kr_fib_decouple(u_int);
861 int		 kr_dispatch_msg(void);
862 int		 kr_nexthop_add(u_int32_t, struct bgpd_addr *);
863 void		 kr_nexthop_delete(u_int32_t, struct bgpd_addr *);
864 void		 kr_show_route(struct imsg *);
865 void		 kr_ifinfo(char *);
866 int		 kr_net_reload(u_int, struct network_head *);
867 int		 kr_reload(void);
868 struct in6_addr	*prefixlen2mask6(u_int8_t prefixlen);
869 
870 /* control.c */
871 void	control_cleanup(const char *);
872 int	control_imsg_relay(struct imsg *);
873 
874 /* pftable.c */
875 int	pftable_exists(const char *);
876 int	pftable_add(const char *);
877 int	pftable_clear_all(void);
878 int	pftable_addr_add(struct pftable_msg *);
879 int	pftable_addr_remove(struct pftable_msg *);
880 int	pftable_commit(void);
881 
882 /* name2id.c */
883 u_int16_t	 rib_name2id(const char *);
884 const char	*rib_id2name(u_int16_t);
885 void		 rib_unref(u_int16_t);
886 void		 rib_ref(u_int16_t);
887 u_int16_t	 rtlabel_name2id(const char *);
888 const char	*rtlabel_id2name(u_int16_t);
889 void		 rtlabel_unref(u_int16_t);
890 void		 rtlabel_ref(u_int16_t);
891 u_int16_t	 pftable_name2id(const char *);
892 const char	*pftable_id2name(u_int16_t);
893 void		 pftable_unref(u_int16_t);
894 void		 pftable_ref(u_int16_t);
895 
896 
897 /* rde_filter.c */
898 void		 filterset_free(struct filter_set_head *);
899 int		 filterset_cmp(struct filter_set *, struct filter_set *);
900 const char	*filterset_name(enum action_types);
901 
902 /* util.c */
903 const char	*log_addr(const struct bgpd_addr *);
904 const char	*log_in6addr(const struct in6_addr *);
905 const char	*log_sockaddr(struct sockaddr *);
906 const char	*log_as(u_int32_t);
907 const char	*log_rd(u_int64_t);
908 const char	*log_ext_subtype(u_int8_t);
909 int		 aspath_snprint(char *, size_t, void *, u_int16_t);
910 int		 aspath_asprint(char **, void *, u_int16_t);
911 size_t		 aspath_strlen(void *, u_int16_t);
912 in_addr_t	 prefixlen2mask(u_int8_t);
913 void		 inet6applymask(struct in6_addr *, const struct in6_addr *,
914 		    int);
915 const char	*aid2str(u_int8_t);
916 int		 aid2afi(u_int8_t, u_int16_t *, u_int8_t *);
917 int		 afi2aid(u_int16_t, u_int8_t, u_int8_t *);
918 sa_family_t	 aid2af(u_int8_t);
919 int		 af2aid(sa_family_t, u_int8_t, u_int8_t *);
920 struct sockaddr	*addr2sa(struct bgpd_addr *, u_int16_t);
921 void		 sa2addr(struct sockaddr *, struct bgpd_addr *);
922 
923 #endif /* __BGPD_H__ */
924