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
58 #define LINK_DOWN_IFFUP -2
60 #define IF_DATA_IPV4 0
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
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 */
74 /* QNX carries defines for, but does not actually support PF_LINK */
79 struct dhcpcd_ctx *ctx;
80 TAILQ_ENTRY(interface) next;
81 char name[IF_NAMESIZE];
85 uint16_t hwtype; /* ARPHRD_ETHER for example */
86 unsigned char hwaddr[HWADDR_LEN];
88 unsigned short vlanid;
92 uint8_t ssid[IF_SSIDLEN];
93 unsigned int ssid_len;
95 char profile[PROFILE_LEN];
96 struct if_options *options;
97 void *if_data[IF_DATA_MAX];
99 TAILQ_HEAD(if_head, interface);
104 /* dhcpcd requires CMSG_SPACE to evaluate to a compile time constant. */
105 #if defined(__QNX) || \
106 (defined(__NetBSD_Version__) && __NetBSD_Version__ < 600000000)
111 #define ALIGNBYTES (sizeof(int) - 1)
114 #define ALIGN(p) (((unsigned int)(p) + ALIGNBYTES) & ~ALIGNBYTES)
117 #define CMSG_SPACE(len) (ALIGN(sizeof(struct cmsghdr)) + ALIGN(len))
120 #define IP6BUFLEN (CMSG_SPACE(sizeof(struct in6_pktinfo)) + \
121 CMSG_SPACE(sizeof(int)))
127 char pidfile[sizeof(PIDFILE) + IF_NAMESIZE + 1];
129 int fork_fd; /* FD for the fork init signal pipe */
131 unsigned long long options;
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 */
145 struct if_head *ifaces;
152 rb_tree_t routes; /* our routes */
153 #ifdef RT_FREE_ROUTE_TABLE
154 rb_tree_t froutes; /* free routes for re-use */
156 size_t rt_order; /* route order storage */
167 int seq; /* route message sequence no */
168 int sseq; /* successful seq no sent */
176 #ifdef HAVE_OPEN_MEMSTREAM
180 size_t script_buflen;
182 size_t script_envlen;
185 int control_unpriv_fd;
186 struct fd_list_head control_fds;
187 char control_sock[sizeof(CONTROLSOCKET) + IF_NAMESIZE];
190 /* DHCP Enterprise options, RFC3925 */
191 struct dhcp_opt *vivso;
194 char *randomstate; /* original state */
196 /* For filtering RTM_MISS messages per router */
198 uint8_t *rt_missfilter;
199 size_t rt_missfilterlen;
200 size_t rt_missfiltersize;
204 struct passwd *ps_user; /* struct passwd for privsep user */
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 */
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 */
220 struct dhcp_opt *dhcp_opts;
221 size_t dhcp_opts_len;
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. */
230 size_t opt_buffer_len;
239 struct ra_head *ra_routers;
241 struct dhcp_opt *nd_opts;
246 struct dhcp_opt *dhcp6_opts;
247 size_t dhcp6_opts_len;
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;
270 extern const char *dhcpcd_default_script;
272 int dhcpcd_ifafwaiting(const struct interface *);
273 int dhcpcd_afwaiting(const struct dhcpcd_ctx *);
274 void dhcpcd_daemonise(struct dhcpcd_ctx *);
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 *);
284 void dhcpcd_startinterface(void *);
285 void dhcpcd_activateinterface(struct interface *, unsigned long long);