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