xref: /dragonfly/contrib/dhcpcd/src/dhcpcd.h (revision 49ecb1a08dc8bbbd8cc8cec29fd6e3a0a12651c2)
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * dhcpcd - DHCP client daemon
4  * Copyright (c) 2006-2023 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 
59 #define IF_DATA_IPV4          0
60 #define IF_DATA_ARP 1
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
66 #define IF_DATA_MAX 7
67 
68 #ifdef __QNX__
69 /* QNX carries defines for, but does not actually support PF_LINK */
70 #undef IFLR_ACTIVE
71 #endif
72 
73 struct interface {
74           struct dhcpcd_ctx *ctx;
75           TAILQ_ENTRY(interface) next;
76           char name[IF_NAMESIZE];
77           unsigned int index;
78           unsigned int active;
79           unsigned int flags;
80           uint16_t hwtype; /* ARPHRD_ETHER for example */
81           unsigned char hwaddr[HWADDR_LEN];
82           uint8_t hwlen;
83           unsigned short vlanid;
84           unsigned int metric;
85           int carrier;
86           bool wireless;
87           uint8_t ssid[IF_SSIDLEN];
88           unsigned int ssid_len;
89 
90           char profile[PROFILE_LEN];
91           struct if_options *options;
92           void *if_data[IF_DATA_MAX];
93 };
94 TAILQ_HEAD(if_head, interface);
95 
96 #include "privsep.h"
97 
98 /* dhcpcd requires CMSG_SPACE to evaluate to a compile time constant. */
99 #if defined(__QNX) || \
100           (defined(__NetBSD_Version__) && __NetBSD_Version__ < 600000000)
101 #undef CMSG_SPACE
102 #endif
103 
104 #ifndef ALIGNBYTES
105 #define ALIGNBYTES (sizeof(int) - 1)
106 #endif
107 #ifndef ALIGN
108 #define   ALIGN(p) (((unsigned int)(p) + ALIGNBYTES) & ~ALIGNBYTES)
109 #endif
110 #ifndef CMSG_SPACE
111 #define   CMSG_SPACE(len)     (ALIGN(sizeof(struct cmsghdr)) + ALIGN(len))
112 #endif
113 
114 struct passwd;
115 
116 struct dhcpcd_ctx {
117           char pidfile[sizeof(PIDFILE) + IF_NAMESIZE + 1];
118           char vendor[256];
119           int fork_fd;        /* FD for the fork init signal pipe */
120           const char *cffile;
121           unsigned long long options;
122           char *logfile;
123           int argc;
124           char **argv;
125           int ifac; /* allowed interfaces */
126           char **ifav;        /* allowed interfaces */
127           int ifdc; /* denied interfaces */
128           char **ifdv;        /* denied interfaces */
129           int ifc;  /* listed interfaces */
130           char **ifv;         /* listed interfaces */
131           int ifcc; /* configured interfaces */
132           char **ifcv;        /* configured interfaces */
133           uint8_t duid_type;
134           unsigned char *duid;
135           size_t duid_len;
136           struct if_head *ifaces;
137 
138           char *ctl_buf;
139           size_t ctl_buflen;
140           size_t ctl_bufpos;
141           size_t ctl_extra;
142 
143           rb_tree_t routes;   /* our routes */
144 #ifdef RT_FREE_ROUTE_TABLE
145           rb_tree_t froutes;  /* free routes for re-use */
146 #endif
147           size_t rt_order;    /* route order storage */
148 
149           int pf_inet_fd;
150 #ifdef PF_LINK
151           int pf_link_fd;
152 #endif
153           void *priv;
154           int link_fd;
155 #ifndef SMALL
156           int link_rcvbuf;
157 #endif
158           int seq;  /* route message sequence no */
159           int sseq; /* successful seq no sent */
160 
161 #ifdef USE_SIGNALS
162           sigset_t sigset;
163 #endif
164           struct eloop *eloop;
165 
166           char *script;
167 #ifdef HAVE_OPEN_MEMSTREAM
168           FILE *script_fp;
169 #endif
170           char *script_buf;
171           size_t script_buflen;
172           char **script_env;
173           size_t script_envlen;
174 
175           int control_fd;
176           int control_unpriv_fd;
177           struct fd_list_head control_fds;
178           char control_sock[sizeof(CONTROLSOCKET) + IF_NAMESIZE];
179           char control_sock_unpriv[sizeof(CONTROLSOCKET) + IF_NAMESIZE + 7];
180           gid_t control_group;
181 
182           /* DHCP Enterprise options, RFC3925 */
183           struct dhcp_opt *vivso;
184           size_t vivso_len;
185 
186           char *randomstate; /* original state */
187 
188           /* For filtering RTM_MISS messages per router */
189 #ifdef BSD
190           uint8_t *rt_missfilter;
191           size_t rt_missfilterlen;
192           size_t rt_missfiltersize;
193 #endif
194 
195 #ifdef PRIVSEP
196           struct passwd *ps_user;       /* struct passwd for privsep user */
197           struct ps_process_head ps_processes;    /* List of spawned processes */
198           struct ps_process *ps_root;
199           struct ps_process *ps_inet;
200           struct ps_process *ps_ctl;
201           int ps_data_fd;               /* data returned from processes */
202           int ps_log_fd;                /* chroot logging */
203           int ps_log_root_fd; /* outside chroot log reader */
204           struct eloop *ps_eloop;       /* eloop for polling root data */
205           struct fd_list *ps_control;             /* Queue for the above */
206           struct fd_list *ps_control_client;      /* Queue for the above */
207 #endif
208 
209 #ifdef INET
210           struct dhcp_opt *dhcp_opts;
211           size_t dhcp_opts_len;
212 
213           int udp_rfd;
214           int udp_wfd;
215 
216           /* Our aggregate option buffer.
217            * We ONLY use this when options are split, which for most purposes is
218            * practically never. See RFC3396 for details. */
219           uint8_t *opt_buffer;
220           size_t opt_buffer_len;
221 #endif
222 #ifdef INET6
223           uint8_t *secret;
224           size_t secret_len;
225 
226 #ifndef __sun
227           int nd_fd;
228 #endif
229           struct ra_head *ra_routers;
230 
231           struct dhcp_opt *nd_opts;
232           size_t nd_opts_len;
233 #ifdef DHCP6
234           int dhcp6_rfd;
235           int dhcp6_wfd;
236           struct dhcp_opt *dhcp6_opts;
237           size_t dhcp6_opts_len;
238 #endif
239 
240 #ifndef __linux__
241           int ra_global;
242 #endif
243 #endif /* INET6 */
244 
245 #ifdef PLUGIN_DEV
246           char *dev_load;
247           int dev_fd;
248           struct dev *dev;
249           void *dev_handle;
250 #endif
251 };
252 
253 #ifdef USE_SIGNALS
254 extern const int dhcpcd_signals[];
255 extern const size_t dhcpcd_signals_len;
256 extern const int dhcpcd_signals_ignore[];
257 extern const size_t dhcpcd_signals_ignore_len;
258 #endif
259 
260 extern const char *dhcpcd_default_script;
261 
262 int dhcpcd_ifafwaiting(const struct interface *);
263 int dhcpcd_afwaiting(const struct dhcpcd_ctx *);
264 void dhcpcd_daemonised(struct dhcpcd_ctx *);
265 void dhcpcd_daemonise(struct dhcpcd_ctx *);
266 
267 void dhcpcd_signal_cb(int, void *);
268 
269 void dhcpcd_linkoverflow(struct dhcpcd_ctx *);
270 int dhcpcd_handleargs(struct dhcpcd_ctx *, struct fd_list *, int, char **);
271 void dhcpcd_handlecarrier(struct interface *, int, unsigned int);
272 int dhcpcd_handleinterface(void *, int, const char *);
273 void dhcpcd_handlehwaddr(struct interface *, uint16_t, const void *, uint8_t);
274 void dhcpcd_dropinterface(struct interface *, const char *);
275 int dhcpcd_selectprofile(struct interface *, const char *);
276 
277 void dhcpcd_startinterface(void *);
278 void dhcpcd_activateinterface(struct interface *, unsigned long long);
279 
280 #endif
281