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