#ifndef __IP4DXE_H__
#define __IP4DXE_H__
/*==============================================================================
Ip4Dxe - IPv4 Protocol Driver for UEFI Network Stack
Source files (from AMI NetworkPkg):
Ip4Driver.c - Driver entry, bind/unbind/stop
Ip4Impl.c - IPv4 implementation (child open/close/configure/receive/transmit)
Ip4Input.c - IPv4 packet input processing, reassembly
Ip4If.c - IPv4 interface management (ARP, frame Tx/Rx)
Ip4Config2Impl.c - IPv4 Configuration II protocol implementation
Ip4Config2Nv.c - IPv4 Configuration NVRAM interface
Ip4Route.c - IPv4 route table management
Protocol Interfaces Installed:
gEfiIp4ServiceBindingProtocolGuid (0x18A031AB-B443-4D1A-A5C0-0C09261E9F71)
gEfiIp4ProtocolGuid (0x6A7A5CFF-E8D9-4F70-BADA-75AB3025CE14)
gEfiIp4Config2ProtocolGuid (0x107A772C-D5E1-11D4-9A46-0090273FC14D)
gEfiManagedNetworkProtocolGuid (0x7A5CFF-F8-D9-4F70-BADA)
gEfiManagedNetworkServiceBindingProtocolGuid
==============================================================================*/
#include "uefi_headers/Uefi.h"
/*==============================================================================
Signature definitions
==============================================================================*/
#define IP4_SERVICE_SIGNATURE 0x53343249 /* 'IP4S' = 1395937353 */
#define IP4_INSTANCE_SIGNATURE 0x50343249 /* 'IP4P' = 1345605705 */
#define IP4_INTERFACE_SIGNATURE 0x46493449 /* 'IP4IF' = 1179209801 */
#define IP4_ARP_QUE_SIGNATURE 0x41504649 /* 'IPFA' = 1095127113 */
#define IP4_FRAME_TOKEN_SIGNATURE 0x52463449 /* 'IP4FR' = 1380339785 */
#define IP4_TOKEN_SIGNATURE 0x54463449 /* 'IP4FT' = 1413894217 */
/*==============================================================================
Protocol GUIDs (from .rdata section)
==============================================================================*/
#define EFI_IP4_SERVICE_BINDING_PROTOCOL_GUID \
{ 0x18A031AB, 0xB443, 0x4D1A, { 0xA5, 0xC0, 0x0C, 0x09, 0x26, 0x1E, 0x9F, 0x71 }}
#define EFI_IP4_PROTOCOL_GUID \
{ 0x6A7A5CFF, 0xE8D9, 0x4F70, { 0xBA, 0xDA, 0x75, 0xAB, 0x30, 0x25, 0xCE, 0x14 }}
#define EFI_IP4_CONFIG2_PROTOCOL_GUID \
{ 0x107A772C, 0xD5E1, 0x11D4, { 0x9A, 0x46, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }}
#define EFI_MANAGED_NETWORK_PROTOCOL_GUID \
{ 0x7A5CFF, 0xF8, 0xD9, { 0x4F, 0x70, 0xBA, 0xDA, 0x75, 0xAB, 0x30, 0x25, 0xCE, 0x14 }}
/*==============================================================================
IPv4 structures
==============================================================================*/
#pragma pack(push, 1)
/* IPv4 header (20 bytes min) */
typedef struct {
UINT8 VersionIhl; /* Version (4) + IHL (4) */
UINT8 Tos; /* Type of Service */
UINT16 TotalLength; /* Total length in network byte order */
UINT16 Identification;
UINT16 FragOffset; /* Flags (3) + Fragment Offset (13) */
UINT8 Ttl; /* Time to Live */
UINT8 Protocol; /* Next Header Protocol */
UINT16 HeaderChecksum;
UINT32 SrcAddr;
UINT32 DstAddr;
} IP4_HEADER;
/* ICMP header */
typedef struct {
UINT8 Type;
UINT8 Code;
UINT16 Checksum;
} ICMP_HEADER;
#pragma pack(pop)
/*==============================================================================
IP4_CONFIG_DATA (28 bytes) - from sub_AC00 usage at Ip4Impl.c
==============================================================================*/
typedef struct {
UINT8 DefaultProtocol; /* +0 */
UINT8 AcceptBroadcast; /* +1 */
UINT8 AcceptPromiscuous; /* +2 */
UINT8 UseDefaultAddress; /* +3 */
UINT16 RawData; /* +4 */
UINT32 SrcAddr; /* +6 (network byte order, converted via ROL2) */
UINT32 SubnetMask; /* +10 */
UINT32 Gateway; /* +14 */
UINT32 Unused[3]; /* +18..+26 */
} IP4_CONFIG_DATA;
#define IP4_CONFIG_DATA_SIZE 28
/*==============================================================================
IP4_ADDRESS_PAIR (16 bytes) - hash table entries at IpSb+88
==============================================================================*/
typedef struct _IP4_ADDRESS_PAIR {
struct _IP4_ADDRESS_PAIR *ForwardLink;
struct _IP4_ADDRESS_PAIR *BackLink;
UINT8 Active; /* +16 (offset 16 in struct) */
UINT32 IpAddr; /* +24 (offset 6*4) */
UINT32 SubnetMask; /* +28 (offset 7*4) */
UINT32 RefCnt; /* +32 (offset 3*8) */
UINT64 Interface; /* +40 */
} IP4_ADDRESS_PAIR;
/*==============================================================================
IP4_ROUTE_ENTRY (40 bytes) - hash table entries
==============================================================================*/
typedef struct _IP4_ROUTE_ENTRY {
struct _IP4_ROUTE_ENTRY *ForwardLink;
struct _IP4_ROUTE_ENTRY *BackLink;
UINT32 RefCnt; /* +16 */
UINT32 DestAddr; /* +24 (offset 6*4) */
UINT32 Netmask; /* +28 (offset 7*4) */
UINT32 NextHop; /* +32 (offset 8*4) */
UINT32 Flag_0; /* +36 */
} IP4_ROUTE_ENTRY;
/*==============================================================================
IP4_SERVICE - main service instance (2184 bytes)
==============================================================================*/
typedef struct _IP4_SERVICE {
UINT32 Signature; /* +0 'IP4S' */
VOID *DestroyCxHandler; /* +8 sub_13C4 */
VOID *StoptHandler; /* +16 sub_1530 */
UINT64 State; /* +24 0=uninit,1=active,3=3destroyed */
UINT32 *ChildrenList[32]; /* +40 88 child instance list head pointers) 31 entries of 16 bytes each) */
/* +40: children list head, +56: children tail */
VOID *MddAddressAr; /* +72 MNP4 child route interface */
VOID *RouteTable; /* +80 */
/* +88: 32 hash buckets for address pairs (each 16 bytes: LIST_ENTRY) */
/* 88 + 32*16 = 88 + 512 = 600 (0x258) */
UINT64 McastIpGroupList; /* +584 */
UINT64 *ChildHandleList; /* +592 */
EFI_HANDLE ControllerHandle; /* +608 */
EFI_HANDLE DriverBindingHandle;/* +616 */
VOID *MnpChildHandle; /* +624 */
VOID *MnpProtocol; /* +632 */
UINT32 Mtu; /* +648 (default 16844800 = 0x1010100 -> 0x1000?) */
UINT32 Pad0; /* +652 */
UINT8 Config; /* +656 */
UINT8 Padding[3]; /* +657-659 */
/* +660: buffer of 656 bytes for config data */
UINT8 ConfigData[656]; /* +660 .. +1316 */
UINT16 ImagePort; /* +1336 (0x100 = 256) */
UINT64 TimerEvent; /* +1320 */
UINT64 TimerReg; /* +1328 */
UINT64 ChildrenCount; /* +32 */
/* +1344: Ip4Config2Instance (824 bytes) */
/* +2168: Ip4Interface pointer */
UINT32 MtuConfig; /* +2176 */
UINT32 MtuCurrent; /* +2180 */
/* Total: 2184 */
} IP4_SERVICE;
#define IP4_SERVICE_SIZE 2184
/*==============================================================================
IP4_INSTANCE (344 bytes) - child instance
==============================================================================*/
typedef struct _IP4_INSTANCE {
UINT32 Signature; /* +0 'IP4P' */
UINT8 ConfigData[64]; /* +8 IP4 config + route table + address */
UINT64 State; /* +72 0=not configured, 1=configured */
UINT8 Destroyed; /* +88 */
UINT64 *Service; /* +96 back-pointer to Ip4Service */
LIST_ENTRY Link; /* +104 instance link */
/* +120: Timer queue (2 LIST_ENTRY) */
/* +160: Pending queue ( LIST_ENTRY) */
/* +200: RcvToken queue ( LIST_ENTRY) */
/* +216: Fragment queue */
/* +232: Lock (16 bytes: 0x10, 4, 0x01) */
/* +264: Route cache */
/* +256: Selected interface */
/* +280: Route table */
/* +288: mRouteTable / + + */
UINT64 Gateway; /* Total */
} IP4_INSTANCE;
#define IP4_INSTANCE_SIZE 344
/*==============================================================================
IP4_INTERFACE (232 bytes)
==============================================================================*/
typedef struct _IP4_INTERFACE {
UINT32 Signature; /* +0 'IP4IF' */
LIST_ENTRY Link; /* +8 */
UINT64 RefCnt; /* +16 (offset 3) */
UINT32 IpAddr; /* +24 */
UINT32 SubnetMask; /* +28 */
UINT32 MacHeaderLen; /* +32 */
UINT8 *MacHeader; /* +40 */
UINT8 Configured; /* +48 */
UINT64 *ArArpQueQue; /* +56 */
VOID *Mnp; /* +72 */
UINT64 *MnpRcv; /* +80 */
UINT64 *MnpConfigData; /* +88 */
UINT64 *MnpInterfaces; /* +96 */
/* ... */
} IP4_INTERFACE;
#define IP4_INTERFACE_SIZE 232
/*==============================================================================
Forward function declarations
==============================================================================*/
/* Ip4Driver.c */
EFI_STATUS
EFIAPI
DriverBindingSupported(
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE RemainingDevicePath
);
EFI_STATUS
EFIAPI
DriverBindingStart(
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDD RemainingDevicePath
);
EFI_STATUS
EFIAPI
DriverBindingStopp(
IN EFI_HANDD ControllerHandle,
IN UINTN NumberOfChildren,
IN EFI_HANDD *ChildHandleBuffer
);
EFI_STATUS
EFIAPI
Ip4DriverEntry(
IN EFI_HANDD ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
);
/*==============================================================================
Global variables
==============================================================================*/
extern UINT8 gBS;
extern UINT8 gImageHandle;
extern UINT64 gSystemTable;
extern UINT64 BootServices;
extern UINT64 RuntimeServices;
extern UINT64 qword_14308; /* HII Database protocol */
extern UINT64 qword_14310; /* HII Package List protocol */
extern UINT64 qword_14328; /* HII Font protocol */
extern UINT64 qword_14340; /* DPC protocol (DPC lib) */
extern UINT16 word_14348; /* Random seed */
extern UINT8 byte_142C0; /* IPSec enabled flag */
extern UINT64 qword_142C8; /* IPSec protocol pointer */
extern UINT64 qword_142D0; /* Config2 Callback event */
#endif /* __IP4DXE_H__ */