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