1*9f20bfa6SDavid van Moolenbroek /* $NetBSD: if-options.h,v 1.14 2015/09/04 12:25:01 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 IF_OPTIONS_H 31*9f20bfa6SDavid van Moolenbroek #define IF_OPTIONS_H 32*9f20bfa6SDavid van Moolenbroek 33*9f20bfa6SDavid van Moolenbroek #include <sys/param.h> 34*9f20bfa6SDavid van Moolenbroek #include <sys/socket.h> 35*9f20bfa6SDavid van Moolenbroek #include <net/if.h> 36*9f20bfa6SDavid van Moolenbroek #include <netinet/in.h> 37*9f20bfa6SDavid van Moolenbroek 38*9f20bfa6SDavid van Moolenbroek #include <getopt.h> 39*9f20bfa6SDavid van Moolenbroek #include <limits.h> 40*9f20bfa6SDavid van Moolenbroek #include <stdint.h> 41*9f20bfa6SDavid van Moolenbroek 42*9f20bfa6SDavid van Moolenbroek #include "auth.h" 43*9f20bfa6SDavid van Moolenbroek 44*9f20bfa6SDavid van Moolenbroek /* Don't set any optional arguments here so we retain POSIX 45*9f20bfa6SDavid van Moolenbroek * compatibility with getopt */ 46*9f20bfa6SDavid van Moolenbroek #define IF_OPTS "46bc:de:f:gh:i:j:kl:m:no:pqr:s:t:u:v:wxy:z:" \ 47*9f20bfa6SDavid van Moolenbroek "ABC:DEF:GHI:JKLMO:Q:S:TUVW:X:Z:" 48*9f20bfa6SDavid van Moolenbroek 49*9f20bfa6SDavid van Moolenbroek #define DEFAULT_TIMEOUT 30 50*9f20bfa6SDavid van Moolenbroek #define DEFAULT_REBOOT 5 51*9f20bfa6SDavid van Moolenbroek 52*9f20bfa6SDavid van Moolenbroek #ifndef HOSTNAME_MAX_LEN 53*9f20bfa6SDavid van Moolenbroek #define HOSTNAME_MAX_LEN 250 /* 255 - 3 (FQDN) - 2 (DNS enc) */ 54*9f20bfa6SDavid van Moolenbroek #endif 55*9f20bfa6SDavid van Moolenbroek #define VENDORCLASSID_MAX_LEN 255 56*9f20bfa6SDavid van Moolenbroek #define CLIENTID_MAX_LEN 48 57*9f20bfa6SDavid van Moolenbroek #define USERCLASS_MAX_LEN 255 58*9f20bfa6SDavid van Moolenbroek #define VENDOR_MAX_LEN 255 59*9f20bfa6SDavid van Moolenbroek 60*9f20bfa6SDavid van Moolenbroek #define DHCPCD_ARP (1ULL << 0) 61*9f20bfa6SDavid van Moolenbroek #define DHCPCD_RELEASE (1ULL << 1) 62*9f20bfa6SDavid van Moolenbroek #define DHCPCD_DOMAIN (1ULL << 2) 63*9f20bfa6SDavid van Moolenbroek #define DHCPCD_GATEWAY (1ULL << 3) 64*9f20bfa6SDavid van Moolenbroek #define DHCPCD_STATIC (1ULL << 4) 65*9f20bfa6SDavid van Moolenbroek #define DHCPCD_DEBUG (1ULL << 5) 66*9f20bfa6SDavid van Moolenbroek #define DHCPCD_LASTLEASE (1ULL << 7) 67*9f20bfa6SDavid van Moolenbroek #define DHCPCD_INFORM (1ULL << 8) 68*9f20bfa6SDavid van Moolenbroek #define DHCPCD_REQUEST (1ULL << 9) 69*9f20bfa6SDavid van Moolenbroek #define DHCPCD_IPV4LL (1ULL << 10) 70*9f20bfa6SDavid van Moolenbroek #define DHCPCD_DUID (1ULL << 11) 71*9f20bfa6SDavid van Moolenbroek #define DHCPCD_PERSISTENT (1ULL << 12) 72*9f20bfa6SDavid van Moolenbroek #define DHCPCD_DAEMONISE (1ULL << 14) 73*9f20bfa6SDavid van Moolenbroek #define DHCPCD_DAEMONISED (1ULL << 15) 74*9f20bfa6SDavid van Moolenbroek #define DHCPCD_TEST (1ULL << 16) 75*9f20bfa6SDavid van Moolenbroek #define DHCPCD_MASTER (1ULL << 17) 76*9f20bfa6SDavid van Moolenbroek #define DHCPCD_HOSTNAME (1ULL << 18) 77*9f20bfa6SDavid van Moolenbroek #define DHCPCD_CLIENTID (1ULL << 19) 78*9f20bfa6SDavid van Moolenbroek #define DHCPCD_LINK (1ULL << 20) 79*9f20bfa6SDavid van Moolenbroek #define DHCPCD_QUIET (1ULL << 21) 80*9f20bfa6SDavid van Moolenbroek #define DHCPCD_BACKGROUND (1ULL << 22) 81*9f20bfa6SDavid van Moolenbroek #define DHCPCD_VENDORRAW (1ULL << 23) 82*9f20bfa6SDavid van Moolenbroek #define DHCPCD_NOWAITIP (1ULL << 24) /* To force daemonise */ 83*9f20bfa6SDavid van Moolenbroek #define DHCPCD_WAITIP (1ULL << 25) 84*9f20bfa6SDavid van Moolenbroek #define DHCPCD_SLAACPRIVATE (1ULL << 26) 85*9f20bfa6SDavid van Moolenbroek #define DHCPCD_CSR_WARNED (1ULL << 27) 86*9f20bfa6SDavid van Moolenbroek #define DHCPCD_XID_HWADDR (1ULL << 28) 87*9f20bfa6SDavid van Moolenbroek #define DHCPCD_BROADCAST (1ULL << 29) 88*9f20bfa6SDavid van Moolenbroek #define DHCPCD_DUMPLEASE (1ULL << 30) 89*9f20bfa6SDavid van Moolenbroek #define DHCPCD_IPV6RS (1ULL << 31) 90*9f20bfa6SDavid van Moolenbroek #define DHCPCD_IPV6RA_REQRDNSS (1ULL << 32) 91*9f20bfa6SDavid van Moolenbroek #define DHCPCD_IPV6RA_OWN (1ULL << 33) 92*9f20bfa6SDavid van Moolenbroek #define DHCPCD_IPV6RA_OWN_DEFAULT (1ULL << 34) 93*9f20bfa6SDavid van Moolenbroek #define DHCPCD_IPV4 (1ULL << 35) 94*9f20bfa6SDavid van Moolenbroek #define DHCPCD_FORKED (1ULL << 36) 95*9f20bfa6SDavid van Moolenbroek #define DHCPCD_IPV6 (1ULL << 37) 96*9f20bfa6SDavid van Moolenbroek #define DHCPCD_STARTED (1ULL << 38) 97*9f20bfa6SDavid van Moolenbroek #define DHCPCD_NOALIAS (1ULL << 39) 98*9f20bfa6SDavid van Moolenbroek #define DHCPCD_IA_FORCED (1ULL << 40) 99*9f20bfa6SDavid van Moolenbroek #define DHCPCD_STOPPING (1ULL << 41) 100*9f20bfa6SDavid van Moolenbroek #define DHCPCD_DEPARTED (1ULL << 42) 101*9f20bfa6SDavid van Moolenbroek #define DHCPCD_HOSTNAME_SHORT (1ULL << 43) 102*9f20bfa6SDavid van Moolenbroek #define DHCPCD_EXITING (1ULL << 44) 103*9f20bfa6SDavid van Moolenbroek #define DHCPCD_WAITIP4 (1ULL << 45) 104*9f20bfa6SDavid van Moolenbroek #define DHCPCD_WAITIP6 (1ULL << 46) 105*9f20bfa6SDavid van Moolenbroek #define DHCPCD_DEV (1ULL << 47) 106*9f20bfa6SDavid van Moolenbroek #define DHCPCD_IAID (1ULL << 48) 107*9f20bfa6SDavid van Moolenbroek #define DHCPCD_DHCP (1ULL << 49) 108*9f20bfa6SDavid van Moolenbroek #define DHCPCD_DHCP6 (1ULL << 50) 109*9f20bfa6SDavid van Moolenbroek #define DHCPCD_IF_UP (1ULL << 51) 110*9f20bfa6SDavid van Moolenbroek // unassigned (1ULL << 52) 111*9f20bfa6SDavid van Moolenbroek // unassinged (1ULL << 53) 112*9f20bfa6SDavid van Moolenbroek #define DHCPCD_IPV6RA_AUTOCONF (1ULL << 54) 113*9f20bfa6SDavid van Moolenbroek #define DHCPCD_ROUTER_HOST_ROUTE_WARNED (1ULL << 55) 114*9f20bfa6SDavid van Moolenbroek #define DHCPCD_IPV6RA_ACCEPT_NOPUBLIC (1ULL << 56) 115*9f20bfa6SDavid van Moolenbroek #define DHCPCD_BOOTP (1ULL << 57) 116*9f20bfa6SDavid van Moolenbroek #define DHCPCD_INITIAL_DELAY (1ULL << 58) 117*9f20bfa6SDavid van Moolenbroek 118*9f20bfa6SDavid van Moolenbroek #define DHCPCD_NODROP (DHCPCD_EXITING | DHCPCD_PERSISTENT) 119*9f20bfa6SDavid van Moolenbroek 120*9f20bfa6SDavid van Moolenbroek #define DHCPCD_WAITOPTS (DHCPCD_WAITIP | DHCPCD_WAITIP4 | DHCPCD_WAITIP6) 121*9f20bfa6SDavid van Moolenbroek 122*9f20bfa6SDavid van Moolenbroek #define DHCPCD_WARNINGS (DHCPCD_CSR_WARNED | \ 123*9f20bfa6SDavid van Moolenbroek DHCPCD_ROUTER_HOST_ROUTE_WARNED) 124*9f20bfa6SDavid van Moolenbroek 125*9f20bfa6SDavid van Moolenbroek extern const struct option cf_options[]; 126*9f20bfa6SDavid van Moolenbroek 127*9f20bfa6SDavid van Moolenbroek struct if_sla { 128*9f20bfa6SDavid van Moolenbroek char ifname[IF_NAMESIZE]; 129*9f20bfa6SDavid van Moolenbroek uint32_t sla; 130*9f20bfa6SDavid van Moolenbroek uint8_t prefix_len; 131*9f20bfa6SDavid van Moolenbroek int8_t sla_set; 132*9f20bfa6SDavid van Moolenbroek }; 133*9f20bfa6SDavid van Moolenbroek 134*9f20bfa6SDavid van Moolenbroek struct if_ia { 135*9f20bfa6SDavid van Moolenbroek uint8_t iaid[4]; 136*9f20bfa6SDavid van Moolenbroek #ifdef INET6 137*9f20bfa6SDavid van Moolenbroek uint16_t ia_type; 138*9f20bfa6SDavid van Moolenbroek uint8_t iaid_set; 139*9f20bfa6SDavid van Moolenbroek struct in6_addr addr; 140*9f20bfa6SDavid van Moolenbroek uint8_t prefix_len; 141*9f20bfa6SDavid van Moolenbroek uint32_t sla_max; 142*9f20bfa6SDavid van Moolenbroek size_t sla_len; 143*9f20bfa6SDavid van Moolenbroek struct if_sla *sla; 144*9f20bfa6SDavid van Moolenbroek #endif 145*9f20bfa6SDavid van Moolenbroek }; 146*9f20bfa6SDavid van Moolenbroek 147*9f20bfa6SDavid van Moolenbroek struct vivco { 148*9f20bfa6SDavid van Moolenbroek size_t len; 149*9f20bfa6SDavid van Moolenbroek uint8_t *data; 150*9f20bfa6SDavid van Moolenbroek }; 151*9f20bfa6SDavid van Moolenbroek 152*9f20bfa6SDavid van Moolenbroek struct if_options { 153*9f20bfa6SDavid van Moolenbroek time_t mtime; 154*9f20bfa6SDavid van Moolenbroek uint8_t iaid[4]; 155*9f20bfa6SDavid van Moolenbroek int metric; 156*9f20bfa6SDavid van Moolenbroek uint8_t requestmask[256 / NBBY]; 157*9f20bfa6SDavid van Moolenbroek uint8_t requiremask[256 / NBBY]; 158*9f20bfa6SDavid van Moolenbroek uint8_t nomask[256 / NBBY]; 159*9f20bfa6SDavid van Moolenbroek uint8_t rejectmask[256 / NBBY]; 160*9f20bfa6SDavid van Moolenbroek uint8_t dstmask[256 / NBBY]; 161*9f20bfa6SDavid van Moolenbroek uint8_t requestmasknd[(UINT16_MAX + 1) / NBBY]; 162*9f20bfa6SDavid van Moolenbroek uint8_t requiremasknd[(UINT16_MAX + 1) / NBBY]; 163*9f20bfa6SDavid van Moolenbroek uint8_t nomasknd[(UINT16_MAX + 1) / NBBY]; 164*9f20bfa6SDavid van Moolenbroek uint8_t rejectmasknd[(UINT16_MAX + 1) / NBBY]; 165*9f20bfa6SDavid van Moolenbroek uint8_t requestmask6[(UINT16_MAX + 1) / NBBY]; 166*9f20bfa6SDavid van Moolenbroek uint8_t requiremask6[(UINT16_MAX + 1) / NBBY]; 167*9f20bfa6SDavid van Moolenbroek uint8_t nomask6[(UINT16_MAX + 1) / NBBY]; 168*9f20bfa6SDavid van Moolenbroek uint8_t rejectmask6[(UINT16_MAX + 1) / NBBY]; 169*9f20bfa6SDavid van Moolenbroek uint32_t leasetime; 170*9f20bfa6SDavid van Moolenbroek time_t timeout; 171*9f20bfa6SDavid van Moolenbroek time_t reboot; 172*9f20bfa6SDavid van Moolenbroek unsigned long long options; 173*9f20bfa6SDavid van Moolenbroek 174*9f20bfa6SDavid van Moolenbroek struct in_addr req_addr; 175*9f20bfa6SDavid van Moolenbroek struct in_addr req_mask; 176*9f20bfa6SDavid van Moolenbroek struct rt_head *routes; 177*9f20bfa6SDavid van Moolenbroek unsigned int mtu; 178*9f20bfa6SDavid van Moolenbroek char **config; 179*9f20bfa6SDavid van Moolenbroek 180*9f20bfa6SDavid van Moolenbroek char **environ; 181*9f20bfa6SDavid van Moolenbroek char *script; 182*9f20bfa6SDavid van Moolenbroek 183*9f20bfa6SDavid van Moolenbroek char hostname[HOSTNAME_MAX_LEN + 1]; /* We don't store the length */ 184*9f20bfa6SDavid van Moolenbroek uint8_t fqdn; 185*9f20bfa6SDavid van Moolenbroek uint8_t vendorclassid[VENDORCLASSID_MAX_LEN + 2]; 186*9f20bfa6SDavid van Moolenbroek uint8_t clientid[CLIENTID_MAX_LEN + 2]; 187*9f20bfa6SDavid van Moolenbroek uint8_t userclass[USERCLASS_MAX_LEN + 2]; 188*9f20bfa6SDavid van Moolenbroek uint8_t vendor[VENDOR_MAX_LEN + 2]; 189*9f20bfa6SDavid van Moolenbroek 190*9f20bfa6SDavid van Moolenbroek size_t blacklist_len; 191*9f20bfa6SDavid van Moolenbroek in_addr_t *blacklist; 192*9f20bfa6SDavid van Moolenbroek size_t whitelist_len; 193*9f20bfa6SDavid van Moolenbroek in_addr_t *whitelist; 194*9f20bfa6SDavid van Moolenbroek size_t arping_len; 195*9f20bfa6SDavid van Moolenbroek in_addr_t *arping; 196*9f20bfa6SDavid van Moolenbroek char *fallback; 197*9f20bfa6SDavid van Moolenbroek 198*9f20bfa6SDavid van Moolenbroek struct if_ia *ia; 199*9f20bfa6SDavid van Moolenbroek size_t ia_len; 200*9f20bfa6SDavid van Moolenbroek 201*9f20bfa6SDavid van Moolenbroek struct dhcp_opt *dhcp_override; 202*9f20bfa6SDavid van Moolenbroek size_t dhcp_override_len; 203*9f20bfa6SDavid van Moolenbroek struct dhcp_opt *nd_override; 204*9f20bfa6SDavid van Moolenbroek size_t nd_override_len; 205*9f20bfa6SDavid van Moolenbroek struct dhcp_opt *dhcp6_override; 206*9f20bfa6SDavid van Moolenbroek size_t dhcp6_override_len; 207*9f20bfa6SDavid van Moolenbroek uint32_t vivco_en; 208*9f20bfa6SDavid van Moolenbroek struct vivco *vivco; 209*9f20bfa6SDavid van Moolenbroek size_t vivco_len; 210*9f20bfa6SDavid van Moolenbroek struct dhcp_opt *vivso_override; 211*9f20bfa6SDavid van Moolenbroek size_t vivso_override_len; 212*9f20bfa6SDavid van Moolenbroek 213*9f20bfa6SDavid van Moolenbroek struct auth auth; 214*9f20bfa6SDavid van Moolenbroek }; 215*9f20bfa6SDavid van Moolenbroek 216*9f20bfa6SDavid van Moolenbroek struct if_options *read_config(struct dhcpcd_ctx *, 217*9f20bfa6SDavid van Moolenbroek const char *, const char *, const char *); 218*9f20bfa6SDavid van Moolenbroek int add_options(struct dhcpcd_ctx *, const char *, 219*9f20bfa6SDavid van Moolenbroek struct if_options *, int, char **); 220*9f20bfa6SDavid van Moolenbroek void free_dhcp_opt_embenc(struct dhcp_opt *); 221*9f20bfa6SDavid van Moolenbroek void free_options(struct if_options *); 222*9f20bfa6SDavid van Moolenbroek 223*9f20bfa6SDavid van Moolenbroek #endif 224