#ifndef _IPXE_DHCPV6_H #define _IPXE_DHCPV6_H /** @file * * Dynamic Host Configuration Protocol for IPv6 * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include /** DHCPv6 server port */ #define DHCPV6_SERVER_PORT 547 /** DHCPv6 client port */ #define DHCPV6_CLIENT_PORT 546 /** * A DHCPv6 option * */ struct dhcpv6_option { /** Code */ uint16_t code; /** Length of the data field */ uint16_t len; /** Data */ uint8_t data[0]; } __attribute__ (( packed )); /** DHCP unique identifier based on UUID (DUID-UUID) */ struct dhcpv6_duid_uuid { /** Type */ uint16_t type; /** UUID */ union uuid uuid; } __attribute__ (( packed )); /** DHCP unique identifier based on UUID (DUID-UUID) */ #define DHCPV6_DUID_UUID 4 /** DHCPv6 client or server identifier option */ struct dhcpv6_duid_option { /** Option header */ struct dhcpv6_option header; /** DHCP unique identifier (DUID) */ uint8_t duid[0]; } __attribute__ (( packed )); /** DHCPv6 client identifier option */ #define DHCPV6_CLIENT_ID 1 /** DHCPv6 server identifier option */ #define DHCPV6_SERVER_ID 2 /** DHCPv6 identity association for non-temporary address (IA_NA) option */ struct dhcpv6_ia_na_option { /** Option header */ struct dhcpv6_option header; /** Identity association identifier (IAID) */ uint32_t iaid; /** Renew time (in seconds) */ uint32_t renew; /** Rebind time (in seconds) */ uint32_t rebind; /** IA_NA options */ struct dhcpv6_option options[0]; } __attribute__ (( packed )); /** DHCPv6 identity association for non-temporary address (IA_NA) option */ #define DHCPV6_IA_NA 3 /** DHCPv6 identity association address (IAADDR) option */ struct dhcpv6_iaaddr_option { /** Option header */ struct dhcpv6_option header; /** IPv6 address */ struct in6_addr address; /** Preferred lifetime (in seconds) */ uint32_t preferred; /** Valid lifetime (in seconds) */ uint32_t valid; /** IAADDR options */ struct dhcpv6_option options[0]; } __attribute__ (( packed )); /** DHCPv6 identity association address (IAADDR) option */ #define DHCPV6_IAADDR 5 /** DHCPv6 option request option */ struct dhcpv6_option_request_option { /** Option header */ struct dhcpv6_option header; /** Requested options */ uint16_t requested[0]; } __attribute__ (( packed )); /** DHCPv6 option request option */ #define DHCPV6_OPTION_REQUEST 6 /** DHCPv6 elapsed time option */ struct dhcpv6_elapsed_time_option { /** Option header */ struct dhcpv6_option header; /** Elapsed time, in centiseconds */ uint16_t elapsed; } __attribute__ (( packed )); /** DHCPv6 elapsed time option */ #define DHCPV6_ELAPSED_TIME 8 /** DHCPv6 status code option */ struct dhcpv6_status_code_option { /** Option header */ struct dhcpv6_option header; /** Status code */ uint16_t status; /** Status message */ char message[0]; } __attribute__ (( packed )); /** DHCPv6 status code option */ #define DHCPV6_STATUS_CODE 13 /** DHCPv6 user class */ struct dhcpv6_user_class { /** Length */ uint16_t len; /** User class string */ char string[0]; } __attribute__ (( packed )); /** DHCPv6 user class option */ struct dhcpv6_user_class_option { /** Option header */ struct dhcpv6_option header; /** User class */ struct dhcpv6_user_class user_class[0]; } __attribute__ (( packed )); /** DHCPv6 user class option */ #define DHCPV6_USER_CLASS 15 /** DHCPv6 vendor class option */ #define DHCPV6_VENDOR_CLASS 16 /** DHCPv6 PXE vendor class * * The DHCPv6 vendor class includes a field for an IANA enterprise * number. The EDK2 codebase uses the value 343, with the comment: * * TODO: IANA TBD: temporarily using Intel's * * Since this "temporarily" has applied since at least 2010, we assume * that it has become a de facto standard. */ #define DHCPV6_VENDOR_CLASS_PXE 343 /** DHCPv6 DNS recursive name server option */ #define DHCPV6_DNS_SERVERS 23 /** DHCPv6 domain search list option */ #define DHCPV6_DOMAIN_LIST 24 /** DHCPv6 bootfile URI option */ #define DHCPV6_BOOTFILE_URL 59 /** DHCPv6 bootfile parameters option */ #define DHCPV6_BOOTFILE_PARAM 60 /** DHCPv6 client system architecture option */ #define DHCPV6_CLIENT_ARCHITECTURE 61 /** DHCPv6 client network interface identifier option */ #define DHCPV6_CLIENT_NDI 62 /** DHCPv6 syslog server option * * This option code has not yet been assigned by IANA. Please update * this definition once an option code has been assigned. */ #define DHCPV6_LOG_SERVERS 0xffffffffUL /** Construct a DHCPv6 byte value */ #define DHCPV6_BYTE_VALUE( value ) ( (value) & 0xff ) /** Construct a DHCPv6 word value */ #define DHCPV6_WORD_VALUE( value ) \ DHCPV6_BYTE_VALUE ( (value) >> 8 ), DHCPV6_BYTE_VALUE ( (value) >> 0 ) /** Construct a DHCPv6 dword value */ #define DHCPV6_DWORD_VALUE( value ) \ DHCPV6_WORD_VALUE ( (value) >> 16 ), DHCPV6_WORD_VALUE ( (value) >> 0 ) /** Construct a DHCPv6 option code */ #define DHCPV6_CODE( code ) DHCPV6_WORD_VALUE ( code ) /** Construct a DHCPv6 option length */ #define DHCPV6_LEN( len ) DHCPV6_WORD_VALUE ( len ) /** Construct a DHCPv6 option from a list of bytes */ #define DHCPV6_OPTION( ... ) \ DHCPV6_LEN ( VA_ARG_COUNT ( __VA_ARGS__ ) ), __VA_ARGS__ /** Construct a DHCPv6 option from a list of characters */ #define DHCPV6_STRING( ... ) DHCPV6_OPTION ( __VA_ARGS__ ) /** Construct a byte-valued DHCPv6 option */ #define DHCPV6_BYTE( value ) DHCPV6_OPTION ( DHCPV6_BYTE_VALUE ( value ) ) /** Construct a word-valued DHCPv6 option */ #define DHCPV6_WORD( value ) DHCPV6_OPTION ( DHCPV6_WORD_VALUE ( value ) ) /** Construct a dword-valued DHCPv6 option */ #define DHCPV6_DWORD( value ) DHCPV6_OPTION ( DHCPV6_DWORD_VALUE ( value ) ) /** * Any DHCPv6 option * */ union dhcpv6_any_option { struct dhcpv6_option header; struct dhcpv6_duid_option duid; struct dhcpv6_ia_na_option ia_na; struct dhcpv6_iaaddr_option iaaddr; struct dhcpv6_option_request_option option_request; struct dhcpv6_elapsed_time_option elapsed_time; struct dhcpv6_status_code_option status_code; struct dhcpv6_user_class_option user_class; }; /** * A DHCPv6 header * */ struct dhcpv6_header { /** Message type */ uint8_t type; /** Transaction ID */ uint8_t xid[3]; /** Options */ struct dhcpv6_option options[0]; } __attribute__ (( packed )); /** DHCPv6 solicitation */ #define DHCPV6_SOLICIT 1 /** DHCPv6 advertisement */ #define DHCPV6_ADVERTISE 2 /** DHCPv6 request */ #define DHCPV6_REQUEST 3 /** DHCPv6 reply */ #define DHCPV6_REPLY 7 /** DHCPv6 information request */ #define DHCPV6_INFORMATION_REQUEST 11 /** DHCPv6 settings block name */ #define DHCPV6_SETTINGS_NAME "dhcpv6" /** * Construct all-DHCP-relay-agents-and-servers multicast address * * @v addr Zeroed address to construct */ static inline void ipv6_all_dhcp_relay_and_servers ( struct in6_addr *addr ) { addr->s6_addr16[0] = htons ( 0xff02 ); addr->s6_addr[13] = 1; addr->s6_addr[15] = 2; } extern int start_dhcpv6 ( struct interface *job, struct net_device *netdev, int stateful ); #endif /* _IPXE_DHCPV6_H */