xref: /openbsd/usr.sbin/bgpd/session.h (revision 0d4ceb41)
1 /*	$OpenBSD: session.h,v 1.184 2024/12/16 16:10:10 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 
19 #include <sys/types.h>
20 #include <sys/socket.h>
21 #include <time.h>
22 
23 #define	MAX_BACKLOG			5
24 #define	INTERVAL_CONNECTRETRY		120
25 #define	INTERVAL_HOLD_INITIAL		240
26 #define	INTERVAL_HOLD			90
27 #define	INTERVAL_IDLE_HOLD_INITIAL	30
28 #define	INTERVAL_HOLD_DEMOTED		60
29 #define	INTERVAL_STALE			180
30 #define	INTERVAL_SESSION_DOWN		3600
31 #define	MAX_IDLE_HOLD			3600
32 #define	MSGSIZE_HEADER			19
33 #define	MSGSIZE_HEADER_MARKER		16
34 #define	MSGSIZE_NOTIFICATION_MIN	21	/* 19 hdr + 1 code + 1 sub */
35 #define	MSGSIZE_OPEN_MIN		29
36 #define	MSGSIZE_UPDATE_MIN		23
37 #define	MSGSIZE_KEEPALIVE		MSGSIZE_HEADER
38 #define	MSGSIZE_RREFRESH		(MSGSIZE_HEADER + 4)
39 #define	MSGSIZE_RREFRESH_MIN		MSGSIZE_RREFRESH
40 #define	MSG_PROCESS_LIMIT		25
41 #define	SESSION_CLEAR_DELAY		5
42 
43 enum session_state {
44 	STATE_NONE,
45 	STATE_IDLE,
46 	STATE_CONNECT,
47 	STATE_ACTIVE,
48 	STATE_OPENSENT,
49 	STATE_OPENCONFIRM,
50 	STATE_ESTABLISHED
51 };
52 
53 enum session_events {
54 	EVNT_NONE,
55 	EVNT_START,
56 	EVNT_STOP,
57 	EVNT_CON_OPEN,
58 	EVNT_CON_CLOSED,
59 	EVNT_CON_OPENFAIL,
60 	EVNT_CON_FATAL,
61 	EVNT_TIMER_CONNRETRY,
62 	EVNT_TIMER_HOLDTIME,
63 	EVNT_TIMER_KEEPALIVE,
64 	EVNT_TIMER_SENDHOLD,
65 	EVNT_RCVD_OPEN,
66 	EVNT_RCVD_KEEPALIVE,
67 	EVNT_RCVD_UPDATE,
68 	EVNT_RCVD_NOTIFICATION,
69 	EVNT_RCVD_GRACE_NOTIFICATION,
70 };
71 
72 enum msg_type {
73 	MSG_OPEN = 1,
74 	MSG_UPDATE,
75 	MSG_NOTIFICATION,
76 	MSG_KEEPALIVE,
77 	MSG_RREFRESH
78 };
79 
80 enum suberr_header {
81 	ERR_HDR_SYNC = 1,
82 	ERR_HDR_LEN,
83 	ERR_HDR_TYPE
84 };
85 
86 enum suberr_open {
87 	ERR_OPEN_VERSION = 1,
88 	ERR_OPEN_AS,
89 	ERR_OPEN_BGPID,
90 	ERR_OPEN_OPT,
91 	ERR_OPEN_AUTH,			/* deprecated */
92 	ERR_OPEN_HOLDTIME,
93 	ERR_OPEN_CAPA,
94 	ERR_OPEN_ROLE = 11,
95 };
96 
97 enum suberr_fsm {
98 	ERR_FSM_UNSPECIFIC = 0,
99 	ERR_FSM_UNEX_OPENSENT,
100 	ERR_FSM_UNEX_OPENCONFIRM,
101 	ERR_FSM_UNEX_ESTABLISHED
102 };
103 
104 enum opt_params {
105 	OPT_PARAM_NONE,
106 	OPT_PARAM_AUTH,
107 	OPT_PARAM_CAPABILITIES,
108 	OPT_PARAM_EXT_LEN=255,
109 };
110 
111 struct bgpd_sysdep {
112 	uint8_t			no_pfkey;
113 	uint8_t			no_md5sig;
114 };
115 
116 struct ctl_conn {
117 	TAILQ_ENTRY(ctl_conn)	entry;
118 	struct imsgbuf		imsgbuf;
119 	int			restricted;
120 	int			throttled;
121 	int			terminate;
122 };
123 
124 struct peer_stats {
125 	unsigned long long	 msg_rcvd_open;
126 	unsigned long long	 msg_rcvd_update;
127 	unsigned long long	 msg_rcvd_notification;
128 	unsigned long long	 msg_rcvd_keepalive;
129 	unsigned long long	 msg_rcvd_rrefresh;
130 	unsigned long long	 msg_sent_open;
131 	unsigned long long	 msg_sent_update;
132 	unsigned long long	 msg_sent_notification;
133 	unsigned long long	 msg_sent_keepalive;
134 	unsigned long long	 msg_sent_rrefresh;
135 	unsigned long long	 refresh_rcvd_req;
136 	unsigned long long	 refresh_rcvd_borr;
137 	unsigned long long	 refresh_rcvd_eorr;
138 	unsigned long long	 refresh_sent_req;
139 	unsigned long long	 refresh_sent_borr;
140 	unsigned long long	 refresh_sent_eorr;
141 	unsigned long long	 prefix_rcvd_update;
142 	unsigned long long	 prefix_rcvd_withdraw;
143 	unsigned long long	 prefix_rcvd_eor;
144 	unsigned long long	 prefix_sent_update;
145 	unsigned long long	 prefix_sent_withdraw;
146 	unsigned long long	 prefix_sent_eor;
147 	time_t			 last_updown;
148 	time_t			 last_read;
149 	time_t			 last_write;
150 	uint32_t		 msg_queue_len;
151 	uint32_t		 prefix_cnt;
152 	uint32_t		 prefix_out_cnt;
153 	uint32_t		 pending_update;
154 	uint32_t		 pending_withdraw;
155 	uint8_t			 last_sent_errcode;
156 	uint8_t			 last_sent_suberr;
157 	uint8_t			 last_rcvd_errcode;
158 	uint8_t			 last_rcvd_suberr;
159 	char			 last_reason[REASON_LEN];
160 };
161 
162 struct auth_state {
163 	struct bgpd_addr	local_addr;
164 	struct bgpd_addr	remote_addr;
165 	uint32_t		spi_in;
166 	uint32_t		spi_out;
167 	enum auth_method	method;
168 	uint8_t			established;
169 };
170 
171 enum Timer {
172 	Timer_None,
173 	Timer_ConnectRetry,
174 	Timer_Keepalive,
175 	Timer_Hold,
176 	Timer_SendHold,
177 	Timer_IdleHold,
178 	Timer_IdleHoldReset,
179 	Timer_CarpUndemote,
180 	Timer_RestartTimeout,
181 	Timer_SessionDown,
182 	Timer_Rtr_Refresh,
183 	Timer_Rtr_Retry,
184 	Timer_Rtr_Expire,
185 	Timer_Rtr_Active,
186 	Timer_Max
187 };
188 
189 struct timer {
190 	TAILQ_ENTRY(timer)	entry;
191 	enum Timer		type;
192 	time_t			val;
193 };
194 
195 TAILQ_HEAD(timer_head, timer);
196 
197 struct peer {
198 	struct peer_config	 conf;
199 	struct peer_stats	 stats;
200 	RB_ENTRY(peer)		 entry;
201 	struct {
202 		struct capabilities	ann;
203 		struct capabilities	peer;
204 		struct capabilities	neg;
205 	}			 capa;
206 	struct auth_state	 auth_state;
207 	struct auth_config	 auth_conf;
208 	struct bgpd_addr	 local;
209 	struct bgpd_addr	 local_alt;
210 	struct bgpd_addr	 remote;
211 	struct timer_head	 timers;
212 	struct msgbuf		*wbuf;
213 	struct peer		*template;
214 	int			 fd;
215 	int			 lasterr;
216 	u_int			 errcnt;
217 	u_int			 IdleHoldTime;
218 	unsigned int		 if_scope;	/* interface scope for IPv6 */
219 	uint32_t		 remote_bgpid;
220 	enum session_state	 state;
221 	enum session_state	 prev_state;
222 	enum reconf_action	 reconf_action;
223 	enum role		 remote_role;
224 	uint16_t		 short_as;
225 	uint16_t		 holdtime;
226 	uint16_t		 local_port;
227 	uint16_t		 remote_port;
228 	uint8_t			 depend_ok;
229 	uint8_t			 demoted;
230 	uint8_t			 passive;
231 	uint8_t			 throttled;
232 	uint8_t			 rpending;
233 	uint8_t			 rdesession;
234 };
235 
236 extern time_t		 pauseaccept;
237 
238 struct ctl_timer {
239 	enum Timer	type;
240 	time_t		val;
241 };
242 
243 /* carp.c */
244 int	 carp_demote_init(char *, int);
245 void	 carp_demote_shutdown(void);
246 int	 carp_demote_get(char *);
247 int	 carp_demote_set(char *, int);
248 
249 /* config.c */
250 void	 merge_config(struct bgpd_config *, struct bgpd_config *);
251 void	 free_deleted_peers(struct bgpd_config *);
252 int	 prepare_listeners(struct bgpd_config *);
253 
254 /* control.c */
255 int	control_check(char *);
256 int	control_init(int, char *);
257 int	control_listen(int);
258 size_t	control_fill_pfds(struct pollfd *, size_t);
259 void	control_shutdown(int);
260 int	control_dispatch_msg(struct pollfd *, struct peer_head *);
261 unsigned int	control_accept(int, int);
262 
263 /* log.c */
264 char	*log_fmt_peer(const struct peer_config *);
265 void	 log_statechange(struct peer *, enum session_state,
266 	    enum session_events);
267 void	 log_notification(const struct peer *, uint8_t, uint8_t,
268 	    const struct ibuf *, const char *);
269 void	 log_conn_attempt(const struct peer *, struct sockaddr *,
270 	    socklen_t);
271 
272 /* mrt.c */
273 void	 mrt_dump_bgp_msg(struct mrt *, struct ibuf *, struct peer *,
274 	    enum msg_type);
275 void	 mrt_dump_state(struct mrt *, uint16_t, uint16_t,
276 	    struct peer *);
277 void	 mrt_done(struct mrt *);
278 
279 /* pfkey.c */
280 struct sadb_msg;
281 int	pfkey_read(int, struct sadb_msg *);
282 int	pfkey_establish(struct auth_state *, struct auth_config *,
283 	    const struct bgpd_addr *, const struct bgpd_addr *);
284 int	pfkey_remove(struct auth_state *);
285 int	pfkey_init(void);
286 int	pfkey_send_conf(struct imsgbuf *, uint32_t, struct auth_config *);
287 int	pfkey_recv_conf(struct peer *, struct imsg *);
288 int	tcp_md5_check(int, struct auth_config *);
289 int	tcp_md5_set(int, struct auth_config *, struct bgpd_addr *);
290 int	tcp_md5_prep_listener(struct listen_addr *, struct peer_head *);
291 void	tcp_md5_add_listener(struct bgpd_config *, struct peer *);
292 void	tcp_md5_del_listener(struct bgpd_config *, struct peer *);
293 
294 /* printconf.c */
295 void	print_config(struct bgpd_config *, struct rib_names *);
296 
297 /* rde.c */
298 void	rde_main(int, int);
299 
300 /* rtr_proto.c */
301 struct rtr_session;
302 size_t			 rtr_count(void);
303 void			 rtr_check_events(struct pollfd *, size_t);
304 size_t			 rtr_poll_events(struct pollfd *, size_t, time_t *);
305 struct rtr_session	*rtr_new(uint32_t, struct rtr_config_msg *);
306 struct rtr_session	*rtr_get(uint32_t);
307 void			 rtr_free(struct rtr_session *);
308 void			 rtr_open(struct rtr_session *, int);
309 void			 rtr_config_prep(void);
310 void			 rtr_config_merge(void);
311 void			 rtr_config_keep(struct rtr_session *,
312 			     struct rtr_config_msg *);
313 void			 rtr_roa_merge(struct roa_tree *);
314 void			 rtr_aspa_merge(struct aspa_tree *);
315 void			 rtr_shutdown(void);
316 void			 rtr_show(struct rtr_session *, pid_t);
317 
318 /* rtr.c */
319 void	rtr_sem_acquire(int);
320 void	rtr_sem_release(int);
321 void	rtr_roa_insert(struct roa_tree *, struct roa *);
322 void	rtr_aspa_insert(struct aspa_tree *, struct aspa_set *);
323 void	rtr_main(int, int);
324 void	rtr_imsg_compose(int, uint32_t, pid_t, void *, size_t);
325 void	rtr_recalc(void);
326 
327 /* session.c */
328 RB_PROTOTYPE(peer_head, peer, entry, peer_compare);
329 
330 void		 session_main(int, int);
331 void		 bgp_fsm(struct peer *, enum session_events, struct ibuf *);
332 int		 session_neighbor_rrefresh(struct peer *p);
333 struct peer	*getpeerbydesc(struct bgpd_config *, const char *);
334 struct peer	*getpeerbyip(struct bgpd_config *, struct sockaddr *);
335 struct peer	*getpeerbyid(struct bgpd_config *, uint32_t);
336 int		 peer_matched(struct peer *, struct ctl_neighbor *);
337 int		 imsg_ctl_parent(struct imsg *);
338 int		 imsg_ctl_rde(struct imsg *);
339 int		 imsg_ctl_rde_msg(int, uint32_t, pid_t);
340 void		 session_stop(struct peer *, uint8_t, const char *);
341 struct bgpd_addr *session_localaddr(struct peer *);
342 
343 /* timer.c */
344 struct timer	*timer_get(struct timer_head *, enum Timer);
345 struct timer	*timer_nextisdue(struct timer_head *, time_t);
346 time_t		 timer_nextduein(struct timer_head *, time_t);
347 int		 timer_running(struct timer_head *, enum Timer, time_t *);
348 void		 timer_set(struct timer_head *, enum Timer, u_int);
349 void		 timer_stop(struct timer_head *, enum Timer);
350 void		 timer_remove(struct timer_head *, enum Timer);
351 void		 timer_remove_all(struct timer_head *);
352