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