#ifndef __DHCP6DXE_H__
#define __DHCP6DXE_H__
#include "Uefi.h"
/*============================================================================
* Dhcp6Dxe - DHCPv6 DXE Driver
* Source files:
* Dhcp6Driver.c - Driver binding, entry point, Start/Stop
* Dhcp6Impl.c - EFI_DHCP6_PROTOCOL implementation (Solicit/Request/Renew/Decline/Release)
* Dhcp6Io.c - DHCPv6 network I/O (packet TX/RX, retransmission, state machine)
* Dhcp6Utility.c - DHCP option encoding/decoding helpers
* External:
* DxeUdpIoLib.c - UdpIo wrapper (UDP TX/RX)
* DxeNetLib - NetBuffer, CopyMem, ZeroMem, etc.
* DxeIpIoLib - IpIo wrapper (IP-level I/O)
*============================================================================*/
/*============================================================================
* Protocol GUIDs
*============================================================================*/
#define DHCP6_SERVICE_SIGNATURE 0x49506455 /* 'UdpI' -- UdpIo wrapper instance */
#define DHCP6_INSTANCE_SIGNATURE 0x53706455 /* 'UdpS' -- Udp6 service instance */
/* EFI DHCP6 Protocol (AMI) */
#define EFI_DHCP6_PROTOCOL_GUID {0x8f3c7a8b,0xc884,0x4e3b,\
{0x9e,0x7e,0x5c,0x7b,0x4c,0x7b,0x4c,0x7b}}
/*============================================================================
* DHCPv6 Message Types
*============================================================================*/
#define DHCP6_MSG_SOLICIT 1
#define DHCP6_MSG_ADVERTISE 2
#define DHCP6_MSG_REQUEST 3
#define DHCP6_MSG_CONFIRM 4
#define DHCP6_MSG_RENEW 5
#define DHCP6_MSG_REBIND 6
#define DHCP6_MSG_REPLY 7
#define DHCP6_MSG_RELEASE 8
#define DHCP6_MSG_DECLINE 9
#define DHCP6_MSG_RECONFIGURE 10
#define DHCP6_MSG_INFORMATION_REQ 11
#define DHCP6_MSG_RELAY_FORWARD 12
#define DHCP6_MSG_RELAY_REPLY 13
/*============================================================================
* DHCPv6 Option Codes
*============================================================================*/
#define DHCP6_OPT_CLIENTID 1
#define DHCP6_OPT_SERVERID 2
#define DHCP6_OPT_IA_NA 3
#define DHCP6_OPT_IA_TA 4
#define DHCP6_OPT_IAADDR 5
#define DHCP6_OPT_ORO 6
#define DHCP6_OPT_PREFERENCE 7
#define DHCP6_OPT_ELAPSED_TIME 8
#define DHCP6_OPT_RELAY_MSG 9
#define DHCP6_OPT_AUTH 11
#define DHCP6_OPT_UNICAST 12
#define DHCP6_OPT_STATUS_CODE 13
#define DHCP6_OPT_RAPID_COMMIT 14
/*============================================================================
* DHCPv6 Status Codes (RFC 3315)
*============================================================================*/
#define DHCP6_STATUS_SUCCESS 0
#define DHCP6_STATUS_UNSPEC 1
#define DHCP6_STATUS_NOADDRS 2
#define DHCP6_STATUS_NOBINDING 3
#define DHCP6_STATUS_INVALID 4
#define DHCP6_STATUS_NOSERVER 5
/*============================================================================
* DHCPv6 Duid Types
*============================================================================*/
#define DHCP6_DUID_LLT 1
#define DHCP6_DUID_EN 2
#define DHCP6_DUID_LL 3
/*============================================================================
* Constants
*============================================================================*/
#define DHCP6_DEFAULT_IRT 1 /* Initial retransmission time */
#define DHCP6_DEFAULT_MRT 120 /* Max retransmission time */
#define DHCP6_DEFAULT_MRC 0 /* Max retransmission count */
#define DHCP6_DEFAULT_MRD 0 /* Max retransmission duration */
#define DHCP6_PACKET_SIZE 1024
#define DHCP6_MAX_IA_ADDRESSES 16
#define DHCP6_MAX_OPTION_COUNT 20
/*============================================================================
* DHCPv6 Option TLV structure
*============================================================================*/
typedef struct {
UINT16 OpCode; /* Network byte order */
UINT16 OpLen; /* Network byte order */
UINT8 Data[0]; /* Variable-length data */
} DHCP6_OPTION_HEADER;
/*============================================================================
* DHCPv6 Packet Header
*============================================================================*/
typedef struct {
UINT32 Size; /* Allocated buffer size */
UINT32 Length; /* Actual data length */
UINT8 MessageType; /* DHCPv6 message type */
UINT8 TransactionId[3]; /* Transaction ID (3 bytes) */
/* Options follow... */
} DHCP6_PACKET;
/*============================================================================
* Client Identifier (DUID)
*============================================================================*/
typedef struct {
UINT16 DuidType; /* Network byte order */
UINT16 HardwareType; /* Network byte order */
UINT8 LinkLayerAddress[0]; /* Variable length */
} DHCP6_DUID_HEADER;
/*============================================================================
* IA Address Option (RFC 3315 Section 22.6)
*============================================================================*/
typedef struct {
UINT8 IpAddress[16]; /* IPv6 address */
UINT32 PreferredLifetime; /* Network byte order */
UINT32 ValidLifetime; /* Network byte order */
} DHCP6_IA_ADDRESS;
/*============================================================================
* IA_NA Option (RFC 3315 Section 22.4)
*============================================================================*/
typedef struct {
UINT32 IaId; /* Network byte order */
UINT32 T1; /* Network byte order */
UINT32 T2; /* Network byte order */
} DHCP6_IA_NA_HEADER;
/*============================================================================
* DHCPv6 Configuration Data (user-provided config for protocol)
*============================================================================*/
typedef struct {
UINT16 OptionCount; /* Number of option entries */
DHCP6_OPTION_HEADER **OptionList; /* Pointer array to option descriptors */
UINT16 IaDescriptorType; /* IA_NA(3) or IA_TA(4) */
UINT32 IaId; /* IA ID value */
DHCP6_DUID_HEADER *ClientId; /* Client ID option data */
UINT16 ClientIdLen; /* Client ID length (big-endian) */
UINT8 IaAddressInfo[24]; /* T1/T2 + IA address list */
} DHCP6_CONFIG_DATA;
/*============================================================================
* IA Control Block (Cached IA information)
*============================================================================*/
typedef struct {
UINT32 IaState; /* One of DHCP6_STATE_* below */
DHCP6_DUID_HEADER *LastReply; /* Server ID from last REPLY */
UINT32 IaAddressCount; /* Number of IA addresses */
UINT8 Reserved[4];
/* IA addresses follow - each is:
* UINT8 IpAddr[16];
* UINT32 PreferredLifetime;
* UINT32 ValidLifetime;
*/
} IA_CB;
/*============================================================================
* DHCPv6 States (matching UEFI spec)
*============================================================================*/
#define DHCP6_STATE_INIT 0
#define DHCP6_STATE_SELECTING 1
#define DHCP6_STATE_REQUESTING 2
#define DHCP6_STATE_DECLINING 3
#define DHCP6_STATE_CONFIRMING 4
#define DHCP6_STATE_RELEASING 5
#define DHCP6_STATE_BOUND 6
#define DHCP6_STATE_RENEWING 7
#define DHCP6_STATE_REBINDING 8
/*============================================================================
* Dhcp6 TX/RX Control Block (per-transaction)
*============================================================================*/
typedef struct {
LIST_ENTRY Link; /* Forward/Back link */
UINT32 TransactionId; /* Transaction ID (lower bytes) */
DHCP6_PACKET *TxPacket; /* Current TX packet */
UINT64 Token; /* Completion token */
UINT8 RetransmitCount; /* Retransmission attempt counter */
UINT8 RetransmitMaxCount; /* MRC */
UINT32 RetransmitCurTimeout; /* Current RT */
UINT32 RetransmitTimeout; /* IRT */
UINT32 RetransmitMaxTimeout; /* MRT */
UINT32 RetransmitDuration; /* MRD */
UINT32 RetransmitTotal; /* Sum of all RTs */
/* Solicitation retry counter (for Solicit-only retries) */
UINT32 SolicitRetryCount;
UINT32 SolicitMaxRetryCount;
BOOLEAN IsDecline; /* true if this is a DECLINE/RELEASE */
} DHCP6_TX_CB;
/*============================================================================
* Dhcp6 Advertise Selection (stored Advertise options for selecting server)
*============================================================================*/
typedef struct {
DHCP6_PACKET *Packet; /* Received Advertise packet */
DHCP6_TX_CB *TxCb; /* Associated TX control block */
} DHCP6_AD_SELECT;
/*============================================================================
* Dhcp6 Service structure (Dhcp6Driver.c - per-controller)
*============================================================================*/
typedef struct _DHCP6_SERVICE {
UINT32 Signature; /* DHCP6_SERVICE_SIGNATURE */
EFI_HANDLE ControllerHandle;
EFI_HANDLE DriverBindingHandle;
UINT32 NumOfChild; /* Number of child protocol instances */
/* IP/IO interfaces */
VOID *IpIo; /* IPv6 IpIo */
EFI_HANDLE UdpIoHandle; /* Created UDP 6 handle */
VOID *UdpIo; /* UdpIo wrapper */
VOID *Udp6; /* Udp6 protocol */
/* UDP receive token and callback context */
VOID *RecvRequest; /* outstanding recv request */
VOID *Udp6CfgData; /* UDP6 config data */
/* Client ID DUID */
DHCP6_DUID_HEADER *ClientId;
UINT32 TransactionIdSeed; /* Seed for generating xid */
/* Protocol instance list */
LIST_ENTRY InstanceList;
/* Timer tick event */
EFI_EVENT TimerEvent;
} DHCP6_SERVICE;
/*============================================================================
* Dhcp6 Protocol Instance structure
*============================================================================*/
typedef struct _DHCP6_INSTANCE {
UINT32 Signature; /* DHCP6_INSTANCE_SIGNATURE */
LIST_ENTRY Link; /* Link in service instance list */
EFI_HANDLE Handle; /* Protocol handle */
DHCP6_SERVICE *Service; /* Back pointer to service */
/* Configuration + state */
DHCP6_CONFIG_DATA *Config; /* User-configured parameters */
IA_CB *IaCb; /* IA control block */
BOOLEAN Configured; /* Tracks if Configured */
/* Advertise selection */
DHCP6_AD_SELECT *AdSelect; /* Selected Advertise */
UINT8 IaState; /* Current IA state */
EFI_STATUS CompletionStatus; /* Last Udp6Wrapped Status */
/* TX control list head */
LIST_ENTRY TxList; /* TX control blocks */
LIST_ENTRY RetryList; /* TX retry blocks */
/* Retransmission parameters for current TX state */
UINT32 IaCbRetransmit; /* IaCb state-driven retry */
UINT32 RetransmitT1; /* T1 or IRT */
UINT32 RetransmitT2; /* T2 or MRD */
/* Elapsed time for current exchange */
UINT64 StartTime;
UINT64 IaTime; /* Last bound/renewal time */
UINT64 MediaPresent;
} DHCP6_INSTANCE;
/*============================================================================
* EFI DHCP6 Protocol interfaces (mapped to function pointers)
*============================================================================*/
typedef struct _EFI_DHCP6_PROTOCOL {
EFI_STATUS (EFIAPI *Start) (VOID *This);
EFI_STATUS (EFIAPI *Stop) (VOID *This);
EFI_STATUS (EFIAPI *Solicit) (VOID *This, UINT32 OptionCount,
VOID *OptionList, VOID *IaCbData);
EFI_STATUS (EFIAPI *Request) (VOID *This, UINT32 OptionCount,
VOID *OptionList, VOID *ClientId,
VOID *IaCbData, UINT32 IaId);
EFI_STATUS (EFIAPI *Renew) (VOID *This, UINT32 OptionCount,
VOID *OptionList);
EFI_STATUS (EFIAPI *Decline) (VOID *This, UINT32 OptionCount,
VOID *OptionList);
EFI_STATUS (EFIAPI *Release) (VOID *This, UINT32 OptionCount,
VOID *OptionList);
} EFI_DHCP6_PROTOCOL;
/*============================================================================
* Global variable declarations (defined in Dhcp6Dxe.c)
*============================================================================*/
extern EFI_HANDLE gImageHandle;
extern EFI_SYSTEM_TABLE *gSystemTable;
extern EFI_BOOT_SERVICES *gBootServices;
extern EFI_RUNTIME_SERVICES *gRuntimeServices;
/*============================================================================
* Forward declarations
*============================================================================*/
/* Driver binding */
EFI_STATUS
EFIAPI
Dhcp6DriverEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
);
EFI_STATUS
EFIAPI
Dhcp6DriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
);
EFI_STATUS
EFIAPI
Dhcp6DriverBindingStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
);
EFI_STATUS
EFIAPI
Dhcp6DriverBindingStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer
);
/* Protocol implementation (Dhcp6Impl.c) */
EFI_STATUS
EFIAPI
Dhcp6Start (
IN EFI_DHCP6_PROTOCOL *This
);
EFI_STATUS
EFIAPI
Dhcp6Stop (
IN EFI_DHCP6_PROTOCOL *This
);
EFI_STATUS
EFIAPI
Dhcp6Solicit (
IN EFI_DHCP6_PROTOCOL *This,
IN UINT32 OptionCount,
IN VOID *OptionList,
IN VOID *ClientId,
IN VOID *IaCbData,
IN UINT32 IaId
);
EFI_STATUS
EFIAPI
Dhcp6Request (
IN EFI_DHCP6_PROTOCOL *This,
IN UINT32 OptionCount,
IN VOID *OptionList,
IN VOID *ClientId,
IN VOID *IaCbData,
IN UINT32 IaId
);
EFI_STATUS
EFIAPI
Dhcp6Renew (
IN EFI_DHCP6_PROTOCOL *This
);
EFI_STATUS
EFIAPI
Dhcp6Rebind (
IN EFI_DHCP6_PROTOCOL *This,
IN UINT32 OptionCount,
IN VOID *OptionList
);
EFI_STATUS
EFIAPI
Dhcp6RenewRebind (
IN EFI_DHCP6_PROTOCOL *This,
IN UINT32 OptionCount,
IN VOID *OptionList
);
EFI_STATUS
EFIAPI
Dhcp6Decline (
IN EFI_DHCP6_PROTOCOL *This,
IN UINT32 OptionCount,
IN VOID *OptionList
);
EFI_STATUS
EFIAPI
Dhcp6Release (
IN EFI_DHCP6_PROTOCOL *This,
IN UINT32 OptionCount,
IN VOID *OptionList
);
/*============================================================================
* Internal function declarations (Dhcp6Io.c / Dhcp6Utility.c)
*============================================================================*/
EFI_STATUS
Dhcp6BuildSolicitAdvertiseFw (
IN DHCP6_INSTANCE *Instance,
IN OUT VOID **Packet
);
EFI_STATUS
Dhcp6BuildRequestFw (
IN DHCP6_INSTANCE *Instance,
IN UINT16 *ServerId,
OUT VOID **Packet
);
EFI_STATUS
Dhcp6BuildRenewFw (
IN DHCP6_INSTANCE *Instance,
IN UINT16 *ServerId,
OUT VOID **Packet
);
EFI_STATUS
Dhcp6BuildDeclineFw (
IN DHCP6_INSTANCE *Instance,
IN UINT16 *IaOption,
OUT VOID **Packet
);
EFI_STATUS
Dhcp6BuildReleaseFw (
IN DHCP6_INSTANCE *Instance,
IN UINT16 *ServerId,
OUT VOID **Packet
);
VOID
EFIAPI
Dhcp6TimerTicking (
IN EFI_EVENT Event,
IN DHCP6_INSTANCE *Instance
);
EFI_STATUS
Dhcp6Transmit (
IN DHCP6_INSTANCE *Instance,
IN DHCP6_PACKET *Packet,
IN DHCP6_TX_CB *TxCb
);
VOID
EFIAPI
Dhcp6ReceiveCallback (
IN VOID *Udp6Wrap,
IN EFI_STATUS Status,
IN VOID *Context,
IN VOID *RxToken
);
VOID
Dhcp6AppendOption (
IN VOID *Buffer,
IN UINT16 OpCode,
IN UINT16 OpLen,
IN VOID *Data
);
VOID *
Dhcp6FindOption (
IN VOID *Buffer,
IN UINT16 BufLen,
IN UINT16 OpCode
);
VOID *
Dhcp6FindIaOption (
IN VOID *IaOptions,
IN UINT16 IaLen,
IN UINT16 IaType,
IN VOID *Config
);
VOID
Dhcp6ParseIaAddresses (
IN IA_CB *IaCb,
IN VOID *IaOption,
IN UINT16 IaLen,
OUT VOID *AddressArray,
OUT UINT32 *AddressCount
);
EFI_STATUS
Dhcp6UpdateIaAddress (
IN DHCP6_INSTANCE *Instance,
IN VOID *IaOption,
IN UINT16 IaLen,
IN UINT32 T1,
IN UINT32 T2
);
UINT32
Dhcp6CalculateIaT1T2 (
IN UINT32 ValidLifetime,
IN UINT32 T1,
IN UINT32 T2
);
EFI_STATUS
Dhcp6SolicitStateMachine (
IN DHCP6_INSTANCE *Instance,
IN DHCP6_PACKET *Packet,
IN DHCP6_AD_SELECT *AdSelect
);
EFI_STATUS
Dhcp6MediaPresent (
IN DHCP6_INSTANCE *Instance,
OUT BOOLEAN *MediaPresent
);
VOID *Dhcp6AllocatePool (UINTN Size);
VOID *Dhcp6AllocateZeroPool (UINTN Size);
VOID Dhcp6FreePool (VOID *Buffer);
VOID *Dhcp6CopyMem (VOID *Dest, VOID *Src, UINTN Length);
VOID Dhcp6ZeroMem (VOID *Buffer, UINTN Length);
INTN Dhcp6CompareMem (VOID *Dest, VOID *Src, UINTN Length);
UINT16 Dhcp6SwapUint16 (UINT16 Value);
UINT32 Dhcp6SwapUint32 (UINT32 Value);
VOID Dhcp6InitializeListHead (LIST_ENTRY *ListHead);
BOOLEAN Dhcp6IsListEmpty (LIST_ENTRY *ListHead);
VOID Dhcp6InsertHeadList (LIST_ENTRY *ListHead, LIST_ENTRY *Entry);
VOID Dhcp6InsertTailList (LIST_ENTRY *ListHead, LIST_ENTRY *Entry);
VOID Dhcp6RemoveEntryList (LIST_ENTRY *Entry);
EFI_STATUS
UdpIoCreateService (
IN EFI_HANDLE DriverBindingHandle,
IN EFI_HANDLE ControllerHandle,
IN EFI_GUID *ProtocolGuid,
OUT VOID **UdpIo
);
VOID
UdpIoFreeService (
IN VOID *UdpIo
);
EFI_STATUS
UdpIoRecv (
IN VOID *UdpIo,
IN VOID *Context,
IN EFI_EVENT *Event OPTIONAL
);
VOID
UdpIoSend (
IN VOID *UdpIo,
IN VOID *Nbuf,
IN EFI_STATUS Status,
IN VOID *Context
);
#endif /* __DHCP6DXE_H__ */