summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/netinet/dhcp6.h
blob: 64f583dac066b8685982a101fc480d77997b3d05 (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
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _DHCP6_H
#define	_DHCP6_H

/*
 * This header file describes constants and on-the-wire data structures used
 * with DHCPv6.
 *
 * Note that the data structures contained here must be used with caution.  The
 * DHCPv6 protocol generally does not maintain alignment.
 *
 * (Users may also need to include other header files to get ntohs/htons
 * definitions, if the DHCPV6_{GET,SET} macros are used.)
 */

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/types.h>
#include <netinet/in.h>

/*
 * Message Types
 */
#define	DHCPV6_MSG_SOLICIT	1	/* Client sends */
#define	DHCPV6_MSG_ADVERTISE	2	/* Server sends */
#define	DHCPV6_MSG_REQUEST	3	/* Client sends */
#define	DHCPV6_MSG_CONFIRM	4	/* Client sends */
#define	DHCPV6_MSG_RENEW	5	/* Client sends */
#define	DHCPV6_MSG_REBIND	6	/* Client sends */
#define	DHCPV6_MSG_REPLY	7	/* Server sends */
#define	DHCPV6_MSG_RELEASE	8	/* Client sends */
#define	DHCPV6_MSG_DECLINE	9	/* Client sends */
#define	DHCPV6_MSG_RECONFIGURE	10	/* Server sends */
#define	DHCPV6_MSG_INFO_REQ	11	/* Client sends */
#define	DHCPV6_MSG_RELAY_FORW	12	/* Relay agent sends to server */
#define	DHCPV6_MSG_RELAY_REPL	13	/* Server sends to relay agent */

/*
 * Status Codes
 */
#define	DHCPV6_STAT_SUCCESS	0
#define	DHCPV6_STAT_UNSPECFAIL	1	/* Unknown reason */
#define	DHCPV6_STAT_NOADDRS	2	/* Server has no addresses available */
#define	DHCPV6_STAT_NOBINDING	3	/* Client record unavailable */
#define	DHCPV6_STAT_NOTONLINK	4	/* Prefix inappropriate for link */
#define	DHCPV6_STAT_USEMCAST	5	/* Client must use multicast */
#define	DHCPV6_STAT_NOPREFIX	6	/* No prefix available; RFC3633 */

/*
 * DHCP Unique Identifier (DUID) Types
 */
#define	DHCPV6_DUID_LLT		1	/* Link layer address plus time */
#define	DHCPV6_DUID_EN		2	/* Vendor assigned */
#define	DHCPV6_DUID_LL		3	/* Link layer address */

/*
 * DHCPv6 Option Codes
 * Note: options 10 and 35 are not assigned.
 */
#define	DHCPV6_OPT_CLIENTID	1	/* Client's DUID */
#define	DHCPV6_OPT_SERVERID	2	/* Server's DUID */
#define	DHCPV6_OPT_IA_NA	3	/* Non-temporary addrs; dhcpv6_ia_na */
#define	DHCPV6_OPT_IA_TA	4	/* Temporary addrs; dhcpv6_ia_ta */
#define	DHCPV6_OPT_IAADDR	5	/* IA Address; dhcpv6_iaaddr */
#define	DHCPV6_OPT_ORO		6	/* Option Request; uint16_t array */
#define	DHCPV6_OPT_PREFERENCE	7	/* Server preference; uint8_t */
#define	DHCPV6_OPT_ELAPSED_TIME	8	/* Client time; uint16_t; centisec */
#define	DHCPV6_OPT_RELAY_MSG	9	/* Relayed client DHCP message */
#define	DHCPV6_OPT_AUTH		11	/* Authentication; dhcpv6_auth */
#define	DHCPV6_OPT_UNICAST	12	/* Client may unicast; in6_addr_t */
#define	DHCPV6_OPT_STATUS_CODE	13	/* Status; uint16_t plus string */
#define	DHCPV6_OPT_RAPID_COMMIT	14	/* Server may do RC; boolean (len 0) */
#define	DHCPV6_OPT_USER_CLASS	15	/* Classes; {uint16_t,uint8_t...}... */
#define	DHCPV6_OPT_VENDOR_CLASS	16	/* Client vendor; uint32_t + list */
#define	DHCPV6_OPT_VENDOR_OPT	17	/* Vendor specific; uint32_t+opts */
#define	DHCPV6_OPT_INTERFACE_ID	18	/* Relay agent interface */
#define	DHCPV6_OPT_RECONF_MSG	19	/* Reconfigure; uint8_t */
#define	DHCPV6_OPT_RECONF_ACC	20	/* Reconfigure accept; boolean */
#define	DHCPV6_OPT_SIP_NAMES	21	/* SIP srv domain names (RFC3319) */
#define	DHCPV6_OPT_SIP_ADDR	22	/* SIP srv IPv6 address (RFC3319) */
#define	DHCPV6_OPT_DNS_ADDR	23	/* DNS Recur. Name Server (RFC3646) */
#define	DHCPV6_OPT_DNS_SEARCH	24	/* Domain Search List (RFC3646) */
#define	DHCPV6_OPT_IA_PD	25	/* Delegate dhcpv6_ia_na (RFC3633) */
#define	DHCPV6_OPT_IAPREFIX	26	/* Prefix dhcpv6_iaprefix (RFC3633) */
#define	DHCPV6_OPT_NIS_SERVERS	27	/* NIS in6_addr_t array (RFC3898) */
#define	DHCPV6_OPT_NIS_DOMAIN	29	/* NIS Domain string (RFC3898) */
#define	DHCPV6_OPT_SNTP_SERVERS	31	/* SNTP in6_addr_t array (RFC4075) */
#define	DHCPV6_OPT_INFO_REFTIME	32	/* Info refresh uint32_t (RFC4242) */
#define	DHCPV6_OPT_BCMCS_SRV_D	33	/* NUL-term string list (RFC4280) */
#define	DHCPV6_OPT_BCMCS_SRV_A	34	/* in6_addr_t array (RFC4280) */
#define	DHCPV6_OPT_GEOCONF_CVC	36	/* dhcpv6_civic_t plus TLVs */
#define	DHCPV6_OPT_REMOTE_ID	37	/* uint32_t plus opaque */
#define	DHCPV6_OPT_SUBSCRIBER	38	/* opaque; may be NVT ASCII */
#define	DHCPV6_OPT_CLIENT_FQDN	39	/* uint8_t plus domain */

/*
 * Reconfiguration types; used with DHCPV6_OPT_RECONF_MSG option.
 */
#define	DHCPV6_RECONF_RENEW	5	/* Renew now */
#define	DHCPV6_RECONF_INFO	11	/* Request information */

/*
 * FQDN Flags; used with DHCPV6_OPT_CLIENT_FQDN option.
 */
#define	DHCPV6_FQDNF_S	0x01	/* Server should perform AAAA RR updates */
#define	DHCPV6_FQDNF_O	0x02	/* Server override of 'S' bit */
#define	DHCPV6_FQDNF_N	0x04	/* Server should not perform any updates */

/*
 * Miscellany
 */
#define	DHCPV6_INFTIME	0xfffffffful	/* Infinity; used for timers */
#define	DHCPV6_FOREVER	0xffff		/* Used for elapsed time option */
#define	DHCPV6_SUN_ENT	42		/* Sun Microsystems enterprise ID */

/*
 * Basic DHCPv6 message header used for server/client communications.  The
 * options follow this header.
 */
struct dhcpv6_message {
	uint8_t		d6m_msg_type;
	uint8_t		d6m_transid_ho;
	uint16_t	d6m_transid_lo;
};

#define	DHCPV6_GET_TRANSID(msg) \
	(((msg)->d6m_transid_ho << 16) + ntohs((msg)->d6m_transid_lo))
#define	DHCPV6_SET_TRANSID(msg, id) \
	((msg)->d6m_transid_ho = (id) >> 16, (msg)->d6m_transid_lo = htons(id))

/*
 * DHCPv6 relay agent header used only for server/relay communications.  The
 * options follow this header, and the client message is encapsulated as an
 * option.  Note that the IPv6 addresses are not on natural word boundaries.
 */
struct dhcpv6_relay {
	uint8_t		d6r_msg_type;
	uint8_t		d6r_hop_count;
	uint8_t		d6r_linkaddr[16];
	uint8_t		d6r_peeraddr[16];
};

/*
 * DHCPv6 generic option header.  Note that options are not aligned on any
 * convenient boundary.
 */
struct dhcpv6_option {
	uint16_t	d6o_code;
	uint16_t	d6o_len;
};

/*
 * Option header for IA_NA (Non-temporary addresses) and IA_PD (Prefix
 * delegation).  Contains IA Address options for IA_NA, IA_PD Prefixes for
 * IA_PD.
 */
struct dhcpv6_ia_na {
	uint16_t	d6in_code;
	uint16_t	d6in_len;
	uint32_t	d6in_iaid;	/* Unique ID [interface] */
	uint32_t	d6in_t1;	/* Extend from same server */
	uint32_t	d6in_t2;	/* Extend from any server */
};

/*
 * Option header for IA_TA (Temporary addresses).  Contains IA Address options.
 */
struct dhcpv6_ia_ta {
	uint16_t	d6it_code;
	uint16_t	d6it_len;
	uint32_t	d6it_iaid;	/* Unique ID [interface] */
};

/*
 * Option header for IA Address.  Must be used inside of an IA_NA or IA_TA
 * option.  May contain a Status Code option.
 */
struct dhcpv6_iaaddr {
	uint16_t	d6ia_code;
	uint16_t	d6ia_len;
	in6_addr_t	d6ia_addr;	/* IPv6 address */
	uint32_t	d6ia_preflife;	/* Preferred lifetime */
	uint32_t	d6ia_vallife;	/* Valid lifetime */
};

/*
 * Option header for Authentication.  Followed by variable-length
 * authentication information field.  Warning: padding may be present.  Use
 * defined size.
 */
struct dhcpv6_auth {
	uint16_t	d6a_code;
	uint16_t	d6a_len;
	uint8_t		d6a_proto;	/* Protocol */
	uint8_t		d6a_alg;	/* Algorithm */
	uint8_t		d6a_rdm;	/* Replay Detection Method (RDM) */
	uint8_t		d6a_replay[8];	/* Information for RDM */
};
#define	DHCPV6_AUTH_SIZE	15

/* dhpv6_auth.d6a_proto values */
#define	DHCPV6_PROTO_DELAYED	2	/* Delayed Authentication mechanism */
#define	DHCPV6_PROTO_RECONFIG	3	/* Reconfigure Key mechanism */

/* dhpv6_auth.d6a_alg values */
#define	DHCPV6_ALG_HMAC_MD5	1	/* HMAC-MD5 signature */

/* dhpv6_auth.d6a_rdm values */
#define	DHCPV6_RDM_MONOCNT	0	/* Monotonic counter */

/*
 * Option header for IA_PD Prefix.  Must be used inside of an IA_PD option.
 * May contain a Status Code option.  Warning: padding may be present; use
 * defined size.
 */
struct dhcpv6_iaprefix {
	uint16_t	d6ip_code;
	uint16_t	d6ip_len;
	uint32_t	d6ip_preflife;	/* Preferred lifetime */
	uint32_t	d6ip_vallife;	/* Valid lifetime */
	uint8_t		d6ip_preflen;	/* Prefix length */
	uint8_t		d6ip_addr[16];	/* IPv6 prefix */
};
#define	DHCPV6_IAPREFIX_SIZE	29

/*
 * Option header for Civic Address information.  Followed by single octet TLV
 * encoded address elements, using CIVICADDR_* values for type.  Warning:
 * padding may be present; use defined size.
 */
struct dhcpv6_civic {
	uint16_t	d6c_code;
	uint16_t	d6c_len;
	uint8_t		d6c_what;	/* DHCPV6_CWHAT_* value */
	char		d6c_cc[2];		/* Country code; ISO 3166 */
};
#define	DHCPV6_CIVIC_SIZE	7

#define	DHCPV6_CWHAT_SERVER	0	/* Location of server */
#define	DHCPV6_CWHAT_NETWORK	1	/* Location of network */
#define	DHCPV6_CWHAT_CLIENT	2	/* Location of client */

#define	CIVICADDR_LANG	0	/* Language; RFC 2277 */
#define	CIVICADDR_A1	1	/* National division (state) */
#define	CIVICADDR_A2	2	/* County */
#define	CIVICADDR_A3	3	/* City */
#define	CIVICADDR_A4	4	/* City division */
#define	CIVICADDR_A5	5	/* Neighborhood */
#define	CIVICADDR_A6	6	/* Street group */
#define	CIVICADDR_PRD	16	/* Leading street direction */
#define	CIVICADDR_POD	17	/* Trailing street suffix */
#define	CIVICADDR_STS	18	/* Street suffix or type */
#define	CIVICADDR_HNO	19	/* House number */
#define	CIVICADDR_HNS	20	/* House number suffix */
#define	CIVICADDR_LMK	21	/* Landmark */
#define	CIVICADDR_LOC	22	/* Additional location information */
#define	CIVICADDR_NAM	23	/* Name/occupant */
#define	CIVICADDR_PC	24	/* Postal Code/ZIP */
#define	CIVICADDR_BLD	25	/* Building */
#define	CIVICADDR_UNIT	26	/* Unit/apt/suite */
#define	CIVICADDR_FLR	27	/* Floor */
#define	CIVICADDR_ROOM	28	/* Room number */
#define	CIVICADDR_TYPE	29	/* Place type */
#define	CIVICADDR_PCN	30	/* Postal community name */
#define	CIVICADDR_POBOX	31	/* Post office box */
#define	CIVICADDR_ADDL	32	/* Additional code */
#define	CIVICADDR_SEAT	33	/* Seat/desk */
#define	CIVICADDR_ROAD	34	/* Primary road or street */
#define	CIVICADDR_RSEC	35	/* Road section */
#define	CIVICADDR_RBRA	36	/* Road branch */
#define	CIVICADDR_RSBR	37	/* Road sub-branch */
#define	CIVICADDR_SPRE	38	/* Street name pre-modifier */
#define	CIVICADDR_SPOST	39	/* Street name post-modifier */
#define	CIVICADDR_SCRIPT 128	/* Script */

/*
 * DHCP Unique Identifier structures.  These represent the fixed portion of the
 * unique identifier object, and are followed by the variable-length link layer
 * address or identifier.
 */
struct duid_llt {
	uint16_t	dllt_dutype;
	uint16_t	dllt_hwtype;
	uint32_t	dllt_time;
};

/* DUID time stamps start on January 1st, 2000 UTC */
#define	DUID_TIME_BASE	946684800ul

struct duid_en {
	uint16_t	den_dutype;
	uint16_t	den_entho;
	uint16_t	den_entlo;
};

#define	DHCPV6_GET_ENTNUM(den) \
	((ntohs((den)->den_entho) << 16) + ntohs((den)->den_entlo))
#define	DHCPV6_SET_ENTNUM(den, val) \
	((den)->den_entho = htons((val) >> 16), (den)->den_entlo = htons(val))

struct duid_ll {
	uint16_t	dll_dutype;
	uint16_t	dll_hwtype;
};

/*
 * Data types
 */
typedef	struct dhcpv6_message	dhcpv6_message_t;
typedef	struct dhcpv6_relay	dhcpv6_relay_t;
typedef	struct dhcpv6_option	dhcpv6_option_t;
typedef	struct dhcpv6_ia_na	dhcpv6_ia_na_t;
typedef	struct dhcpv6_ia_ta	dhcpv6_ia_ta_t;
typedef	struct dhcpv6_iaaddr	dhcpv6_iaaddr_t;
typedef	struct dhcpv6_auth	dhcpv6_auth_t;
typedef	struct dhcpv6_iaprefix	dhcpv6_iaprefix_t;
typedef struct dhcpv6_civic	dhcpv6_civic_t;
typedef	struct duid_llt		duid_llt_t;
typedef	struct duid_en		duid_en_t;
typedef	struct duid_ll		duid_ll_t;

#ifdef __cplusplus
}
#endif

#endif /* _DHCP6_H */