/* Udp4Dxe.h - UDPv4 DXE driver header
* Source: AmiNetworkPkg/UefiNetworkStack/Ipv4/Udp4Dxe
* Build files: Udp4Driver.c, Udp4Main.c, Udp4Impl.c, Udp4Config2Impl.c
* DxeNetLib.c, DxeIpIoLib.c, NetBuffer.c, UefiDriverModel.c
*/
#ifndef __UDP4_DXE_H__
#define __UDP4_DXE_H__
#include "../uefi_headers/Uefi.h"
/*============================================================================
* GUID definitions
*============================================================================*/
#define EFI_UDP4_PROTOCOL_GUID \
{ 0x5b1b31a1, 0x9562, 0x11d2, { 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }
#define EFI_UDP4_SERVICE_BINDING_PROTOCOL_GUID \
{ 0x36232936, 0x0e76, 0x31c8, { 0xa1, 0x3a, 0x3a, 0xf2, 0xfc, 0x1c, 0x39, 0x32 } }
#define EFI_UDP4_INSTANCE_PROTOCOL_GUID \
{ 0x2c8759d5, 0x5c2d, 0xef66, { 0x92, 0x5f, 0xb6, 0x6c, 0x10, 0x19, 0x57, 0xe2 } }
#define EFI_IP4_SERVICE_BINDING_PROTOCOL_GUID \
{ 0xc51711e7, 0xb4bf, 0x404a, { 0xbf, 0xb8, 0x0a, 0x04, 0x8e, 0xf1, 0xff, 0xe4 } }
#define EFI_IP4_PROTOCOL_GUID \
{ 0x41d94cd2, 0x35b6, 0x455a, { 0x82, 0x58, 0xd4, 0xe5, 0x13, 0x34, 0xaa, 0xdd } }
#define EFI_IP_IO_PROTOCOL_GUID \
{ 0x18a031ab, 0xb443, 0x4d1a, { 0xa5, 0xc0, 0x0c, 0x09, 0x26, 0x1e, 0x9f, 0x71 } }
#define EFI_DPC_PROTOCOL_GUID \
{ 0x480f8ae9, 0x0c46, 0x4aa9, { 0xbc, 0x89, 0xdb, 0x9f, 0xba, 0x61, 0x98, 0x06 } }
#define NETWORK_STACK_VAR_GUID \
{ 0xd1405d16, 0x7afc, 0x4695, { 0xbb, 0x12, 0x41, 0x45, 0x9d, 0x36, 0x95, 0xa2 } }
/*============================================================================
* Signature constants (little-endian ASCII)
*============================================================================*/
#define UDP4_SERVICE_SIGNATURE 0x34737055 /* 'Udp4' */
#define UDP4_INSTANCE_SIGNATURE 0x49706455 /* 'UdpI' */
#define NET_BUF_SIGNATURE 0x6662756e /* 'nbuf' */
/*============================================================================
* Forward declarations
*============================================================================*/
typedef struct _UDP4_SERVICE UDP4_SERVICE;
typedef struct _UDP4_INSTANCE UDP4_INSTANCE;
typedef struct _EFI_UDP4_PROTOCOL EFI_UDP4_PROTOCOL;
typedef struct _IP_IO_PROTOCOL IP_IO_PROTOCOL;
typedef struct _IPIO_INFO IPIO_INFO;
typedef struct _NET_BUF NET_BUF;
typedef struct _NET_MAP NET_MAP;
typedef struct _NET_MAP_ITEM NET_MAP_ITEM;
/* Basic list entry (not in Uefi.h) */
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *ForwardLink;
struct _LIST_ENTRY *BackLink;
} LIST_ENTRY;
/*============================================================================
* UEFI UDP4 protocol definitions
*============================================================================*/
/* EFI_UDP4_CONFIG_DATA - 36 bytes */
typedef struct {
UINT8 Type; /* +0x00: 0=Unicast, 1=Multicast, 2=Broadcast */
UINT8 Io; /* +0x01: Udp4Io (0=Rx, 1=Tx) */
UINT8 UseDefaultAddr; /* +0x02 */
UINT8 pad; /* +0x03 */
UINT8 StationAddress[4]; /* +0x04: IP address */
UINT32 SubnetMask; /* +0x08 */
UINT16 StationPort; /* +0x0C */
UINT32 RemoteAddress; /* +0x10 */
UINT16 RemotePort; /* +0x14 */
UINT16 pad2; /* +0x16 */
UINT16 LocalPort; /* +0x1A: assigned ephemeral */
UINT16 TimeToLive; /* +0x1C */
UINT16 pad3; /* +0x1E */
UINT32 Timeout; /* +0x20 */
} EFI_UDP4_CONFIG_DATA;
/* EFI_UDP4_COMPLETION_TOKEN */
typedef struct {
EFI_EVENT Event; /* +0x00 */
EFI_STATUS Status; /* +0x08 */
union {
struct {
UINT32 FragmentCount;
UINT32 DataLength;
VOID *FragmentTable;
} Packet;
struct {
UINT64 UrgentLength;
UINT64 DataLength;
VOID *FragmentTable;
} RxData;
};
} EFI_UDP4_COMPLETION_TOKEN;
/* EFI_UDP4_PROTOCOL - 64 bytes (8 function pointers) */
struct _EFI_UDP4_PROTOCOL {
EFI_STATUS (EFIAPI *Transmit)(EFI_UDP4_PROTOCOL *This, VOID *Token);
EFI_STATUS (EFIAPI *Configure)(EFI_UDP4_PROTOCOL *This, EFI_UDP4_CONFIG_DATA *ConfigData);
EFI_STATUS (EFIAPI *Groups)(EFI_UDP4_PROTOCOL *This, BOOLEAN JoinFlag, VOID *MulticastAddr);
EFI_STATUS (EFIAPI *Routes)(EFI_UDP4_PROTOCOL *This, BOOLEAN DeleteRoute, VOID *SubnetAddr, VOID *SubnetMask, VOID *GatewayAddr);
EFI_STATUS (EFIAPI *Transmit2)(EFI_UDP4_PROTOCOL *This, VOID *Token);
EFI_STATUS (EFIAPI *Receive)(EFI_UDP4_PROTOCOL *This, VOID *Token);
EFI_STATUS (EFIAPI *Cancel)(EFI_UDP4_PROTOCOL *This, VOID *Token);
EFI_STATUS (EFIAPI *Poll)(EFI_UDP4_PROTOCOL *This);
};
/*============================================================================
* UDP4 Internal structures
*============================================================================*/
/* NET_MAP - 24 bytes (3 QWORDs) */
struct _NET_MAP {
UINTN UsedCount; /* +0x00 */
UINTN FreeCount; /* +0x08 */
LIST_ENTRY List; /* +0x10 */
};
/* NET_MAP_ITEM */
struct _NET_MAP_ITEM {
LIST_ENTRY Link; /* +0x00 (16 bytes) */
VOID *Map; /* +0x10 */
VOID *Key; /* +0x18 */
VOID *Value; /* +0x20 */
UINTN Status; /* +0x30 */
};
/* NET_BUF header */
struct _NET_BUF {
UINT32 Signature; /* +0x00: 0x6662756e = 'nbuf' */
UINT32 pad; /* +0x04 */
UINTN RefCount; /* +0x08 */
LIST_ENTRY List; /* +0x10 */
UINT8 Reserved[0x80 - 0x20];
UINTN TotalSize; /* +0x80 (128) */
UINTN HeaderLen; /* +0x88 */
UINTN TailLen; /* +0x90 */
};
/* IPIO_INFO per sub_5B08 (96 bytes = 0x60) */
struct _IPIO_INFO {
LIST_ENTRY Link; /* +0x00 (16 bytes) */
UINT32 Ip; /* +0x10 */
UINT32 SubnetMask; /* +0x14 */
LIST_ENTRY InfoLink; /* +0x18 (16 bytes) */
EFI_HANDLE ChildHandle; /* +0x28 */
IP_IO_PROTOCOL *IpIo; /* +0x30 */
VOID *Ip; /* +0x38 */
UINTN RefCnt; /* +0x40 */
EFI_EVENT Event; /* +0x48 */
UINT8 IpVersion; /* +0x58 */
};
/* IP_IO_PROTOCOL - 0xA0 (160) bytes */
struct _IP_IO_PROTOCOL {
LIST_ENTRY OpenList; /* +0x08: 16 bytes */
LIST_ENTRY PendingSndList; /* +0x18: 16 bytes */
EFI_HANDLE Image; /* +0x20 (32) */
EFI_HANDLE Controller; /* +0x28 (40) */
VOID *Protocol; /* +0x38 (56) */
UINT8 State; /* +0x40 (64): 1=opened */
UINT8 pad[0x90 - 0x41];
UINT8 IpVersion; /* +0x90 (144): 4 or 6 */
VOID *Ipv4Protocol; /* +0x98? */
};
/* UDP4_SERVICE - 80 bytes (0x50) */
struct _UDP4_SERVICE {
UINT32 Signature; /* +0x00: 0x34737055 = 'Udp4' */
UINT8 Reserved[4]; /* +0x04 */
EFI_STATUS (EFIAPI *CreateChild)(EFI_HANDLE *ChildHandle); /* +0x08 */
EFI_STATUS (EFIAPI *DestroyChild)(EFI_HANDLE *ChildHandle); /* +0x10 */
EFI_HANDLE ImageHandle; /* +0x18 */
EFI_HANDLE ControllerHandle;/* +0x20 */
LIST_ENTRY ChildrenList; /* +0x28 (16 bytes) */
UINTN ChildrenCount; /* +0x38 */
IP_IO_PROTOCOL *IpIo; /* +0x40 */
EFI_EVENT TimerEvent; /* +0x48 */
};
/* UDP4_INSTANCE - 336 bytes (0x150) */
struct _UDP4_INSTANCE {
UINT32 Signature; /* +0x000: 0x49706455 = 'UdpI' */
UINT8 pad0[4]; /* +0x004 */
LIST_ENTRY Link; /* +0x008 (16 bytes) */
UDP4_SERVICE *Service; /* +0x018 (24) */
EFI_UDP4_CONFIG_DATA ConfigData; /* +0x020 (32): 36 bytes */
UINT8 padConfig[0x40 - 0x44]; /* fill to 0x40 */
EFI_UDP4_PROTOCOL Udp4Protocol; /* +0x040 (64): 64 bytes */
UINT8 pad1[0x10]; /* +0x080..0x090 */
UINT16 IsConfigured; /* +0x090 (144) */
UINT8 IsNoReconfig; /* +0x092 (146) */
UINT8 pad2[6]; /* +0x093 */
NET_MAP TxTokens; /* +0x098 (152): 24 bytes */
NET_MAP RxTokens; /* +0x0C0 (192): 24 bytes */
NET_MAP McastIps; /* +0x0E8 (232): 24 bytes */
LIST_ENTRY DeliveredDgramQue; /* +0x110 (272): 16 bytes */
LIST_ENTRY DeliveredRxTokensQue; /* +0x120 (288): 16 bytes */
UINT16 HeadSum; /* +0x130 (304) */
UINT64 LastStatus; /* +0x138 (312) */
IPIO_INFO *IpInfo; /* +0x140 (320) */
UINT8 DestroyPending; /* +0x148 (328) */
};
/*============================================================================
* Global data declarations
*============================================================================*/
extern EFI_BOOT_SERVICES *BootServices;
extern EFI_RUNTIME_SERVICES *RuntimeServices;
extern EFI_HANDLE ImageHandle_0;
extern EFI_HANDLE ImageHandle_1;
extern UINT16 gEphemeralPort;
/*============================================================================
* Function prototypes - Udp4Driver.c
*============================================================================*/
EFI_STATUS
EFIAPI
Udp4DriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
);
EFI_STATUS
EFIAPI
Udp4DriverBindingStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
);
EFI_STATUS
EFIAPI
Udp4DriverBindingStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer
);
EFI_STATUS
EFIAPI
Udp4ServiceBindingCreateChild (
IN EFI_SERVICE_BINDING_PROTOCOL *This,
IN OUT EFI_HANDLE *ChildHandle
);
EFI_STATUS
EFIAPI
Udp4ServiceBindingDestroyChild (
IN EFI_SERVICE_BINDING_PROTOCOL *This,
IN EFI_HANDLE ChildHandle
);
/*============================================================================
* Function prototypes - Udp4Impl.c
*============================================================================*/
EFI_STATUS
Udp4CreateService (
IN UDP4_SERVICE *Udp4Service,
IN EFI_HANDLE ImageHandle,
IN EFI_HANDLE ControllerHandle
);
VOID
EFIAPI
Udp4TimerHandler (
IN EFI_EVENT Event,
IN VOID *Context
);
EFI_STATUS
Udp4FindInstanceByConfig (
IN LIST_ENTRY *InstanceList,
IN EFI_UDP4_CONFIG_DATA *ConfigData,
IN UINT16 LocalPort
);
UINT16
Udp4GetPort (
IN LIST_ENTRY *InstanceList,
IN EFI_UDP4_CONFIG_DATA *ConfigData
);
BOOLEAN
Udp4MatchConfig (
IN EFI_UDP4_CONFIG_DATA *Config1,
IN EFI_UDP4_CONFIG_DATA *Config2
);
EFI_STATUS
Udp4ValidateTxToken (
IN UDP4_INSTANCE *Instance,
IN EFI_UDP4_COMPLETION_TOKEN *Token
);
VOID
Udp4DpcHandler (
IN VOID *Context,
IN VOID *DpcArg
);
VOID
Udp4DispatchRxPacket (
IN VOID *IcmpErr,
IN UINT8 IpVersion,
IN UINT32 *Headers,
IN NET_BUF *Packet,
IN VOID *Context
);
VOID
Udp4RecycleRxPacket (
IN NET_MAP_ITEM *Item,
IN VOID *Context
);
EFI_STATUS
Udp4CancelTxRx (
IN NET_MAP_ITEM *Item,
IN VOID *Context
);
BOOLEAN
Udp4MatchInstanceByFilter (
IN UDP4_INSTANCE *Instance,
IN NET_BUF *UdpHeader
);
UINTN
Udp4DeliverRxPacket (
IN UDP4_SERVICE *Service,
IN NET_BUF *Packet,
IN VOID *UdpHeaderInfo
);
EFI_STATUS
Udp4DeliverDgram (
IN UDP4_INSTANCE *Instance
);
VOID
Udp4RxProcess (
IN VOID *Context,
IN UINT32 *Session,
IN NET_BUF *Packet
);
VOID
Udp4SendIcmpError (
IN IP_IO_PROTOCOL *IpIo,
IN UINT32 *Session,
IN NET_BUF *UdpHeader
);
VOID
Udp4SendIcmpErrorFromInstance (
IN UDP4_INSTANCE *Instance,
IN UINT8 IpVersion,
IN UINT32 *Headers,
IN NET_BUF *Packet
);
VOID
Udp4TryDeliverToken (
IN UDP4_INSTANCE *Instance
);
/*============================================================================
* Function prototypes - Udp4Main.c
*============================================================================*/
EFI_STATUS
EFIAPI
Udp4Configure (
IN EFI_UDP4_PROTOCOL *This,
IN EFI_UDP4_CONFIG_DATA *ConfigData
);
EFI_STATUS
EFIAPI
Udp4Groups (
IN EFI_UDP4_PROTOCOL *This,
IN BOOLEAN JoinFlag,
IN VOID *MulticastAddr
);
EFI_STATUS
EFIAPI
Udp4Routes (
IN EFI_UDP4_PROTOCOL *This,
IN BOOLEAN DeleteRoute,
IN VOID *SubnetAddr,
IN VOID *SubnetMask,
IN VOID *GatewayAddr
);
EFI_STATUS
EFIAPI
Udp4Transmit (
IN EFI_UDP4_PROTOCOL *This,
IN EFI_UDP4_COMPLETION_TOKEN *Token
);
EFI_STATUS
EFIAPI
Udp4Transmit2 (
IN EFI_UDP4_PROTOCOL *This,
IN EFI_UDP4_COMPLETION_TOKEN *Token
);
EFI_STATUS
EFIAPI
Udp4Receive (
IN EFI_UDP4_PROTOCOL *This,
IN EFI_UDP4_COMPLETION_TOKEN *Token
);
EFI_STATUS
EFIAPI
Udp4Cancel (
IN EFI_UDP4_PROTOCOL *This,
IN VOID *Token
);
EFI_STATUS
EFIAPI
Udp4Poll (
IN EFI_UDP4_PROTOCOL *This
);
/*============================================================================
* Helper/library function prototypes
*============================================================================*/
VOID *CopyMem (VOID *Dest, const VOID *Src, UINTN Len);
VOID ZeroMem (VOID *Buf, UINTN Len);
INTN CompareMem (const VOID *Buf1, const VOID *Buf2, UINTN Len);
INTN InternalCompareMem (const VOID *Buf1, const VOID *Buf2, UINTN Len);
UINTN StrLen (const CHAR16 *Str);
UINTN StrnSize (const CHAR16 *Str, UINTN MaxLen);
UINTN AsciiStrLen (const CHAR8 *Str);
UINTN AsciiStrSize (const CHAR8 *Str);
VOID DebugPrintAssert (UINTN Severity, const CHAR8 *Format, ...);
VOID DebugBreak (VOID);
VOID *AllocatePool (UINTN Size);
VOID *AllocateZeroPool (UINTN Size);
VOID *AllocateCopyPool (UINTN Size, const VOID *Buf);
VOID FreePool (VOID *Ptr);
BOOLEAN IsListValid (LIST_ENTRY *ListHead);
VOID InitializeListHead (LIST_ENTRY *ListHead);
VOID InsertHeadList (LIST_ENTRY *ListHead, LIST_ENTRY *Entry);
VOID InsertTailList (LIST_ENTRY *ListHead, LIST_ENTRY *Entry);
BOOLEAN IsListEmpty (LIST_ENTRY *ListHead);
VOID RemoveEntryList (LIST_ENTRY *Entry);
BOOLEAN NetCompareMacAddr (UINT32 *Addr1, UINT32 *Addr2);
UINT16 NetChecksum (VOID *Data, UINTN Len);
UINT16 NetCalcSum16 (UINT16 *Data, UINTN Len);
NET_BUF *NetbufAllocStruct (UINT32 TotalSize);
VOID NetbufFree (NET_BUF *Nbuf);
NET_BUF *NetbufAlloc (UINTN Len);
VOID *NetbufGetProtocolData (NET_BUF *Nbuf, UINTN Offset);
VOID NetbufTrim (NET_BUF *Nbuf, UINTN Len);
VOID NetbufCopy (NET_BUF *Nbuf, UINTN Offset, UINTN Len, VOID *Buf);
VOID NetbufInsert (NET_BUF *Nbuf, UINTN Offset, UINTN Len);
UINTN NetbufGetByte (NET_BUF *Nbuf, UINTN Offset, VOID **Buf);
NET_BUF *NetbufClone (NET_BUF *Nbuf);
VOID *NetbufGetFragment (NET_BUF *Nbuf, UINTN Offset);
VOID NetMapInit (NET_MAP *Map);
VOID NetMapClean (NET_MAP *Map);
UINTN NetMapGetCount (NET_MAP *Map);
EFI_STATUS NetMapInsert (NET_MAP *Map, VOID *Key, VOID *Value);
EFI_STATUS NetMapInsertTail (NET_MAP *Map, VOID *Key, VOID *Value);
NET_MAP_ITEM *NetMapFindKey (NET_MAP *Map, VOID *Key);
VOID NetMapRemoveEntry (NET_MAP *Map, NET_MAP_ITEM *Item);
NET_MAP_ITEM *NetMapGetNext (NET_MAP *Map, NET_MAP_ITEM *Item);
EFI_STATUS NetMapIterate (NET_MAP *Map, EFI_STATUS (*Callback)(NET_MAP_ITEM *, VOID *), VOID *Context);
EFI_STATUS NetLibCreateChildRx (EFI_HANDLE ImageHandle, EFI_HANDLE ControllerHandle,
EFI_HANDLE *ChildHandle, UINT8 IpVersion,
VOID *Protocol);
EFI_STATUS NetLibDestroyChildRx (EFI_HANDLE ImageHandle, EFI_HANDLE ControllerHandle,
EFI_HANDLE ChildHandle, UINT8 IpVersion);
EFI_STATUS NetLibDestroyServiceChild (EFI_HANDLE ImageHandle, EFI_HANDLE ControllerHandle,
EFI_GUID *ServiceBindingGuid, EFI_HANDLE ChildHandle);
EFI_STATUS EfiGetSystemConfigurationTable (EFI_GUID *Guid, VOID **Table);
CHAR8 *GetBestLanguage (const CHAR8 *SupportedLanguages, BOOLEAN Ascii, ...);
UINT64 GetTick (VOID);
#endif /* __UDP4_DXE_H__ */