1 /* $OpenBSD: ospf6d.h,v 1.50 2021/01/19 09:46:51 claudio Exp $ */ 2 3 /* 4 * Copyright (c) 2004, 2007 Esben Norby <norby@openbsd.org> 5 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #ifndef _OSPF6D_H_ 21 #define _OSPF6D_H_ 22 23 #include <sys/queue.h> 24 #include <sys/socket.h> 25 #include <sys/time.h> 26 #include <sys/tree.h> 27 #include <net/if.h> 28 #include <netinet/in.h> 29 #include <event.h> 30 31 #include <imsg.h> 32 #include "ospf6.h" 33 #include "log.h" 34 35 #define CONF_FILE "/etc/ospf6d.conf" 36 #define OSPF6D_SOCKET "/var/run/ospf6d.sock" 37 #define OSPF6D_USER "_ospf6d" 38 39 #define NBR_HASHSIZE 128 40 #define LSA_HASHSIZE 512 41 42 #define NBR_IDSELF 1 43 #define NBR_CNTSTART (NBR_IDSELF + 1) 44 45 #define READ_BUF_SIZE 65535 46 #define PKG_DEF_SIZE 512 /* compromise */ 47 #define RT_BUF_SIZE 16384 48 #define MAX_RTSOCK_BUF (2 * 1024 * 1024) 49 50 #define OSPFD_FLAG_NO_FIB_UPDATE 0x0001 51 #define OSPFD_FLAG_STUB_ROUTER 0x0002 52 53 #define F_OSPFD_INSERTED 0x0001 54 #define F_KERNEL 0x0002 55 #define F_CONNECTED 0x0008 56 #define F_DOWN 0x0010 57 #define F_STATIC 0x0020 58 #define F_DYNAMIC 0x0040 59 #define F_REJECT 0x0080 60 #define F_BLACKHOLE 0x0100 61 #define F_REDISTRIBUTED 0x0200 62 63 static const char * const log_procnames[] = { 64 "parent", 65 "ospfe", 66 "rde" 67 }; 68 69 struct imsgev { 70 struct imsgbuf ibuf; 71 void (*handler)(int, short, void *); 72 struct event ev; 73 void *data; 74 short events; 75 }; 76 77 enum imsg_type { 78 IMSG_NONE, 79 IMSG_CTL_RELOAD, 80 IMSG_CTL_SHOW_INTERFACE, 81 IMSG_CTL_SHOW_DATABASE, 82 IMSG_CTL_SHOW_DB_EXT, 83 IMSG_CTL_SHOW_DB_LINK, 84 IMSG_CTL_SHOW_DB_NET, 85 IMSG_CTL_SHOW_DB_RTR, 86 IMSG_CTL_SHOW_DB_INTRA, 87 IMSG_CTL_SHOW_DB_SELF, 88 IMSG_CTL_SHOW_DB_SUM, 89 IMSG_CTL_SHOW_DB_ASBR, 90 IMSG_CTL_SHOW_NBR, 91 IMSG_CTL_SHOW_RIB, 92 IMSG_CTL_SHOW_SUM, 93 IMSG_CTL_SHOW_SUM_AREA, 94 IMSG_CTL_FIB_COUPLE, 95 IMSG_CTL_FIB_DECOUPLE, 96 IMSG_CTL_AREA, 97 IMSG_CTL_IFACE, 98 IMSG_CTL_KROUTE, 99 IMSG_CTL_KROUTE_ADDR, 100 IMSG_CTL_END, 101 IMSG_CTL_LOG_VERBOSE, 102 IMSG_CONTROLFD, 103 IMSG_KROUTE_CHANGE, 104 IMSG_KROUTE_DELETE, 105 IMSG_IFINFO, 106 IMSG_IFADDRNEW, 107 IMSG_IFADDRDEL, 108 IMSG_NEIGHBOR_UP, 109 IMSG_NEIGHBOR_DOWN, 110 IMSG_NEIGHBOR_CHANGE, 111 IMSG_NETWORK_ADD, 112 IMSG_NETWORK_DEL, 113 IMSG_AREA_CHANGE, 114 IMSG_DD, 115 IMSG_DD_END, 116 IMSG_DB_SNAPSHOT, 117 IMSG_DB_END, 118 IMSG_LS_REQ, 119 IMSG_LS_UPD, 120 IMSG_LS_SNAP, 121 IMSG_LS_ACK, 122 IMSG_LS_FLOOD, 123 IMSG_LS_BADREQ, 124 IMSG_LS_MAXAGE, 125 IMSG_ABR_UP, 126 IMSG_ABR_DOWN, 127 IMSG_RECONF_CONF, 128 IMSG_RECONF_AREA, 129 IMSG_RECONF_END, 130 IMSG_DEMOTE 131 }; 132 133 /* area */ 134 struct vertex; 135 struct rde_nbr; 136 RB_HEAD(lsa_tree, vertex); 137 138 struct area { 139 LIST_ENTRY(area) entry; 140 struct in_addr id; 141 struct lsa_tree lsa_tree; 142 143 LIST_HEAD(, iface) iface_list; 144 LIST_HEAD(, rde_nbr) nbr_list; 145 /* list addr_range_list; */ 146 char demote_group[IFNAMSIZ]; 147 u_int32_t stub_default_cost; 148 u_int32_t num_spf_calc; 149 int active; 150 u_int8_t transit; 151 u_int8_t stub; 152 u_int8_t dirty; 153 u_int8_t demote_level; 154 }; 155 156 /* interface states */ 157 #define IF_STA_NEW 0x00 /* dummy state for reload */ 158 #define IF_STA_DOWN 0x01 159 #define IF_STA_LOOPBACK 0x02 160 #define IF_STA_WAITING 0x04 161 #define IF_STA_POINTTOPOINT 0x08 162 #define IF_STA_DROTHER 0x10 163 #define IF_STA_BACKUP 0x20 164 #define IF_STA_DR 0x40 165 #define IF_STA_DRORBDR (IF_STA_DR | IF_STA_BACKUP) 166 #define IF_STA_MULTI (IF_STA_DROTHER | IF_STA_BACKUP | IF_STA_DR) 167 #define IF_STA_ANY 0x7f 168 169 /* interface events */ 170 enum iface_event { 171 IF_EVT_NOTHING, 172 IF_EVT_UP, 173 IF_EVT_WTIMER, 174 IF_EVT_BACKUP_SEEN, 175 IF_EVT_NBR_CHNG, 176 IF_EVT_LOOP, 177 IF_EVT_UNLOOP, 178 IF_EVT_DOWN 179 }; 180 181 /* interface actions */ 182 enum iface_action { 183 IF_ACT_NOTHING, 184 IF_ACT_STRT, 185 IF_ACT_ELECT, 186 IF_ACT_RST 187 }; 188 189 /* interface types */ 190 enum iface_type { 191 IF_TYPE_POINTOPOINT, 192 IF_TYPE_BROADCAST, 193 IF_TYPE_NBMA, 194 IF_TYPE_POINTOMULTIPOINT, 195 IF_TYPE_VIRTUALLINK 196 }; 197 198 /* neighbor states */ 199 #define NBR_STA_DOWN 0x0001 200 #define NBR_STA_ATTEMPT 0x0002 201 #define NBR_STA_INIT 0x0004 202 #define NBR_STA_2_WAY 0x0008 203 #define NBR_STA_XSTRT 0x0010 204 #define NBR_STA_SNAP 0x0020 205 #define NBR_STA_XCHNG 0x0040 206 #define NBR_STA_LOAD 0x0080 207 #define NBR_STA_FULL 0x0100 208 #define NBR_STA_ACTIVE (~NBR_STA_DOWN) 209 #define NBR_STA_FLOOD (NBR_STA_XCHNG | NBR_STA_LOAD | NBR_STA_FULL) 210 #define NBR_STA_ADJFORM (NBR_STA_XSTRT | NBR_STA_SNAP | NBR_STA_FLOOD) 211 #define NBR_STA_BIDIR (NBR_STA_2_WAY | NBR_STA_ADJFORM) 212 #define NBR_STA_PRELIM (NBR_STA_DOWN | NBR_STA_ATTEMPT | NBR_STA_INIT) 213 #define NBR_STA_ANY 0xffff 214 215 /* neighbor events */ 216 enum nbr_event { 217 NBR_EVT_NOTHING, 218 NBR_EVT_HELLO_RCVD, 219 NBR_EVT_2_WAY_RCVD, 220 NBR_EVT_NEG_DONE, 221 NBR_EVT_SNAP_DONE, 222 NBR_EVT_XCHNG_DONE, 223 NBR_EVT_BAD_LS_REQ, 224 NBR_EVT_LOAD_DONE, 225 NBR_EVT_ADJ_OK, 226 NBR_EVT_SEQ_NUM_MIS, 227 NBR_EVT_1_WAY_RCVD, 228 NBR_EVT_KILL_NBR, 229 NBR_EVT_ITIMER, 230 NBR_EVT_LL_DOWN, 231 NBR_EVT_ADJTMOUT 232 }; 233 234 /* neighbor actions */ 235 enum nbr_action { 236 NBR_ACT_NOTHING, 237 NBR_ACT_RST_ITIMER, 238 NBR_ACT_STRT_ITIMER, 239 NBR_ACT_EVAL, 240 NBR_ACT_SNAP, 241 NBR_ACT_SNAP_DONE, 242 NBR_ACT_XCHNG_DONE, 243 NBR_ACT_ADJ_OK, 244 NBR_ACT_RESTRT_DD, 245 NBR_ACT_DEL, 246 NBR_ACT_CLR_LST, 247 NBR_ACT_HELLO_CHK 248 }; 249 250 /* spf states */ 251 enum spf_state { 252 SPF_IDLE, 253 SPF_DELAY, 254 SPF_HOLD, 255 SPF_HOLDQUEUE 256 }; 257 258 enum dst_type { 259 DT_NET, 260 DT_RTR 261 }; 262 263 enum path_type { 264 PT_INTRA_AREA, 265 PT_INTER_AREA, 266 PT_TYPE1_EXT, 267 PT_TYPE2_EXT 268 }; 269 270 enum rib_type { 271 RIB_NET = 1, 272 RIB_RTR, 273 RIB_EXT 274 }; 275 276 struct iface_addr { 277 TAILQ_ENTRY(iface_addr) entry; 278 struct in6_addr addr; 279 struct in6_addr dstbrd; 280 u_int8_t prefixlen; 281 u_int8_t redistribute; 282 }; 283 284 /* lsa list used in RDE and OE */ 285 TAILQ_HEAD(lsa_head, lsa_entry); 286 287 struct iface { 288 LIST_ENTRY(iface) entry; 289 TAILQ_ENTRY(iface) list; 290 struct event hello_timer; 291 struct event wait_timer; 292 struct event lsack_tx_timer; 293 294 LIST_HEAD(, nbr) nbr_list; 295 TAILQ_HEAD(, iface_addr) ifa_list; 296 struct lsa_head ls_ack_list; 297 298 struct lsa_tree lsa_tree; /* LSA with link local scope */ 299 300 char name[IF_NAMESIZE]; 301 char demote_group[IFNAMSIZ]; 302 char dependon[IFNAMSIZ]; 303 struct in6_addr addr; 304 struct in6_addr dst; 305 struct in_addr abr_id; 306 struct nbr *dr; /* designated router */ 307 struct nbr *bdr; /* backup designated router */ 308 struct nbr *self; 309 struct area *area; 310 311 u_int64_t baudrate; 312 u_int32_t ls_ack_cnt; 313 time_t uptime; 314 unsigned int ifindex; 315 u_int rdomain; 316 int fd; 317 int state; 318 int mtu; 319 int depend_ok; 320 u_int16_t flags; 321 u_int16_t transmit_delay; 322 u_int16_t hello_interval; 323 u_int16_t rxmt_interval; 324 u_int16_t dead_interval; 325 u_int16_t metric; 326 enum iface_type type; 327 u_int8_t if_type; 328 u_int8_t linkstate; 329 u_int8_t priority; 330 u_int8_t cflags; 331 #define F_IFACE_PASSIVE 0x01 332 #define F_IFACE_CONFIGURED 0x02 333 }; 334 335 struct ifaddrchange { 336 struct in6_addr addr; 337 struct in6_addr dstbrd; 338 unsigned int ifindex; 339 u_int8_t prefixlen; 340 }; 341 342 /* ospf_conf */ 343 enum ospfd_process { 344 PROC_MAIN, 345 PROC_OSPF_ENGINE, 346 PROC_RDE_ENGINE 347 }; 348 extern enum ospfd_process ospfd_process; 349 350 #define REDIST_CONNECTED 0x01 351 #define REDIST_STATIC 0x02 352 #define REDIST_LABEL 0x04 353 #define REDIST_ADDR 0x08 354 #define REDIST_NO 0x10 355 #define REDIST_DEFAULT 0x20 356 357 struct redistribute { 358 SIMPLEQ_ENTRY(redistribute) entry; 359 struct in6_addr addr; 360 u_int32_t metric; 361 u_int16_t label; 362 u_int16_t type; 363 u_int8_t prefixlen; 364 char dependon[IFNAMSIZ]; 365 }; 366 SIMPLEQ_HEAD(redist_list, redistribute); 367 368 struct ospfd_conf { 369 struct event ev; 370 struct in_addr rtr_id; 371 LIST_HEAD(, area) area_list; 372 LIST_HEAD(, vertex) cand_list; 373 struct redist_list redist_list; 374 375 u_int32_t opts; 376 #define OSPFD_OPT_VERBOSE 0x00000001 377 #define OSPFD_OPT_VERBOSE2 0x00000002 378 #define OSPFD_OPT_NOACTION 0x00000004 379 #define OSPFD_OPT_STUB_ROUTER 0x00000008 380 #define OSPFD_OPT_FORCE_DEMOTE 0x00000010 381 u_int32_t spf_delay; 382 u_int32_t spf_hold_time; 383 time_t uptime; 384 int spf_state; 385 int ospf_socket; 386 int flags; 387 int redist_label_or_prefix; 388 u_int8_t border; 389 u_int8_t redistribute; 390 u_int8_t fib_priority; 391 u_int rdomain; 392 char *csock; 393 }; 394 395 /* kroute */ 396 struct kroute { 397 struct in6_addr prefix; 398 struct in6_addr nexthop; 399 u_int32_t ext_tag; 400 u_int32_t metric; 401 unsigned int scope; /* scope of nexthop */ 402 u_int16_t flags; 403 u_int16_t rtlabel; 404 u_short ifindex; 405 u_int8_t prefixlen; 406 u_int8_t priority; 407 }; 408 409 /* name2id */ 410 struct n2id_label { 411 TAILQ_ENTRY(n2id_label) entry; 412 char *name; 413 u_int16_t id; 414 u_int32_t ext_tag; 415 int ref; 416 }; 417 418 TAILQ_HEAD(n2id_labels, n2id_label); 419 extern struct n2id_labels rt_labels; 420 421 /* control data structures */ 422 struct ctl_iface { 423 char name[IF_NAMESIZE]; 424 struct in6_addr addr; 425 struct in_addr area; 426 struct in_addr rtr_id; 427 struct in_addr dr_id; 428 struct in6_addr dr_addr; 429 struct in_addr bdr_id; 430 struct in6_addr bdr_addr; 431 time_t hello_timer; 432 time_t uptime; 433 u_int64_t baudrate; 434 u_int32_t dead_interval; 435 unsigned int ifindex; 436 int state; 437 int mtu; 438 int nbr_cnt; 439 int adj_cnt; 440 u_int16_t transmit_delay; 441 u_int16_t hello_interval; 442 u_int16_t flags; 443 u_int16_t metric; 444 u_int16_t rxmt_interval; 445 enum iface_type type; 446 u_int8_t linkstate; 447 u_int8_t if_type; 448 u_int8_t priority; 449 u_int8_t passive; 450 }; 451 452 struct ctl_nbr { 453 char name[IF_NAMESIZE]; 454 struct in_addr id; 455 struct in6_addr addr; 456 struct in_addr dr; 457 struct in_addr bdr; 458 struct in_addr area; 459 time_t dead_timer; 460 time_t uptime; 461 u_int32_t db_sum_lst_cnt; 462 u_int32_t ls_req_lst_cnt; 463 u_int32_t ls_retrans_lst_cnt; 464 u_int32_t state_chng_cnt; 465 u_int32_t options; 466 int nbr_state; 467 int iface_state; 468 u_int8_t priority; 469 }; 470 471 struct ctl_rt { 472 struct in6_addr prefix; 473 struct in6_addr nexthop; 474 struct in_addr area; 475 struct in_addr adv_rtr; 476 time_t uptime; 477 u_int32_t cost; 478 u_int32_t cost2; 479 unsigned int ifindex; /* scope of nexthop */ 480 enum path_type p_type; 481 enum dst_type d_type; 482 u_int8_t flags; 483 u_int8_t prefixlen; 484 u_int8_t connected; 485 }; 486 487 struct ctl_sum { 488 struct in_addr rtr_id; 489 u_int32_t spf_delay; 490 u_int32_t spf_hold_time; 491 u_int32_t num_ext_lsa; 492 u_int32_t num_area; 493 time_t uptime; 494 }; 495 496 struct ctl_sum_area { 497 struct in_addr area; 498 u_int32_t num_iface; 499 u_int32_t num_adj_nbr; 500 u_int32_t num_spf_calc; 501 u_int32_t num_lsa; 502 }; 503 504 struct demote_msg { 505 char demote_group[IF_NAMESIZE]; 506 int level; 507 }; 508 509 /* area.c */ 510 struct area *area_new(void); 511 int area_del(struct area *); 512 struct area *area_find(struct ospfd_conf *, struct in_addr); 513 void area_track(struct area *); 514 int area_border_router(struct ospfd_conf *); 515 u_int32_t area_ospf_options(struct area *); 516 517 /* carp.c */ 518 int carp_demote_init(char *, int); 519 void carp_demote_shutdown(void); 520 int carp_demote_get(char *); 521 int carp_demote_set(char *, int); 522 523 /* parse.y */ 524 struct ospfd_conf *parse_config(char *, int); 525 int cmdline_symset(char *); 526 void conf_clear_redist_list(struct redist_list *); 527 528 /* interface.c */ 529 int if_init(void); 530 struct iface *if_find(unsigned int); 531 struct iface *if_findname(char *); 532 struct iface *if_new(u_short, char *); 533 void if_update(struct iface *, int, int, u_int8_t, u_int8_t, 534 u_int64_t, u_int32_t); 535 536 /* in_cksum.c */ 537 u_int16_t in_cksum(void *, size_t); 538 539 /* iso_cksum.c */ 540 u_int16_t iso_cksum(void *, u_int16_t, u_int16_t); 541 542 /* kroute.c */ 543 int kr_init(int, u_int, int, u_int8_t); 544 int kr_change(struct kroute *, int); 545 int kr_delete(struct kroute *); 546 void kr_shutdown(void); 547 void kr_fib_couple(void); 548 void kr_fib_decouple(void); 549 void kr_fib_update_prio(u_int8_t); 550 void kr_dispatch_msg(int, short, void *); 551 void kr_show_route(struct imsg *); 552 void kr_reload(int); 553 554 void embedscope(struct sockaddr_in6 *); 555 void recoverscope(struct sockaddr_in6 *); 556 void addscope(struct sockaddr_in6 *, u_int32_t); 557 void clearscope(struct in6_addr *); 558 u_int8_t mask2prefixlen(struct sockaddr_in6 *); 559 struct in6_addr *prefixlen2mask(u_int8_t); 560 void inet6applymask(struct in6_addr *, const struct in6_addr *, int); 561 562 int fetchifs(u_short); 563 564 /* logmsg.h */ 565 const char *log_in6addr(const struct in6_addr *); 566 const char *log_in6addr_scope(const struct in6_addr *, unsigned int); 567 const char *log_rtr_id(u_int32_t); 568 const char *log_sockaddr(void *); 569 const char *nbr_state_name(int); 570 const char *if_state_name(int); 571 const char *if_type_name(enum iface_type); 572 const char *dst_type_name(enum dst_type); 573 const char *path_type_name(enum path_type); 574 575 /* name2id.c */ 576 u_int16_t rtlabel_name2id(const char *); 577 const char *rtlabel_id2name(u_int16_t); 578 void rtlabel_unref(u_int16_t); 579 u_int32_t rtlabel_id2tag(u_int16_t); 580 u_int16_t rtlabel_tag2id(u_int32_t); 581 void rtlabel_tag(u_int16_t, u_int32_t); 582 583 /* ospf6d.c */ 584 void main_imsg_compose_ospfe(int, pid_t, void *, u_int16_t); 585 void main_imsg_compose_ospfe_fd(int, pid_t, int); 586 void main_imsg_compose_rde(int, pid_t, void *, u_int16_t); 587 int ospf_redistribute(struct kroute *, u_int32_t *); 588 void merge_config(struct ospfd_conf *, struct ospfd_conf *); 589 void imsg_event_add(struct imsgev *); 590 int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, 591 pid_t, int, void *, u_int16_t); 592 int ifstate_is_up(struct iface *iface); 593 594 /* printconf.c */ 595 void print_config(struct ospfd_conf *); 596 597 #endif /* _OSPF6D_H_ */ 598