summaryrefslogtreecommitdiff
path: root/includes/dhcp6.h
blob: a5fbfef4ccb57349e60ba79e5314d86b8d742f41 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
/* dhcp6.h

   DHCPv6 Protocol structures... */

/*
 * Copyright (C) 2006-2022 Internet Systems Consortium, Inc. ("ISC")
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 *   Internet Systems Consortium, Inc.
 *   PO Box 360
 *   Newmarket, NH 03857 USA
 *   <info@isc.org>
 *   https://www.isc.org/
 */


/* DHCPv6 Option codes: */

#define D6O_CLIENTID				1 /* RFC3315 */
#define D6O_SERVERID				2
#define D6O_IA_NA				3
#define D6O_IA_TA				4
#define D6O_IAADDR				5
#define D6O_ORO					6
#define D6O_PREFERENCE				7
#define D6O_ELAPSED_TIME			8
#define D6O_RELAY_MSG				9
/* Option code 10 unassigned. */
#define D6O_AUTH				11
#define D6O_UNICAST				12
#define D6O_STATUS_CODE				13
#define D6O_RAPID_COMMIT			14
#define D6O_USER_CLASS				15
#define D6O_VENDOR_CLASS			16
#define D6O_VENDOR_OPTS				17
#define D6O_INTERFACE_ID			18
#define D6O_RECONF_MSG				19
#define D6O_RECONF_ACCEPT			20
#define D6O_SIP_SERVERS_DNS			21 /* RFC3319 */
#define D6O_SIP_SERVERS_ADDR			22 /* RFC3319 */
#define D6O_NAME_SERVERS			23 /* RFC3646 */
#define D6O_DOMAIN_SEARCH			24 /* RFC3646 */
#define D6O_IA_PD				25 /* RFC3633 */
#define D6O_IAPREFIX				26 /* RFC3633 */
#define D6O_NIS_SERVERS				27 /* RFC3898 */
#define D6O_NISP_SERVERS			28 /* RFC3898 */
#define D6O_NIS_DOMAIN_NAME			29 /* RFC3898 */
#define D6O_NISP_DOMAIN_NAME			30 /* RFC3898 */
#define D6O_SNTP_SERVERS			31 /* RFC4075 */
#define D6O_INFORMATION_REFRESH_TIME		32 /* RFC4242 */
#define D6O_BCMCS_SERVER_D			33 /* RFC4280 */
#define D6O_BCMCS_SERVER_A			34 /* RFC4280 */
/* 35 is unassigned */
#define D6O_GEOCONF_CIVIC			36 /* RFC4776 */
#define D6O_REMOTE_ID				37 /* RFC4649 */
#define D6O_SUBSCRIBER_ID			38 /* RFC4580 */
#define D6O_CLIENT_FQDN				39 /* RFC4704 */
#define D6O_PANA_AGENT				40 /* paa-option */
#define D6O_NEW_POSIX_TIMEZONE			41 /* RFC4833 */
#define D6O_NEW_TZDB_TIMEZONE			42 /* RFC4833 */
#define D6O_ERO					43 /* RFC4994 */
#define D6O_LQ_QUERY				44 /* RFC5007 */
#define D6O_CLIENT_DATA				45 /* RFC5007 */
#define D6O_CLT_TIME				46 /* RFC5007 */
#define D6O_LQ_RELAY_DATA			47 /* RFC5007 */
#define D6O_LQ_CLIENT_LINK			48 /* RFC5007 */
#define D6O_MIP6_HNIDF				49 /* RFC6610 */
#define D6O_MIP6_VDINF				50 /* RFC6610 */
#define D6O_V6_LOST				51 /* RFC5223 */
#define D6O_CAPWAP_AC_V6			52 /* RFC5417 */
#define D6O_RELAY_ID				53 /* RFC5460 */
#define D6O_IPV6_ADDRESS_MOS			54 /* RFC5678 */
#define D6O_IPV6_FQDN_MOS			55 /* RFC5678 */
#define D6O_NTP_SERVER				56 /* RFC5908 */
#define D6O_V6_ACCESS_DOMAIN			57 /* RFC5986 */
#define D6O_SIP_UA_CS_LIST			58 /* RFC6011 */
#define D6O_BOOTFILE_URL			59 /* RFC5970 */
#define D6O_BOOTFILE_PARAM			60 /* RFC5970 */
#define D6O_CLIENT_ARCH_TYPE			61 /* RFC5970 */
#define D6O_NII					62 /* RFC5970 */
#define D6O_GEOLOCATION				63 /* RFC6225 */
#define D6O_AFTR_NAME				64 /* RFC6334 */
#define D6O_ERP_LOCAL_DOMAIN_NAME		65 /* RFC6440 */
#define D6O_RSOO				66 /* RFC6422 */
#define D6O_PD_EXCLUDE				67 /* RFC6603 */
#define D6O_VSS					68 /* RFC6607 */
#define D6O_MIP6_IDINF				69 /* RFC6610 */
#define D6O_MIP6_UDINF				70 /* RFC6610 */
#define D6O_MIP6_HNP				71 /* RFC6610 */
#define D6O_MIP6_HAA				72 /* RFC6610 */
#define D6O_MIP6_HAF				73 /* RFC6610 */
#define D6O_RDNSS_SELECTION			74 /* RFC6731 */
#define D6O_KRB_PRINCIPAL_NAME			75 /* RFC6784 */
#define D6O_KRB_REALM_NAME			76 /* RFC6784 */
#define D6O_KRB_DEFAULT_REALM_NAME		77 /* RFC6784 */
#define D6O_KRB_KDC				78 /* RFC6784 */
#define D6O_CLIENT_LINKLAYER_ADDR		79 /* RFC6939 */
#define D6O_LINK_ADDRESS			80 /* RFC6977 */
#define D6O_RADIUS				81 /* RFC7037 */
#define D6O_SOL_MAX_RT				82 /* RFC7083 */
#define D6O_INF_MAX_RT				83 /* RFC7083 */
#define D6O_ADDRSEL				84 /* RFC7078 */
#define D6O_ADDRSEL_TABLE			85 /* RFC7078 */
#define D6O_V6_PCP_SERVER			86 /* RFC7291 */
#define D6O_DHCPV4_MSG				87 /* RFC7341 */
#define D6O_DHCP4_O_DHCP6_SERVER		88 /* RFC7341 */
/* not yet assigned but next free value */
#define D6O_RELAY_SOURCE_PORT			135 /* I-D */

/*
 * Status Codes, from RFC 3315 section 24.4, and RFC 3633, 5007, 5460.
 */
#define STATUS_Success		 0
#define STATUS_UnspecFail	 1
#define STATUS_NoAddrsAvail	 2
#define STATUS_NoBinding	 3
#define STATUS_NotOnLink	 4
#define STATUS_UseMulticast	 5
#define STATUS_NoPrefixAvail	 6
#define STATUS_UnknownQueryType	 7
#define STATUS_MalformedQuery	 8
#define STATUS_NotConfigured	 9
#define STATUS_NotAllowed	10
#define STATUS_QueryTerminated	11

/*
 * DHCPv6 message types, defined in section 5.3 of RFC 3315
 */
#define DHCPV6_SOLICIT		    1
#define DHCPV6_ADVERTISE	    2
#define DHCPV6_REQUEST		    3
#define DHCPV6_CONFIRM		    4
#define DHCPV6_RENEW		    5
#define DHCPV6_REBIND		    6
#define DHCPV6_REPLY		    7
#define DHCPV6_RELEASE		    8
#define DHCPV6_DECLINE		    9
#define DHCPV6_RECONFIGURE	   10
#define DHCPV6_INFORMATION_REQUEST 11
#define DHCPV6_RELAY_FORW	   12
#define DHCPV6_RELAY_REPL	   13
#define DHCPV6_LEASEQUERY	   14	/* RFC5007 */
#define DHCPV6_LEASEQUERY_REPLY	   15	/* RFC5007 */
#define DHCPV6_LEASEQUERY_DONE	   16	/* RFC5460 */
#define DHCPV6_LEASEQUERY_DATA	   17	/* RFC5460 */
#define DHCPV6_RECONFIGURE_REQUEST 18	/* RFC6977 */
#define DHCPV6_RECONFIGURE_REPLY   19	/* RFC6977 */
#define DHCPV6_DHCPV4_QUERY	   20	/* RFC7341 */
#define DHCPV6_DHCPV4_RESPONSE	   21	/* RFC7341 */

extern const char *dhcpv6_type_names[];
extern const int dhcpv6_type_name_max;

/* DUID type definitions (RFC3315 section 9).
 */
#define DUID_LLT	1
#define DUID_EN		2
#define DUID_LL		3
#define DUID_UUID	4	/* RFC6355 */

/* Offsets into IA_*'s where Option spaces commence.  */
#define IA_NA_OFFSET 12 /* IAID, T1, T2, all 4 octets each */
#define IA_TA_OFFSET  4 /* IAID only, 4 octets */
#define IA_PD_OFFSET 12 /* IAID, T1, T2, all 4 octets each */

/* Offset into IAADDR's where Option spaces commence. */
#define IAADDR_OFFSET 24

/* Offset into IAPREFIX's where Option spaces commence. */
#define IAPREFIX_OFFSET 25

/* Offset into LQ_QUERY's where Option spaces commence. */
#define LQ_QUERY_OFFSET 17

/*
 * DHCPv6 well-known multicast addressess, from section 5.1 of RFC 3315
 */
#define All_DHCP_Relay_Agents_and_Servers "FF02::1:2"
#define All_DHCP_Servers "FF05::1:3"

/*
 * DHCPv6 Retransmission Constants (RFC3315 section 5.5, RFC 5007)
 */

#define SOL_MAX_DELAY     1
#define SOL_TIMEOUT       1
#define SOL_MAX_RT      120
#define REQ_TIMEOUT       1
#define REQ_MAX_RT       30
#define REQ_MAX_RC       10
#define CNF_MAX_DELAY     1
#define CNF_TIMEOUT       1
#define CNF_MAX_RT        4
#define CNF_MAX_RD       10
#define REN_TIMEOUT      10
#define REN_MAX_RT      600
#define REB_TIMEOUT      10
#define REB_MAX_RT      600
#define INF_MAX_DELAY     1
#define INF_TIMEOUT       1
#define INF_MAX_RT      120
#define REL_TIMEOUT       1
#define REL_MAX_RC        5
#define DEC_TIMEOUT       1
#define DEC_MAX_RC        5
#define REC_TIMEOUT       2
#define REC_MAX_RC        8
#define HOP_COUNT_LIMIT  32
#define LQ6_TIMEOUT       1
#define LQ6_MAX_RT       10
#define LQ6_MAX_RC        5

/*
 * Normal packet format, defined in section 6 of RFC 3315
 */
struct dhcpv6_packet {
	unsigned char msg_type;
	unsigned char transaction_id[3];
	unsigned char options[FLEXIBLE_ARRAY_MEMBER];
};

/* Offset into DHCPV6 Reply packets where Options spaces commence. */
#define REPLY_OPTIONS_INDEX 4

/*
 * Relay packet format, defined in section 7 of RFC 3315
 */
struct dhcpv6_relay_packet {
	unsigned char msg_type;
	unsigned char hop_count;
	unsigned char link_address[16];
	unsigned char peer_address[16];
	unsigned char options[FLEXIBLE_ARRAY_MEMBER];
};
#define MAX_V6RELAY_HOPS 32

/*
 * DHCPv4-over-DHCPv6 packet format, defined in RFC 4731
 */
struct dhcpv4_over_dhcpv6_packet {
	unsigned char msg_type;
	unsigned char flags[3];
	unsigned char options[FLEXIBLE_ARRAY_MEMBER];
};
#define DHCP4O6_QUERY_UNICAST	128

/* DHCPv4-over-DHCPv6 ISC vendor suboptions */
#define D4O6_INTERFACE		60000
#define D4O6_SRC_ADDRESS	60001

/* Leasequery query-types (RFC 5007, 5460) */

#define LQ6QT_BY_ADDRESS	1
#define LQ6QT_BY_CLIENTID	2
#define LQ6QT_BY_RELAY_ID	3
#define LQ6QT_BY_LINK_ADDRESS	4
#define LQ6QT_BY_REMOTE_ID	5

/*
 * DUID time starts 2000-01-01.
 * This constant is the number of seconds since 1970-01-01,
 * when the Unix epoch began.
 */
#define DUID_TIME_EPOCH 946684800

/* Information-Request Time option (RFC 4242) */

#define IRT_DEFAULT	86400
#define IRT_MINIMUM	600

#define EUI_64_ID_LEN 12  /* 2 for duid-type, 2 for hardware type, 8 for ID */
#define IAID_LEN 4

/* Offsets with iasubopt wire data of data values for IA_NA and TA */
#define IASUBOPT_NA_ADDR_OFFSET		0
#define IASUBOPT_NA_PREF_OFFSET		16
#define IASUBOPT_NA_VALID_OFFSET	20
#define IASUBOPT_NA_LEN			24

/* Offsets with iasubopt wire data of data values for PD */
#define IASUBOPT_PD_PREF_OFFSET		0
#define IASUBOPT_PD_VALID_OFFSET	4
#define IASUBOPT_PD_PREFLEN_OFFSET	8
#define IASUBOPT_PD_PREFIX_OFFSET	9
#define IASUBOPT_PD_LEN			25