xref: /minix3/external/bsd/dhcpcd/dist/dhcpcd.h (revision 9f20bfa6c4c442e2e798d91b11c2a5f8d6833a41)
1*9f20bfa6SDavid van Moolenbroek /* $NetBSD: dhcpcd.h,v 1.13 2015/08/21 10:39:00 roy Exp $ */
2*9f20bfa6SDavid van Moolenbroek 
3*9f20bfa6SDavid van Moolenbroek /*
4*9f20bfa6SDavid van Moolenbroek  * dhcpcd - DHCP client daemon
5*9f20bfa6SDavid van Moolenbroek  * Copyright (c) 2006-2015 Roy Marples <roy@marples.name>
6*9f20bfa6SDavid van Moolenbroek  * All rights reserved
7*9f20bfa6SDavid van Moolenbroek 
8*9f20bfa6SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
9*9f20bfa6SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
10*9f20bfa6SDavid van Moolenbroek  * are met:
11*9f20bfa6SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
12*9f20bfa6SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
13*9f20bfa6SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
14*9f20bfa6SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
15*9f20bfa6SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
16*9f20bfa6SDavid van Moolenbroek  *
17*9f20bfa6SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18*9f20bfa6SDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*9f20bfa6SDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*9f20bfa6SDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21*9f20bfa6SDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*9f20bfa6SDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23*9f20bfa6SDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24*9f20bfa6SDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25*9f20bfa6SDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26*9f20bfa6SDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27*9f20bfa6SDavid van Moolenbroek  * SUCH DAMAGE.
28*9f20bfa6SDavid van Moolenbroek  */
29*9f20bfa6SDavid van Moolenbroek 
30*9f20bfa6SDavid van Moolenbroek #ifndef DHCPCD_H
31*9f20bfa6SDavid van Moolenbroek #define DHCPCD_H
32*9f20bfa6SDavid van Moolenbroek 
33*9f20bfa6SDavid van Moolenbroek #include <sys/socket.h>
34*9f20bfa6SDavid van Moolenbroek #include <net/if.h>
35*9f20bfa6SDavid van Moolenbroek 
36*9f20bfa6SDavid van Moolenbroek #include "config.h"
37*9f20bfa6SDavid van Moolenbroek #ifdef HAVE_SYS_QUEUE_H
38*9f20bfa6SDavid van Moolenbroek #include <sys/queue.h>
39*9f20bfa6SDavid van Moolenbroek #endif
40*9f20bfa6SDavid van Moolenbroek 
41*9f20bfa6SDavid van Moolenbroek #include "defs.h"
42*9f20bfa6SDavid van Moolenbroek #include "control.h"
43*9f20bfa6SDavid van Moolenbroek #include "if-options.h"
44*9f20bfa6SDavid van Moolenbroek 
45*9f20bfa6SDavid van Moolenbroek #define HWADDR_LEN	20
46*9f20bfa6SDavid van Moolenbroek #define IF_SSIDSIZE	33
47*9f20bfa6SDavid van Moolenbroek #define PROFILE_LEN	64
48*9f20bfa6SDavid van Moolenbroek #define SECRET_LEN	64
49*9f20bfa6SDavid van Moolenbroek 
50*9f20bfa6SDavid van Moolenbroek #define LINK_UP		1
51*9f20bfa6SDavid van Moolenbroek #define LINK_UNKNOWN	0
52*9f20bfa6SDavid van Moolenbroek #define LINK_DOWN	-1
53*9f20bfa6SDavid van Moolenbroek 
54*9f20bfa6SDavid van Moolenbroek #define IF_DATA_IPV4	0
55*9f20bfa6SDavid van Moolenbroek #define IF_DATA_ARP	1
56*9f20bfa6SDavid van Moolenbroek #define IF_DATA_IPV4LL	2
57*9f20bfa6SDavid van Moolenbroek #define IF_DATA_DHCP	3
58*9f20bfa6SDavid van Moolenbroek #define IF_DATA_IPV6	4
59*9f20bfa6SDavid van Moolenbroek #define IF_DATA_IPV6ND	5
60*9f20bfa6SDavid van Moolenbroek #define IF_DATA_DHCP6	6
61*9f20bfa6SDavid van Moolenbroek #define IF_DATA_MAX	7
62*9f20bfa6SDavid van Moolenbroek 
63*9f20bfa6SDavid van Moolenbroek /* If the interface does not support carrier status (ie PPP),
64*9f20bfa6SDavid van Moolenbroek  * dhcpcd can poll it for the relevant flags periodically */
65*9f20bfa6SDavid van Moolenbroek #define IF_POLL_UP	100	/* milliseconds */
66*9f20bfa6SDavid van Moolenbroek 
67*9f20bfa6SDavid van Moolenbroek #ifdef __QNX__
68*9f20bfa6SDavid van Moolenbroek /* QNX carries defines for, but does not actually support PF_LINK */
69*9f20bfa6SDavid van Moolenbroek #undef IFLR_ACTIVE
70*9f20bfa6SDavid van Moolenbroek #endif
71*9f20bfa6SDavid van Moolenbroek 
72*9f20bfa6SDavid van Moolenbroek struct interface {
73*9f20bfa6SDavid van Moolenbroek 	struct dhcpcd_ctx *ctx;
74*9f20bfa6SDavid van Moolenbroek 	TAILQ_ENTRY(interface) next;
75*9f20bfa6SDavid van Moolenbroek 	char name[IF_NAMESIZE];
76*9f20bfa6SDavid van Moolenbroek #ifdef __linux__
77*9f20bfa6SDavid van Moolenbroek 	char alias[IF_NAMESIZE];
78*9f20bfa6SDavid van Moolenbroek #endif
79*9f20bfa6SDavid van Moolenbroek 	unsigned int index;
80*9f20bfa6SDavid van Moolenbroek 	unsigned int flags;
81*9f20bfa6SDavid van Moolenbroek 	sa_family_t family;
82*9f20bfa6SDavid van Moolenbroek 	unsigned char hwaddr[HWADDR_LEN];
83*9f20bfa6SDavid van Moolenbroek 	uint8_t hwlen;
84*9f20bfa6SDavid van Moolenbroek 	unsigned int metric;
85*9f20bfa6SDavid van Moolenbroek 	int carrier;
86*9f20bfa6SDavid van Moolenbroek 	int wireless;
87*9f20bfa6SDavid van Moolenbroek 	uint8_t ssid[IF_SSIDSIZE];
88*9f20bfa6SDavid van Moolenbroek 	unsigned int ssid_len;
89*9f20bfa6SDavid van Moolenbroek 
90*9f20bfa6SDavid van Moolenbroek 	char profile[PROFILE_LEN];
91*9f20bfa6SDavid van Moolenbroek 	struct if_options *options;
92*9f20bfa6SDavid van Moolenbroek 	void *if_data[IF_DATA_MAX];
93*9f20bfa6SDavid van Moolenbroek };
94*9f20bfa6SDavid van Moolenbroek TAILQ_HEAD(if_head, interface);
95*9f20bfa6SDavid van Moolenbroek 
96*9f20bfa6SDavid van Moolenbroek struct dhcpcd_ctx {
97*9f20bfa6SDavid van Moolenbroek 	int pid_fd;
98*9f20bfa6SDavid van Moolenbroek 	char pidfile[sizeof(PIDFILE) + IF_NAMESIZE + 1];
99*9f20bfa6SDavid van Moolenbroek 	const char *cffile;
100*9f20bfa6SDavid van Moolenbroek 	unsigned long long options;
101*9f20bfa6SDavid van Moolenbroek 	char *logfile;
102*9f20bfa6SDavid van Moolenbroek 	int log_fd;
103*9f20bfa6SDavid van Moolenbroek 	int argc;
104*9f20bfa6SDavid van Moolenbroek 	char **argv;
105*9f20bfa6SDavid van Moolenbroek 	int ifac;	/* allowed interfaces */
106*9f20bfa6SDavid van Moolenbroek 	char **ifav;	/* allowed interfaces */
107*9f20bfa6SDavid van Moolenbroek 	int ifdc;	/* denied interfaces */
108*9f20bfa6SDavid van Moolenbroek 	char **ifdv;	/* denied interfaces */
109*9f20bfa6SDavid van Moolenbroek 	int ifc;	/* listed interfaces */
110*9f20bfa6SDavid van Moolenbroek 	char **ifv;	/* listed interfaces */
111*9f20bfa6SDavid van Moolenbroek 	int ifcc;	/* configured interfaces */
112*9f20bfa6SDavid van Moolenbroek 	char **ifcv;	/* configured interfaces */
113*9f20bfa6SDavid van Moolenbroek 	unsigned char *duid;
114*9f20bfa6SDavid van Moolenbroek 	size_t duid_len;
115*9f20bfa6SDavid van Moolenbroek 	struct if_head *ifaces;
116*9f20bfa6SDavid van Moolenbroek 
117*9f20bfa6SDavid van Moolenbroek 	int pf_inet_fd;
118*9f20bfa6SDavid van Moolenbroek #if defined(INET6) && defined(BSD)
119*9f20bfa6SDavid van Moolenbroek 	int pf_inet6_fd;
120*9f20bfa6SDavid van Moolenbroek #endif
121*9f20bfa6SDavid van Moolenbroek #ifdef IFLR_ACTIVE
122*9f20bfa6SDavid van Moolenbroek 	int pf_link_fd;
123*9f20bfa6SDavid van Moolenbroek #endif
124*9f20bfa6SDavid van Moolenbroek 	int link_fd;
125*9f20bfa6SDavid van Moolenbroek 
126*9f20bfa6SDavid van Moolenbroek #ifdef USE_SIGNALS
127*9f20bfa6SDavid van Moolenbroek 	sigset_t sigset;
128*9f20bfa6SDavid van Moolenbroek #endif
129*9f20bfa6SDavid van Moolenbroek 	struct eloop *eloop;
130*9f20bfa6SDavid van Moolenbroek 
131*9f20bfa6SDavid van Moolenbroek 	int control_fd;
132*9f20bfa6SDavid van Moolenbroek 	int control_unpriv_fd;
133*9f20bfa6SDavid van Moolenbroek 	struct fd_list_head control_fds;
134*9f20bfa6SDavid van Moolenbroek 	char control_sock[sizeof(CONTROLSOCKET) + IF_NAMESIZE];
135*9f20bfa6SDavid van Moolenbroek 	gid_t control_group;
136*9f20bfa6SDavid van Moolenbroek 
137*9f20bfa6SDavid van Moolenbroek 	/* DHCP Enterprise options, RFC3925 */
138*9f20bfa6SDavid van Moolenbroek 	struct dhcp_opt *vivso;
139*9f20bfa6SDavid van Moolenbroek 	size_t vivso_len;
140*9f20bfa6SDavid van Moolenbroek 
141*9f20bfa6SDavid van Moolenbroek 	char *randomstate; /* original state */
142*9f20bfa6SDavid van Moolenbroek 
143*9f20bfa6SDavid van Moolenbroek #ifdef INET
144*9f20bfa6SDavid van Moolenbroek 	struct dhcp_opt *dhcp_opts;
145*9f20bfa6SDavid van Moolenbroek 	size_t dhcp_opts_len;
146*9f20bfa6SDavid van Moolenbroek 	struct rt_head *ipv4_routes;
147*9f20bfa6SDavid van Moolenbroek 	struct rt_head *ipv4_kroutes;
148*9f20bfa6SDavid van Moolenbroek 
149*9f20bfa6SDavid van Moolenbroek 	int udp_fd;
150*9f20bfa6SDavid van Moolenbroek 	uint8_t *packet;
151*9f20bfa6SDavid van Moolenbroek 
152*9f20bfa6SDavid van Moolenbroek 	/* Our aggregate option buffer.
153*9f20bfa6SDavid van Moolenbroek 	 * We ONLY use this when options are split, which for most purposes is
154*9f20bfa6SDavid van Moolenbroek 	 * practically never. See RFC3396 for details. */
155*9f20bfa6SDavid van Moolenbroek 	uint8_t *opt_buffer;
156*9f20bfa6SDavid van Moolenbroek #endif
157*9f20bfa6SDavid van Moolenbroek #ifdef INET6
158*9f20bfa6SDavid van Moolenbroek 	unsigned char secret[SECRET_LEN];
159*9f20bfa6SDavid van Moolenbroek 	size_t secret_len;
160*9f20bfa6SDavid van Moolenbroek 
161*9f20bfa6SDavid van Moolenbroek 	struct dhcp_opt *nd_opts;
162*9f20bfa6SDavid van Moolenbroek 	size_t nd_opts_len;
163*9f20bfa6SDavid van Moolenbroek 	struct dhcp_opt *dhcp6_opts;
164*9f20bfa6SDavid van Moolenbroek 	size_t dhcp6_opts_len;
165*9f20bfa6SDavid van Moolenbroek 	struct ipv6_ctx *ipv6;
166*9f20bfa6SDavid van Moolenbroek #ifndef __linux__
167*9f20bfa6SDavid van Moolenbroek 	int ra_global;
168*9f20bfa6SDavid van Moolenbroek #endif
169*9f20bfa6SDavid van Moolenbroek #endif /* INET6 */
170*9f20bfa6SDavid van Moolenbroek 
171*9f20bfa6SDavid van Moolenbroek #ifdef PLUGIN_DEV
172*9f20bfa6SDavid van Moolenbroek 	char *dev_load;
173*9f20bfa6SDavid van Moolenbroek 	int dev_fd;
174*9f20bfa6SDavid van Moolenbroek 	struct dev *dev;
175*9f20bfa6SDavid van Moolenbroek 	void *dev_handle;
176*9f20bfa6SDavid van Moolenbroek #endif
177*9f20bfa6SDavid van Moolenbroek };
178*9f20bfa6SDavid van Moolenbroek 
179*9f20bfa6SDavid van Moolenbroek #ifdef USE_SIGNALS
180*9f20bfa6SDavid van Moolenbroek extern const int dhcpcd_signals[];
181*9f20bfa6SDavid van Moolenbroek extern const size_t dhcpcd_signals_len;
182*9f20bfa6SDavid van Moolenbroek #endif
183*9f20bfa6SDavid van Moolenbroek 
184*9f20bfa6SDavid van Moolenbroek int dhcpcd_ifafwaiting(const struct interface *);
185*9f20bfa6SDavid van Moolenbroek int dhcpcd_afwaiting(const struct dhcpcd_ctx *);
186*9f20bfa6SDavid van Moolenbroek pid_t dhcpcd_daemonise(struct dhcpcd_ctx *);
187*9f20bfa6SDavid van Moolenbroek 
188*9f20bfa6SDavid van Moolenbroek int dhcpcd_handleargs(struct dhcpcd_ctx *, struct fd_list *, int, char **);
189*9f20bfa6SDavid van Moolenbroek void dhcpcd_handlecarrier(struct dhcpcd_ctx *, int, unsigned int, const char *);
190*9f20bfa6SDavid van Moolenbroek int dhcpcd_handleinterface(void *, int, const char *);
191*9f20bfa6SDavid van Moolenbroek void dhcpcd_handlehwaddr(struct dhcpcd_ctx *, const char *,
192*9f20bfa6SDavid van Moolenbroek     const unsigned char *, uint8_t);
193*9f20bfa6SDavid van Moolenbroek void dhcpcd_dropinterface(struct interface *, const char *);
194*9f20bfa6SDavid van Moolenbroek int dhcpcd_selectprofile(struct interface *, const char *);
195*9f20bfa6SDavid van Moolenbroek 
196*9f20bfa6SDavid van Moolenbroek void dhcpcd_startinterface(void *);
197*9f20bfa6SDavid van Moolenbroek void dhcpcd_initstate(struct interface *, unsigned long long);
198*9f20bfa6SDavid van Moolenbroek 
199*9f20bfa6SDavid van Moolenbroek #endif
200