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