Newer
Older
AMI-Aptio-BIOS-Reversed / Dhcp4Dxe / Dhcp4Dxe.h
@Ajax Dong Ajax Dong 2 days ago 12 KB Init
#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__ */