blob: 41b2213c106f13f69f12bb026275322b21ec1b44 [file] [log] [blame]
Samuel Tand7ed8512015-08-13 16:11:35 -07001/*
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
103struct dhcp6_message {
104 uint8_t type;
105 uint8_t xid[3];
106 /* followed by options */
107} __packed;
108
109struct 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
154enum 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
170struct 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
233void dhcp6_printoptions(const struct dhcpcd_ctx *,
234 const struct dhcp_opt *, size_t);
235struct ipv6_addr *dhcp6_findaddr(struct dhcpcd_ctx *, const struct in6_addr *,
236 short);
237size_t dhcp6_find_delegates(struct interface *);
238int dhcp6_has_public_addr(const struct interface *);
239int dhcp6_start(struct interface *, enum DH6S);
240void dhcp6_reboot(struct interface *);
241ssize_t dhcp6_env(char **, const char *, const struct interface *,
242 const struct dhcp6_message *, size_t);
243void dhcp6_free(struct interface *);
244void dhcp6_handleifa(struct dhcpcd_ctx *, int, const char *,
245 const struct in6_addr *addr, int);
246int dhcp6_dadcompleted(const struct interface *);
247void dhcp6_drop(struct interface *, const char *);
248int 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