xref: /dflybsd-src/contrib/dhcpcd/src/if-options.h (revision 6a6d63c5317abf314a78f8c8300ef73c2bc0c39e)
18d36e1dfSRoy Marples /* SPDX-License-Identifier: BSD-2-Clause */
27827cba2SAaron LI /*
37827cba2SAaron LI  * dhcpcd - DHCP client daemon
480aa9461SRoy Marples  * Copyright (c) 2006-2023 Roy Marples <roy@marples.name>
57827cba2SAaron LI  * All rights reserved
67827cba2SAaron LI 
77827cba2SAaron LI  * Redistribution and use in source and binary forms, with or without
87827cba2SAaron LI  * modification, are permitted provided that the following conditions
97827cba2SAaron LI  * are met:
107827cba2SAaron LI  * 1. Redistributions of source code must retain the above copyright
117827cba2SAaron LI  *    notice, this list of conditions and the following disclaimer.
127827cba2SAaron LI  * 2. Redistributions in binary form must reproduce the above copyright
137827cba2SAaron LI  *    notice, this list of conditions and the following disclaimer in the
147827cba2SAaron LI  *    documentation and/or other materials provided with the distribution.
157827cba2SAaron LI  *
167827cba2SAaron LI  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
177827cba2SAaron LI  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
187827cba2SAaron LI  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
197827cba2SAaron LI  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
207827cba2SAaron LI  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
217827cba2SAaron LI  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
227827cba2SAaron LI  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
237827cba2SAaron LI  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
247827cba2SAaron LI  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
257827cba2SAaron LI  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
267827cba2SAaron LI  * SUCH DAMAGE.
277827cba2SAaron LI  */
287827cba2SAaron LI 
297827cba2SAaron LI #ifndef IF_OPTIONS_H
307827cba2SAaron LI #define IF_OPTIONS_H
317827cba2SAaron LI 
327827cba2SAaron LI #include <sys/param.h>
337827cba2SAaron LI #include <sys/socket.h>
347827cba2SAaron LI #include <net/if.h>
357827cba2SAaron LI #include <netinet/in.h>
367827cba2SAaron LI 
377827cba2SAaron LI #include <getopt.h>
387827cba2SAaron LI #include <limits.h>
397827cba2SAaron LI #include <stdint.h>
407827cba2SAaron LI 
417827cba2SAaron LI #include "auth.h"
427827cba2SAaron LI #include "route.h"
437827cba2SAaron LI 
447827cba2SAaron LI /* Don't set any optional arguments here so we retain POSIX
457827cba2SAaron LI  * compatibility with getopt */
467827cba2SAaron LI #define IF_OPTS "146bc:de:f:gh:i:j:kl:m:no:pqr:s:t:u:v:wxy:z:" \
477827cba2SAaron LI 		"ABC:DEF:GHI:JKLMNO:PQ:S:TUVW:X:Z:"
487827cba2SAaron LI #define NOERR_IF_OPTS		":" IF_OPTS
497827cba2SAaron LI 
507827cba2SAaron LI #define DEFAULT_TIMEOUT		30
517827cba2SAaron LI #define DEFAULT_REBOOT		5
52*54175cefSRoy Marples #define DEFAULT_REQUEST		180	/* secs to request, mirror DHCP6 */
53*54175cefSRoy Marples #define DEFAULT_FALLBACK	5	/* secs until fallback */
54*54175cefSRoy Marples #define DEFAULT_IPV4LL		5	/* secs until ipv4ll */
557827cba2SAaron LI 
567827cba2SAaron LI #ifndef HOSTNAME_MAX_LEN
577827cba2SAaron LI #define HOSTNAME_MAX_LEN	250	/* 255 - 3 (FQDN) - 2 (DNS enc) */
587827cba2SAaron LI #endif
597827cba2SAaron LI #define VENDORCLASSID_MAX_LEN	255
607827cba2SAaron LI #define CLIENTID_MAX_LEN	48
617827cba2SAaron LI #define USERCLASS_MAX_LEN	255
627827cba2SAaron LI #define VENDOR_MAX_LEN		255
637827cba2SAaron LI #define	MUDURL_MAX_LEN		255
647827cba2SAaron LI 
657827cba2SAaron LI #define DHCPCD_ARP			(1ULL << 0)
667827cba2SAaron LI #define DHCPCD_RELEASE			(1ULL << 1)
678d36e1dfSRoy Marples #define DHCPCD_RTBUILD			(1ULL << 2)
687827cba2SAaron LI #define DHCPCD_GATEWAY			(1ULL << 3)
697827cba2SAaron LI #define DHCPCD_STATIC			(1ULL << 4)
707827cba2SAaron LI #define DHCPCD_DEBUG			(1ULL << 5)
71*54175cefSRoy Marples #define DHCPCD_ARP_PERSISTDEFENCE	(1ULL << 6)
727827cba2SAaron LI #define DHCPCD_LASTLEASE		(1ULL << 7)
737827cba2SAaron LI #define DHCPCD_INFORM			(1ULL << 8)
747827cba2SAaron LI #define DHCPCD_REQUEST			(1ULL << 9)
757827cba2SAaron LI #define DHCPCD_IPV4LL			(1ULL << 10)
767827cba2SAaron LI #define DHCPCD_DUID			(1ULL << 11)
777827cba2SAaron LI #define DHCPCD_PERSISTENT		(1ULL << 12)
787827cba2SAaron LI #define DHCPCD_DAEMONISE		(1ULL << 14)
797827cba2SAaron LI #define DHCPCD_DAEMONISED		(1ULL << 15)
807827cba2SAaron LI #define DHCPCD_TEST			(1ULL << 16)
810a68f8d2SRoy Marples #define DHCPCD_MANAGER			(1ULL << 17)
827827cba2SAaron LI #define DHCPCD_HOSTNAME			(1ULL << 18)
837827cba2SAaron LI #define DHCPCD_CLIENTID			(1ULL << 19)
847827cba2SAaron LI #define DHCPCD_LINK			(1ULL << 20)
856e63cc1fSRoy Marples #define DHCPCD_ANONYMOUS		(1ULL << 21)
867827cba2SAaron LI #define DHCPCD_BACKGROUND		(1ULL << 22)
877827cba2SAaron LI #define DHCPCD_VENDORRAW		(1ULL << 23)
887827cba2SAaron LI #define DHCPCD_NOWAITIP			(1ULL << 24) /* To force daemonise */
897827cba2SAaron LI #define DHCPCD_WAITIP			(1ULL << 25)
907827cba2SAaron LI #define DHCPCD_SLAACPRIVATE		(1ULL << 26)
917827cba2SAaron LI #define DHCPCD_CSR_WARNED		(1ULL << 27)
927827cba2SAaron LI #define DHCPCD_XID_HWADDR		(1ULL << 28)
937827cba2SAaron LI #define DHCPCD_BROADCAST		(1ULL << 29)
947827cba2SAaron LI #define DHCPCD_DUMPLEASE		(1ULL << 30)
957827cba2SAaron LI #define DHCPCD_IPV6RS			(1ULL << 31)
967827cba2SAaron LI #define DHCPCD_IPV6RA_REQRDNSS		(1ULL << 32)
976e63cc1fSRoy Marples #define DHCPCD_PRIVSEP			(1ULL << 33)
98b2927f2bSRoy Marples #define DHCPCD_CONFIGURE		(1ULL << 34)
997827cba2SAaron LI #define DHCPCD_IPV4			(1ULL << 35)
1007827cba2SAaron LI #define DHCPCD_FORKED			(1ULL << 36)
1017827cba2SAaron LI #define DHCPCD_IPV6			(1ULL << 37)
1027827cba2SAaron LI #define DHCPCD_STARTED			(1ULL << 38)
1037827cba2SAaron LI #define DHCPCD_NOALIAS			(1ULL << 39)
1047827cba2SAaron LI #define DHCPCD_IA_FORCED		(1ULL << 40)
1057827cba2SAaron LI #define DHCPCD_STOPPING			(1ULL << 41)
10693ddca5eSRoy Marples #define DHCPCD_LAUNCHER			(1ULL << 42)
1077827cba2SAaron LI #define DHCPCD_HOSTNAME_SHORT		(1ULL << 43)
1087827cba2SAaron LI #define DHCPCD_EXITING			(1ULL << 44)
1097827cba2SAaron LI #define DHCPCD_WAITIP4			(1ULL << 45)
1107827cba2SAaron LI #define DHCPCD_WAITIP6			(1ULL << 46)
1117827cba2SAaron LI #define DHCPCD_DEV			(1ULL << 47)
1127827cba2SAaron LI #define DHCPCD_IAID			(1ULL << 48)
1137827cba2SAaron LI #define DHCPCD_DHCP			(1ULL << 49)
1147827cba2SAaron LI #define DHCPCD_DHCP6			(1ULL << 50)
1157827cba2SAaron LI #define DHCPCD_IF_UP			(1ULL << 51)
1167827cba2SAaron LI #define DHCPCD_INFORM6			(1ULL << 52)
1178d36e1dfSRoy Marples #define DHCPCD_WANTDHCP			(1ULL << 53)
1187827cba2SAaron LI #define DHCPCD_IPV6RA_AUTOCONF		(1ULL << 54)
1197827cba2SAaron LI #define DHCPCD_ROUTER_HOST_ROUTE_WARNED	(1ULL << 55)
1207827cba2SAaron LI #define DHCPCD_LASTLEASE_EXTEND		(1ULL << 56)
1217827cba2SAaron LI #define DHCPCD_BOOTP			(1ULL << 57)
1227827cba2SAaron LI #define DHCPCD_INITIAL_DELAY		(1ULL << 58)
1237827cba2SAaron LI #define DHCPCD_PRINT_PIDFILE		(1ULL << 59)
1247827cba2SAaron LI #define DHCPCD_ONESHOT			(1ULL << 60)
1257827cba2SAaron LI #define DHCPCD_INACTIVE			(1ULL << 61)
1267a0236bfSRoy Marples #define	DHCPCD_SLAACTEMP		(1ULL << 62)
127d4fb1e02SRoy Marples #define DHCPCD_PRIVSEPROOT		(1ULL << 63)
1287827cba2SAaron LI 
1297827cba2SAaron LI #define DHCPCD_NODROP	(DHCPCD_EXITING | DHCPCD_PERSISTENT)
1307827cba2SAaron LI 
1317827cba2SAaron LI #define DHCPCD_WAITOPTS	(DHCPCD_WAITIP | DHCPCD_WAITIP4 | DHCPCD_WAITIP6)
1327827cba2SAaron LI 
1337827cba2SAaron LI #define DHCPCD_WARNINGS	(DHCPCD_CSR_WARNED | \
1347827cba2SAaron LI 		DHCPCD_ROUTER_HOST_ROUTE_WARNED)
1357827cba2SAaron LI 
136d4fb1e02SRoy Marples /* These options only make sense in the config file, so don't use any
137d4fb1e02SRoy Marples    valid short options for them */
138d4fb1e02SRoy Marples #define O_BASE			MAX('z', 'Z') + 1
139d4fb1e02SRoy Marples #define O_ARPING		O_BASE + 1
140d4fb1e02SRoy Marples #define O_FALLBACK		O_BASE + 2
141d4fb1e02SRoy Marples #define O_DESTINATION		O_BASE + 3
142d4fb1e02SRoy Marples #define O_IPV6RS		O_BASE + 4
143d4fb1e02SRoy Marples #define O_NOIPV6RS		O_BASE + 5
144d4fb1e02SRoy Marples #define O_IPV6RA_FORK		O_BASE + 6
145d4fb1e02SRoy Marples #define O_LINK_RCVBUF		O_BASE + 7
146d4fb1e02SRoy Marples #define O_ANONYMOUS		O_BASE + 8
147d4fb1e02SRoy Marples #define O_NOALIAS		O_BASE + 9
148d4fb1e02SRoy Marples #define O_IA_NA			O_BASE + 10
149d4fb1e02SRoy Marples #define O_IA_TA			O_BASE + 11
150d4fb1e02SRoy Marples #define O_IA_PD			O_BASE + 12
151d4fb1e02SRoy Marples #define O_HOSTNAME_SHORT	O_BASE + 13
152d4fb1e02SRoy Marples #define O_DEV			O_BASE + 14
153d4fb1e02SRoy Marples #define O_NODEV			O_BASE + 15
154d4fb1e02SRoy Marples #define O_NOIPV4		O_BASE + 16
155d4fb1e02SRoy Marples #define O_NOIPV6		O_BASE + 17
156d4fb1e02SRoy Marples #define O_IAID			O_BASE + 18
157d4fb1e02SRoy Marples #define O_DEFINE		O_BASE + 19
158d4fb1e02SRoy Marples #define O_DEFINE6		O_BASE + 20
159d4fb1e02SRoy Marples #define O_EMBED			O_BASE + 21
160d4fb1e02SRoy Marples #define O_ENCAP			O_BASE + 22
161d4fb1e02SRoy Marples #define O_VENDOPT		O_BASE + 23
162d4fb1e02SRoy Marples #define O_VENDCLASS		O_BASE + 24
163d4fb1e02SRoy Marples #define O_AUTHPROTOCOL		O_BASE + 25
164d4fb1e02SRoy Marples #define O_AUTHTOKEN		O_BASE + 26
165d4fb1e02SRoy Marples #define O_AUTHNOTREQUIRED	O_BASE + 27
166d4fb1e02SRoy Marples #define O_NODHCP		O_BASE + 28
167d4fb1e02SRoy Marples #define O_NODHCP6		O_BASE + 29
168d4fb1e02SRoy Marples #define O_DHCP			O_BASE + 30
169d4fb1e02SRoy Marples #define O_DHCP6			O_BASE + 31
170d4fb1e02SRoy Marples #define O_IPV4			O_BASE + 32
171d4fb1e02SRoy Marples #define O_IPV6			O_BASE + 33
172d4fb1e02SRoy Marples #define O_CONTROLGRP		O_BASE + 34
173d4fb1e02SRoy Marples #define O_SLAAC			O_BASE + 35
174d4fb1e02SRoy Marples #define O_GATEWAY		O_BASE + 36
175d4fb1e02SRoy Marples #define O_NOUP			O_BASE + 37
176d4fb1e02SRoy Marples #define O_IPV6RA_AUTOCONF	O_BASE + 38
177d4fb1e02SRoy Marples #define O_IPV6RA_NOAUTOCONF	O_BASE + 39
178d4fb1e02SRoy Marples #define O_REJECT		O_BASE + 40
179d4fb1e02SRoy Marples #define O_BOOTP			O_BASE + 42
180d4fb1e02SRoy Marples #define O_DEFINEND		O_BASE + 43
181d4fb1e02SRoy Marples #define O_NODELAY		O_BASE + 44
182d4fb1e02SRoy Marples #define O_INFORM6		O_BASE + 45
183d4fb1e02SRoy Marples #define O_LASTLEASE_EXTEND	O_BASE + 46
184d4fb1e02SRoy Marples #define O_INACTIVE		O_BASE + 47
185d4fb1e02SRoy Marples #define O_MUDURL		O_BASE + 48
186d4fb1e02SRoy Marples #define O_MSUSERCLASS		O_BASE + 49
187b2927f2bSRoy Marples #define O_CONFIGURE		O_BASE + 50
188b2927f2bSRoy Marples #define O_NOCONFIGURE		O_BASE + 51
1890aaf6155SRoy Marples #define O_RANDOMISE_HWADDR	O_BASE + 52
190*54175cefSRoy Marples #define O_ARP_PERSISTDEFENCE	O_BASE + 53
191*54175cefSRoy Marples #define O_REQUEST_TIME		O_BASE + 54
192*54175cefSRoy Marples #define O_FALLBACK_TIME		O_BASE + 55
193*54175cefSRoy Marples #define O_IPV4LL_TIME		O_BASE + 56
194d4fb1e02SRoy Marples 
1957827cba2SAaron LI extern const struct option cf_options[];
1967827cba2SAaron LI 
1977827cba2SAaron LI struct if_sla {
1987827cba2SAaron LI 	char ifname[IF_NAMESIZE];
1997827cba2SAaron LI 	uint32_t sla;
2007827cba2SAaron LI 	uint8_t prefix_len;
2017827cba2SAaron LI 	uint64_t suffix;
2027f8103cdSRoy Marples 	bool sla_set;
2037827cba2SAaron LI };
2047827cba2SAaron LI 
2057827cba2SAaron LI struct if_ia {
2067827cba2SAaron LI 	uint8_t iaid[4];
2077827cba2SAaron LI #ifdef INET6
2087827cba2SAaron LI 	uint16_t ia_type;
2097827cba2SAaron LI 	uint8_t iaid_set;
2107827cba2SAaron LI 	struct in6_addr addr;
2117827cba2SAaron LI 	uint8_t prefix_len;
2127827cba2SAaron LI #ifndef SMALL
2137827cba2SAaron LI 	uint32_t sla_max;
2147827cba2SAaron LI 	size_t sla_len;
2157827cba2SAaron LI 	struct if_sla *sla;
2167827cba2SAaron LI #endif
2177827cba2SAaron LI #endif
2187827cba2SAaron LI };
2197827cba2SAaron LI 
2207827cba2SAaron LI struct vivco {
2217827cba2SAaron LI 	size_t len;
2227827cba2SAaron LI 	uint8_t *data;
2237827cba2SAaron LI };
2247827cba2SAaron LI 
2257827cba2SAaron LI struct if_options {
2267827cba2SAaron LI 	time_t mtime;
2277827cba2SAaron LI 	uint8_t iaid[4];
2287827cba2SAaron LI 	int metric;
2297827cba2SAaron LI 	uint8_t requestmask[256 / NBBY];
2307827cba2SAaron LI 	uint8_t requiremask[256 / NBBY];
2317827cba2SAaron LI 	uint8_t nomask[256 / NBBY];
2327827cba2SAaron LI 	uint8_t rejectmask[256 / NBBY];
2337827cba2SAaron LI 	uint8_t dstmask[256 / NBBY];
2347827cba2SAaron LI 	uint8_t requestmasknd[(UINT16_MAX + 1) / NBBY];
2357827cba2SAaron LI 	uint8_t requiremasknd[(UINT16_MAX + 1) / NBBY];
2367827cba2SAaron LI 	uint8_t nomasknd[(UINT16_MAX + 1) / NBBY];
2377827cba2SAaron LI 	uint8_t rejectmasknd[(UINT16_MAX + 1) / NBBY];
2387827cba2SAaron LI 	uint8_t requestmask6[(UINT16_MAX + 1) / NBBY];
2397827cba2SAaron LI 	uint8_t requiremask6[(UINT16_MAX + 1) / NBBY];
2407827cba2SAaron LI 	uint8_t nomask6[(UINT16_MAX + 1) / NBBY];
2417827cba2SAaron LI 	uint8_t rejectmask6[(UINT16_MAX + 1) / NBBY];
2427827cba2SAaron LI 	uint32_t leasetime;
2436e63cc1fSRoy Marples 	uint32_t timeout;
2446e63cc1fSRoy Marples 	uint32_t reboot;
245*54175cefSRoy Marples 	uint32_t request_time;
246*54175cefSRoy Marples 	uint32_t fallback_time;
247*54175cefSRoy Marples 	uint32_t ipv4ll_time;
2487827cba2SAaron LI 	unsigned long long options;
2490aaf6155SRoy Marples 	bool randomise_hwaddr;
2507827cba2SAaron LI 
2517827cba2SAaron LI 	struct in_addr req_addr;
2527827cba2SAaron LI 	struct in_addr req_mask;
2537827cba2SAaron LI 	struct in_addr req_brd;
2548d36e1dfSRoy Marples 	rb_tree_t routes;
2557827cba2SAaron LI 	struct in6_addr req_addr6;
2567827cba2SAaron LI 	uint8_t req_prefix_len;
2577827cba2SAaron LI 	unsigned int mtu;
2587827cba2SAaron LI 	char **config;
2597827cba2SAaron LI 
2607827cba2SAaron LI 	char **environ;
2617827cba2SAaron LI 
2627827cba2SAaron LI 	char hostname[HOSTNAME_MAX_LEN + 1]; /* We don't store the length */
2637827cba2SAaron LI 	uint8_t fqdn;
2647827cba2SAaron LI 	uint8_t vendorclassid[VENDORCLASSID_MAX_LEN + 2];
2657827cba2SAaron LI 	uint8_t clientid[CLIENTID_MAX_LEN + 2];
2667827cba2SAaron LI 	uint8_t userclass[USERCLASS_MAX_LEN + 2];
2677827cba2SAaron LI 	uint8_t vendor[VENDOR_MAX_LEN + 2];
2687827cba2SAaron LI 	uint8_t mudurl[MUDURL_MAX_LEN + 2];
2697827cba2SAaron LI 
2707827cba2SAaron LI 	size_t blacklist_len;
2717827cba2SAaron LI 	in_addr_t *blacklist;
2727827cba2SAaron LI 	size_t whitelist_len;
2737827cba2SAaron LI 	in_addr_t *whitelist;
2747827cba2SAaron LI 	ssize_t arping_len;
2757827cba2SAaron LI 	in_addr_t *arping;
2767827cba2SAaron LI 	char *fallback;
2777827cba2SAaron LI 
2787827cba2SAaron LI 	struct if_ia *ia;
2797827cba2SAaron LI 	size_t ia_len;
28080aa9461SRoy Marples #ifdef INET6
28180aa9461SRoy Marples 	struct in6_addr token;
28280aa9461SRoy Marples #endif
2837827cba2SAaron LI 
2847827cba2SAaron LI 	struct dhcp_opt *dhcp_override;
2857827cba2SAaron LI 	size_t dhcp_override_len;
2867827cba2SAaron LI 	struct dhcp_opt *nd_override;
2877827cba2SAaron LI 	size_t nd_override_len;
2887827cba2SAaron LI 	struct dhcp_opt *dhcp6_override;
2897827cba2SAaron LI 	size_t dhcp6_override_len;
2907827cba2SAaron LI 	uint32_t vivco_en;
2917827cba2SAaron LI 	struct vivco *vivco;
2927827cba2SAaron LI 	size_t vivco_len;
2937827cba2SAaron LI 	struct dhcp_opt *vivso_override;
2947827cba2SAaron LI 	size_t vivso_override_len;
2957827cba2SAaron LI 
2967827cba2SAaron LI 	struct auth auth;
2977827cba2SAaron LI };
2987827cba2SAaron LI 
2997827cba2SAaron LI struct if_options *read_config(struct dhcpcd_ctx *,
3007827cba2SAaron LI     const char *, const char *, const char *);
3017827cba2SAaron LI int add_options(struct dhcpcd_ctx *, const char *,
3027827cba2SAaron LI     struct if_options *, int, char **);
3037827cba2SAaron LI void free_dhcp_opt_embenc(struct dhcp_opt *);
3047827cba2SAaron LI void free_options(struct dhcpcd_ctx *, struct if_options *);
3057827cba2SAaron LI 
3067827cba2SAaron LI #endif
307