xref: /illumos-gate/usr/src/uts/common/netinet/dhcp6.h (revision d04ccbb3)
1*d04ccbb3Scarlsonj /*
2*d04ccbb3Scarlsonj  * CDDL HEADER START
3*d04ccbb3Scarlsonj  *
4*d04ccbb3Scarlsonj  * The contents of this file are subject to the terms of the
5*d04ccbb3Scarlsonj  * Common Development and Distribution License (the "License").
6*d04ccbb3Scarlsonj  * You may not use this file except in compliance with the License.
7*d04ccbb3Scarlsonj  *
8*d04ccbb3Scarlsonj  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*d04ccbb3Scarlsonj  * or http://www.opensolaris.org/os/licensing.
10*d04ccbb3Scarlsonj  * See the License for the specific language governing permissions
11*d04ccbb3Scarlsonj  * and limitations under the License.
12*d04ccbb3Scarlsonj  *
13*d04ccbb3Scarlsonj  * When distributing Covered Code, include this CDDL HEADER in each
14*d04ccbb3Scarlsonj  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*d04ccbb3Scarlsonj  * If applicable, add the following below this CDDL HEADER, with the
16*d04ccbb3Scarlsonj  * fields enclosed by brackets "[]" replaced with your own identifying
17*d04ccbb3Scarlsonj  * information: Portions Copyright [yyyy] [name of copyright owner]
18*d04ccbb3Scarlsonj  *
19*d04ccbb3Scarlsonj  * CDDL HEADER END
20*d04ccbb3Scarlsonj  */
21*d04ccbb3Scarlsonj 
22*d04ccbb3Scarlsonj /*
23*d04ccbb3Scarlsonj  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24*d04ccbb3Scarlsonj  * Use is subject to license terms.
25*d04ccbb3Scarlsonj  */
26*d04ccbb3Scarlsonj 
27*d04ccbb3Scarlsonj #ifndef _DHCP6_H
28*d04ccbb3Scarlsonj #define	_DHCP6_H
29*d04ccbb3Scarlsonj 
30*d04ccbb3Scarlsonj #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*d04ccbb3Scarlsonj 
32*d04ccbb3Scarlsonj /*
33*d04ccbb3Scarlsonj  * This header file describes constants and on-the-wire data structures used
34*d04ccbb3Scarlsonj  * with DHCPv6.
35*d04ccbb3Scarlsonj  *
36*d04ccbb3Scarlsonj  * Note that the data structures contained here must be used with caution.  The
37*d04ccbb3Scarlsonj  * DHCPv6 protocol generally does not maintain alignment.
38*d04ccbb3Scarlsonj  *
39*d04ccbb3Scarlsonj  * (Users may also need to include other header files to get ntohs/htons
40*d04ccbb3Scarlsonj  * definitions, if the DHCPV6_{GET,SET} macros are used.)
41*d04ccbb3Scarlsonj  */
42*d04ccbb3Scarlsonj 
43*d04ccbb3Scarlsonj #ifdef __cplusplus
44*d04ccbb3Scarlsonj extern "C" {
45*d04ccbb3Scarlsonj #endif
46*d04ccbb3Scarlsonj 
47*d04ccbb3Scarlsonj #include <sys/types.h>
48*d04ccbb3Scarlsonj #include <netinet/in.h>
49*d04ccbb3Scarlsonj 
50*d04ccbb3Scarlsonj /*
51*d04ccbb3Scarlsonj  * Message Types
52*d04ccbb3Scarlsonj  */
53*d04ccbb3Scarlsonj #define	DHCPV6_MSG_SOLICIT	1	/* Client sends */
54*d04ccbb3Scarlsonj #define	DHCPV6_MSG_ADVERTISE	2	/* Server sends */
55*d04ccbb3Scarlsonj #define	DHCPV6_MSG_REQUEST	3	/* Client sends */
56*d04ccbb3Scarlsonj #define	DHCPV6_MSG_CONFIRM	4	/* Client sends */
57*d04ccbb3Scarlsonj #define	DHCPV6_MSG_RENEW	5	/* Client sends */
58*d04ccbb3Scarlsonj #define	DHCPV6_MSG_REBIND	6	/* Client sends */
59*d04ccbb3Scarlsonj #define	DHCPV6_MSG_REPLY	7	/* Server sends */
60*d04ccbb3Scarlsonj #define	DHCPV6_MSG_RELEASE	8	/* Client sends */
61*d04ccbb3Scarlsonj #define	DHCPV6_MSG_DECLINE	9	/* Client sends */
62*d04ccbb3Scarlsonj #define	DHCPV6_MSG_RECONFIGURE	10	/* Server sends */
63*d04ccbb3Scarlsonj #define	DHCPV6_MSG_INFO_REQ	11	/* Client sends */
64*d04ccbb3Scarlsonj #define	DHCPV6_MSG_RELAY_FORW	12	/* Relay agent sends to server */
65*d04ccbb3Scarlsonj #define	DHCPV6_MSG_RELAY_REPL	13	/* Server sends to relay agent */
66*d04ccbb3Scarlsonj 
67*d04ccbb3Scarlsonj /*
68*d04ccbb3Scarlsonj  * Status Codes
69*d04ccbb3Scarlsonj  */
70*d04ccbb3Scarlsonj #define	DHCPV6_STAT_SUCCESS	0
71*d04ccbb3Scarlsonj #define	DHCPV6_STAT_UNSPECFAIL	1	/* Unknown reason */
72*d04ccbb3Scarlsonj #define	DHCPV6_STAT_NOADDRS	2	/* Server has no addresses available */
73*d04ccbb3Scarlsonj #define	DHCPV6_STAT_NOBINDING	3	/* Client record unavailable */
74*d04ccbb3Scarlsonj #define	DHCPV6_STAT_NOTONLINK	4	/* Prefix inappropriate for link */
75*d04ccbb3Scarlsonj #define	DHCPV6_STAT_USEMCAST	5	/* Client must use multicast */
76*d04ccbb3Scarlsonj #define	DHCPV6_STAT_NOPREFIX	6	/* No prefix available; RFC3633 */
77*d04ccbb3Scarlsonj 
78*d04ccbb3Scarlsonj /*
79*d04ccbb3Scarlsonj  * DHCP Unique Identifier (DUID) Types
80*d04ccbb3Scarlsonj  */
81*d04ccbb3Scarlsonj #define	DHCPV6_DUID_LLT		1	/* Link layer address plus time */
82*d04ccbb3Scarlsonj #define	DHCPV6_DUID_EN		2	/* Vendor assigned */
83*d04ccbb3Scarlsonj #define	DHCPV6_DUID_LL		3	/* Link layer address */
84*d04ccbb3Scarlsonj 
85*d04ccbb3Scarlsonj /*
86*d04ccbb3Scarlsonj  * DHCPv6 Option Codes
87*d04ccbb3Scarlsonj  * Note: options 10 and 35 are not assigned.
88*d04ccbb3Scarlsonj  */
89*d04ccbb3Scarlsonj #define	DHCPV6_OPT_CLIENTID	1	/* Client's DUID */
90*d04ccbb3Scarlsonj #define	DHCPV6_OPT_SERVERID	2	/* Server's DUID */
91*d04ccbb3Scarlsonj #define	DHCPV6_OPT_IA_NA	3	/* Non-temporary addrs; dhcpv6_ia_na */
92*d04ccbb3Scarlsonj #define	DHCPV6_OPT_IA_TA	4	/* Temporary addrs; dhcpv6_ia_ta */
93*d04ccbb3Scarlsonj #define	DHCPV6_OPT_IAADDR	5	/* IA Address; dhcpv6_iaaddr */
94*d04ccbb3Scarlsonj #define	DHCPV6_OPT_ORO		6	/* Option Request; uint16_t array */
95*d04ccbb3Scarlsonj #define	DHCPV6_OPT_PREFERENCE	7	/* Server preference; uint8_t */
96*d04ccbb3Scarlsonj #define	DHCPV6_OPT_ELAPSED_TIME	8	/* Client time; uint16_t; centisec */
97*d04ccbb3Scarlsonj #define	DHCPV6_OPT_RELAY_MSG	9	/* Relayed client DHCP message */
98*d04ccbb3Scarlsonj #define	DHCPV6_OPT_AUTH		11	/* Authentication; dhcpv6_auth */
99*d04ccbb3Scarlsonj #define	DHCPV6_OPT_UNICAST	12	/* Client may unicast; in6_addr_t */
100*d04ccbb3Scarlsonj #define	DHCPV6_OPT_STATUS_CODE	13	/* Status; uint16_t plus string */
101*d04ccbb3Scarlsonj #define	DHCPV6_OPT_RAPID_COMMIT	14	/* Server may do RC; boolean (len 0) */
102*d04ccbb3Scarlsonj #define	DHCPV6_OPT_USER_CLASS	15	/* Classes; {uint16_t,uint8_t...}... */
103*d04ccbb3Scarlsonj #define	DHCPV6_OPT_VENDOR_CLASS	16	/* Client vendor; uint32_t + list */
104*d04ccbb3Scarlsonj #define	DHCPV6_OPT_VENDOR_OPT	17	/* Vendor specific; uint32_t+opts */
105*d04ccbb3Scarlsonj #define	DHCPV6_OPT_INTERFACE_ID	18	/* Relay agent interface */
106*d04ccbb3Scarlsonj #define	DHCPV6_OPT_RECONF_MSG	19	/* Reconfigure; uint8_t */
107*d04ccbb3Scarlsonj #define	DHCPV6_OPT_RECONF_ACC	20	/* Reconfigure accept; boolean */
108*d04ccbb3Scarlsonj #define	DHCPV6_OPT_SIP_NAMES	21	/* SIP srv domain names (RFC3319) */
109*d04ccbb3Scarlsonj #define	DHCPV6_OPT_SIP_ADDR	22	/* SIP srv IPv6 address (RFC3319) */
110*d04ccbb3Scarlsonj #define	DHCPV6_OPT_DNS_ADDR	23	/* DNS Recur. Name Server (RFC3646) */
111*d04ccbb3Scarlsonj #define	DHCPV6_OPT_DNS_SEARCH	24	/* Domain Search List (RFC3646) */
112*d04ccbb3Scarlsonj #define	DHCPV6_OPT_IA_PD	25	/* Delegate dhcpv6_ia_na (RFC3633) */
113*d04ccbb3Scarlsonj #define	DHCPV6_OPT_IAPREFIX	26	/* Prefix dhcpv6_iaprefix (RFC3633) */
114*d04ccbb3Scarlsonj #define	DHCPV6_OPT_NIS_SERVERS	27	/* NIS in6_addr_t array (RFC3898) */
115*d04ccbb3Scarlsonj #define	DHCPV6_OPT_NISP_SERVERS	28	/* NIS+ in6_addr_t array (RFC3898) */
116*d04ccbb3Scarlsonj #define	DHCPV6_OPT_NIS_DOMAIN	29	/* NIS Domain string (RFC3898) */
117*d04ccbb3Scarlsonj #define	DHCPV6_OPT_NISP_DOMAIN	30	/* NIS+ Domain string (RFC3898) */
118*d04ccbb3Scarlsonj #define	DHCPV6_OPT_SNTP_SERVERS	31	/* SNTP in6_addr_t array (RFC4075) */
119*d04ccbb3Scarlsonj #define	DHCPV6_OPT_INFO_REFTIME	32	/* Info refresh uint32_t (RFC4242) */
120*d04ccbb3Scarlsonj #define	DHCPV6_OPT_BCMCS_SRV_D	33	/* NUL-term string list (RFC4280) */
121*d04ccbb3Scarlsonj #define	DHCPV6_OPT_BCMCS_SRV_A	34	/* in6_addr_t array (RFC4280) */
122*d04ccbb3Scarlsonj #define	DHCPV6_OPT_GEOCONF_CVC	36	/* dhcpv6_civic_t plus TLVs */
123*d04ccbb3Scarlsonj #define	DHCPV6_OPT_REMOTE_ID	37	/* uint32_t plus opaque */
124*d04ccbb3Scarlsonj #define	DHCPV6_OPT_SUBSCRIBER	38	/* opaque; may be NVT ASCII */
125*d04ccbb3Scarlsonj #define	DHCPV6_OPT_CLIENT_FQDN	39	/* uint8_t plus domain */
126*d04ccbb3Scarlsonj 
127*d04ccbb3Scarlsonj /*
128*d04ccbb3Scarlsonj  * Reconfiguration types; used with DHCPV6_OPT_RECONF_MSG option.
129*d04ccbb3Scarlsonj  */
130*d04ccbb3Scarlsonj #define	DHCPV6_RECONF_RENEW	5	/* Renew now */
131*d04ccbb3Scarlsonj #define	DHCPV6_RECONF_INFO	11	/* Request information */
132*d04ccbb3Scarlsonj 
133*d04ccbb3Scarlsonj /*
134*d04ccbb3Scarlsonj  * FQDN Flags; used with DHCPV6_OPT_CLIENT_FQDN option.
135*d04ccbb3Scarlsonj  */
136*d04ccbb3Scarlsonj #define	DHCPV6_FQDNF_S	0x01	/* Server should perform AAAA RR updates */
137*d04ccbb3Scarlsonj #define	DHCPV6_FQDNF_O	0x02	/* Server override of 'S' bit */
138*d04ccbb3Scarlsonj #define	DHCPV6_FQDNF_N	0x04	/* Server should not perform any updates */
139*d04ccbb3Scarlsonj 
140*d04ccbb3Scarlsonj /*
141*d04ccbb3Scarlsonj  * Miscellany
142*d04ccbb3Scarlsonj  */
143*d04ccbb3Scarlsonj #define	DHCPV6_INFTIME	0xfffffffful	/* Infinity; used for timers */
144*d04ccbb3Scarlsonj #define	DHCPV6_FOREVER	0xffff		/* Used for elapsed time option */
145*d04ccbb3Scarlsonj #define	DHCPV6_SUN_ENT	42		/* Sun Microsystems enterprise ID */
146*d04ccbb3Scarlsonj 
147*d04ccbb3Scarlsonj /*
148*d04ccbb3Scarlsonj  * Basic DHCPv6 message header used for server/client communications.  The
149*d04ccbb3Scarlsonj  * options follow this header.
150*d04ccbb3Scarlsonj  */
151*d04ccbb3Scarlsonj struct dhcpv6_message {
152*d04ccbb3Scarlsonj 	uint8_t		d6m_msg_type;
153*d04ccbb3Scarlsonj 	uint8_t		d6m_transid_ho;
154*d04ccbb3Scarlsonj 	uint16_t	d6m_transid_lo;
155*d04ccbb3Scarlsonj };
156*d04ccbb3Scarlsonj 
157*d04ccbb3Scarlsonj #define	DHCPV6_GET_TRANSID(msg) \
158*d04ccbb3Scarlsonj 	(((msg)->d6m_transid_ho << 16) + ntohs((msg)->d6m_transid_lo))
159*d04ccbb3Scarlsonj #define	DHCPV6_SET_TRANSID(msg, id) \
160*d04ccbb3Scarlsonj 	((msg)->d6m_transid_ho = (id) >> 16, (msg)->d6m_transid_lo = htons(id))
161*d04ccbb3Scarlsonj 
162*d04ccbb3Scarlsonj /*
163*d04ccbb3Scarlsonj  * DHCPv6 relay agent header used only for server/relay communications.  The
164*d04ccbb3Scarlsonj  * options follow this header, and the client message is encapsulated as an
165*d04ccbb3Scarlsonj  * option.  Note that the IPv6 addresses are not on natural word boundaries.
166*d04ccbb3Scarlsonj  */
167*d04ccbb3Scarlsonj struct dhcpv6_relay {
168*d04ccbb3Scarlsonj 	uint8_t		d6r_msg_type;
169*d04ccbb3Scarlsonj 	uint8_t		d6r_hop_count;
170*d04ccbb3Scarlsonj 	uint8_t		d6r_linkaddr[16];
171*d04ccbb3Scarlsonj 	uint8_t		d6r_peeraddr[16];
172*d04ccbb3Scarlsonj };
173*d04ccbb3Scarlsonj 
174*d04ccbb3Scarlsonj /*
175*d04ccbb3Scarlsonj  * DHCPv6 generic option header.  Note that options are not aligned on any
176*d04ccbb3Scarlsonj  * convenient boundary.
177*d04ccbb3Scarlsonj  */
178*d04ccbb3Scarlsonj struct dhcpv6_option {
179*d04ccbb3Scarlsonj 	uint16_t	d6o_code;
180*d04ccbb3Scarlsonj 	uint16_t	d6o_len;
181*d04ccbb3Scarlsonj };
182*d04ccbb3Scarlsonj 
183*d04ccbb3Scarlsonj /*
184*d04ccbb3Scarlsonj  * Option header for IA_NA (Non-temporary addresses) and IA_PD (Prefix
185*d04ccbb3Scarlsonj  * delegation).  Contains IA Address options for IA_NA, IA_PD Prefixes for
186*d04ccbb3Scarlsonj  * IA_PD.
187*d04ccbb3Scarlsonj  */
188*d04ccbb3Scarlsonj struct dhcpv6_ia_na {
189*d04ccbb3Scarlsonj 	uint16_t	d6in_code;
190*d04ccbb3Scarlsonj 	uint16_t	d6in_len;
191*d04ccbb3Scarlsonj 	uint32_t	d6in_iaid;	/* Unique ID [interface] */
192*d04ccbb3Scarlsonj 	uint32_t	d6in_t1;	/* Extend from same server */
193*d04ccbb3Scarlsonj 	uint32_t	d6in_t2;	/* Extend from any server */
194*d04ccbb3Scarlsonj };
195*d04ccbb3Scarlsonj 
196*d04ccbb3Scarlsonj /*
197*d04ccbb3Scarlsonj  * Option header for IA_TA (Temporary addresses).  Contains IA Address options.
198*d04ccbb3Scarlsonj  */
199*d04ccbb3Scarlsonj struct dhcpv6_ia_ta {
200*d04ccbb3Scarlsonj 	uint16_t	d6it_code;
201*d04ccbb3Scarlsonj 	uint16_t	d6it_len;
202*d04ccbb3Scarlsonj 	uint32_t	d6it_iaid;	/* Unique ID [interface] */
203*d04ccbb3Scarlsonj };
204*d04ccbb3Scarlsonj 
205*d04ccbb3Scarlsonj /*
206*d04ccbb3Scarlsonj  * Option header for IA Address.  Must be used inside of an IA_NA or IA_TA
207*d04ccbb3Scarlsonj  * option.  May contain a Status Code option.
208*d04ccbb3Scarlsonj  */
209*d04ccbb3Scarlsonj struct dhcpv6_iaaddr {
210*d04ccbb3Scarlsonj 	uint16_t	d6ia_code;
211*d04ccbb3Scarlsonj 	uint16_t	d6ia_len;
212*d04ccbb3Scarlsonj 	in6_addr_t	d6ia_addr;	/* IPv6 address */
213*d04ccbb3Scarlsonj 	uint32_t	d6ia_preflife;	/* Preferred lifetime */
214*d04ccbb3Scarlsonj 	uint32_t	d6ia_vallife;	/* Valid lifetime */
215*d04ccbb3Scarlsonj };
216*d04ccbb3Scarlsonj 
217*d04ccbb3Scarlsonj /*
218*d04ccbb3Scarlsonj  * Option header for Authentication.  Followed by variable-length
219*d04ccbb3Scarlsonj  * authentication information field.  Warning: padding may be present.  Use
220*d04ccbb3Scarlsonj  * defined size.
221*d04ccbb3Scarlsonj  */
222*d04ccbb3Scarlsonj struct dhcpv6_auth {
223*d04ccbb3Scarlsonj 	uint16_t	d6a_code;
224*d04ccbb3Scarlsonj 	uint16_t	d6a_len;
225*d04ccbb3Scarlsonj 	uint8_t		d6a_proto;	/* Protocol */
226*d04ccbb3Scarlsonj 	uint8_t		d6a_alg;	/* Algorithm */
227*d04ccbb3Scarlsonj 	uint8_t		d6a_rdm;	/* Replay Detection Method (RDM) */
228*d04ccbb3Scarlsonj 	uint8_t		d6a_replay[8];	/* Information for RDM */
229*d04ccbb3Scarlsonj };
230*d04ccbb3Scarlsonj #define	DHCPV6_AUTH_SIZE	15
231*d04ccbb3Scarlsonj 
232*d04ccbb3Scarlsonj /* dhpv6_auth.d6a_proto values */
233*d04ccbb3Scarlsonj #define	DHCPV6_PROTO_DELAYED	2	/* Delayed Authentication mechanism */
234*d04ccbb3Scarlsonj #define	DHCPV6_PROTO_RECONFIG	3	/* Reconfigure Key mechanism */
235*d04ccbb3Scarlsonj 
236*d04ccbb3Scarlsonj /* dhpv6_auth.d6a_alg values */
237*d04ccbb3Scarlsonj #define	DHCPV6_ALG_HMAC_MD5	1	/* HMAC-MD5 signature */
238*d04ccbb3Scarlsonj 
239*d04ccbb3Scarlsonj /* dhpv6_auth.d6a_rdm values */
240*d04ccbb3Scarlsonj #define	DHCPV6_RDM_MONOCNT	0	/* Monotonic counter */
241*d04ccbb3Scarlsonj 
242*d04ccbb3Scarlsonj /*
243*d04ccbb3Scarlsonj  * Option header for IA_PD Prefix.  Must be used inside of an IA_PD option.
244*d04ccbb3Scarlsonj  * May contain a Status Code option.  Warning: padding may be present; use
245*d04ccbb3Scarlsonj  * defined size.
246*d04ccbb3Scarlsonj  */
247*d04ccbb3Scarlsonj struct dhcpv6_iaprefix {
248*d04ccbb3Scarlsonj 	uint16_t	d6ip_code;
249*d04ccbb3Scarlsonj 	uint16_t	d6ip_len;
250*d04ccbb3Scarlsonj 	uint32_t	d6ip_preflife;	/* Preferred lifetime */
251*d04ccbb3Scarlsonj 	uint32_t	d6ip_vallife;	/* Valid lifetime */
252*d04ccbb3Scarlsonj 	uint8_t		d6ip_preflen;	/* Prefix length */
253*d04ccbb3Scarlsonj 	uint8_t		d6ip_addr[16];	/* IPv6 prefix */
254*d04ccbb3Scarlsonj };
255*d04ccbb3Scarlsonj #define	DHCPV6_IAPREFIX_SIZE	29
256*d04ccbb3Scarlsonj 
257*d04ccbb3Scarlsonj /*
258*d04ccbb3Scarlsonj  * Option header for Civic Address information.  Followed by single octet TLV
259*d04ccbb3Scarlsonj  * encoded address elements, using CIVICADDR_* values for type.  Warning:
260*d04ccbb3Scarlsonj  * padding may be present; use defined size.
261*d04ccbb3Scarlsonj  */
262*d04ccbb3Scarlsonj struct dhcpv6_civic {
263*d04ccbb3Scarlsonj 	uint16_t	d6c_code;
264*d04ccbb3Scarlsonj 	uint16_t	d6c_len;
265*d04ccbb3Scarlsonj 	uint8_t		d6c_what;	/* DHCPV6_CWHAT_* value */
266*d04ccbb3Scarlsonj 	char		d6c_cc[2];		/* Country code; ISO 3166 */
267*d04ccbb3Scarlsonj };
268*d04ccbb3Scarlsonj #define	DHCPV6_CIVIC_SIZE	7
269*d04ccbb3Scarlsonj 
270*d04ccbb3Scarlsonj #define	DHCPV6_CWHAT_SERVER	0	/* Location of server */
271*d04ccbb3Scarlsonj #define	DHCPV6_CWHAT_NETWORK	1	/* Location of network */
272*d04ccbb3Scarlsonj #define	DHCPV6_CWHAT_CLIENT	2	/* Location of client */
273*d04ccbb3Scarlsonj 
274*d04ccbb3Scarlsonj #define	CIVICADDR_LANG	0	/* Language; RFC 2277 */
275*d04ccbb3Scarlsonj #define	CIVICADDR_A1	1	/* National division (state) */
276*d04ccbb3Scarlsonj #define	CIVICADDR_A2	2	/* County */
277*d04ccbb3Scarlsonj #define	CIVICADDR_A3	3	/* City */
278*d04ccbb3Scarlsonj #define	CIVICADDR_A4	4	/* City division */
279*d04ccbb3Scarlsonj #define	CIVICADDR_A5	5	/* Neighborhood */
280*d04ccbb3Scarlsonj #define	CIVICADDR_A6	6	/* Street group */
281*d04ccbb3Scarlsonj #define	CIVICADDR_PRD	16	/* Leading street direction */
282*d04ccbb3Scarlsonj #define	CIVICADDR_POD	17	/* Trailing street suffix */
283*d04ccbb3Scarlsonj #define	CIVICADDR_STS	18	/* Street suffix or type */
284*d04ccbb3Scarlsonj #define	CIVICADDR_HNO	19	/* House number */
285*d04ccbb3Scarlsonj #define	CIVICADDR_HNS	20	/* House number suffix */
286*d04ccbb3Scarlsonj #define	CIVICADDR_LMK	21	/* Landmark */
287*d04ccbb3Scarlsonj #define	CIVICADDR_LOC	22	/* Additional location information */
288*d04ccbb3Scarlsonj #define	CIVICADDR_NAM	23	/* Name/occupant */
289*d04ccbb3Scarlsonj #define	CIVICADDR_PC	24	/* Postal Code/ZIP */
290*d04ccbb3Scarlsonj #define	CIVICADDR_BLD	25	/* Building */
291*d04ccbb3Scarlsonj #define	CIVICADDR_UNIT	26	/* Unit/apt/suite */
292*d04ccbb3Scarlsonj #define	CIVICADDR_FLR	27	/* Floor */
293*d04ccbb3Scarlsonj #define	CIVICADDR_ROOM	28	/* Room number */
294*d04ccbb3Scarlsonj #define	CIVICADDR_TYPE	29	/* Place type */
295*d04ccbb3Scarlsonj #define	CIVICADDR_PCN	30	/* Postal community name */
296*d04ccbb3Scarlsonj #define	CIVICADDR_POBOX	31	/* Post office box */
297*d04ccbb3Scarlsonj #define	CIVICADDR_ADDL	32	/* Additional code */
298*d04ccbb3Scarlsonj #define	CIVICADDR_SEAT	33	/* Seat/desk */
299*d04ccbb3Scarlsonj #define	CIVICADDR_ROAD	34	/* Primary road or street */
300*d04ccbb3Scarlsonj #define	CIVICADDR_RSEC	35	/* Road section */
301*d04ccbb3Scarlsonj #define	CIVICADDR_RBRA	36	/* Road branch */
302*d04ccbb3Scarlsonj #define	CIVICADDR_RSBR	37	/* Road sub-branch */
303*d04ccbb3Scarlsonj #define	CIVICADDR_SPRE	38	/* Street name pre-modifier */
304*d04ccbb3Scarlsonj #define	CIVICADDR_SPOST	39	/* Street name post-modifier */
305*d04ccbb3Scarlsonj #define	CIVICADDR_SCRIPT 128	/* Script */
306*d04ccbb3Scarlsonj 
307*d04ccbb3Scarlsonj /*
308*d04ccbb3Scarlsonj  * DHCP Unique Identifier structures.  These represent the fixed portion of the
309*d04ccbb3Scarlsonj  * unique identifier object, and are followed by the variable-length link layer
310*d04ccbb3Scarlsonj  * address or identifier.
311*d04ccbb3Scarlsonj  */
312*d04ccbb3Scarlsonj struct duid_llt {
313*d04ccbb3Scarlsonj 	uint16_t	dllt_dutype;
314*d04ccbb3Scarlsonj 	uint16_t	dllt_hwtype;
315*d04ccbb3Scarlsonj 	uint32_t	dllt_time;
316*d04ccbb3Scarlsonj };
317*d04ccbb3Scarlsonj 
318*d04ccbb3Scarlsonj /* DUID time stamps start on January 1st, 2000 UTC */
319*d04ccbb3Scarlsonj #define	DUID_TIME_BASE	946684800ul
320*d04ccbb3Scarlsonj 
321*d04ccbb3Scarlsonj struct duid_en {
322*d04ccbb3Scarlsonj 	uint16_t	den_dutype;
323*d04ccbb3Scarlsonj 	uint16_t	den_entho;
324*d04ccbb3Scarlsonj 	uint16_t	den_entlo;
325*d04ccbb3Scarlsonj };
326*d04ccbb3Scarlsonj 
327*d04ccbb3Scarlsonj #define	DHCPV6_GET_ENTNUM(den) \
328*d04ccbb3Scarlsonj 	((ntohs((den)->den_entho) << 16) + ntohs((den)->den_entlo))
329*d04ccbb3Scarlsonj #define	DHCPV6_SET_ENTNUM(den, val) \
330*d04ccbb3Scarlsonj 	((den)->den_entho = htons((val) >> 16), (den)->den_entlo = htons(val))
331*d04ccbb3Scarlsonj 
332*d04ccbb3Scarlsonj struct duid_ll {
333*d04ccbb3Scarlsonj 	uint16_t	dll_dutype;
334*d04ccbb3Scarlsonj 	uint16_t	dll_hwtype;
335*d04ccbb3Scarlsonj };
336*d04ccbb3Scarlsonj 
337*d04ccbb3Scarlsonj /*
338*d04ccbb3Scarlsonj  * Data types
339*d04ccbb3Scarlsonj  */
340*d04ccbb3Scarlsonj typedef	struct dhcpv6_message	dhcpv6_message_t;
341*d04ccbb3Scarlsonj typedef	struct dhcpv6_relay	dhcpv6_relay_t;
342*d04ccbb3Scarlsonj typedef	struct dhcpv6_option	dhcpv6_option_t;
343*d04ccbb3Scarlsonj typedef	struct dhcpv6_ia_na	dhcpv6_ia_na_t;
344*d04ccbb3Scarlsonj typedef	struct dhcpv6_ia_ta	dhcpv6_ia_ta_t;
345*d04ccbb3Scarlsonj typedef	struct dhcpv6_iaaddr	dhcpv6_iaaddr_t;
346*d04ccbb3Scarlsonj typedef	struct dhcpv6_auth	dhcpv6_auth_t;
347*d04ccbb3Scarlsonj typedef	struct dhcpv6_iaprefix	dhcpv6_iaprefix_t;
348*d04ccbb3Scarlsonj typedef struct dhcpv6_civic	dhcpv6_civic_t;
349*d04ccbb3Scarlsonj typedef	struct duid_llt		duid_llt_t;
350*d04ccbb3Scarlsonj typedef	struct duid_en		duid_en_t;
351*d04ccbb3Scarlsonj typedef	struct duid_ll		duid_ll_t;
352*d04ccbb3Scarlsonj 
353*d04ccbb3Scarlsonj #ifdef __cplusplus
354*d04ccbb3Scarlsonj }
355*d04ccbb3Scarlsonj #endif
356*d04ccbb3Scarlsonj 
357*d04ccbb3Scarlsonj #endif /* _DHCP6_H */
358