xref: /openbsd-src/usr.sbin/ospfd/ospfd.h (revision d8606ed99c18bd9b5ac2d468813fdd5f1d3a8eb1)
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