Update to dhcpcd-9.1.2 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 /* 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