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