xref: /netbsd-src/external/mpl/dhcp/dist/keama/keama.h (revision f407d9293b6650aa8c33d6a995f797bb6aaefd90)
1 /*	$NetBSD: keama.h,v 1.3 2022/04/03 01:10:59 christos Exp $	*/
2 
3 /*
4  * Copyright (C) 2017-2022 Internet Systems Consortium, Inc. ("ISC")
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
16  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  *
18  *   Internet Systems Consortium, Inc.
19  *   PO Box 360
20  *   Newmarket, NH 03857 USA
21  *   <info@isc.org>
22  *   https://www.isc.org/
23  *
24  */
25 
26 #ifndef EOL
27 #define EOL '\n'
28 #endif
29 
30 #include "data.h"
31 #include "dhctoken.h"
32 
33 #include <time.h>
34 
35 /* Resolution of FQDNs into IPv4 addresses */
36 enum resolve {
37 	perform = 0,	/* resolve */
38 	fatal,		/* raise a fatal error */
39 	pass		/* pass the string wth a warning */
40 };
41 
42 extern enum resolve resolve;
43 
44 /* From includes/dhcp.h */
45 
46 #define HTYPE_ETHER	1
47 #define HTYPE_IEEE802	6
48 #define HTYPE_FDDI	8
49 
50 #define DHO_DHCP_SERVER_IDENTIFIER		54
51 #define DHO_VENDOR_CLASS_IDENTIFIER		60
52 #define DHO_USER_CLASS				77
53 #define DHO_VIVSO_SUBOPTIONS			125
54 
55 /* From includes/dhcp6.h */
56 #define D6O_VENDOR_OPTS				17
57 #define MAX_V6RELAY_HOPS			32
58 
59 /* From includes/dhcpd.h */
60 
61 extern int local_family;
62 
63 /* A parsing context. */
64 
65 struct parse {
66 	int lexline;
67 	int lexchar;
68 	char *token_line;
69 	char *prev_line;
70 	char *cur_line;
71 	const char *tlname;
72 	int eol_token;
73 
74 	/*
75 	 * In order to give nice output when we have a parsing error
76 	 * in our file, we keep track of where we are in the line so
77 	 * that we can show the user.
78 	 *
79 	 * We need to keep track of two lines, because we can look
80 	 * ahead, via the "peek" function, to the next line sometimes.
81 	 *
82 	 * The "line1" and "line2" variables act as buffers for this
83 	 * information. The "lpos" variable tells us where we are in the
84 	 * line.
85 	 *
86 	 * When we "put back" a character from the parsing context, we
87 	 * do not want to have the character appear twice in the error
88 	 * output. So, we set a flag, the "ugflag", which the
89 	 * get_char() function uses to check for this condition.
90 	 */
91 	char line1[81];
92 	char line2[81];
93 	int lpos;
94 	int line;
95 	int tlpos;
96 	int tline;
97 	enum dhcp_token token;
98 	int ugflag;
99 	char *tval;
100 	int tlen;
101 	char tokbuf[1500];
102 
103 	int warnings_occurred;
104 	int file;
105 	char *inbuf;
106 	size_t bufix, buflen;
107 	size_t bufsiz;
108 
109 	/*
110 	 * Additions for the Kea Migration Assistant.
111 	 */
112 	struct element **stack;
113 	size_t stack_size;
114 	size_t stack_top;
115 	size_t issue_counter;
116 
117 	/* don't save below this */
118 	struct comments comments;
119 
120 	/* TAILQ_NEXT(self) is the saved state */
121 	TAILQ_ENTRY(parse) next;
122 
123 };
124 
125 extern TAILQ_HEAD(parses, parse) parses;
126 
127 #define PARAMETER	0
128 #define TOPLEVEL	1
129 #define	ROOT_GROUP	2
130 #define HOST_DECL	3
131 #define SHARED_NET_DECL	4
132 #define SUBNET_DECL	5
133 #define CLASS_DECL	6
134 #define	GROUP_DECL	7
135 #define POOL_DECL	8
136 
137 /* Used as an argument to parse_class_decl() */
138 #define CLASS_TYPE_VENDOR	0
139 #define CLASS_TYPE_USER		1
140 #define CLASS_TYPE_CLASS	2
141 #define CLASS_TYPE_SUBCLASS	3
142 
143 #define CLASS_DECL_DELETED	1
144 #define CLASS_DECL_DYNAMIC	2
145 #define CLASS_DECL_STATIC	4
146 #define CLASS_DECL_SUBCLASS	8
147 
148 /* Hardware buffer size */
149 #define HARDWARE_ADDR_LEN 20
150 
151 /* Expression context */
152 
153 enum expression_context {
154 	context_any, /* indefinite */
155 	context_boolean,
156 	context_data,
157 	context_numeric,
158 	context_dns,
159 	context_data_or_numeric, /* indefinite */
160 	context_function
161 };
162 
163 /* Statements */
164 
165 enum statement_op {
166 	null_statement,
167 	if_statement,
168 	add_statement,
169 	eval_statement,
170 	break_statement,
171 	default_option_statement,
172 	supersede_option_statement,
173 	append_option_statement,
174 	prepend_option_statement,
175 	send_option_statement,
176 	statements_statement,
177 	on_statement,
178 	switch_statement,
179 	case_statement,
180 	default_statement,
181 	set_statement,
182 	unset_statement,
183 	let_statement,
184 	define_statement,
185 	log_statement,
186 	return_statement,
187 	execute_statement,
188 	vendor_opt_statement
189 };
190 
191 /* Expression tree structure. */
192 
193 enum expr_op {
194 	expr_none,
195 	expr_match,
196 	expr_check,
197 	expr_equal,
198 	expr_substring,
199 	expr_suffix,
200 	expr_concat,
201 	expr_host_lookup,
202 	expr_and,
203 	expr_or,
204 	expr_not,
205 	expr_option,
206 	expr_hardware,
207 	expr_hw_type,		/* derived from expr_hardware */
208 	expr_hw_address,	/* derived from expr_hardware */
209 	expr_packet,
210 	expr_const_data,
211 	expr_extract_int8,
212 	expr_extract_int16,
213 	expr_extract_int32,
214 	expr_encode_int8,
215 	expr_encode_int16,
216 	expr_encode_int32,
217 	expr_const_int,
218 	expr_exists,
219 	expr_encapsulate,
220 	expr_known,
221 	expr_reverse,
222 	expr_leased_address,
223 	expr_binary_to_ascii,
224 	expr_config_option,
225 	expr_host_decl_name,
226 	expr_pick_first_value,
227  	expr_lease_time,
228  	expr_dns_transaction,
229 	expr_static,
230 	expr_ns_add,
231  	expr_ns_delete,
232  	expr_ns_exists,
233  	expr_ns_not_exists,
234 	expr_not_equal,
235 	expr_null,
236 	expr_variable_exists,
237 	expr_variable_reference,
238 	expr_filename,
239  	expr_sname,
240 	expr_arg,
241 	expr_funcall,
242 	expr_function,
243 	expr_add,
244 	expr_subtract,
245 	expr_multiply,
246 	expr_divide,
247 	expr_remainder,
248 	expr_binary_and,
249 	expr_binary_or,
250 	expr_binary_xor,
251 	expr_client_state,
252 	expr_ucase,
253 	expr_lcase,
254 	expr_regex_match,
255 	expr_iregex_match,
256 	expr_gethostname,
257 	expr_v6relay,
258 	expr_concat_dclist
259 };
260 
261 /* options */
262 
263 enum option_status {
264 	kea_unknown = 0,	/* known only by ISC DHCP */
265 	isc_dhcp_unknown = 1,	/* known only by Kea */
266 	known = 2,		/* known by both ISC DHCP and Kea */
267 	special = 3,		/* requires special processing */
268 	dynamic = 4		/* dynamic entry */
269 };
270 
271 struct option_def {			/* ISC DHCP option definition */
272 	const char *name;		/* option name */
273 	const char *format;		/* format string */
274 	const char *space;		/* space (aka universe) */
275 	unsigned code;			/* code point */
276 	enum option_status status;	/* status */
277 };
278 
279 struct space_def {			/* ISC DHCP space definition */
280 	const char *old;		/* ISC DHCP space name */
281 	const char *name;		/* Kea space name */
282 	enum option_status status;	/* status */
283 };
284 
285 struct space {
286 	const char *old;		/* ISC DHCP space name */
287 	const char *name;		/* Kea space name */
288 	enum option_status status;	/* status */
289 	struct element *vendor;		/* vendor option */
290 	TAILQ_ENTRY(space) next;	/* next space */
291 };
292 
293 struct option {
294 	const char *old;		/* ISC DHCP option name */
295 	const char *name;		/* Kea option name */
296 	const char *format;		/* ISC DHCP format string */
297 	const struct space *space;	/* space (aka universe) */
298 	unsigned code;			/* code point */
299 	enum option_status status;	/* status */
300 	TAILQ_ENTRY(option) next;	/* next option */
301 };
302 
303 /* Kea parse tools */
304 void stackPush(struct parse *cfile, struct element *elem);
305 
306 /* From command line */
307 extern char *hook_library_path;
308 extern isc_boolean_t use_isc_lifetimes;
309 extern isc_boolean_t global_hr;
310 
311 /* From common/parse.c */
312 void parse_error(struct parse *, const char *, ...)
313 	__attribute__((__format__(__printf__,2,3)))
314 	__attribute__((noreturn));
315 
316 /* conflex.c */
317 struct parse *new_parse(int, char *, size_t, const char *, int);
318 void end_parse(struct parse *);
319 void save_parse_state(struct parse *);
320 void restore_parse_state(struct parse *);
321 enum dhcp_token next_token(const char **, unsigned *, struct parse *);
322 enum dhcp_token peek_token(const char **, unsigned *, struct parse *);
323 enum dhcp_token next_raw_token(const char **, unsigned *, struct parse *);
324 enum dhcp_token peek_raw_token(const char **, unsigned *, struct parse *);
325 /*
326  * Use skip_token when we are skipping a token we have previously
327  * used peek_token on as we know what the result will be in this case.
328  */
329 #define skip_token(a,b,c) ((void) next_token((a),(b),(c)))
330 
331 /* confparse.c */
332 size_t conf_file_parse(struct parse *);
333 void read_conf_file(struct parse *, const char *, int);
334 size_t conf_file_subparse(struct parse *, int);
335 isc_boolean_t parse_statement(struct parse *, int, isc_boolean_t);
336 void get_permit(struct parse *, struct element *);
337 void parse_pool_statement(struct parse *, int);
338 void parse_lbrace(struct parse *);
339 void parse_host_declaration(struct parse *);
340 void parse_class_declaration(struct parse *, int);
341 void parse_shared_net_declaration(struct parse *);
342 void parse_subnet_declaration(struct parse *);
343 void parse_subnet6_declaration(struct parse *);
344 void parse_group_declaration(struct parse *);
345 void close_group(struct parse *, struct element *);
346 struct element *parse_fixed_addr_param(struct parse *, enum dhcp_token);
347 void parse_address_range(struct parse *, int, size_t);
348 void parse_address_range6(struct parse *, int, size_t);
349 void parse_prefix6(struct parse *, int, size_t);
350 void parse_fixed_prefix6(struct parse *, size_t);
351 void parse_pool6_statement(struct parse *, int);
352 struct element *parse_allow_deny(struct parse *, int);
353 void parse_server_duid_conf(struct parse *);
354 void parse_directive(struct parse *);
355 void parse_option_space_dir(struct parse *);
356 void parse_option_code_dir(struct parse *, struct option *);
357 void parse_option_status_dir(struct parse *, struct option *, enum dhcp_token);
358 void parse_option_local_dir(struct parse *, struct option *);
359 void parse_option_define_dir(struct parse *, struct option *);
360 
361 /* parse.c */
362 void skip_to_semi(struct parse *);
363 void skip_to_rbrace(struct parse *, int);
364 void parse_semi(struct parse *);
365 void parse_string(struct parse *, char **, unsigned *);
366 struct string *parse_host_name(struct parse *);
367 struct string *parse_ip_addr_or_hostname(struct parse *, isc_boolean_t);
368 struct string *parse_ip_addr(struct parse *);
369 struct string *parse_ip6_addr(struct parse *);
370 struct string *parse_ip6_addr_txt(struct parse *);
371 struct element *parse_hardware_param(struct parse *);
372 void parse_lease_time(struct parse *, time_t *);
373 struct string *parse_numeric_aggregate(struct parse *,
374 				       unsigned char *, unsigned *,
375 				       int, int, unsigned);
376 void convert_num(struct parse *, unsigned char *, const char *,
377 		 int, unsigned);
378 struct option *parse_option_name(struct parse *, isc_boolean_t,
379 				 isc_boolean_t *);
380 void parse_option_space_decl(struct parse *);
381 void parse_option_code_definition(struct parse *, struct option *);
382 void parse_vendor_code_definition(struct parse *, struct option *);
383 struct string *convert_format(const char *, isc_boolean_t *, isc_boolean_t *);
384 struct string *parse_base64(struct parse *);
385 struct string *parse_cshl(struct parse *);
386 struct string *parse_hexa(struct parse *);
387 isc_boolean_t parse_executable_statements(struct element *,
388 					  struct parse *, isc_boolean_t *,
389 					  enum expression_context);
390 isc_boolean_t parse_executable_statement(struct element *,
391 					 struct parse *, isc_boolean_t *,
392 					 enum expression_context,
393 					 isc_boolean_t);
394 isc_boolean_t parse_zone(struct element *, struct parse *);
395 isc_boolean_t parse_key(struct element *, struct parse *);
396 isc_boolean_t parse_on_statement(struct element *, struct parse *,
397 				 isc_boolean_t *);
398 isc_boolean_t parse_switch_statement(struct element *, struct parse *,
399 				     isc_boolean_t *);
400 isc_boolean_t parse_case_statement(struct element *, struct parse *,
401 				   isc_boolean_t *, enum expression_context);
402 isc_boolean_t parse_if_statement(struct element *, struct parse *,
403 				 isc_boolean_t *);
404 isc_boolean_t parse_boolean_expression(struct element *, struct parse *,
405 				       isc_boolean_t *);
406 /* currently unused */
407 isc_boolean_t parse_boolean(struct parse *);
408 isc_boolean_t parse_data_expression(struct element *, struct parse *,
409 				    isc_boolean_t *);
410 isc_boolean_t numeric_expression(struct element *, struct parse *,
411 				 isc_boolean_t *);
412 isc_boolean_t parse_non_binary(struct element *, struct parse *,
413 			       isc_boolean_t *, enum expression_context);
414 isc_boolean_t parse_expression(struct element *, struct parse *,
415 			       isc_boolean_t *, enum expression_context,
416 			       struct element *, enum expr_op);
417 struct string *escape_option_string(unsigned, const char *,
418 				   isc_boolean_t *, isc_boolean_t *);
419 isc_boolean_t parse_option_data(struct element *, struct parse *,
420 				struct option *);
421 isc_boolean_t parse_option_binary(struct element *, struct parse *,
422 				  struct option *, isc_boolean_t);
423 struct string * parse_option_textbin(struct parse *, struct option *);
424 isc_boolean_t parse_option_statement(struct element *, struct parse *,
425 				     struct option *, enum statement_op);
426 isc_boolean_t parse_config_data(struct element *, struct parse *,
427 				struct option *);
428 isc_boolean_t parse_config_statement(struct element *, struct parse *,
429 				     struct option *, enum statement_op);
430 struct string *parse_option_token(struct parse *, const char *,
431 				  isc_boolean_t *, isc_boolean_t *,
432 				  isc_boolean_t *);
433 struct string *parse_option_token_binary(struct parse *, const char *);
434 struct string *parse_domain_list(struct parse *, isc_boolean_t);
435 isc_boolean_t is_boolean_expression(struct element *);
436 isc_boolean_t is_data_expression(struct element *);
437 isc_boolean_t is_numeric_expression(struct element *);
438 int expr_precedence(enum expr_op, struct element *);
439 
440 /* options.c */
441 void spaces_init(void);
442 void options_init(void);
443 struct space *space_lookup(const char *);
444 struct option *option_lookup_name(const char *, const char *);
445 struct option *kea_lookup_name(const char *, const char *);
446 struct option *option_lookup_code(const char *, unsigned);
447 void push_space(struct space *);
448 void push_option(struct option *);
449 void add_option_data(struct element *, struct element *);
450 void merge_option_data(struct element *, struct element *);
451 struct comments *get_config_comments(unsigned);
452 const char *display_status(enum option_status);
453 
454 /* json.c */
455 struct element *json_parse(struct parse *);
456 struct element *json_list_parse(struct parse *);
457 struct element *json_map_parse(struct parse *);
458 
459 /* print.c */
460 const char *print_expression(struct element *, isc_boolean_t *);
461 const char *print_boolean_expression(struct element *, isc_boolean_t *);
462 const char *print_data_expression(struct element *, isc_boolean_t *);
463 const char *print_numeric_expression(struct element *, isc_boolean_t *);
464 
465 /* reduce.c */
466 struct element *reduce_boolean_expression(struct element *);
467 struct element *reduce_data_expression(struct element *);
468 struct element *reduce_numeric_expression(struct element *);
469 
470 /* eval */
471 struct element *eval_expression(struct element *, isc_boolean_t *);
472 struct element *eval_boolean_expression(struct element *, isc_boolean_t *);
473 struct element *eval_data_expression(struct element *, isc_boolean_t *);
474 struct element *eval_numeric_expression(struct element *, isc_boolean_t *);
475