xref: /dragonfly/contrib/dhcpcd/src/dhcpcd.h (revision 89656a4e)
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * dhcpcd - DHCP client daemon
4  * Copyright (c) 2006-2020 Roy Marples <roy@marples.name>
5  * All rights reserved
6 
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #ifndef DHCPCD_H
30 #define DHCPCD_H
31 
32 #include <sys/socket.h>
33 #include <net/if.h>
34 
35 #include <stdio.h>
36 
37 #include "config.h"
38 #ifdef HAVE_SYS_QUEUE_H
39 #include <sys/queue.h>
40 #endif
41 
42 #include "defs.h"
43 #include "control.h"
44 #include "if-options.h"
45 
46 #define HWADDR_LEN	20
47 #define IF_SSIDLEN	32
48 #define PROFILE_LEN	64
49 #define SECRET_LEN	64
50 
51 #define IF_INACTIVE	0
52 #define IF_ACTIVE	1
53 #define IF_ACTIVE_USER	2
54 
55 #define	LINK_UP		1
56 #define	LINK_UNKNOWN	0
57 #define	LINK_DOWN	-1
58 #define	LINK_DOWN_IFFUP	-2
59 
60 #define IF_DATA_IPV4	0
61 #define IF_DATA_ARP	1
62 #define IF_DATA_IPV4LL	2
63 #define IF_DATA_DHCP	3
64 #define IF_DATA_IPV6	4
65 #define IF_DATA_IPV6ND	5
66 #define IF_DATA_DHCP6	6
67 #define IF_DATA_MAX	7
68 
69 /* If the interface does not support carrier status (ie PPP),
70  * dhcpcd can poll it for the relevant flags periodically */
71 #define IF_POLL_UP	100	/* milliseconds */
72 
73 #ifdef __QNX__
74 /* QNX carries defines for, but does not actually support PF_LINK */
75 #undef IFLR_ACTIVE
76 #endif
77 
78 struct interface {
79 	struct dhcpcd_ctx *ctx;
80 	TAILQ_ENTRY(interface) next;
81 	char name[IF_NAMESIZE];
82 	unsigned int index;
83 	unsigned int active;
84 	unsigned int flags;
85 	uint16_t hwtype; /* ARPHRD_ETHER for example */
86 	unsigned char hwaddr[HWADDR_LEN];
87 	uint8_t hwlen;
88 	unsigned short vlanid;
89 	unsigned int metric;
90 	int carrier;
91 	bool wireless;
92 	uint8_t ssid[IF_SSIDLEN];
93 	unsigned int ssid_len;
94 
95 	char profile[PROFILE_LEN];
96 	struct if_options *options;
97 	void *if_data[IF_DATA_MAX];
98 };
99 TAILQ_HEAD(if_head, interface);
100 
101 #include "privsep.h"
102 
103 #ifdef INET6
104 /* dhcpcd requires CMSG_SPACE to evaluate to a compile time constant. */
105 #if defined(__QNX) || \
106 	(defined(__NetBSD_Version__) && __NetBSD_Version__ < 600000000)
107 #undef CMSG_SPACE
108 #endif
109 
110 #ifndef ALIGNBYTES
111 #define ALIGNBYTES (sizeof(int) - 1)
112 #endif
113 #ifndef ALIGN
114 #define	ALIGN(p) (((unsigned int)(p) + ALIGNBYTES) & ~ALIGNBYTES)
115 #endif
116 #ifndef CMSG_SPACE
117 #define	CMSG_SPACE(len)	(ALIGN(sizeof(struct cmsghdr)) + ALIGN(len))
118 #endif
119 
120 #define IP6BUFLEN	(CMSG_SPACE(sizeof(struct in6_pktinfo)) + \
121 			CMSG_SPACE(sizeof(int)))
122 #endif
123 
124 struct passwd;
125 
126 struct dhcpcd_ctx {
127 	char pidfile[sizeof(PIDFILE) + IF_NAMESIZE + 1];
128 	char vendor[256];
129 	int fork_fd;	/* FD for the fork init signal pipe */
130 	const char *cffile;
131 	unsigned long long options;
132 	char *logfile;
133 	int argc;
134 	char **argv;
135 	int ifac;	/* allowed interfaces */
136 	char **ifav;	/* allowed interfaces */
137 	int ifdc;	/* denied interfaces */
138 	char **ifdv;	/* denied interfaces */
139 	int ifc;	/* listed interfaces */
140 	char **ifv;	/* listed interfaces */
141 	int ifcc;	/* configured interfaces */
142 	char **ifcv;	/* configured interfaces */
143 	unsigned char *duid;
144 	size_t duid_len;
145 	struct if_head *ifaces;
146 
147 	char *ctl_buf;
148 	size_t ctl_buflen;
149 	size_t ctl_bufpos;
150 	size_t ctl_extra;
151 
152 	rb_tree_t routes;	/* our routes */
153 #ifdef RT_FREE_ROUTE_TABLE
154 	rb_tree_t froutes;	/* free routes for re-use */
155 #endif
156 	size_t rt_order;	/* route order storage */
157 
158 	int pf_inet_fd;
159 #ifdef PF_LINK
160 	int pf_link_fd;
161 #endif
162 	void *priv;
163 	int link_fd;
164 #ifndef SMALL
165 	int link_rcvbuf;
166 #endif
167 	int seq;	/* route message sequence no */
168 	int sseq;	/* successful seq no sent */
169 
170 #ifdef USE_SIGNALS
171 	sigset_t sigset;
172 #endif
173 	struct eloop *eloop;
174 
175 	char *script;
176 #ifdef HAVE_OPEN_MEMSTREAM
177 	FILE *script_fp;
178 #endif
179 	char *script_buf;
180 	size_t script_buflen;
181 	char **script_env;
182 	size_t script_envlen;
183 
184 	int control_fd;
185 	int control_unpriv_fd;
186 	struct fd_list_head control_fds;
187 	char control_sock[sizeof(CONTROLSOCKET) + IF_NAMESIZE];
188 	gid_t control_group;
189 
190 	/* DHCP Enterprise options, RFC3925 */
191 	struct dhcp_opt *vivso;
192 	size_t vivso_len;
193 
194 	char *randomstate; /* original state */
195 
196 	/* For filtering RTM_MISS messages per router */
197 #ifdef BSD
198 	uint8_t *rt_missfilter;
199 	size_t rt_missfilterlen;
200 	size_t rt_missfiltersize;
201 #endif
202 
203 #ifdef PRIVSEP
204 	struct passwd *ps_user;	/* struct passwd for privsep user */
205 	pid_t ps_root_pid;
206 	int ps_root_fd;		/* Privileged Actioneer commands */
207 	int ps_data_fd;		/* Data from root spawned processes */
208 	struct eloop *ps_eloop;	/* eloop for polling root data */
209 	struct ps_process_head ps_processes;	/* List of spawned processes */
210 	pid_t ps_inet_pid;
211 	int ps_inet_fd;		/* Network Proxy commands and data */
212 	pid_t ps_control_pid;
213 	int ps_control_fd;	/* Control Proxy - generic listener */
214 	int ps_control_data_fd;	/* Control Proxy - data query */
215 	struct fd_list *ps_control;		/* Queue for the above */
216 	struct fd_list *ps_control_client;	/* Queue for the above */
217 #endif
218 
219 #ifdef INET
220 	struct dhcp_opt *dhcp_opts;
221 	size_t dhcp_opts_len;
222 
223 	int udp_rfd;
224 	int udp_wfd;
225 
226 	/* Our aggregate option buffer.
227 	 * We ONLY use this when options are split, which for most purposes is
228 	 * practically never. See RFC3396 for details. */
229 	uint8_t *opt_buffer;
230 	size_t opt_buffer_len;
231 #endif
232 #ifdef INET6
233 	uint8_t *secret;
234 	size_t secret_len;
235 
236 #ifndef __sun
237 	int nd_fd;
238 #endif
239 	struct ra_head *ra_routers;
240 
241 	struct dhcp_opt *nd_opts;
242 	size_t nd_opts_len;
243 #ifdef DHCP6
244 	int dhcp6_rfd;
245 	int dhcp6_wfd;
246 	struct dhcp_opt *dhcp6_opts;
247 	size_t dhcp6_opts_len;
248 #endif
249 
250 #ifndef __linux__
251 	int ra_global;
252 #endif
253 #endif /* INET6 */
254 
255 #ifdef PLUGIN_DEV
256 	char *dev_load;
257 	int dev_fd;
258 	struct dev *dev;
259 	void *dev_handle;
260 #endif
261 };
262 
263 #ifdef USE_SIGNALS
264 extern const int dhcpcd_signals[];
265 extern const size_t dhcpcd_signals_len;
266 extern const int dhcpcd_signals_ignore[];
267 extern const size_t dhcpcd_signals_ignore_len;
268 #endif
269 
270 extern const char *dhcpcd_default_script;
271 
272 int dhcpcd_ifafwaiting(const struct interface *);
273 int dhcpcd_afwaiting(const struct dhcpcd_ctx *);
274 void dhcpcd_daemonise(struct dhcpcd_ctx *);
275 
276 void dhcpcd_linkoverflow(struct dhcpcd_ctx *);
277 int dhcpcd_handleargs(struct dhcpcd_ctx *, struct fd_list *, int, char **);
278 void dhcpcd_handlecarrier(struct dhcpcd_ctx *, int, unsigned int, const char *);
279 int dhcpcd_handleinterface(void *, int, const char *);
280 void dhcpcd_handlehwaddr(struct interface *, uint16_t, const void *, uint8_t);
281 void dhcpcd_dropinterface(struct interface *, const char *);
282 int dhcpcd_selectprofile(struct interface *, const char *);
283 
284 void dhcpcd_startinterface(void *);
285 void dhcpcd_activateinterface(struct interface *, unsigned long long);
286 
287 #endif
288