1 /* SPDX-License-Identifier: BSD-2-Clause */
3 * dhcpcd - DHCP client daemon
4 * Copyright (c) 2006-2020 Roy Marples <roy@marples.name>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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
32 #include <sys/socket.h>
38 #ifdef HAVE_SYS_QUEUE_H
39 #include <sys/queue.h>
44 #include "if-options.h"
48 #define PROFILE_LEN 64
53 #define IF_ACTIVE_USER 2
56 #define LINK_UNKNOWN 0
59 #define IF_DATA_IPV4 0
61 #define IF_DATA_IPV4LL 2
62 #define IF_DATA_DHCP 3
63 #define IF_DATA_IPV6 4
64 #define IF_DATA_IPV6ND 5
65 #define IF_DATA_DHCP6 6
69 /* QNX carries defines for, but does not actually support PF_LINK */
74 struct dhcpcd_ctx
*ctx
;
75 TAILQ_ENTRY(interface
) next
;
76 char name
[IF_NAMESIZE
];
80 uint16_t hwtype
; /* ARPHRD_ETHER for example */
81 unsigned char hwaddr
[HWADDR_LEN
];
83 unsigned short vlanid
;
87 uint8_t ssid
[IF_SSIDLEN
];
88 unsigned int ssid_len
;
90 char profile
[PROFILE_LEN
];
91 struct if_options
*options
;
92 void *if_data
[IF_DATA_MAX
];
94 TAILQ_HEAD(if_head
, interface
);
98 /* dhcpcd requires CMSG_SPACE to evaluate to a compile time constant. */
99 #if defined(__QNX) || \
100 (defined(__NetBSD_Version__) && __NetBSD_Version__ < 600000000)
105 #define ALIGNBYTES (sizeof(int) - 1)
108 #define ALIGN(p) (((unsigned int)(p) + ALIGNBYTES) & ~ALIGNBYTES)
111 #define CMSG_SPACE(len) (ALIGN(sizeof(struct cmsghdr)) + ALIGN(len))
117 char pidfile
[sizeof(PIDFILE
) + IF_NAMESIZE
+ 1];
119 bool stdin_valid
; /* It's possible stdin, stdout and stderr */
120 bool stdout_valid
; /* could be closed when dhcpcd starts. */
122 int stderr_fd
; /* FD for logging to stderr */
123 int fork_fd
; /* FD for the fork init signal pipe */
125 unsigned long long options
;
129 int ifac
; /* allowed interfaces */
130 char **ifav
; /* allowed interfaces */
131 int ifdc
; /* denied interfaces */
132 char **ifdv
; /* denied interfaces */
133 int ifc
; /* listed interfaces */
134 char **ifv
; /* listed interfaces */
135 int ifcc
; /* configured interfaces */
136 char **ifcv
; /* configured interfaces */
140 struct if_head
*ifaces
;
147 rb_tree_t routes
; /* our routes */
148 #ifdef RT_FREE_ROUTE_TABLE
149 rb_tree_t froutes
; /* free routes for re-use */
151 size_t rt_order
; /* route order storage */
162 int seq
; /* route message sequence no */
163 int sseq
; /* successful seq no sent */
171 #ifdef HAVE_OPEN_MEMSTREAM
175 size_t script_buflen
;
177 size_t script_envlen
;
180 int control_unpriv_fd
;
181 struct fd_list_head control_fds
;
182 char control_sock
[sizeof(CONTROLSOCKET
) + IF_NAMESIZE
];
183 char control_sock_unpriv
[sizeof(CONTROLSOCKET
) + IF_NAMESIZE
+ 7];
186 /* DHCP Enterprise options, RFC3925 */
187 struct dhcp_opt
*vivso
;
190 char *randomstate
; /* original state */
192 /* For filtering RTM_MISS messages per router */
194 uint8_t *rt_missfilter
;
195 size_t rt_missfilterlen
;
196 size_t rt_missfiltersize
;
200 struct passwd
*ps_user
; /* struct passwd for privsep user */
202 int ps_root_fd
; /* Privileged Actioneer commands */
203 int ps_log_fd
; /* chroot logging */
204 int ps_data_fd
; /* Data from root spawned processes */
205 struct eloop
*ps_eloop
; /* eloop for polling root data */
206 struct ps_process_head ps_processes
; /* List of spawned processes */
208 int ps_inet_fd
; /* Network Proxy commands and data */
209 pid_t ps_control_pid
;
210 int ps_control_fd
; /* Control Proxy - generic listener */
211 int ps_control_data_fd
; /* Control Proxy - data query */
212 struct fd_list
*ps_control
; /* Queue for the above */
213 struct fd_list
*ps_control_client
; /* Queue for the above */
217 struct dhcp_opt
*dhcp_opts
;
218 size_t dhcp_opts_len
;
223 /* Our aggregate option buffer.
224 * We ONLY use this when options are split, which for most purposes is
225 * practically never. See RFC3396 for details. */
227 size_t opt_buffer_len
;
236 struct ra_head
*ra_routers
;
238 struct dhcp_opt
*nd_opts
;
243 struct dhcp_opt
*dhcp6_opts
;
244 size_t dhcp6_opts_len
;
261 extern const int dhcpcd_signals
[];
262 extern const size_t dhcpcd_signals_len
;
263 extern const int dhcpcd_signals_ignore
[];
264 extern const size_t dhcpcd_signals_ignore_len
;
267 extern const char *dhcpcd_default_script
;
269 int dhcpcd_ifafwaiting(const struct interface
*);
270 int dhcpcd_afwaiting(const struct dhcpcd_ctx
*);
271 void dhcpcd_daemonise(struct dhcpcd_ctx
*);
273 void dhcpcd_linkoverflow(struct dhcpcd_ctx
*);
274 int dhcpcd_handleargs(struct dhcpcd_ctx
*, struct fd_list
*, int, char **);
275 void dhcpcd_handlecarrier(struct interface
*, int, unsigned int);
276 int dhcpcd_handleinterface(void *, int, const char *);
277 void dhcpcd_handlehwaddr(struct interface
*, uint16_t, const void *, uint8_t);
278 void dhcpcd_dropinterface(struct interface
*, const char *);
279 int dhcpcd_selectprofile(struct interface
*, const char *);
281 void dhcpcd_startinterface(void *);
282 void dhcpcd_activateinterface(struct interface
*, unsigned long long);