123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- #ifndef _IPXE_DHCPV6_H
- #define _IPXE_DHCPV6_H
-
- /** @file
- *
- * Dynamic Host Configuration Protocol for IPv6
- *
- */
-
- FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
-
- #include <stdint.h>
- #include <ipxe/in.h>
- #include <ipxe/uuid.h>
-
- /** 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 */
|