1*d8606ed9Sclaudio /* $OpenBSD: ospfd.h,v 1.108 2021/01/19 09:37:53 claudio Exp $ */ 2204df0f8Sclaudio 3204df0f8Sclaudio /* 4367f601bSnorby * Copyright (c) 2004 Esben Norby <norby@openbsd.org> 5204df0f8Sclaudio * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> 6204df0f8Sclaudio * 7204df0f8Sclaudio * Permission to use, copy, modify, and distribute this software for any 8204df0f8Sclaudio * purpose with or without fee is hereby granted, provided that the above 9204df0f8Sclaudio * copyright notice and this permission notice appear in all copies. 10204df0f8Sclaudio * 11204df0f8Sclaudio * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12204df0f8Sclaudio * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13204df0f8Sclaudio * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14204df0f8Sclaudio * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15204df0f8Sclaudio * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16204df0f8Sclaudio * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17204df0f8Sclaudio * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18204df0f8Sclaudio */ 19204df0f8Sclaudio 20204df0f8Sclaudio #ifndef _OSPFD_H_ 21204df0f8Sclaudio #define _OSPFD_H_ 22204df0f8Sclaudio 23204df0f8Sclaudio #include <sys/queue.h> 24204df0f8Sclaudio #include <sys/socket.h> 25204df0f8Sclaudio #include <sys/time.h> 26204df0f8Sclaudio #include <sys/tree.h> 2703431b74Snorby #include <md5.h> 28204df0f8Sclaudio #include <net/if.h> 29204df0f8Sclaudio #include <netinet/in.h> 30204df0f8Sclaudio #include <event.h> 31204df0f8Sclaudio 327ffc5073Spyr #include <imsg.h> 33764e7e6cSclaudio #include "ospf.h" 34f2e37bc3Sbenno #include "log.h" 35764e7e6cSclaudio 36204df0f8Sclaudio #define CONF_FILE "/etc/ospfd.conf" 37204df0f8Sclaudio #define OSPFD_SOCKET "/var/run/ospfd.sock" 38204df0f8Sclaudio #define OSPFD_USER "_ospfd" 39204df0f8Sclaudio 40204df0f8Sclaudio #define NBR_HASHSIZE 128 41204df0f8Sclaudio #define LSA_HASHSIZE 512 42204df0f8Sclaudio 43e2993955Sclaudio #define NBR_IDSELF 1 44e2993955Sclaudio #define NBR_CNTSTART (NBR_IDSELF + 1) 45e2993955Sclaudio 46204df0f8Sclaudio #define READ_BUF_SIZE 65535 470491ce75Sclaudio #define PKG_DEF_SIZE 512 /* compromise */ 48204df0f8Sclaudio #define RT_BUF_SIZE 16384 49b7b65d7fSclaudio #define MAX_RTSOCK_BUF (2 * 1024 * 1024) 50204df0f8Sclaudio 51204df0f8Sclaudio #define OSPFD_FLAG_NO_FIB_UPDATE 0x0001 521891964aSclaudio #define OSPFD_FLAG_STUB_ROUTER 0x0002 53204df0f8Sclaudio 54204df0f8Sclaudio #define F_OSPFD_INSERTED 0x0001 55204df0f8Sclaudio #define F_KERNEL 0x0002 56d9eec83cSclaudio #define F_CONNECTED 0x0004 57d9eec83cSclaudio #define F_STATIC 0x0008 58d9eec83cSclaudio #define F_DYNAMIC 0x0010 59d9eec83cSclaudio #define F_DOWN 0x0020 60d9eec83cSclaudio #define F_REJECT 0x0040 61d9eec83cSclaudio #define F_BLACKHOLE 0x0080 6244cb7d8eSclaudio #define F_REDISTRIBUTED 0x0100 63204df0f8Sclaudio 642d29f8f3Sbenno static const char * const log_procnames[] = { 652d29f8f3Sbenno "parent", 662d29f8f3Sbenno "ospfe", 672d29f8f3Sbenno "rde" 682d29f8f3Sbenno }; 692d29f8f3Sbenno 707b4c0c10Seric struct imsgev { 717b4c0c10Seric struct imsgbuf ibuf; 727b4c0c10Seric void (*handler)(int, short, void *); 737b4c0c10Seric struct event ev; 747b4c0c10Seric void *data; 757b4c0c10Seric short events; 767b4c0c10Seric }; 777b4c0c10Seric 78204df0f8Sclaudio enum imsg_type { 79204df0f8Sclaudio IMSG_NONE, 80204df0f8Sclaudio IMSG_CTL_RELOAD, 81204df0f8Sclaudio IMSG_CTL_SHOW_INTERFACE, 82204df0f8Sclaudio IMSG_CTL_SHOW_DATABASE, 8332286112Snorby IMSG_CTL_SHOW_DB_EXT, 8432286112Snorby IMSG_CTL_SHOW_DB_NET, 8532286112Snorby IMSG_CTL_SHOW_DB_RTR, 8632286112Snorby IMSG_CTL_SHOW_DB_SELF, 8732286112Snorby IMSG_CTL_SHOW_DB_SUM, 8832286112Snorby IMSG_CTL_SHOW_DB_ASBR, 89097ed198Sclaudio IMSG_CTL_SHOW_DB_OPAQ, 90204df0f8Sclaudio IMSG_CTL_SHOW_NBR, 9137355230Snorby IMSG_CTL_SHOW_RIB, 9259df52c7Snorby IMSG_CTL_SHOW_SUM, 9359df52c7Snorby IMSG_CTL_SHOW_SUM_AREA, 94204df0f8Sclaudio IMSG_CTL_FIB_COUPLE, 95204df0f8Sclaudio IMSG_CTL_FIB_DECOUPLE, 96119f0f1dSdlg IMSG_CTL_FIB_RELOAD, 97204df0f8Sclaudio IMSG_CTL_AREA, 98097ed198Sclaudio IMSG_CTL_IFACE, 99b6b3a59aSclaudio IMSG_CTL_KROUTE, 100b6b3a59aSclaudio IMSG_CTL_KROUTE_ADDR, 101b6b3a59aSclaudio IMSG_CTL_IFINFO, 102204df0f8Sclaudio IMSG_CTL_END, 103636d06c3Sclaudio IMSG_CTL_LOG_VERBOSE, 104617bb465Sremi IMSG_CONTROLFD, 1053ada9d8fSnorby IMSG_KROUTE_CHANGE, 1063ada9d8fSnorby IMSG_KROUTE_DELETE, 107204df0f8Sclaudio IMSG_IFINFO, 108204df0f8Sclaudio IMSG_NEIGHBOR_UP, 109204df0f8Sclaudio IMSG_NEIGHBOR_DOWN, 110ef209401Sremi IMSG_NEIGHBOR_ADDR, 111204df0f8Sclaudio IMSG_NEIGHBOR_CHANGE, 112097ed198Sclaudio IMSG_NEIGHBOR_CAPA, 113e2993955Sclaudio IMSG_NETWORK_ADD, 114e2993955Sclaudio IMSG_NETWORK_DEL, 11506267228Sclaudio IMSG_AREA_CHANGE, 116204df0f8Sclaudio IMSG_DD, 117299d99d9Sclaudio IMSG_DD_END, 11898b447a7Sclaudio IMSG_DD_BADLSA, 119204df0f8Sclaudio IMSG_DB_SNAPSHOT, 120204df0f8Sclaudio IMSG_DB_END, 121204df0f8Sclaudio IMSG_LS_REQ, 122204df0f8Sclaudio IMSG_LS_UPD, 123c983ff94Smarkus IMSG_LS_SNAP, 124204df0f8Sclaudio IMSG_LS_ACK, 125204df0f8Sclaudio IMSG_LS_FLOOD, 126204df0f8Sclaudio IMSG_LS_BADREQ, 127c7e5c5fcSnorby IMSG_LS_MAXAGE, 128c7e5c5fcSnorby IMSG_ABR_UP, 129f28af201Sclaudio IMSG_ABR_DOWN, 130f28af201Sclaudio IMSG_RECONF_CONF, 131f28af201Sclaudio IMSG_RECONF_AREA, 132f28af201Sclaudio IMSG_RECONF_IFACE, 133f28af201Sclaudio IMSG_RECONF_AUTHMD, 1346fa28760Sclaudio IMSG_RECONF_REDIST, 135fba2d3d0Sclaudio IMSG_RECONF_END, 136a60d5a8aSclaudio IMSG_DEMOTE, 1372dc8313fSremi IMSG_IFADDRADD, 138a60d5a8aSclaudio IMSG_IFADDRDEL 139204df0f8Sclaudio }; 140204df0f8Sclaudio 1416fa28760Sclaudio #define REDIST_CONNECTED 0x01 1426fa28760Sclaudio #define REDIST_STATIC 0x02 1436fa28760Sclaudio #define REDIST_LABEL 0x04 1446fa28760Sclaudio #define REDIST_ADDR 0x08 1456fa28760Sclaudio #define REDIST_NO 0x10 1466fa28760Sclaudio #define REDIST_DEFAULT 0x20 1476fa28760Sclaudio 1486fa28760Sclaudio struct redistribute { 1496fa28760Sclaudio SIMPLEQ_ENTRY(redistribute) entry; 1506fa28760Sclaudio struct in_addr addr; 1516fa28760Sclaudio struct in_addr mask; 1526fa28760Sclaudio u_int32_t metric; 1536fa28760Sclaudio u_int16_t label; 1546fa28760Sclaudio u_int16_t type; 155ac149fe2Sremi char dependon[IFNAMSIZ]; 1566fa28760Sclaudio }; 1576fa28760Sclaudio SIMPLEQ_HEAD(redist_list, redistribute); 1586fa28760Sclaudio 159204df0f8Sclaudio struct vertex; 160204df0f8Sclaudio struct rde_nbr; 161204df0f8Sclaudio RB_HEAD(lsa_tree, vertex); 162204df0f8Sclaudio 163204df0f8Sclaudio struct area { 164204df0f8Sclaudio LIST_ENTRY(area) entry; 165204df0f8Sclaudio struct in_addr id; 166204df0f8Sclaudio struct lsa_tree lsa_tree; 16759df52c7Snorby 168204df0f8Sclaudio LIST_HEAD(, iface) iface_list; 169204df0f8Sclaudio LIST_HEAD(, rde_nbr) nbr_list; 1706fa28760Sclaudio struct redist_list redist_list; 171204df0f8Sclaudio /* list addr_range_list; */ 172fba2d3d0Sclaudio char demote_group[IFNAMSIZ]; 173204df0f8Sclaudio u_int32_t stub_default_cost; 17459df52c7Snorby u_int32_t num_spf_calc; 175317d560cSclaudio int active; 1765c6e55e9Snorby u_int8_t transit; 1775c6e55e9Snorby u_int8_t stub; 178678f1ea5Snorby u_int8_t dirty; 179fba2d3d0Sclaudio u_int8_t demote_level; 180204df0f8Sclaudio }; 181204df0f8Sclaudio 182204df0f8Sclaudio /* interface states */ 183f28af201Sclaudio #define IF_STA_NEW 0x00 /* dummy state for reload */ 184204df0f8Sclaudio #define IF_STA_DOWN 0x01 185204df0f8Sclaudio #define IF_STA_LOOPBACK 0x02 186204df0f8Sclaudio #define IF_STA_WAITING 0x04 187204df0f8Sclaudio #define IF_STA_POINTTOPOINT 0x08 188204df0f8Sclaudio #define IF_STA_DROTHER 0x10 189204df0f8Sclaudio #define IF_STA_BACKUP 0x20 190204df0f8Sclaudio #define IF_STA_DR 0x40 191204df0f8Sclaudio #define IF_STA_DRORBDR (IF_STA_DR | IF_STA_BACKUP) 192204df0f8Sclaudio #define IF_STA_MULTI (IF_STA_DROTHER | IF_STA_BACKUP | IF_STA_DR) 193204df0f8Sclaudio #define IF_STA_ANY 0x7f 194204df0f8Sclaudio 195204df0f8Sclaudio /* interface events */ 196204df0f8Sclaudio enum iface_event { 1971aaf2c2dSclaudio IF_EVT_NOTHING, 198204df0f8Sclaudio IF_EVT_UP, 199204df0f8Sclaudio IF_EVT_WTIMER, 200204df0f8Sclaudio IF_EVT_BACKUP_SEEN, 201204df0f8Sclaudio IF_EVT_NBR_CHNG, 202204df0f8Sclaudio IF_EVT_LOOP, 203204df0f8Sclaudio IF_EVT_UNLOOP, 204204df0f8Sclaudio IF_EVT_DOWN 205204df0f8Sclaudio }; 206204df0f8Sclaudio 207204df0f8Sclaudio /* interface actions */ 208204df0f8Sclaudio enum iface_action { 2091aaf2c2dSclaudio IF_ACT_NOTHING, 210204df0f8Sclaudio IF_ACT_STRT, 211204df0f8Sclaudio IF_ACT_ELECT, 212204df0f8Sclaudio IF_ACT_RST 213204df0f8Sclaudio }; 214204df0f8Sclaudio 215204df0f8Sclaudio /* interface types */ 216204df0f8Sclaudio enum iface_type { 217204df0f8Sclaudio IF_TYPE_POINTOPOINT, 218204df0f8Sclaudio IF_TYPE_BROADCAST, 219204df0f8Sclaudio IF_TYPE_NBMA, 220204df0f8Sclaudio IF_TYPE_POINTOMULTIPOINT, 221204df0f8Sclaudio IF_TYPE_VIRTUALLINK 222204df0f8Sclaudio }; 223204df0f8Sclaudio 224cdd38203Sclaudio /* neighbor states */ 225cdd38203Sclaudio #define NBR_STA_DOWN 0x0001 226cdd38203Sclaudio #define NBR_STA_ATTEMPT 0x0002 227cdd38203Sclaudio #define NBR_STA_INIT 0x0004 228cdd38203Sclaudio #define NBR_STA_2_WAY 0x0008 229cdd38203Sclaudio #define NBR_STA_XSTRT 0x0010 230cdd38203Sclaudio #define NBR_STA_SNAP 0x0020 231cdd38203Sclaudio #define NBR_STA_XCHNG 0x0040 232cdd38203Sclaudio #define NBR_STA_LOAD 0x0080 233cdd38203Sclaudio #define NBR_STA_FULL 0x0100 234cdd38203Sclaudio #define NBR_STA_ACTIVE (~NBR_STA_DOWN) 235cdd38203Sclaudio #define NBR_STA_FLOOD (NBR_STA_XCHNG | NBR_STA_LOAD | NBR_STA_FULL) 236cdd38203Sclaudio #define NBR_STA_ADJFORM (NBR_STA_XSTRT | NBR_STA_SNAP | NBR_STA_FLOOD) 237cdd38203Sclaudio #define NBR_STA_BIDIR (NBR_STA_2_WAY | NBR_STA_ADJFORM) 238cdd38203Sclaudio #define NBR_STA_PRELIM (NBR_STA_DOWN | NBR_STA_ATTEMPT | NBR_STA_INIT) 239cdd38203Sclaudio #define NBR_STA_ANY 0xffff 240cdd38203Sclaudio 241cdd38203Sclaudio /* neighbor events */ 242cdd38203Sclaudio enum nbr_event { 243cdd38203Sclaudio NBR_EVT_NOTHING, 244cdd38203Sclaudio NBR_EVT_HELLO_RCVD, 245cdd38203Sclaudio NBR_EVT_2_WAY_RCVD, 246cdd38203Sclaudio NBR_EVT_NEG_DONE, 247cdd38203Sclaudio NBR_EVT_SNAP_DONE, 248cdd38203Sclaudio NBR_EVT_XCHNG_DONE, 249cdd38203Sclaudio NBR_EVT_BAD_LS_REQ, 250cdd38203Sclaudio NBR_EVT_LOAD_DONE, 251cdd38203Sclaudio NBR_EVT_ADJ_OK, 252cdd38203Sclaudio NBR_EVT_SEQ_NUM_MIS, 253cdd38203Sclaudio NBR_EVT_1_WAY_RCVD, 254cdd38203Sclaudio NBR_EVT_KILL_NBR, 255cdd38203Sclaudio NBR_EVT_ITIMER, 256cdd38203Sclaudio NBR_EVT_LL_DOWN, 257cdd38203Sclaudio NBR_EVT_ADJTMOUT 258cdd38203Sclaudio }; 259cdd38203Sclaudio 260cdd38203Sclaudio /* neighbor actions */ 261cdd38203Sclaudio enum nbr_action { 262cdd38203Sclaudio NBR_ACT_NOTHING, 263cdd38203Sclaudio NBR_ACT_RST_ITIMER, 264cdd38203Sclaudio NBR_ACT_STRT_ITIMER, 265cdd38203Sclaudio NBR_ACT_EVAL, 266cdd38203Sclaudio NBR_ACT_SNAP, 267cdd38203Sclaudio NBR_ACT_SNAP_DONE, 268cdd38203Sclaudio NBR_ACT_XCHNG_DONE, 269cdd38203Sclaudio NBR_ACT_ADJ_OK, 270cdd38203Sclaudio NBR_ACT_RESTRT_DD, 271cdd38203Sclaudio NBR_ACT_DEL, 272cdd38203Sclaudio NBR_ACT_CLR_LST, 273cdd38203Sclaudio NBR_ACT_HELLO_CHK 274cdd38203Sclaudio }; 275cdd38203Sclaudio 276204df0f8Sclaudio /* auth types */ 277204df0f8Sclaudio enum auth_type { 278204df0f8Sclaudio AUTH_NONE, 279204df0f8Sclaudio AUTH_SIMPLE, 280204df0f8Sclaudio AUTH_CRYPT 281204df0f8Sclaudio }; 282204df0f8Sclaudio 2833ada9d8fSnorby /* spf states */ 2843ada9d8fSnorby enum spf_state { 2853ada9d8fSnorby SPF_IDLE, 2863ada9d8fSnorby SPF_DELAY, 2873ada9d8fSnorby SPF_HOLD, 2883ada9d8fSnorby SPF_HOLDQUEUE 2893ada9d8fSnorby }; 2903ada9d8fSnorby 291eb1522a1Snorby enum dst_type { 292eb1522a1Snorby DT_NET, 293eb1522a1Snorby DT_RTR 294eb1522a1Snorby }; 295eb1522a1Snorby 2963ada9d8fSnorby enum path_type { 2973ada9d8fSnorby PT_INTRA_AREA, 2983ada9d8fSnorby PT_INTER_AREA, 2993ada9d8fSnorby PT_TYPE1_EXT, 3003ada9d8fSnorby PT_TYPE2_EXT 3013ada9d8fSnorby }; 3023ada9d8fSnorby 30337355230Snorby enum rib_type { 30437355230Snorby RIB_NET = 1, 30537355230Snorby RIB_RTR, 30637355230Snorby RIB_EXT 30737355230Snorby }; 30837355230Snorby 30903431b74Snorby struct auth_md { 31003431b74Snorby TAILQ_ENTRY(auth_md) entry; 31103431b74Snorby char key[MD5_DIGEST_LENGTH]; 31203431b74Snorby u_int8_t keyid; 31303431b74Snorby }; 31403431b74Snorby 315204df0f8Sclaudio /* lsa list used in RDE and OE */ 316204df0f8Sclaudio TAILQ_HEAD(lsa_head, lsa_entry); 31776b51f83Sclaudio TAILQ_HEAD(auth_md_head, auth_md); 318204df0f8Sclaudio 319204df0f8Sclaudio struct iface { 320204df0f8Sclaudio LIST_ENTRY(iface) entry; 321204df0f8Sclaudio struct event hello_timer; 322204df0f8Sclaudio struct event wait_timer; 323204df0f8Sclaudio struct event lsack_tx_timer; 324204df0f8Sclaudio 325204df0f8Sclaudio LIST_HEAD(, nbr) nbr_list; 32676b51f83Sclaudio struct auth_md_head auth_md_list; 327204df0f8Sclaudio struct lsa_head ls_ack_list; 328097ed198Sclaudio struct lsa_tree lsa_tree; 329204df0f8Sclaudio 330204df0f8Sclaudio char name[IF_NAMESIZE]; 331fba2d3d0Sclaudio char demote_group[IFNAMSIZ]; 332ac149fe2Sremi char dependon[IFNAMSIZ]; 333764e7e6cSclaudio char auth_key[MAX_SIMPLE_AUTH_LEN]; 334204df0f8Sclaudio struct in_addr addr; 335feb9f399Snorby struct in_addr dst; 336204df0f8Sclaudio struct in_addr mask; 337c7e5c5fcSnorby struct in_addr abr_id; 338204df0f8Sclaudio struct nbr *dr; /* designated router */ 339204df0f8Sclaudio struct nbr *bdr; /* backup designated router */ 340204df0f8Sclaudio struct nbr *self; 341204df0f8Sclaudio struct area *area; 342204df0f8Sclaudio 3432e87294eSclaudio u_int64_t baudrate; 344204df0f8Sclaudio u_int32_t dead_interval; 3457afdfd2dSdlg u_int32_t fast_hello_interval; 346204df0f8Sclaudio u_int32_t ls_ack_cnt; 34703431b74Snorby u_int32_t crypt_seq_num; 3483388a643Snorby time_t uptime; 349204df0f8Sclaudio unsigned int ifindex; 350358269bbSclaudio u_int rdomain; 351204df0f8Sclaudio int fd; 352204df0f8Sclaudio int state; 353204df0f8Sclaudio int mtu; 354ac149fe2Sremi int depend_ok; 355204df0f8Sclaudio u_int16_t flags; 3561d3a1c7dSnorby u_int16_t transmit_delay; 357204df0f8Sclaudio u_int16_t hello_interval; 358204df0f8Sclaudio u_int16_t rxmt_interval; 359204df0f8Sclaudio u_int16_t metric; 360204df0f8Sclaudio enum iface_type type; 361204df0f8Sclaudio enum auth_type auth_type; 36218ffdd94Sstsp u_int8_t if_type; 36303431b74Snorby u_int8_t auth_keyid; 364204df0f8Sclaudio u_int8_t linkstate; 365204df0f8Sclaudio u_int8_t priority; 3665c6e55e9Snorby u_int8_t passive; 367204df0f8Sclaudio }; 368204df0f8Sclaudio 3692dc8313fSremi struct ifaddrchange { 370a60d5a8aSclaudio struct in_addr addr; 3712dc8313fSremi struct in_addr mask; 3722dc8313fSremi struct in_addr dst; 373a60d5a8aSclaudio unsigned int ifindex; 374a60d5a8aSclaudio }; 375a60d5a8aSclaudio 376204df0f8Sclaudio /* ospf_conf */ 377*d8606ed9Sclaudio enum ospfd_process { 378204df0f8Sclaudio PROC_MAIN, 379204df0f8Sclaudio PROC_OSPF_ENGINE, 380204df0f8Sclaudio PROC_RDE_ENGINE 381*d8606ed9Sclaudio }; 382*d8606ed9Sclaudio extern enum ospfd_process ospfd_process; 383204df0f8Sclaudio 384204df0f8Sclaudio struct ospfd_conf { 385204df0f8Sclaudio struct event ev; 386204df0f8Sclaudio struct in_addr rtr_id; 387e2993955Sclaudio LIST_HEAD(, area) area_list; 388e2993955Sclaudio LIST_HEAD(, vertex) cand_list; 3896fa28760Sclaudio struct redist_list redist_list; 390e2993955Sclaudio 391204df0f8Sclaudio u_int32_t opts; 392204df0f8Sclaudio #define OSPFD_OPT_VERBOSE 0x00000001 393204df0f8Sclaudio #define OSPFD_OPT_VERBOSE2 0x00000002 394204df0f8Sclaudio #define OSPFD_OPT_NOACTION 0x00000004 3951891964aSclaudio #define OSPFD_OPT_STUB_ROUTER 0x00000008 396fba2d3d0Sclaudio #define OSPFD_OPT_FORCE_DEMOTE 0x00000010 3973ada9d8fSnorby u_int32_t spf_delay; 3983ada9d8fSnorby u_int32_t spf_hold_time; 3995f00f66cSnorby time_t uptime; 4003ada9d8fSnorby int spf_state; 401204df0f8Sclaudio int ospf_socket; 402204df0f8Sclaudio int flags; 403ad4152efSbenno int redist_label_or_prefix; 40459df52c7Snorby u_int8_t rfc1583compat; 405317d560cSclaudio u_int8_t border; 406bbb232d2Sclaudio u_int8_t redistribute; 4074c260f66Sremi u_int8_t fib_priority; 408e4caa3d9Sclaudio u_int rdomain; 409d1b94773Sreyk char *csock; 410204df0f8Sclaudio }; 411204df0f8Sclaudio 412204df0f8Sclaudio /* kroute */ 413204df0f8Sclaudio struct kroute { 414204df0f8Sclaudio struct in_addr prefix; 415204df0f8Sclaudio struct in_addr nexthop; 4161795d796Sclaudio u_int32_t ext_tag; 417afcfb5e2Sclaudio u_int32_t metric; 418204df0f8Sclaudio u_int16_t flags; 419bbb232d2Sclaudio u_int16_t rtlabel; 420204df0f8Sclaudio u_short ifindex; 421e9fa2173Sclaudio u_int8_t prefixlen; 4221795d796Sclaudio u_int8_t priority; 423204df0f8Sclaudio }; 424204df0f8Sclaudio 42566dd3991Sclaudio struct kif_addr { 42666dd3991Sclaudio TAILQ_ENTRY(kif_addr) entry; 42766dd3991Sclaudio struct in_addr addr; 42866dd3991Sclaudio struct in_addr mask; 42966dd3991Sclaudio struct in_addr dstbrd; 43066dd3991Sclaudio }; 43166dd3991Sclaudio 432204df0f8Sclaudio struct kif { 433204df0f8Sclaudio char ifname[IF_NAMESIZE]; 4342e87294eSclaudio u_int64_t baudrate; 435e9fa2173Sclaudio int flags; 436e9fa2173Sclaudio int mtu; 437358269bbSclaudio unsigned int ifindex; 438358269bbSclaudio u_int rdomain; 43918ffdd94Sstsp u_int8_t if_type; 440204df0f8Sclaudio u_int8_t link_state; 441204df0f8Sclaudio u_int8_t nh_reachable; /* for nexthop verification */ 442204df0f8Sclaudio }; 443204df0f8Sclaudio 444fcb4545bSreyk /* name2id */ 445fcb4545bSreyk struct n2id_label { 446fcb4545bSreyk TAILQ_ENTRY(n2id_label) entry; 447fcb4545bSreyk char *name; 448fcb4545bSreyk u_int16_t id; 449fcb4545bSreyk u_int32_t ext_tag; 450fcb4545bSreyk int ref; 451fcb4545bSreyk }; 452fcb4545bSreyk 453fcb4545bSreyk TAILQ_HEAD(n2id_labels, n2id_label); 454fcb4545bSreyk extern struct n2id_labels rt_labels; 455fcb4545bSreyk 456204df0f8Sclaudio /* control data structures */ 457204df0f8Sclaudio struct ctl_iface { 458204df0f8Sclaudio char name[IF_NAMESIZE]; 459204df0f8Sclaudio struct in_addr addr; 460204df0f8Sclaudio struct in_addr mask; 461204df0f8Sclaudio struct in_addr area; 462204df0f8Sclaudio struct in_addr rtr_id; 463204df0f8Sclaudio struct in_addr dr_id; 464204df0f8Sclaudio struct in_addr dr_addr; 465204df0f8Sclaudio struct in_addr bdr_id; 466204df0f8Sclaudio struct in_addr bdr_addr; 4677afdfd2dSdlg struct timeval hello_timer; 4683388a643Snorby time_t uptime; 4692e87294eSclaudio u_int64_t baudrate; 470204df0f8Sclaudio u_int32_t dead_interval; 4717afdfd2dSdlg u_int32_t fast_hello_interval; 472204df0f8Sclaudio unsigned int ifindex; 473204df0f8Sclaudio int state; 474204df0f8Sclaudio int mtu; 475204df0f8Sclaudio int nbr_cnt; 476204df0f8Sclaudio int adj_cnt; 4771d3a1c7dSnorby u_int16_t transmit_delay; 478204df0f8Sclaudio u_int16_t hello_interval; 479204df0f8Sclaudio u_int16_t flags; 480204df0f8Sclaudio u_int16_t metric; 481204df0f8Sclaudio u_int16_t rxmt_interval; 482204df0f8Sclaudio enum iface_type type; 483204df0f8Sclaudio u_int8_t linkstate; 48418ffdd94Sstsp u_int8_t if_type; 485204df0f8Sclaudio u_int8_t priority; 4865c6e55e9Snorby u_int8_t passive; 487a4aef966Smsf enum auth_type auth_type; 488a4aef966Smsf u_int8_t auth_keyid; 48927198fecSdlg char dependon[IF_NAMESIZE]; 49027198fecSdlg int depend_ok; 491204df0f8Sclaudio }; 492204df0f8Sclaudio 493204df0f8Sclaudio struct ctl_nbr { 494204df0f8Sclaudio char name[IF_NAMESIZE]; 495204df0f8Sclaudio struct in_addr id; 496204df0f8Sclaudio struct in_addr addr; 497204df0f8Sclaudio struct in_addr dr; 498204df0f8Sclaudio struct in_addr bdr; 499204df0f8Sclaudio struct in_addr area; 500204df0f8Sclaudio time_t dead_timer; 501129e6b5fSnorby time_t uptime; 502204df0f8Sclaudio u_int32_t db_sum_lst_cnt; 503204df0f8Sclaudio u_int32_t ls_req_lst_cnt; 504204df0f8Sclaudio u_int32_t ls_retrans_lst_cnt; 505204df0f8Sclaudio u_int32_t state_chng_cnt; 506204df0f8Sclaudio int nbr_state; 507204df0f8Sclaudio int iface_state; 508204df0f8Sclaudio u_int8_t priority; 509204df0f8Sclaudio u_int8_t options; 510204df0f8Sclaudio }; 511204df0f8Sclaudio 51237355230Snorby struct ctl_rt { 51337355230Snorby struct in_addr prefix; 51437355230Snorby struct in_addr nexthop; 51537355230Snorby struct in_addr area; 51637355230Snorby struct in_addr adv_rtr; 5177aa44f3cSnorby time_t uptime; 51837355230Snorby u_int32_t cost; 5198ae50567Snorby u_int32_t cost2; 52037355230Snorby enum path_type p_type; 52137355230Snorby enum dst_type d_type; 5228ae50567Snorby u_int8_t flags; 52337355230Snorby u_int8_t prefixlen; 52406267228Sclaudio u_int8_t connected; 52537355230Snorby }; 52637355230Snorby 52759df52c7Snorby struct ctl_sum { 52859df52c7Snorby struct in_addr rtr_id; 52959df52c7Snorby u_int32_t spf_delay; 53059df52c7Snorby u_int32_t spf_hold_time; 53159df52c7Snorby u_int32_t num_ext_lsa; 53259df52c7Snorby u_int32_t num_area; 533aa8be4a8Sclaudio u_int32_t ext_lsa_cksum; 5345f00f66cSnorby time_t uptime; 53559df52c7Snorby u_int8_t rfc1583compat; 53659df52c7Snorby }; 53759df52c7Snorby 53859df52c7Snorby struct ctl_sum_area { 53959df52c7Snorby struct in_addr area; 54059df52c7Snorby u_int32_t num_iface; 54159df52c7Snorby u_int32_t num_adj_nbr; 54259df52c7Snorby u_int32_t num_spf_calc; 54359df52c7Snorby u_int32_t num_lsa; 544aa8be4a8Sclaudio u_int32_t lsa_cksum; 54559df52c7Snorby }; 54659df52c7Snorby 547fba2d3d0Sclaudio struct demote_msg { 548fba2d3d0Sclaudio char demote_group[IF_NAMESIZE]; 549fba2d3d0Sclaudio int level; 550fba2d3d0Sclaudio }; 551fba2d3d0Sclaudio 552204df0f8Sclaudio /* area.c */ 553204df0f8Sclaudio struct area *area_new(void); 554204df0f8Sclaudio int area_del(struct area *); 555204df0f8Sclaudio struct area *area_find(struct ospfd_conf *, struct in_addr); 55606267228Sclaudio void area_track(struct area *); 557317d560cSclaudio int area_border_router(struct ospfd_conf *); 5583ffd5c19Sclaudio u_int8_t area_ospf_options(struct area *); 559204df0f8Sclaudio 560fba2d3d0Sclaudio /* carp.c */ 561fba2d3d0Sclaudio int carp_demote_init(char *, int); 562fba2d3d0Sclaudio void carp_demote_shutdown(void); 563fba2d3d0Sclaudio int carp_demote_get(char *); 564fba2d3d0Sclaudio int carp_demote_set(char *, int); 565fba2d3d0Sclaudio 566204df0f8Sclaudio /* parse.y */ 567204df0f8Sclaudio struct ospfd_conf *parse_config(char *, int); 568f65e64a0Sdenis u_int32_t get_rtr_id(void); 569204df0f8Sclaudio int cmdline_symset(char *); 570ac149fe2Sremi void conf_clear_redist_list(struct redist_list *); 571204df0f8Sclaudio 572204df0f8Sclaudio /* in_cksum.c */ 5735368b4c3Sclaudio u_int16_t in_cksum(void *, size_t); 574204df0f8Sclaudio 575204df0f8Sclaudio /* iso_cksum.c */ 576204df0f8Sclaudio u_int16_t iso_cksum(void *, u_int16_t, u_int16_t); 577204df0f8Sclaudio 578204df0f8Sclaudio /* kroute.c */ 579e9fa2173Sclaudio int kif_init(void); 580358269bbSclaudio void kif_clear(void); 5814c260f66Sremi int kr_init(int, u_int, int, u_int8_t); 582d5218eb1Sclaudio int kr_change(struct kroute *, int); 583204df0f8Sclaudio int kr_delete(struct kroute *); 584204df0f8Sclaudio void kr_shutdown(void); 585204df0f8Sclaudio void kr_fib_couple(void); 586204df0f8Sclaudio void kr_fib_decouple(void); 587119f0f1dSdlg void kr_fib_reload(void); 5884c260f66Sremi void kr_fib_update_prio(u_int8_t); 589204df0f8Sclaudio void kr_dispatch_msg(int, short, void *); 590204df0f8Sclaudio void kr_show_route(struct imsg *); 59170955e50Sclaudio void kr_ifinfo(char *, pid_t); 59266dd3991Sclaudio struct kif *kif_findname(char *, struct in_addr, struct kif_addr **); 593ad4152efSbenno void kr_reload(int); 594204df0f8Sclaudio 59515ab6e8cSclaudio u_int8_t mask2prefixlen(in_addr_t); 59615ab6e8cSclaudio in_addr_t prefixlen2mask(u_int8_t); 59715ab6e8cSclaudio 598f2e37bc3Sbenno /* logmsg.h */ 599cdd38203Sclaudio const char *nbr_state_name(int); 600cdd38203Sclaudio const char *if_state_name(int); 601cdd38203Sclaudio const char *if_type_name(enum iface_type); 602cdd38203Sclaudio const char *if_auth_name(enum auth_type); 603cdd38203Sclaudio const char *dst_type_name(enum dst_type); 604cdd38203Sclaudio const char *path_type_name(enum path_type); 605cdd38203Sclaudio 606bbb232d2Sclaudio /* name2id.c */ 607bbb232d2Sclaudio u_int16_t rtlabel_name2id(const char *); 608bbb232d2Sclaudio const char *rtlabel_id2name(u_int16_t); 609bbb232d2Sclaudio void rtlabel_unref(u_int16_t); 610fcb4545bSreyk u_int32_t rtlabel_id2tag(u_int16_t); 611fcb4545bSreyk u_int16_t rtlabel_tag2id(u_int32_t); 612fcb4545bSreyk void rtlabel_tag(u_int16_t, u_int32_t); 613bbb232d2Sclaudio 614fa6b10e6Sclaudio /* ospfd.c */ 615fa6b10e6Sclaudio void main_imsg_compose_ospfe(int, pid_t, void *, u_int16_t); 616617bb465Sremi void main_imsg_compose_ospfe_fd(int, pid_t, int); 617fa6b10e6Sclaudio void main_imsg_compose_rde(int, pid_t, void *, u_int16_t); 618f373ed5aSclaudio int ospf_redistribute(struct kroute *, u_int32_t *); 619f28af201Sclaudio void merge_config(struct ospfd_conf *, struct ospfd_conf *); 6207b4c0c10Seric void imsg_event_add(struct imsgev *); 6217b4c0c10Seric int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, 622d13e54e1Spyr pid_t, int, void *, u_int16_t); 623ac149fe2Sremi int ifstate_is_up(struct kif *kif); 624fa6b10e6Sclaudio 62504fa3fdbSnorby /* printconf.c */ 62604fa3fdbSnorby void print_config(struct ospfd_conf *); 62704fa3fdbSnorby 628204df0f8Sclaudio #endif /* _OSPFD_H_ */ 629