#ifndef __DHCP4DXE_H__
#define __DHCP4DXE_H__
#include "../uefi_headers/Uefi.h"
/*=============================================================================
* Dhcp4Dxe - DHCPv4 Protocol Driver for UEFI Network Stack
* Source: e:\hs\AmiNetworkPkg\UefiNetworkStack\Ipv4\Dhcp4Dxe\
* Files: Dhcp4Driver.c, Dhcp4Io.c, Dhcp4Impl.c, Dhcp4Option.c
*=============================================================================
* This module implements the EFI DHCPv4 Protocol (service binding + per-child
* protocol instances), the DHCP finite state machine, DHCP option parsing
* and building, and UDP I/O integration for sending/receiving DHCP messages.
*/
/*=============================================================================
* GUIDs
*=============================================================================*/
/* EFI_DHCP4_PROTOCOL_GUID: {6A7A5CFF-E8D9-4F70-BADA-75AB3025CE14} */
#define EFI_DHCP4_PROTOCOL_GUID \
{ 0x6A7A5CFF, 0xE8D9, 0x4F70, \
{ 0xBA, 0xDA, 0x75, 0xAB, 0x30, 0x25, 0xCE, 0x14 } }
/* EFI_DHCPP4_SERVICE_BINDING_PRROTOCOCOL _GUID: {{18A031AB-B443-4D1A0A0C0000000000000 0000000} */
/* Service Binding GUID for DHCP4: {18A031AB-B443-4D1A-A5C0-0C09261E9F71} */
#define EFI_DHCP4_SERVICE_BINDING_PROTOCOL_GUID \
{ 0x18A031AB, 0xB443, 0x4D1A, \
{ 0xA5, 0xC0, 0x0C, 0x09, 0x26, 0x1E, 0x9F, 0x71 } }
/* EFI_SERVICE_BINDING_PROTOCOL_GUID (standard UEFI): {8A219718-4EF5-4761-91C8-C0F04BDA9E56} */
#define EFI_SERVICE_BINDING_PROTOCOL_GUID \
{ 0x8A219718, 0x4EF5, 0x4761, \
{ 0x91, 0xC8, 0xC0, 0xF0, 0x4B, 0xDA, 0x9E, 0x56 } }
/* EFI_IP4_PROTOCOL_GUID: {41D94CD2-35B6-455A-8258-D4E51334AADD} (from SNP/IP4 layer) */
#define EFI_IP4_SERVICE_BINDING_PROTOCOL_GUID \
{ 0x83F01464, 0x99BD, 0x45E5, \
{ 0xB3, 0x83, 0xAF, 0x63, 0x05, 0xD8, 0xE9, 0xE6 } }
/* EFI_UDP4_SERVICE_BINDING_PROTOCOL_GUID: {83F01464-99BD-45E5-B383-AF6305D8E9E6} */
/* MNP_SERVICE_BINDING_PROTOCOL_GUID: {F2FD1544-9794-4A2C-992E-E5BBCF20E394} */
/* EFI_IP4_CONFIG_PROTOCOL_GUID: {3A799C0A-5C86-4093-9650-5CD19298A600} */
/* AMI_NETWORK_STACK_VAR_GUID: {D1405D16-7AFC-4695-BB12-41459D3695A2} */
/*=============================================================================
* DHCP4 Protocol State Machine - States
*=============================================================================*/
#define DHCP4_STATE_STOPPED 0
#define DHCP4_STATE_INIT 1
#define DHCP4_STATE_SELECTING 2
#define DHCP4_STATE_REQUESTING 3
#define DHCP4_STATE_BOUND 4
#define DHCP4_STATE_RENEWING 5
#define DHCP4_STATE_REBINDING 6
#define DHCP4_STATE_INIT_REBOOT 7
#define DHCP4_STATE_REBOOTING 8
/*=============================================================================
* DHCP Message Types (Option 53 values)
*============================================================================*/
#define DHCP_MSG_DISCOVER 1
#define DHCP_MSG_OFFER 2
#define DHCP_MSG_REQUEST 3
#define DHCP_MSG_DECLINE 4
#define DHCP_MSG_ACK 5
#define DHCP_MSG_NAK 6
#define DHCP_MSG_RELEASE 7
/*=============================================================================
* DHCP Option Tags (common ones parsed by this driver)
*============================================================================*/
#define DHCP_TAG_PAD 0
#define DHCP_TAG_END 255
#define DHCP_TAG_SUBNET_MASK 1
#define DHCP_TAG_ROUTER 3
#define DHCP_TAG_DNS 6
#define DHCP_TAG_HOST_NAME 12
#define DHCP_TAG_DOMAIN_NAME 15
#define DHCP_TAG_MTU 26
#define DHCP_TAG_REQUESTED_IP 50
#define DHCP_TAG_LEASE_TIME 51
#define DHCP_TAG_MSG_TYPE 53
#define DHCP_TAG_SERVER_ID 54
#define DHCP_TAG_PARAMETER_REQUEST_LIST 55
#define DHCP_TAG_CLIENT_IDENT 61
#define DHCP_TAG_TFTP_SERVER_NAME 66
#define DHCP_TAG_CLASS_IDENTIFIER 77
/*===========================================================================
* DHCP Option Table Entry (used for validation during parse)
* Size: 40 bytes each (5 fields)
* Each entry describes how a DHCP option tag should be handled.
* The table at 0x9210 has 15 entries (tag values: 0, 1, 3, 4, 6, 12, 15, 26, 28, 40, 42, 43, 44, 50, 51)
*============================================================================*/
typedef struct {
UINT8 Tag; // DHCP option tag (offset +0)
UINT16 MinLen; // Minimum valid data length (offset 1)
UINT16 MaxLen; // Maximum valid data length (offset 3)
UINT16 Data1; // Internal flags/processing hint (offset 5)
UINT32 Data2; // More flags (offset 7)
UINT8 IsArray; // Non-zero if multiple instances allowed (offset 32)
UINT8 Pad[7]; // Padding to 40 bytes (offset 33-39)
} DHCP_OPTION_ENTRY;
/*=============================================================================
* Network Buffer (NET_BUF) - from DxeNetLib
* Signature: 'n' | ('b' << 8) | (('u') | ('f' << 8)) << 16 = 0x6675626E
* Size: variable header + data
*============================================================================*/
typedef struct {
UINT32 Signature; // 0x6675626E ('nbuf')
UINT64 RefCnt; // Reference count
UINT64 TotalSize; // Total size
UINT8 *Data; // Pointer to data
UINT32 DataLen; // Data length
UINT32 HeadLen; // Headroom length
UINT32 TailLen; // Tailroom length
// ... more fields including block list
} NET_BUF;
/*=============================================================================
* UDP I/O (UDP_IO) - from DxeUdpIoLib
*============================================================================*/
typedef struct {
UINT32 Signature; // 0x49504455 ('UDPI')
LIST_ENTRY Link; // Link to global list
UINT64 UdpVersion; // 4 for IPv4, 6 for IPv6
UINT32 *UdpHandle; // UDP protocol handle
UINT64 Controller; // Controller handle
UINT64 Image; // Image handle
// ... Rx/Tx token management fields
} UDP_IO;
/*=============================================================================
* DHCP Protocol Instance (DHCP_PROTOCOL)
* This is the per-child protocol instance installed on child handles.
* Signature: 0x50434844 ('DHCP')
* Size: 360 bytes (0x168)
* Created by CreateChild (sub_8C8)
*============================================================================*/
typedef struct _DHCP_PROTOCOL {
/* Offset 0x00 (0) */ UINT32 Signature; // = 0x50434844 ('DHCP')
/* Offset 0x04 (4) */ UINT8 Pad0[4];
/* Offset 0x08 (8) */ LIST_ENTRY Link; // Link in protocol list
/* Offset 0x10 (16) */ UINT8 Pad1[8];
/* Offset 0x18 (24) */ UINT64 IoStatus; // Async operation status
/* Offset 0x20 (32) */ UINT64 Controller; // Controller handle
/* Offset 0x28 (40) */ UINT64 Image; // Driver image handle
/* Offset 0x30 (48) */ LIST_ENTRY ChildList; // Children list head
/* Offset 0x40 (64) */ UINT64 ChildCount; // Number of child instances
/* Offset 0x48 (72) */ UINT64 State; // DHCP state (0-8)
/* Offset 0x50 (80) */ UINT64 Result; // Completion status
/* Offset 0x58 (88) */ UINT32 Xid; // Transaction ID (xid)
/* Offset 0x5C (92) */ UINT32 ClientAddr; // Client IP address (network order)
/* Offset 0x60 (96) */ UINT32 Netmask; // Subnet mask mask(mask)
/* Offset 0x64 (100) */ UINT32 Gateway; // Gateway IP
/* Offset 0x68 (104) */ NET_BUF *ParsedList; // Parsed offer list
/* Offset 0x70 (112) */ NET_BUF *SelectedOffer; // Selected offer
/* Offset 0x78 (120) */ DHCP_LEASE *Lease; // Active lease struct
/* Offset 0x80 (128) */ UINT32 MaxRetryCount; // Max retry count for current state
/* Offset 0x84 (136) */ UINT32 RetryCount; // Retry count
/* Offset 0x88 (144) */ UINT64 RenewRebind; // Non-zero if in renew/reind phase*
/* Offset 0x90 (152) */ UDP_IO *UdpIo; // UDP I/O for for DHCP TX/RXX
/* Offset 0x98 (160) */ UDP_IO *UdpIoProxProx; // UDP IO for proxy (renew/reind)*
/* Offset 0xA0 (168) */ NET_BUF *LastPacket; // Last sent DHCP packet
/* Offset 0xA8 (176) */ UINT8 MacAddr[32]; // MAC address (from SNP)
/* Offset 0xC8 (200) */ UINT8 Pad2[8];
/* Offset 0xD0 (208) */ UINT8 HwAddrType; // Hardware address type
/* Offset 0xD1 (209) */ UINT8 HwAddrLen; // Hardware address length
/* Offset 0xD2 (210) */ UINT8 ClientHwAddr[16]; // Client hardware address in packets
/* Offset 0xE2 (226) */ UINT8 Pad3[14];
/* Offset 0xF0 (240) */ LIST_ENTRY ParaList; // Parameter request list
/* Offset 0x100 (256) */ UINT32 RetryCntRanges[4]; // Retry count thresholds
// offset 0x100: RetryCount (T1/T2, etc)
// lots of fields...
/* Offset 0x120 (288) */ UINT64 Pad5[4];
/* Offset 0x140 (320) */ UINT64 TimerEvent; // Timer event
/* Offset 0x148 (328) */ UINT64 RetryTimer; // Retry timer counter
/* Offset 0x150 (336) */ UINT64 TriesCount; // Number of tries in current state
/* Offset 0x158 (344) */ UINT64 MaxTries; // Max tries before timeout
/* Offset 0x160 (352) */ UINT32 ProbeCount; // Probe/broadcast counter
} DHCP_PROTOCOL;
/*=============================================================================
* DHCPv4 Option Parse Context
* Used by Dhcp4Option.c functions for parsing options from packets
*============================================================================*/
typedef struct {
UINT8 *OptionPtr; // Pointer to current option in the option area
UINT32 OptionLen; // Remaining option length
// ... internal parsing state
} DHCP_PARSE_CONTEXT;
/*=============================================================================
* EFI_DHCP4_PROTOCOL - The UEFI protocol interface (8 functions)
*============================================================================*/
typedef struct _EFI_DHCP4_PROTOCOL {
UINT64 GetModeData; // (0) sub_2ACC - Get current mode data
UINT64 Configure; // (1) sub_2EE4 - Configure DHCP instance
UINT64 Initialize; // (2) sub_30E0 - Start DHCP
UINT64 RenewRebind; // (3) sub_32D0 - Renew/Rebind lease
UINT64 Release; // (4) sub_34B0 - Release lease
UINT64 Stop; // (5) sub_3598 - Stop DHCP
UINT64 Build; // (6) sub_3624 - Build DHCP packet
UINT64 TransmitReceive; // (7) sub_3C08 - Transmit and receive
UINT64 Parse; // (8) sub_3FFC - Parse DHCP options
} EFI_DHCP4_PROTOCOL;
/*=============================================================================
* DHCP4 Mode Data (returned by GetModeData)
* Size: ~144 bytes
*============================================================================*/
typedef struct {
UINT32 State; // Current DHCP state
UINT32 ConfigData[18]; // EFI_DHCP4_CONFIG_DATA (at offset 8)
UINT32 ClientMacAddr[8]; // Client MAC address (at offset 84)
UINT32 ServerAddr; // DHCP server address (at offset 80 -> actually 116)
UINT32 ClientAddr; // Client IP address (at offset 124)
UINT32 SubnetMask; // Subnet mask (at offset 116 -> actually 120)
UINT32 Gateway; // Gateway (at offset 80)
UINT32 LeaseTime; // Lease time (at offset 128)
UINT64 LeaseStart; // Lease start time
} DHCP4_MODE_DATA;
/*=============================================================================
* Known GUID reference table (from .rdata at 0x9000)
*============================================================================*/
/*
0x9000: 5B1B31A1-9562-11D2-8E3F-00A0C969723B EFI_DEVICE_PATH_PROTOCOL
0x9010: 36232936-0E76-31C8-A13A-3AF2FC1C3932 Unknown (AMI specific)
0x9020: 6A7A5CFF-E8D9-4F70-BADA-75AB3025CE14 EFI_DHCP4_PROTOCOL
0x9030: 9D9A39D8-BD42-4A73-A4D5-8EE94BE11380 EFI_DHCP4_SERVICE_BINDING
0x9040: 09576E91-6D3F-11D2-8E39-00A0C969723B EFI_SIMPLE_NETWORK_PROTOCOL
0x9050: A19832B9-AC25-11D3-9A2D-0090273FC14D EFI_PXE_BASE_CODE_PROTOCOL
0x9060: 83F01464-99BD-45E5-B383-AF6305D8E9E6 EFI_IP4_SERVICE_BINDING
0x9070: 4F948815-B4B9-43CB-8A33-90E060B34955 EFI_IP6_SERVICE_BINDING
0x9080: F2FD1544-9794-4A2C-992E-E5BBCF20E394 MNP_SERVICE_BINDING
0x9090: 66ED4721-3C98-4D3E-81E3-D03DD39A7254 EFI_UDP4_SERVICE_BINDING
0x90A0: EB9D2D31-2D88-11D3-9A16-0090273FC14D EFI_IP4_CONFIG_PROTOCOL
0x90B0: 7739F24C-93D7-11D4-9A3A-0090273FC14D EFI_HOB_LIST_GUID
0x90C0: 18A031AB-B443-4D1A-A5C0-0C09261E9F71 EFI_DHCP4_SERVICE_BINDING
0x90D0: 3AD9DF29-4501-478D-B1F8-7F7FE70E50F3 EFI_UDP4_PROTOCOL
0x90E0: 107A772C-D5E1-11D4-9A46-0090273FC14D EFI_IP4_PROTOCOL
0x90F0: 480F8AE9-0C46-4AA9-BC89-DB9FBA619806 EFI_DPC_PROTOCOL
0x9100: 8A219718-4EF5-4761-91C8-C0F04BDA9E56 EFI_SERVICE_BINDING_PROTOCOL
0x9110: D1405D16-7AFC-4695-BB12-41459D3695A2 AMI_NETWORK_STACK_VAR_GUID
*/
#endif /* __DHCP4DXXE_H__ */