d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * CDDL HEADER START
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj *
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * The contents of this file are subject to the terms of the
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Common Development and Distribution License (the "License").
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * You may not use this file except in compliance with the License.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj *
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * or http://www.opensolaris.org/os/licensing.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * See the License for the specific language governing permissions
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * and limitations under the License.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj *
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * When distributing Covered Code, include this CDDL HEADER in each
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * If applicable, add the following below this CDDL HEADER, with the
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * fields enclosed by brackets "[]" replaced with your own identifying
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * information: Portions Copyright [yyyy] [name of copyright owner]
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj *
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * CDDL HEADER END
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
36e852a172cba914383d7341c988128b2c667fbdRaja Andra * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Use is subject to license terms.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#ifndef _DHCP6_H
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define _DHCP6_H
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * This header file describes constants and on-the-wire data structures used
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * with DHCPv6.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj *
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Note that the data structures contained here must be used with caution. The
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * DHCPv6 protocol generally does not maintain alignment.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj *
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * (Users may also need to include other header files to get ntohs/htons
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * definitions, if the DHCPV6_{GET,SET} macros are used.)
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#ifdef __cplusplus
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjextern "C" {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#endif
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#include <sys/types.h>
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#include <netinet/in.h>
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Message Types
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_SOLICIT 1 /* Client sends */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_ADVERTISE 2 /* Server sends */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_REQUEST 3 /* Client sends */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_CONFIRM 4 /* Client sends */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_RENEW 5 /* Client sends */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_REBIND 6 /* Client sends */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_REPLY 7 /* Server sends */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_RELEASE 8 /* Client sends */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_DECLINE 9 /* Client sends */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_RECONFIGURE 10 /* Server sends */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_INFO_REQ 11 /* Client sends */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_RELAY_FORW 12 /* Relay agent sends to server */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_MSG_RELAY_REPL 13 /* Server sends to relay agent */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Status Codes
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_STAT_SUCCESS 0
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_STAT_UNSPECFAIL 1 /* Unknown reason */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_STAT_NOADDRS 2 /* Server has no addresses available */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_STAT_NOBINDING 3 /* Client record unavailable */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_STAT_NOTONLINK 4 /* Prefix inappropriate for link */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_STAT_USEMCAST 5 /* Client must use multicast */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_STAT_NOPREFIX 6 /* No prefix available; RFC3633 */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * DHCP Unique Identifier (DUID) Types
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_DUID_LLT 1 /* Link layer address plus time */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_DUID_EN 2 /* Vendor assigned */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_DUID_LL 3 /* Link layer address */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * DHCPv6 Option Codes
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Note: options 10 and 35 are not assigned.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_CLIENTID 1 /* Client's DUID */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_SERVERID 2 /* Server's DUID */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_IA_NA 3 /* Non-temporary addrs; dhcpv6_ia_na */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_IA_TA 4 /* Temporary addrs; dhcpv6_ia_ta */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_IAADDR 5 /* IA Address; dhcpv6_iaaddr */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_ORO 6 /* Option Request; uint16_t array */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_PREFERENCE 7 /* Server preference; uint8_t */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_ELAPSED_TIME 8 /* Client time; uint16_t; centisec */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_RELAY_MSG 9 /* Relayed client DHCP message */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_AUTH 11 /* Authentication; dhcpv6_auth */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_UNICAST 12 /* Client may unicast; in6_addr_t */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_STATUS_CODE 13 /* Status; uint16_t plus string */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_RAPID_COMMIT 14 /* Server may do RC; boolean (len 0) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_USER_CLASS 15 /* Classes; {uint16_t,uint8_t...}... */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_VENDOR_CLASS 16 /* Client vendor; uint32_t + list */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_VENDOR_OPT 17 /* Vendor specific; uint32_t+opts */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_INTERFACE_ID 18 /* Relay agent interface */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_RECONF_MSG 19 /* Reconfigure; uint8_t */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_RECONF_ACC 20 /* Reconfigure accept; boolean */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_SIP_NAMES 21 /* SIP srv domain names (RFC3319) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_SIP_ADDR 22 /* SIP srv IPv6 address (RFC3319) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_DNS_ADDR 23 /* DNS Recur. Name Server (RFC3646) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_DNS_SEARCH 24 /* Domain Search List (RFC3646) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_IA_PD 25 /* Delegate dhcpv6_ia_na (RFC3633) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_IAPREFIX 26 /* Prefix dhcpv6_iaprefix (RFC3633) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_NIS_SERVERS 27 /* NIS in6_addr_t array (RFC3898) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_NIS_DOMAIN 29 /* NIS Domain string (RFC3898) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_SNTP_SERVERS 31 /* SNTP in6_addr_t array (RFC4075) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_INFO_REFTIME 32 /* Info refresh uint32_t (RFC4242) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_BCMCS_SRV_D 33 /* NUL-term string list (RFC4280) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_BCMCS_SRV_A 34 /* in6_addr_t array (RFC4280) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_GEOCONF_CVC 36 /* dhcpv6_civic_t plus TLVs */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_REMOTE_ID 37 /* uint32_t plus opaque */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_SUBSCRIBER 38 /* opaque; may be NVT ASCII */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_OPT_CLIENT_FQDN 39 /* uint8_t plus domain */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Reconfiguration types; used with DHCPV6_OPT_RECONF_MSG option.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_RECONF_RENEW 5 /* Renew now */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_RECONF_INFO 11 /* Request information */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * FQDN Flags; used with DHCPV6_OPT_CLIENT_FQDN option.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_FQDNF_S 0x01 /* Server should perform AAAA RR updates */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_FQDNF_O 0x02 /* Server override of 'S' bit */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_FQDNF_N 0x04 /* Server should not perform any updates */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Miscellany
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_INFTIME 0xfffffffful /* Infinity; used for timers */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_FOREVER 0xffff /* Used for elapsed time option */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_SUN_ENT 42 /* Sun Microsystems enterprise ID */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Basic DHCPv6 message header used for server/client communications. The
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * options follow this header.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjstruct dhcpv6_message {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6m_msg_type;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6m_transid_ho;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6m_transid_lo;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj};
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_GET_TRANSID(msg) \
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj (((msg)->d6m_transid_ho << 16) + ntohs((msg)->d6m_transid_lo))
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_SET_TRANSID(msg, id) \
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj ((msg)->d6m_transid_ho = (id) >> 16, (msg)->d6m_transid_lo = htons(id))
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * DHCPv6 relay agent header used only for server/relay communications. The
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * options follow this header, and the client message is encapsulated as an
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * option. Note that the IPv6 addresses are not on natural word boundaries.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjstruct dhcpv6_relay {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6r_msg_type;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6r_hop_count;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6r_linkaddr[16];
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6r_peeraddr[16];
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj};
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * DHCPv6 generic option header. Note that options are not aligned on any
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * convenient boundary.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjstruct dhcpv6_option {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6o_code;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6o_len;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj};
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Option header for IA_NA (Non-temporary addresses) and IA_PD (Prefix
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * delegation). Contains IA Address options for IA_NA, IA_PD Prefixes for
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * IA_PD.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjstruct dhcpv6_ia_na {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6in_code;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6in_len;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint32_t d6in_iaid; /* Unique ID [interface] */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint32_t d6in_t1; /* Extend from same server */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint32_t d6in_t2; /* Extend from any server */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj};
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Option header for IA_TA (Temporary addresses). Contains IA Address options.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjstruct dhcpv6_ia_ta {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6it_code;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6it_len;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint32_t d6it_iaid; /* Unique ID [interface] */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj};
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Option header for IA Address. Must be used inside of an IA_NA or IA_TA
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * option. May contain a Status Code option.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjstruct dhcpv6_iaaddr {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6ia_code;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6ia_len;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj in6_addr_t d6ia_addr; /* IPv6 address */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint32_t d6ia_preflife; /* Preferred lifetime */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint32_t d6ia_vallife; /* Valid lifetime */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj};
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Option header for Authentication. Followed by variable-length
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * authentication information field. Warning: padding may be present. Use
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * defined size.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjstruct dhcpv6_auth {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6a_code;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6a_len;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6a_proto; /* Protocol */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6a_alg; /* Algorithm */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6a_rdm; /* Replay Detection Method (RDM) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6a_replay[8]; /* Information for RDM */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj};
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_AUTH_SIZE 15
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/* dhpv6_auth.d6a_proto values */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_PROTO_DELAYED 2 /* Delayed Authentication mechanism */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_PROTO_RECONFIG 3 /* Reconfigure Key mechanism */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/* dhpv6_auth.d6a_alg values */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_ALG_HMAC_MD5 1 /* HMAC-MD5 signature */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/* dhpv6_auth.d6a_rdm values */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_RDM_MONOCNT 0 /* Monotonic counter */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Option header for IA_PD Prefix. Must be used inside of an IA_PD option.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * May contain a Status Code option. Warning: padding may be present; use
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * defined size.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjstruct dhcpv6_iaprefix {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6ip_code;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6ip_len;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint32_t d6ip_preflife; /* Preferred lifetime */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint32_t d6ip_vallife; /* Valid lifetime */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6ip_preflen; /* Prefix length */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6ip_addr[16]; /* IPv6 prefix */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj};
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_IAPREFIX_SIZE 29
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Option header for Civic Address information. Followed by single octet TLV
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * encoded address elements, using CIVICADDR_* values for type. Warning:
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * padding may be present; use defined size.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjstruct dhcpv6_civic {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6c_code;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t d6c_len;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint8_t d6c_what; /* DHCPV6_CWHAT_* value */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj char d6c_cc[2]; /* Country code; ISO 3166 */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj};
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_CIVIC_SIZE 7
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_CWHAT_SERVER 0 /* Location of server */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_CWHAT_NETWORK 1 /* Location of network */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_CWHAT_CLIENT 2 /* Location of client */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_LANG 0 /* Language; RFC 2277 */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_A1 1 /* National division (state) */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_A2 2 /* County */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_A3 3 /* City */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_A4 4 /* City division */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_A5 5 /* Neighborhood */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_A6 6 /* Street group */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_PRD 16 /* Leading street direction */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_POD 17 /* Trailing street suffix */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_STS 18 /* Street suffix or type */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_HNO 19 /* House number */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_HNS 20 /* House number suffix */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_LMK 21 /* Landmark */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_LOC 22 /* Additional location information */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_NAM 23 /* Name/occupant */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_PC 24 /* Postal Code/ZIP */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_BLD 25 /* Building */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_UNIT 26 /* Unit/apt/suite */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_FLR 27 /* Floor */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_ROOM 28 /* Room number */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_TYPE 29 /* Place type */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_PCN 30 /* Postal community name */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_POBOX 31 /* Post office box */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_ADDL 32 /* Additional code */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_SEAT 33 /* Seat/desk */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_ROAD 34 /* Primary road or street */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_RSEC 35 /* Road section */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_RBRA 36 /* Road branch */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_RSBR 37 /* Road sub-branch */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_SPRE 38 /* Street name pre-modifier */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_SPOST 39 /* Street name post-modifier */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define CIVICADDR_SCRIPT 128 /* Script */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * DHCP Unique Identifier structures. These represent the fixed portion of the
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * unique identifier object, and are followed by the variable-length link layer
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * address or identifier.
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjstruct duid_llt {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t dllt_dutype;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t dllt_hwtype;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint32_t dllt_time;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj};
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/* DUID time stamps start on January 1st, 2000 UTC */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DUID_TIME_BASE 946684800ul
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjstruct duid_en {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t den_dutype;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t den_entho;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t den_entlo;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj};
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_GET_ENTNUM(den) \
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj ((ntohs((den)->den_entho) << 16) + ntohs((den)->den_entlo))
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#define DHCPV6_SET_ENTNUM(den, val) \
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj ((den)->den_entho = htons((val) >> 16), (den)->den_entlo = htons(val))
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjstruct duid_ll {
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t dll_dutype;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj uint16_t dll_hwtype;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj};
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj/*
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj * Data types
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj */
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjtypedef struct dhcpv6_message dhcpv6_message_t;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjtypedef struct dhcpv6_relay dhcpv6_relay_t;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjtypedef struct dhcpv6_option dhcpv6_option_t;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjtypedef struct dhcpv6_ia_na dhcpv6_ia_na_t;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjtypedef struct dhcpv6_ia_ta dhcpv6_ia_ta_t;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjtypedef struct dhcpv6_iaaddr dhcpv6_iaaddr_t;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjtypedef struct dhcpv6_auth dhcpv6_auth_t;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjtypedef struct dhcpv6_iaprefix dhcpv6_iaprefix_t;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjtypedef struct dhcpv6_civic dhcpv6_civic_t;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjtypedef struct duid_llt duid_llt_t;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjtypedef struct duid_en duid_en_t;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonjtypedef struct duid_ll duid_ll_t;
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#ifdef __cplusplus
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj}
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#endif
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj
d04ccbb3f3163ae5962a8b7465d9796bff6ca434carlsonj#endif /* _DHCP6_H */