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