| /* |
| * dhcpcd - DHCP client daemon |
| * Copyright (c) 2006-2015 Roy Marples <[email protected]> |
| * All rights reserved |
| |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
| * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
| * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| */ |
| |
| #ifndef DHCPCD_H |
| #define DHCPCD_H |
| |
| #include <sys/socket.h> |
| #include <net/if.h> |
| |
| #include "config.h" |
| #include "defs.h" |
| #include "control.h" |
| #include "if-options.h" |
| |
| #define HWADDR_LEN 20 |
| #define IF_SSIDSIZE 33 |
| #define PROFILE_LEN 64 |
| #define SECRET_LEN 64 |
| #define LEASE_IDENTIFIER_LEN (PATH_MAX - sizeof(LEASEFILE)) |
| |
| #define LINK_UP 1 |
| #define LINK_UNKNOWN 0 |
| #define LINK_DOWN -1 |
| |
| #define IF_DATA_IPV4 0 |
| #define IF_DATA_DHCP 1 |
| #define IF_DATA_IPV6 2 |
| #define IF_DATA_IPV6ND 3 |
| #define IF_DATA_DHCP6 4 |
| #define IF_DATA_MAX 5 |
| |
| /* If the interface does not support carrier status (ie PPP), |
| * dhcpcd can poll it for the relevant flags periodically */ |
| #define IF_POLL_UP 100 /* milliseconds */ |
| |
| struct interface { |
| struct dhcpcd_ctx *ctx; |
| TAILQ_ENTRY(interface) next; |
| char name[IF_NAMESIZE]; |
| #ifdef __linux__ |
| char alias[IF_NAMESIZE]; |
| #endif |
| unsigned int index; |
| unsigned int flags; |
| sa_family_t family; |
| unsigned char hwaddr[HWADDR_LEN]; |
| uint8_t hwlen; |
| unsigned int metric; |
| int carrier; |
| int wireless; |
| uint8_t ssid[IF_SSIDSIZE]; |
| unsigned int ssid_len; |
| char lease_identifier[LEASE_IDENTIFIER_LEN]; |
| |
| char profile[PROFILE_LEN]; |
| struct if_options *options; |
| void *if_data[IF_DATA_MAX]; |
| }; |
| TAILQ_HEAD(if_head, interface); |
| |
| struct dhcpcd_ctx { |
| int pid_fd; |
| char pidfile[sizeof(PIDFILE) + IF_NAMESIZE + 1]; |
| const char *cffile; |
| unsigned long long options; |
| char *logfile; |
| int log_fd; |
| int argc; |
| char **argv; |
| int ifac; /* allowed interfaces */ |
| char **ifav; /* allowed interfaces */ |
| int ifdc; /* denied interfaces */ |
| char **ifdv; /* denied interfaces */ |
| int ifc; /* listed interfaces */ |
| char **ifv; /* listed interfaces */ |
| int ifcc; /* configured interfaces */ |
| char **ifcv; /* configured interfaces */ |
| unsigned char *duid; |
| size_t duid_len; |
| int link_fd; |
| struct if_head *ifaces; |
| |
| #ifdef USE_SIGNALS |
| sigset_t sigset; |
| #endif |
| struct eloop_ctx *eloop; |
| |
| int control_fd; |
| int control_unpriv_fd; |
| struct fd_list_head control_fds; |
| char control_sock[sizeof(CONTROLSOCKET) + IF_NAMESIZE]; |
| gid_t control_group; |
| |
| /* DHCP Enterprise options, RFC3925 */ |
| struct dhcp_opt *vivso; |
| size_t vivso_len; |
| |
| #ifdef INET |
| struct dhcp_opt *dhcp_opts; |
| size_t dhcp_opts_len; |
| struct rt_head *ipv4_routes; |
| struct rt_head *ipv4_kroutes; |
| |
| int udp_fd; |
| uint8_t *packet; |
| |
| /* Our aggregate option buffer. |
| * We ONLY use this when options are split, which for most purposes is |
| * practically never. See RFC3396 for details. */ |
| uint8_t *opt_buffer; |
| #endif |
| #ifdef INET6 |
| unsigned char secret[SECRET_LEN]; |
| size_t secret_len; |
| |
| struct dhcp_opt *dhcp6_opts; |
| size_t dhcp6_opts_len; |
| struct ipv6_ctx *ipv6; |
| #ifndef __linux__ |
| int ra_global; |
| #endif |
| #endif /* INET6 */ |
| |
| #ifdef PLUGIN_DEV |
| char *dev_load; |
| int dev_fd; |
| struct dev *dev; |
| void *dev_handle; |
| #endif |
| }; |
| |
| #ifdef USE_SIGNALS |
| struct dhcpcd_siginfo { |
| int signo; |
| }; |
| |
| extern const int dhcpcd_handlesigs[]; |
| void dhcpcd_handle_signal(void *); |
| #endif |
| |
| int dhcpcd_oneup(struct dhcpcd_ctx *); |
| int dhcpcd_ipwaited(struct dhcpcd_ctx *); |
| pid_t dhcpcd_daemonise(struct dhcpcd_ctx *); |
| |
| int dhcpcd_handleargs(struct dhcpcd_ctx *, struct fd_list *, int, char **); |
| void dhcpcd_handlecarrier(struct dhcpcd_ctx *, int, unsigned int, const char *); |
| int dhcpcd_handleinterface(void *, int, const char *); |
| void dhcpcd_handlehwaddr(struct dhcpcd_ctx *, const char *, |
| const unsigned char *, uint8_t); |
| void dhcpcd_dropinterface(struct interface *, const char *); |
| int dhcpcd_selectprofile(struct interface *, const char *); |
| |
| void dhcpcd_startinterface(void *); |
| void dhcpcd_initstate(struct interface *, unsigned long long); |
| |
| void dhcpcd_start_interface(struct dhcpcd_ctx *, const char *); |
| void dhcpcd_stop_interface(struct dhcpcd_ctx *, const char *); |
| void dhcpcd_release_ipv4(struct dhcpcd_ctx *, const char *); |
| void dhcpcd_stop_interfaces(struct dhcpcd_ctx *); |
| |
| #endif |