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