xref: /openbsd-src/sbin/dhcp6leased/printconf.c (revision 3ae4b9df79285457e898ae3ce0dd69c842f0a5b2)
1*3ae4b9dfSflorian /*	$OpenBSD: printconf.c,v 1.3 2024/06/03 11:08:31 florian Exp $	*/
2ad7c548dSflorian 
3ad7c548dSflorian /*
4ad7c548dSflorian  * Copyright (c) 2024 Florian Obser <florian@openbsd.org>
5ad7c548dSflorian  * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
6ad7c548dSflorian  *
7ad7c548dSflorian  * Permission to use, copy, modify, and distribute this software for any
8ad7c548dSflorian  * purpose with or without fee is hereby granted, provided that the above
9ad7c548dSflorian  * copyright notice and this permission notice appear in all copies.
10ad7c548dSflorian  *
11ad7c548dSflorian  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12ad7c548dSflorian  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13ad7c548dSflorian  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14ad7c548dSflorian  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15ad7c548dSflorian  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16ad7c548dSflorian  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17ad7c548dSflorian  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18ad7c548dSflorian  */
19ad7c548dSflorian 
20ad7c548dSflorian #include <sys/types.h>
21ad7c548dSflorian #include <sys/queue.h>
22ad7c548dSflorian #include <sys/socket.h>
23ad7c548dSflorian #include <sys/uio.h>
24ad7c548dSflorian 
25ad7c548dSflorian #include <net/if.h>
26ad7c548dSflorian 
27ad7c548dSflorian #include <netinet/in.h>
28ad7c548dSflorian 
29ad7c548dSflorian #include <arpa/inet.h>
30ad7c548dSflorian 
31ad7c548dSflorian #include <event.h>
32ad7c548dSflorian #include <imsg.h>
33ad7c548dSflorian #include <stdio.h>
34ad7c548dSflorian #include <stdlib.h>
35ad7c548dSflorian #include <string.h>
36ad7c548dSflorian 
37ad7c548dSflorian #include "dhcp6leased.h"
38ad7c548dSflorian #include "log.h"
39ad7c548dSflorian 
40ad7c548dSflorian void	print_iface_conf(struct iface_conf *, int);
41ad7c548dSflorian void	print_iface_ia_conf(struct iface_ia_conf *, int);
42ad7c548dSflorian void	print_iface_pd_conf(char *, struct iface_pd_conf *, int);
43ad7c548dSflorian 
44ad7c548dSflorian void
print_iface_pd_conf(char * indent,struct iface_pd_conf * pd_conf,int verbose)45ad7c548dSflorian print_iface_pd_conf(char *indent, struct iface_pd_conf *pd_conf, int verbose)
46ad7c548dSflorian {
47ad7c548dSflorian 	if (verbose > 1) {
48ad7c548dSflorian 		struct in6_addr	 ia6;
49ad7c548dSflorian 		int		 i;
50ad7c548dSflorian 		char		 ntopbuf[INET6_ADDRSTRLEN];
51ad7c548dSflorian 
52ad7c548dSflorian 		memset(&ia6, 0, sizeof(ia6));
53ad7c548dSflorian 		inet_pton(AF_INET6, "2001:db8::", &ia6);
54ad7c548dSflorian 
55ad7c548dSflorian 		for (i = 0; i < 16; i++)
56ad7c548dSflorian 			ia6.s6_addr[i] |= pd_conf->prefix_mask.s6_addr[i];
57ad7c548dSflorian 
58ad7c548dSflorian 		inet_ntop(AF_INET6, &ia6, ntopbuf, INET6_ADDRSTRLEN);
59ad7c548dSflorian 		printf("%s%s/%d\t# %s/%d\n", indent, pd_conf->name,
60ad7c548dSflorian 		    pd_conf->prefix_len, ntopbuf, pd_conf->prefix_len);
61ad7c548dSflorian 	} else
62ad7c548dSflorian 		printf("%s%s/%d\n", indent, pd_conf->name, pd_conf->prefix_len);
63ad7c548dSflorian }
64ad7c548dSflorian 
65ad7c548dSflorian void
print_iface_ia_conf(struct iface_ia_conf * ia_conf,int verbose)66ad7c548dSflorian print_iface_ia_conf(struct iface_ia_conf *ia_conf, int verbose)
67ad7c548dSflorian {
68ad7c548dSflorian 	struct iface_pd_conf	*pd_conf;
69ad7c548dSflorian 
70ad7c548dSflorian 	SIMPLEQ_FOREACH(pd_conf, &ia_conf->iface_pd_list, entry)
71ad7c548dSflorian 	    print_iface_pd_conf("\t", pd_conf,
72ad7c548dSflorian 		ia_conf->prefix_len >= 32 ? verbose : 1);
73ad7c548dSflorian }
74ad7c548dSflorian 
75ad7c548dSflorian void
print_iface_conf(struct iface_conf * iface,int verbose)76ad7c548dSflorian print_iface_conf(struct iface_conf *iface, int verbose)
77ad7c548dSflorian {
78ad7c548dSflorian 	struct iface_ia_conf	*ia_conf;
79ad7c548dSflorian 	int			 first = 1;
80ad7c548dSflorian 
81ad7c548dSflorian 	SIMPLEQ_FOREACH(ia_conf, &iface->iface_ia_list, entry) {
82ad7c548dSflorian 		if (!first)
83ad7c548dSflorian 			printf("\n");
84ad7c548dSflorian 		first = 0;
85ad7c548dSflorian 
86ad7c548dSflorian 		if (verbose > 1) {
87ad7c548dSflorian 			printf("request prefix delegation on %s for {"
88ad7c548dSflorian 			    "\t# prefix length = %d\n", iface->name,
89ad7c548dSflorian 			    ia_conf->prefix_len);
90ad7c548dSflorian 		} else {
91ad7c548dSflorian 			printf("request prefix delegation on %s for {\n",
92ad7c548dSflorian 			    iface->name);
93ad7c548dSflorian 		}
94ad7c548dSflorian 		print_iface_ia_conf(ia_conf, verbose);
95ad7c548dSflorian 		printf("}\n");
96ad7c548dSflorian 	}
97ad7c548dSflorian }
98ad7c548dSflorian void
print_config(struct dhcp6leased_conf * conf,int verbose)99ad7c548dSflorian print_config(struct dhcp6leased_conf *conf, int verbose)
100ad7c548dSflorian {
101ad7c548dSflorian 	struct iface_conf	*iface;
102ad7c548dSflorian 
103*3ae4b9dfSflorian 	if (conf->rapid_commit)
104*3ae4b9dfSflorian 		printf("request rapid commit\n\n");
105*3ae4b9dfSflorian 
106ad7c548dSflorian 	SIMPLEQ_FOREACH(iface, &conf->iface_list, entry)
107ad7c548dSflorian 		print_iface_conf(iface, verbose);
108ad7c548dSflorian }
109