xref: /openbsd/usr.sbin/rad/rad.h (revision 20fc6e8e)
1 /*	$OpenBSD: rad.h,v 1.28 2024/05/31 16:10:42 florian Exp $	*/
2 
3 /*
4  * Copyright (c) 2018 Florian Obser <florian@openbsd.org>
5  * Copyright (c) 2004 Esben Norby <norby@openbsd.org>
6  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
7  *
8  * Permission to use, copy, modify, and distribute this software for any
9  * purpose with or without fee is hereby granted, provided that the above
10  * copyright notice and this permission notice appear in all copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19  */
20 
21 #define	_PATH_CONF_FILE		"/etc/rad.conf"
22 #define	_PATH_RAD_SOCKET	"/var/run/rad.sock"
23 #define	RAD_USER		"_rad"
24 
25 #define	OPT_VERBOSE	0x00000001
26 #define	OPT_VERBOSE2	0x00000002
27 #define	OPT_NOACTION	0x00000004
28 
29 #define	MAX_RTR_ADV_INTERVAL	600
30 #define	MIN_RTR_ADV_INTERVAL	200
31 #define	ADV_DEFAULT_LIFETIME	3 * MAX_RTR_ADV_INTERVAL
32 #define	ADV_PREFERRED_LIFETIME	2700	/* 45 minutes */
33 #define	ADV_VALID_LIFETIME	5400	/* 90 minutes */
34 #define	MAX_RA_DELAY_TIME	500	/* 500 milliseconds */
35 #define	MIN_DELAY_BETWEEN_RAS	3	/* 3 seconds */
36 #define	MAX_SEARCH		1025	/* MAXDNAME in arpa/nameser.h */
37 #define	DEFAULT_RDNS_LIFETIME	600 * 1.5
38 #define	PLTIME_DECAYING		1
39 #define	VLTIME_DECAYING		2
40 
41 #define	IMSG_DATA_SIZE(imsg)	((imsg).hdr.len - IMSG_HEADER_SIZE)
42 
43 struct imsgev {
44 	struct imsgbuf	 ibuf;
45 	void		(*handler)(int, short, void *);
46 	struct event	 ev;
47 	short		 events;
48 };
49 
50 enum imsg_type {
51 	IMSG_NONE,
52 	IMSG_CTL_LOG_VERBOSE,
53 	IMSG_CTL_RELOAD,
54 	IMSG_RECONF_CONF,
55 	IMSG_RECONF_RA_IFACE,
56 	IMSG_RECONF_RA_AUTOPREFIX,
57 	IMSG_RECONF_RA_PREFIX,
58 	IMSG_RECONF_RA_RDNSS,
59 	IMSG_RECONF_RA_DNSSL,
60 	IMSG_RECONF_RA_PREF64,
61 	IMSG_RECONF_END,
62 	IMSG_ICMP6SOCK,
63 	IMSG_OPEN_ICMP6SOCK,
64 	IMSG_ROUTESOCK,
65 	IMSG_CONTROLFD,
66 	IMSG_STARTUP,
67 	IMSG_RA_RS,
68 	IMSG_SEND_RA,
69 	IMSG_UPDATE_IF,
70 	IMSG_REMOVE_IF,
71 	IMSG_SOCKET_IPC
72 };
73 
74 /* RFC 8106 */
75 struct ra_rdnss_conf {
76 	SIMPLEQ_ENTRY(ra_rdnss_conf)	entry;
77 	struct in6_addr			rdnss;
78 };
79 struct ra_dnssl_conf {
80 	SIMPLEQ_ENTRY(ra_dnssl_conf)	entry;
81 	char				search[MAX_SEARCH];
82 };
83 
84 /* RFC 8781 Section 4 */
85 struct ra_pref64_conf {
86 	SIMPLEQ_ENTRY(ra_pref64_conf)	 entry;
87 	struct in6_addr			 prefix;	/* prefix */
88 	int				 prefixlen;	/* prefix length */
89 	uint32_t			 ltime;		/* lifetime */
90 };
91 
92 /* RFC 4861 Sections 4.2 and 4.6.4 */
93 struct ra_options_conf {
94 	int		dfr;			/* is default router? */
95 	int		cur_hl;			/* current hop limit */
96 	int		m_flag;			/* managed address conf flag */
97 	int		o_flag;			/* other conf flag */
98 	int		rtpref;			/* router preference */
99 	int		router_lifetime;	/* default router lifetime */
100 	uint32_t	reachable_time;
101 	uint32_t	retrans_timer;
102 	int		source_link_addr;	/* source link-layer address */
103 	uint32_t	mtu;
104 	uint32_t	rdns_lifetime;
105 	SIMPLEQ_HEAD(, ra_rdnss_conf)		 ra_rdnss_list;
106 	int		rdnss_count;
107 	SIMPLEQ_HEAD(, ra_dnssl_conf)		 ra_dnssl_list;
108 	int		dnssl_len;
109 	SIMPLEQ_HEAD(, ra_pref64_conf)		 ra_pref64_list;
110 };
111 
112 /* RFC 4861 Section 4.6.2 */
113 struct ra_prefix_conf {
114 	SIMPLEQ_ENTRY(ra_prefix_conf)	 entry;
115 	struct in6_addr			 prefix;	/* prefix */
116 	int				 prefixlen;	/* prefix length */
117 	uint32_t			 vltime;	/* valid lifetime */
118 	uint32_t			 pltime;	/* preferred lifetime */
119 	int				 ltime_decaying;
120 	int				 lflag;		/* on-link flag*/
121 	int				 aflag;		/* autonom. addr flag */
122 };
123 
124 struct ra_iface_conf {
125 	SIMPLEQ_ENTRY(ra_iface_conf)		 entry;
126 	struct ra_options_conf			 ra_options;
127 	struct ra_prefix_conf			*autoprefix;
128 	SIMPLEQ_HEAD(ra_prefix_conf_head,
129 	    ra_prefix_conf)			 ra_prefix_list;
130 	char					 name[IF_NAMESIZE];
131 };
132 
133 struct rad_conf {
134 	struct ra_options_conf				 ra_options;
135 	SIMPLEQ_HEAD(ra_iface_conf_head, ra_iface_conf)	 ra_iface_list;
136 };
137 
138 struct imsg_ra_rs {
139 	uint32_t		if_index;
140 	struct sockaddr_in6	from;
141 	ssize_t			len;
142 	uint8_t			packet[1500];
143 };
144 
145 struct imsg_send_ra {
146 	uint32_t		if_index;
147 	struct sockaddr_in6	to;
148 };
149 
150 extern uint32_t	 cmd_opts;
151 
152 /* rad.c */
153 int	main_imsg_compose_frontend(int, int, void *, uint16_t);
154 void	main_imsg_compose_engine(int, pid_t, void *, uint16_t);
155 void	merge_config(struct rad_conf *, struct rad_conf *);
156 void	imsg_event_add(struct imsgev *);
157 int	imsg_compose_event(struct imsgev *, uint16_t, uint32_t, pid_t,
158 	    int, void *, uint16_t);
159 
160 struct rad_conf	*config_new_empty(void);
161 void		 config_clear(struct rad_conf *);
162 void		 free_ra_iface_conf(struct ra_iface_conf *);
163 void		 free_dns_options(struct ra_options_conf *);
164 void		 mask_prefix(struct in6_addr*, int len);
165 const char	*sin6_to_str(struct sockaddr_in6 *);
166 const char	*in6_to_str(struct in6_addr *);
167 
168 /* printconf.c */
169 void	print_config(struct rad_conf *);
170 
171 /* parse.y */
172 struct rad_conf	*parse_config(char *);
173 int			 cmdline_symset(char *);
174