1*9f20bfa6SDavid van Moolenbroek /* $NetBSD: dhcp6.h,v 1.10 2015/07/09 10:15:34 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 DHCP6_H 31*9f20bfa6SDavid van Moolenbroek #define DHCP6_H 32*9f20bfa6SDavid van Moolenbroek 33*9f20bfa6SDavid van Moolenbroek #include "dhcpcd.h" 34*9f20bfa6SDavid van Moolenbroek 35*9f20bfa6SDavid van Moolenbroek #define IN6ADDR_LINKLOCAL_ALLDHCP_INIT \ 36*9f20bfa6SDavid van Moolenbroek {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 37*9f20bfa6SDavid van Moolenbroek 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02 }}} 38*9f20bfa6SDavid van Moolenbroek 39*9f20bfa6SDavid van Moolenbroek /* UDP port numbers for DHCP */ 40*9f20bfa6SDavid van Moolenbroek #define DHCP6_CLIENT_PORT 546 41*9f20bfa6SDavid van Moolenbroek #define DHCP6_SERVER_PORT 547 42*9f20bfa6SDavid van Moolenbroek 43*9f20bfa6SDavid van Moolenbroek /* DHCP message type */ 44*9f20bfa6SDavid van Moolenbroek #define DHCP6_SOLICIT 1 45*9f20bfa6SDavid van Moolenbroek #define DHCP6_ADVERTISE 2 46*9f20bfa6SDavid van Moolenbroek #define DHCP6_REQUEST 3 47*9f20bfa6SDavid van Moolenbroek #define DHCP6_CONFIRM 4 48*9f20bfa6SDavid van Moolenbroek #define DHCP6_RENEW 5 49*9f20bfa6SDavid van Moolenbroek #define DHCP6_REBIND 6 50*9f20bfa6SDavid van Moolenbroek #define DHCP6_REPLY 7 51*9f20bfa6SDavid van Moolenbroek #define DHCP6_RELEASE 8 52*9f20bfa6SDavid van Moolenbroek #define DHCP6_DECLINE 9 53*9f20bfa6SDavid van Moolenbroek #define DHCP6_RECONFIGURE 10 54*9f20bfa6SDavid van Moolenbroek #define DHCP6_INFORMATION_REQ 11 55*9f20bfa6SDavid van Moolenbroek #define DHCP6_RELAY_FLOW 12 56*9f20bfa6SDavid van Moolenbroek #define DHCP6_RELAY_REPL 13 57*9f20bfa6SDavid van Moolenbroek #define DHCP6_RECONFIGURE_REQ 18 58*9f20bfa6SDavid van Moolenbroek #define DHCP6_RECONFIGURE_REPLY 19 59*9f20bfa6SDavid van Moolenbroek 60*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_CLIENTID 1 61*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_SERVERID 2 62*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_IA_NA 3 63*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_IA_TA 4 64*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_ORO 6 65*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_IA_ADDR 5 66*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_PREFERENCE 7 67*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_ELAPSED 8 68*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_AUTH 11 69*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_UNICAST 12 70*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_STATUS_CODE 13 71*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_RAPID_COMMIT 14 72*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_VENDOR_CLASS 16 73*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_VENDOR_OPTS 17 74*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_INTERFACE_ID 18 75*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_RECONF_MSG 19 76*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_RECONF_ACCEPT 20 77*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_SIP_SERVERS_NAME 21 78*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_SIP_SERVERS_ADDRESS 22 79*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_DNS_SERVERS 23 80*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_DOMAIN_LIST 24 81*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_IA_PD 25 82*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_IAPREFIX 26 83*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_NIS_SERVERS 27 84*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_NISP_SERVERS 28 85*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_NIS_DOMAIN_NAME 29 86*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_NISP_DOMAIN_NAME 30 87*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_SNTP_SERVERS 31 88*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_INFO_REFRESH_TIME 32 89*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_BCMS_SERVER_D 33 90*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_BCMS_SERVER_A 34 91*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_FQDN 39 92*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_POSIX_TIMEZONE 41 93*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_TZDB_TIMEZONE 42 94*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_PD_EXCLUDE 67 95*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_SOL_MAX_RT 82 96*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_INF_MAX_RT 83 97*9f20bfa6SDavid van Moolenbroek 98*9f20bfa6SDavid van Moolenbroek #define D6_FQDN_PTR 0x00 99*9f20bfa6SDavid van Moolenbroek #define D6_FQDN_BOTH 0x01 100*9f20bfa6SDavid van Moolenbroek #define D6_FQDN_NONE 0x04 101*9f20bfa6SDavid van Moolenbroek 102*9f20bfa6SDavid van Moolenbroek #include "dhcp.h" 103*9f20bfa6SDavid van Moolenbroek #include "ipv6.h" 104*9f20bfa6SDavid van Moolenbroek 105*9f20bfa6SDavid van Moolenbroek struct dhcp6_message { 106*9f20bfa6SDavid van Moolenbroek uint8_t type; 107*9f20bfa6SDavid van Moolenbroek uint8_t xid[3]; 108*9f20bfa6SDavid van Moolenbroek /* followed by options */ 109*9f20bfa6SDavid van Moolenbroek } __packed; 110*9f20bfa6SDavid van Moolenbroek 111*9f20bfa6SDavid van Moolenbroek struct dhcp6_option { 112*9f20bfa6SDavid van Moolenbroek uint16_t code; 113*9f20bfa6SDavid van Moolenbroek uint16_t len; 114*9f20bfa6SDavid van Moolenbroek /* followed by data */ 115*9f20bfa6SDavid van Moolenbroek } __packed; 116*9f20bfa6SDavid van Moolenbroek 117*9f20bfa6SDavid van Moolenbroek #define D6_STATUS_OK 0 118*9f20bfa6SDavid van Moolenbroek #define D6_STATUS_FAIL 1 119*9f20bfa6SDavid van Moolenbroek #define D6_STATUS_NOADDR 2 120*9f20bfa6SDavid van Moolenbroek #define D6_STATUS_NOBINDING 3 121*9f20bfa6SDavid van Moolenbroek #define D6_STATUS_NOTONLINK 4 122*9f20bfa6SDavid van Moolenbroek #define D6_STATUS_USEMULTICAST 5 123*9f20bfa6SDavid van Moolenbroek 124*9f20bfa6SDavid van Moolenbroek #define SOL_MAX_DELAY 1 125*9f20bfa6SDavid van Moolenbroek #define SOL_TIMEOUT 1 126*9f20bfa6SDavid van Moolenbroek #define SOL_MAX_RT 3600 /* RFC7083 */ 127*9f20bfa6SDavid van Moolenbroek #define REQ_TIMEOUT 1 128*9f20bfa6SDavid van Moolenbroek #define REQ_MAX_RT 30 129*9f20bfa6SDavid van Moolenbroek #define REQ_MAX_RC 10 130*9f20bfa6SDavid van Moolenbroek #define CNF_MAX_DELAY 1 131*9f20bfa6SDavid van Moolenbroek #define CNF_TIMEOUT 1 132*9f20bfa6SDavid van Moolenbroek #define CNF_MAX_RT 4 133*9f20bfa6SDavid van Moolenbroek #define CNF_MAX_RD 10 134*9f20bfa6SDavid van Moolenbroek #define REN_TIMEOUT 10 135*9f20bfa6SDavid van Moolenbroek #define REN_MAX_RT 600 136*9f20bfa6SDavid van Moolenbroek #define REB_TIMEOUT 10 137*9f20bfa6SDavid van Moolenbroek #define REB_MAX_RT 600 138*9f20bfa6SDavid van Moolenbroek #define INF_MAX_DELAY 1 139*9f20bfa6SDavid van Moolenbroek #define INF_TIMEOUT 1 140*9f20bfa6SDavid van Moolenbroek #define INF_MAX_RT 3600 /* RFC7083 */ 141*9f20bfa6SDavid van Moolenbroek #define REL_TIMEOUT 1 142*9f20bfa6SDavid van Moolenbroek #define REL_MAX_RC 5 143*9f20bfa6SDavid van Moolenbroek #define DEC_TIMEOUT 1 144*9f20bfa6SDavid van Moolenbroek #define DEC_MAX_RC 5 145*9f20bfa6SDavid van Moolenbroek #define REC_TIMEOUT 2 146*9f20bfa6SDavid van Moolenbroek #define REC_MAX_RC 8 147*9f20bfa6SDavid van Moolenbroek #define HOP_COUNT_LIMIT 32 148*9f20bfa6SDavid van Moolenbroek 149*9f20bfa6SDavid van Moolenbroek /* RFC4242 3.1 */ 150*9f20bfa6SDavid van Moolenbroek #define IRT_DEFAULT 86400 151*9f20bfa6SDavid van Moolenbroek #define IRT_MINIMUM 600 152*9f20bfa6SDavid van Moolenbroek 153*9f20bfa6SDavid van Moolenbroek #define DHCP6_RAND_MIN -100 154*9f20bfa6SDavid van Moolenbroek #define DHCP6_RAND_MAX 100 155*9f20bfa6SDavid van Moolenbroek 156*9f20bfa6SDavid van Moolenbroek enum DH6S { 157*9f20bfa6SDavid van Moolenbroek DH6S_INIT, 158*9f20bfa6SDavid van Moolenbroek DH6S_DISCOVER, 159*9f20bfa6SDavid van Moolenbroek DH6S_REQUEST, 160*9f20bfa6SDavid van Moolenbroek DH6S_BOUND, 161*9f20bfa6SDavid van Moolenbroek DH6S_RENEW, 162*9f20bfa6SDavid van Moolenbroek DH6S_REBIND, 163*9f20bfa6SDavid van Moolenbroek DH6S_CONFIRM, 164*9f20bfa6SDavid van Moolenbroek DH6S_INFORM, 165*9f20bfa6SDavid van Moolenbroek DH6S_INFORMED, 166*9f20bfa6SDavid van Moolenbroek DH6S_RENEW_REQUESTED, 167*9f20bfa6SDavid van Moolenbroek DH6S_PROBE, 168*9f20bfa6SDavid van Moolenbroek DH6S_DELEGATED, 169*9f20bfa6SDavid van Moolenbroek DH6S_RELEASE, 170*9f20bfa6SDavid van Moolenbroek DH6S_RELEASED 171*9f20bfa6SDavid van Moolenbroek }; 172*9f20bfa6SDavid van Moolenbroek 173*9f20bfa6SDavid van Moolenbroek struct dhcp6_state { 174*9f20bfa6SDavid van Moolenbroek enum DH6S state; 175*9f20bfa6SDavid van Moolenbroek struct timespec started; 176*9f20bfa6SDavid van Moolenbroek 177*9f20bfa6SDavid van Moolenbroek /* Message retransmission timings */ 178*9f20bfa6SDavid van Moolenbroek struct timespec RT; 179*9f20bfa6SDavid van Moolenbroek unsigned int IMD; 180*9f20bfa6SDavid van Moolenbroek unsigned int RTC; 181*9f20bfa6SDavid van Moolenbroek time_t IRT; 182*9f20bfa6SDavid van Moolenbroek unsigned int MRC; 183*9f20bfa6SDavid van Moolenbroek time_t MRT; 184*9f20bfa6SDavid van Moolenbroek void (*MRCcallback)(void *); 185*9f20bfa6SDavid van Moolenbroek time_t sol_max_rt; 186*9f20bfa6SDavid van Moolenbroek time_t inf_max_rt; 187*9f20bfa6SDavid van Moolenbroek 188*9f20bfa6SDavid van Moolenbroek struct dhcp6_message *send; 189*9f20bfa6SDavid van Moolenbroek size_t send_len; 190*9f20bfa6SDavid van Moolenbroek struct dhcp6_message *recv; 191*9f20bfa6SDavid van Moolenbroek size_t recv_len; 192*9f20bfa6SDavid van Moolenbroek struct dhcp6_message *new; 193*9f20bfa6SDavid van Moolenbroek size_t new_len; 194*9f20bfa6SDavid van Moolenbroek struct dhcp6_message *old; 195*9f20bfa6SDavid van Moolenbroek size_t old_len; 196*9f20bfa6SDavid van Moolenbroek 197*9f20bfa6SDavid van Moolenbroek uint32_t renew; 198*9f20bfa6SDavid van Moolenbroek uint32_t rebind; 199*9f20bfa6SDavid van Moolenbroek uint32_t expire; 200*9f20bfa6SDavid van Moolenbroek struct in6_addr unicast; 201*9f20bfa6SDavid van Moolenbroek struct ipv6_addrhead addrs; 202*9f20bfa6SDavid van Moolenbroek uint32_t lowpl; 203*9f20bfa6SDavid van Moolenbroek /* The +3 is for the possible .pd extension for prefix delegation */ 204*9f20bfa6SDavid van Moolenbroek char leasefile[sizeof(LEASEFILE6) + IF_NAMESIZE + (IF_SSIDSIZE * 4) +3]; 205*9f20bfa6SDavid van Moolenbroek const char *reason; 206*9f20bfa6SDavid van Moolenbroek 207*9f20bfa6SDavid van Moolenbroek struct authstate auth; 208*9f20bfa6SDavid van Moolenbroek }; 209*9f20bfa6SDavid van Moolenbroek 210*9f20bfa6SDavid van Moolenbroek #define D6_STATE(ifp) \ 211*9f20bfa6SDavid van Moolenbroek ((struct dhcp6_state *)(ifp)->if_data[IF_DATA_DHCP6]) 212*9f20bfa6SDavid van Moolenbroek #define D6_CSTATE(ifp) \ 213*9f20bfa6SDavid van Moolenbroek ((const struct dhcp6_state *)(ifp)->if_data[IF_DATA_DHCP6]) 214*9f20bfa6SDavid van Moolenbroek #define D6_STATE_RUNNING(ifp) \ 215*9f20bfa6SDavid van Moolenbroek (D6_CSTATE((ifp)) && \ 216*9f20bfa6SDavid van Moolenbroek D6_CSTATE((ifp))->reason && dhcp6_dadcompleted((ifp))) 217*9f20bfa6SDavid van Moolenbroek 218*9f20bfa6SDavid van Moolenbroek #define D6_FIRST_OPTION(m) \ 219*9f20bfa6SDavid van Moolenbroek ((struct dhcp6_option *) \ 220*9f20bfa6SDavid van Moolenbroek ((uint8_t *)(m) + sizeof(struct dhcp6_message))) 221*9f20bfa6SDavid van Moolenbroek #define D6_NEXT_OPTION(o) \ 222*9f20bfa6SDavid van Moolenbroek ((struct dhcp6_option *) \ 223*9f20bfa6SDavid van Moolenbroek (((uint8_t *)o) + sizeof(struct dhcp6_option) + ntohs((o)->len))) 224*9f20bfa6SDavid van Moolenbroek #define D6_OPTION_DATA(o) \ 225*9f20bfa6SDavid van Moolenbroek ((uint8_t *)(o) + sizeof(struct dhcp6_option)) 226*9f20bfa6SDavid van Moolenbroek #define D6_CFIRST_OPTION(m) \ 227*9f20bfa6SDavid van Moolenbroek ((const struct dhcp6_option *) \ 228*9f20bfa6SDavid van Moolenbroek ((const uint8_t *)(m) + sizeof(struct dhcp6_message))) 229*9f20bfa6SDavid van Moolenbroek #define D6_CNEXT_OPTION(o) \ 230*9f20bfa6SDavid van Moolenbroek ((const struct dhcp6_option *) \ 231*9f20bfa6SDavid van Moolenbroek (((const uint8_t *)o) + sizeof(struct dhcp6_option) + ntohs((o)->len))) 232*9f20bfa6SDavid van Moolenbroek #define D6_COPTION_DATA(o) \ 233*9f20bfa6SDavid van Moolenbroek ((const uint8_t *)(o) + sizeof(struct dhcp6_option)) 234*9f20bfa6SDavid van Moolenbroek 235*9f20bfa6SDavid van Moolenbroek #ifdef INET6 236*9f20bfa6SDavid van Moolenbroek void dhcp6_printoptions(const struct dhcpcd_ctx *, 237*9f20bfa6SDavid van Moolenbroek const struct dhcp_opt *, size_t); 238*9f20bfa6SDavid van Moolenbroek const struct ipv6_addr *dhcp6_iffindaddr(const struct interface *ifp, 239*9f20bfa6SDavid van Moolenbroek const struct in6_addr *addr, short flags); 240*9f20bfa6SDavid van Moolenbroek struct ipv6_addr *dhcp6_findaddr(struct dhcpcd_ctx *, const struct in6_addr *, 241*9f20bfa6SDavid van Moolenbroek short); 242*9f20bfa6SDavid van Moolenbroek size_t dhcp6_find_delegates(struct interface *); 243*9f20bfa6SDavid van Moolenbroek int dhcp6_has_public_addr(const struct interface *); 244*9f20bfa6SDavid van Moolenbroek int dhcp6_start(struct interface *, enum DH6S); 245*9f20bfa6SDavid van Moolenbroek void dhcp6_reboot(struct interface *); 246*9f20bfa6SDavid van Moolenbroek ssize_t dhcp6_env(char **, const char *, const struct interface *, 247*9f20bfa6SDavid van Moolenbroek const struct dhcp6_message *, size_t); 248*9f20bfa6SDavid van Moolenbroek void dhcp6_free(struct interface *); 249*9f20bfa6SDavid van Moolenbroek void dhcp6_handleifa(struct dhcpcd_ctx *, int, const char *, 250*9f20bfa6SDavid van Moolenbroek const struct in6_addr *addr, int); 251*9f20bfa6SDavid van Moolenbroek int dhcp6_dadcompleted(const struct interface *); 252*9f20bfa6SDavid van Moolenbroek void dhcp6_drop(struct interface *, const char *); 253*9f20bfa6SDavid van Moolenbroek int dhcp6_dump(struct interface *); 254*9f20bfa6SDavid van Moolenbroek #else 255*9f20bfa6SDavid van Moolenbroek #define dhcp6_find_delegates(a) {} 256*9f20bfa6SDavid van Moolenbroek #define dhcp6_start(a, b) (0) 257*9f20bfa6SDavid van Moolenbroek #define dhcp6_reboot(a) {} 258*9f20bfa6SDavid van Moolenbroek #define dhcp6_env(a, b, c, d, e) {} 259*9f20bfa6SDavid van Moolenbroek #define dhcp6_free(a) {} 260*9f20bfa6SDavid van Moolenbroek #define dhcp6_dadcompleted(a) (0) 261*9f20bfa6SDavid van Moolenbroek #define dhcp6_drop(a, b) {} 262*9f20bfa6SDavid van Moolenbroek #define dhcp6_dump(a) (-1) 263*9f20bfa6SDavid van Moolenbroek #endif 264*9f20bfa6SDavid van Moolenbroek 265*9f20bfa6SDavid van Moolenbroek #endif 266