1/*	$OpenBSD: ospf6d.h,v 1.52 2024/05/18 11:17:30 jsg 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
63static const char * const log_procnames[] = {
64	"parent",
65	"ospfe",
66	"rde"
67};
68
69struct imsgev {
70	struct imsgbuf		 ibuf;
71	void			(*handler)(int, short, void *);
72	struct event		 ev;
73	void			*data;
74	short			 events;
75};
76
77enum 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_FIB_RELOAD,
97	IMSG_CTL_AREA,
98	IMSG_CTL_IFACE,
99	IMSG_CTL_KROUTE,
100	IMSG_CTL_KROUTE_ADDR,
101	IMSG_CTL_END,
102	IMSG_CTL_LOG_VERBOSE,
103	IMSG_CONTROLFD,
104	IMSG_KROUTE_CHANGE,
105	IMSG_KROUTE_DELETE,
106	IMSG_IFINFO,
107	IMSG_IFADDRNEW,
108	IMSG_IFADDRDEL,
109	IMSG_NEIGHBOR_UP,
110	IMSG_NEIGHBOR_DOWN,
111	IMSG_NEIGHBOR_CHANGE,
112	IMSG_NETWORK_ADD,
113	IMSG_NETWORK_DEL,
114	IMSG_AREA_CHANGE,
115	IMSG_DD,
116	IMSG_DD_END,
117	IMSG_DB_SNAPSHOT,
118	IMSG_DB_END,
119	IMSG_LS_REQ,
120	IMSG_LS_UPD,
121	IMSG_LS_SNAP,
122	IMSG_LS_ACK,
123	IMSG_LS_FLOOD,
124	IMSG_LS_BADREQ,
125	IMSG_LS_MAXAGE,
126	IMSG_ABR_UP,
127	IMSG_ABR_DOWN,
128	IMSG_RECONF_CONF,
129	IMSG_RECONF_AREA,
130	IMSG_RECONF_END,
131	IMSG_DEMOTE
132};
133
134/* area */
135struct vertex;
136struct rde_nbr;
137RB_HEAD(lsa_tree, vertex);
138
139struct area {
140	LIST_ENTRY(area)	 entry;
141	struct in_addr		 id;
142	struct lsa_tree		 lsa_tree;
143
144	LIST_HEAD(, iface)	 iface_list;
145	LIST_HEAD(, rde_nbr)	 nbr_list;
146/*	list			 addr_range_list; */
147	char			 demote_group[IFNAMSIZ];
148	u_int32_t		 stub_default_cost;
149	u_int32_t		 num_spf_calc;
150	int			 active;
151	u_int8_t		 transit;
152	u_int8_t		 stub;
153	u_int8_t		 dirty;
154	u_int8_t		 demote_level;
155};
156
157/* interface states */
158#define	IF_STA_NEW		0x00	/* dummy state for reload */
159#define	IF_STA_DOWN		0x01
160#define	IF_STA_LOOPBACK		0x02
161#define	IF_STA_WAITING		0x04
162#define	IF_STA_POINTTOPOINT	0x08
163#define	IF_STA_DROTHER		0x10
164#define	IF_STA_BACKUP		0x20
165#define	IF_STA_DR		0x40
166#define IF_STA_DRORBDR		(IF_STA_DR | IF_STA_BACKUP)
167#define	IF_STA_MULTI		(IF_STA_DROTHER | IF_STA_BACKUP | IF_STA_DR)
168#define	IF_STA_ANY		0x7f
169
170/* interface events */
171enum iface_event {
172	IF_EVT_NOTHING,
173	IF_EVT_UP,
174	IF_EVT_WTIMER,
175	IF_EVT_BACKUP_SEEN,
176	IF_EVT_NBR_CHNG,
177	IF_EVT_LOOP,
178	IF_EVT_UNLOOP,
179	IF_EVT_DOWN
180};
181
182/* interface actions */
183enum iface_action {
184	IF_ACT_NOTHING,
185	IF_ACT_STRT,
186	IF_ACT_ELECT,
187	IF_ACT_RST
188};
189
190/* interface types */
191enum iface_type {
192	IF_TYPE_POINTOPOINT,
193	IF_TYPE_BROADCAST,
194	IF_TYPE_NBMA,
195	IF_TYPE_POINTOMULTIPOINT,
196	IF_TYPE_VIRTUALLINK
197};
198
199/* neighbor states */
200#define	NBR_STA_DOWN		0x0001
201#define	NBR_STA_ATTEMPT		0x0002
202#define	NBR_STA_INIT		0x0004
203#define	NBR_STA_2_WAY		0x0008
204#define	NBR_STA_XSTRT		0x0010
205#define NBR_STA_SNAP		0x0020
206#define	NBR_STA_XCHNG		0x0040
207#define	NBR_STA_LOAD		0x0080
208#define	NBR_STA_FULL		0x0100
209#define	NBR_STA_ACTIVE		(~NBR_STA_DOWN)
210#define	NBR_STA_FLOOD		(NBR_STA_XCHNG | NBR_STA_LOAD | NBR_STA_FULL)
211#define	NBR_STA_ADJFORM		(NBR_STA_XSTRT | NBR_STA_SNAP | NBR_STA_FLOOD)
212#define	NBR_STA_BIDIR		(NBR_STA_2_WAY | NBR_STA_ADJFORM)
213#define	NBR_STA_PRELIM		(NBR_STA_DOWN | NBR_STA_ATTEMPT | NBR_STA_INIT)
214#define	NBR_STA_ANY		0xffff
215
216/* neighbor events */
217enum nbr_event {
218	NBR_EVT_NOTHING,
219	NBR_EVT_HELLO_RCVD,
220	NBR_EVT_2_WAY_RCVD,
221	NBR_EVT_NEG_DONE,
222	NBR_EVT_SNAP_DONE,
223	NBR_EVT_XCHNG_DONE,
224	NBR_EVT_BAD_LS_REQ,
225	NBR_EVT_LOAD_DONE,
226	NBR_EVT_ADJ_OK,
227	NBR_EVT_SEQ_NUM_MIS,
228	NBR_EVT_1_WAY_RCVD,
229	NBR_EVT_KILL_NBR,
230	NBR_EVT_ITIMER,
231	NBR_EVT_LL_DOWN,
232	NBR_EVT_ADJTMOUT
233};
234
235/* neighbor actions */
236enum nbr_action {
237	NBR_ACT_NOTHING,
238	NBR_ACT_RST_ITIMER,
239	NBR_ACT_STRT_ITIMER,
240	NBR_ACT_EVAL,
241	NBR_ACT_SNAP,
242	NBR_ACT_SNAP_DONE,
243	NBR_ACT_XCHNG_DONE,
244	NBR_ACT_ADJ_OK,
245	NBR_ACT_RESTRT_DD,
246	NBR_ACT_DEL,
247	NBR_ACT_CLR_LST,
248	NBR_ACT_HELLO_CHK
249};
250
251/* spf states */
252enum spf_state {
253	SPF_IDLE,
254	SPF_DELAY,
255	SPF_HOLD,
256	SPF_HOLDQUEUE
257};
258
259enum dst_type {
260	DT_NET,
261	DT_RTR
262};
263
264enum path_type {
265	PT_INTRA_AREA,
266	PT_INTER_AREA,
267	PT_TYPE1_EXT,
268	PT_TYPE2_EXT
269};
270
271enum rib_type {
272	RIB_NET = 1,
273	RIB_RTR,
274	RIB_EXT
275};
276
277struct iface_addr {
278	TAILQ_ENTRY(iface_addr)	 entry;
279	struct in6_addr		 addr;
280	struct in6_addr		 dstbrd;
281	u_int8_t		 prefixlen;
282	u_int8_t		 redistribute;
283};
284
285/* lsa list used in RDE and OE */
286TAILQ_HEAD(lsa_head, lsa_entry);
287
288struct iface {
289	LIST_ENTRY(iface)	 entry;
290	TAILQ_ENTRY(iface)	 list;
291	struct event		 hello_timer;
292	struct event		 wait_timer;
293	struct event		 lsack_tx_timer;
294
295	LIST_HEAD(, nbr)	 nbr_list;
296	TAILQ_HEAD(, iface_addr) ifa_list;
297	struct lsa_head		 ls_ack_list;
298
299	struct lsa_tree		 lsa_tree;	/* LSA with link local scope */
300
301	char			 name[IF_NAMESIZE];
302	char			 demote_group[IFNAMSIZ];
303	char			 dependon[IFNAMSIZ];
304	struct in6_addr		 addr;
305	struct in6_addr		 dst;
306	struct in_addr		 abr_id;
307	struct nbr		*dr;	/* designated router */
308	struct nbr		*bdr;	/* backup designated router */
309	struct nbr		*self;
310	struct area		*area;
311
312	u_int64_t		 baudrate;
313	u_int32_t		 ls_ack_cnt;
314	time_t			 uptime;
315	unsigned int		 ifindex;
316	u_int			 rdomain;
317	int			 fd;
318	int			 state;
319	int			 mtu;
320	int			 depend_ok;
321	u_int16_t		 flags;
322	u_int16_t		 transmit_delay;
323	u_int16_t		 hello_interval;
324	u_int16_t		 rxmt_interval;
325	u_int16_t		 dead_interval;
326	u_int16_t		 metric;
327	enum iface_type		 type;
328	u_int8_t		 if_type;
329	u_int8_t		 linkstate;
330	u_int8_t		 priority;
331	u_int8_t		 cflags;
332#define F_IFACE_PASSIVE		0x01
333#define F_IFACE_CONFIGURED	0x02
334};
335
336struct ifaddrchange {
337	struct in6_addr		 addr;
338	struct in6_addr		 dstbrd;
339	unsigned int		 ifindex;
340	u_int8_t		 prefixlen;
341};
342
343/* ospf_conf */
344enum ospfd_process {
345	PROC_MAIN,
346	PROC_OSPF_ENGINE,
347	PROC_RDE_ENGINE
348};
349extern enum ospfd_process ospfd_process;
350
351#define	REDIST_CONNECTED	0x01
352#define	REDIST_STATIC		0x02
353#define	REDIST_LABEL		0x04
354#define	REDIST_ADDR		0x08
355#define	REDIST_NO		0x10
356#define	REDIST_DEFAULT		0x20
357
358struct redistribute {
359	SIMPLEQ_ENTRY(redistribute)	entry;
360	struct in6_addr			addr;
361	u_int32_t			metric;
362	u_int16_t			label;
363	u_int16_t			type;
364	u_int8_t			prefixlen;
365	char				dependon[IFNAMSIZ];
366};
367SIMPLEQ_HEAD(redist_list, redistribute);
368
369struct ospfd_conf {
370	struct event		ev;
371	struct in_addr		rtr_id;
372	LIST_HEAD(, area)	area_list;
373	LIST_HEAD(, vertex)	cand_list;
374	struct redist_list	redist_list;
375
376	u_int32_t		opts;
377#define OSPFD_OPT_VERBOSE	0x00000001
378#define OSPFD_OPT_VERBOSE2	0x00000002
379#define OSPFD_OPT_NOACTION	0x00000004
380#define OSPFD_OPT_STUB_ROUTER	0x00000008
381#define OSPFD_OPT_FORCE_DEMOTE	0x00000010
382	u_int32_t		spf_delay;
383	u_int32_t		spf_hold_time;
384	time_t			uptime;
385	int			spf_state;
386	int			ospf_socket;
387	int			flags;
388	int			redist_label_or_prefix;
389	u_int8_t		border;
390	u_int8_t		redistribute;
391	u_int8_t		fib_priority;
392	u_int			rdomain;
393	char			*csock;
394};
395
396/* kroute */
397struct kroute {
398	struct in6_addr	prefix;
399	struct in6_addr	nexthop;
400	u_int32_t	ext_tag;
401	u_int32_t	metric;
402	unsigned int	scope;		/* scope of nexthop */
403	u_int16_t	flags;
404	u_int16_t	rtlabel;
405	u_short		ifindex;
406	u_int8_t	prefixlen;
407	u_int8_t	priority;
408};
409
410/* name2id */
411struct n2id_label {
412	TAILQ_ENTRY(n2id_label)	 entry;
413	char			*name;
414	u_int16_t		 id;
415	u_int32_t		 ext_tag;
416	int			 ref;
417};
418
419TAILQ_HEAD(n2id_labels, n2id_label);
420extern struct n2id_labels rt_labels;
421
422/* control data structures */
423struct ctl_iface {
424	char			 name[IF_NAMESIZE];
425	struct in6_addr		 addr;
426	struct in_addr		 area;
427	struct in_addr		 rtr_id;
428	struct in_addr		 dr_id;
429	struct in6_addr		 dr_addr;
430	struct in_addr		 bdr_id;
431	struct in6_addr		 bdr_addr;
432	time_t			 hello_timer;
433	time_t			 uptime;
434	u_int64_t		 baudrate;
435	u_int32_t		 dead_interval;
436	unsigned int		 ifindex;
437	int			 state;
438	int			 mtu;
439	int			 nbr_cnt;
440	int			 adj_cnt;
441	u_int16_t		 transmit_delay;
442	u_int16_t		 hello_interval;
443	u_int16_t		 flags;
444	u_int16_t		 metric;
445	u_int16_t		 rxmt_interval;
446	enum iface_type		 type;
447	u_int8_t		 linkstate;
448	u_int8_t		 if_type;
449	u_int8_t		 priority;
450	u_int8_t		 passive;
451};
452
453struct ctl_nbr {
454	char			 name[IF_NAMESIZE];
455	struct in_addr		 id;
456	struct in6_addr		 addr;
457	struct in_addr		 dr;
458	struct in_addr		 bdr;
459	struct in_addr		 area;
460	time_t			 dead_timer;
461	time_t			 uptime;
462	u_int32_t		 db_sum_lst_cnt;
463	u_int32_t		 ls_req_lst_cnt;
464	u_int32_t		 ls_retrans_lst_cnt;
465	u_int32_t		 state_chng_cnt;
466	u_int32_t		 options;
467	int			 nbr_state;
468	int			 iface_state;
469	u_int8_t		 priority;
470};
471
472struct ctl_rt {
473	struct in6_addr		 prefix;
474	struct in6_addr		 nexthop;
475	struct in_addr		 area;
476	struct in_addr		 adv_rtr;
477	time_t			 uptime;
478	u_int32_t		 cost;
479	u_int32_t		 cost2;
480	unsigned int		 ifindex;	/* scope of nexthop */
481	enum path_type		 p_type;
482	enum dst_type		 d_type;
483	u_int8_t		 flags;
484	u_int8_t		 prefixlen;
485	u_int8_t		 connected;
486};
487
488struct ctl_sum {
489	struct in_addr		 rtr_id;
490	u_int32_t		 spf_delay;
491	u_int32_t		 spf_hold_time;
492	u_int32_t		 num_ext_lsa;
493	u_int32_t		 num_area;
494	time_t			 uptime;
495};
496
497struct ctl_sum_area {
498	struct in_addr		 area;
499	u_int32_t		 num_iface;
500	u_int32_t		 num_adj_nbr;
501	u_int32_t		 num_spf_calc;
502	u_int32_t		 num_lsa;
503};
504
505struct demote_msg {
506	char			 demote_group[IF_NAMESIZE];
507	int			 level;
508};
509
510/* area.c */
511struct area	*area_new(void);
512int		 area_del(struct area *);
513struct area	*area_find(struct ospfd_conf *, struct in_addr);
514void		 area_track(struct area *);
515int		 area_border_router(struct ospfd_conf *);
516u_int32_t	 area_ospf_options(struct area *);
517
518/* carp.c */
519int		 carp_demote_init(char *, int);
520void		 carp_demote_shutdown(void);
521int		 carp_demote_get(char *);
522int		 carp_demote_set(char *, int);
523
524/* parse.y */
525struct ospfd_conf	*parse_config(char *, int);
526int			 cmdline_symset(char *);
527void			 conf_clear_redist_list(struct redist_list *);
528
529/* interface.c */
530int		 if_init(void);
531struct iface	*if_find(unsigned int);
532struct iface	*if_findname(char *);
533struct iface	*if_new(u_short, char *);
534void		 if_update(struct iface *, int, int, u_int8_t, u_int8_t,
535		    u_int64_t, u_int32_t);
536
537/* iso_cksum.c */
538u_int16_t	 iso_cksum(void *, u_int16_t, u_int16_t);
539
540/* kroute.c */
541int		 kr_init(int, u_int, int, u_int8_t);
542int		 kr_change(struct kroute *, int);
543int		 kr_delete(struct kroute *);
544void		 kr_shutdown(void);
545void		 kr_fib_couple(void);
546void		 kr_fib_decouple(void);
547void		 kr_fib_reload(void);
548void		 kr_fib_update_prio(u_int8_t);
549void		 kr_dispatch_msg(int, short, void *);
550void		 kr_show_route(struct imsg *);
551void		 kr_reload(int);
552
553void		 embedscope(struct sockaddr_in6 *);
554void		 recoverscope(struct sockaddr_in6 *);
555void		 addscope(struct sockaddr_in6 *, u_int32_t);
556void		 clearscope(struct in6_addr *);
557u_int8_t	 mask2prefixlen(struct sockaddr_in6 *);
558struct in6_addr	*prefixlen2mask(u_int8_t);
559void		inet6applymask(struct in6_addr *, const struct in6_addr *, int);
560
561int		fetchifs(u_short);
562
563/* logmsg.h */
564const char	*log_in6addr(const struct in6_addr *);
565const char	*log_in6addr_scope(const struct in6_addr *, unsigned int);
566const char	*log_rtr_id(u_int32_t);
567const char	*log_sockaddr(void *);
568const char	*nbr_state_name(int);
569const char	*if_state_name(int);
570const char	*if_type_name(enum iface_type);
571const char	*dst_type_name(enum dst_type);
572const char	*path_type_name(enum path_type);
573
574/* name2id.c */
575u_int16_t	 rtlabel_name2id(const char *);
576const char	*rtlabel_id2name(u_int16_t);
577void		 rtlabel_unref(u_int16_t);
578u_int32_t	 rtlabel_id2tag(u_int16_t);
579u_int16_t	 rtlabel_tag2id(u_int32_t);
580void		 rtlabel_tag(u_int16_t, u_int32_t);
581
582/* ospf6d.c */
583void	main_imsg_compose_ospfe(int, pid_t, void *, u_int16_t);
584void	main_imsg_compose_ospfe_fd(int, pid_t, int);
585void	main_imsg_compose_rde(int, pid_t, void *, u_int16_t);
586int	ospf_redistribute(struct kroute *, u_int32_t *);
587void	merge_config(struct ospfd_conf *, struct ospfd_conf *);
588void	imsg_event_add(struct imsgev *);
589int	imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t,
590	    pid_t, int, void *, u_int16_t);
591int	ifstate_is_up(struct iface *iface);
592
593/* printconf.c */
594void	print_config(struct ospfd_conf *);
595
596#endif	/* _OSPF6D_H_ */
597