david/ipxe
david
/
ipxe
Archived
1
0
Fork 0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/include/ipxe/dhcpv6.h

282 lines
6.9 KiB
C

#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 */