/*++
Udp6Dxe.h - Udp6Dxe module header
Source: AmiNetworkPkg/UefiNetworkStack/Ipv6/Udp6Dxe/
Files: Udp6Driver.c, Udp6Main.c, Udp6Impl.c
Module: Udp6Dxe (UDPv6 DXE driver)
Guids:
0x9160: 5B1B31A1-9562-11D2-8E3F-00A0C969723B (EFI_DRIVER_BINDING_PROTOCOL)
0x9180: 6A7A5CFF-E8D9-4F70-BADA-75AB3025CE14 (EFI_COMPONENT_NAME2_PROTOCOL)
0x91A0: 4F948815-B4B9-43CB-8A33-90E060B34955 (EFI_UDP6_SERVICE_BINDING_PROTOCOL)
0x91C0: 66ED4721-3C98-4D3E-81E3-D03DD39A7254 (EFI_UDP6_PROTOCOL - child protocol)
0x9210: 18A031AB-B443-4D1A-A5C0-0C09261E9F71 (EFI_UDP6_PROTOCOL - alternate)
0x9220: 2C8759D5-5C2D-66EF-925F-B66C101957E2 (EFI_IP6_PROTOCOL)
0x9230: 107A772C-D5E1-11D4-9A46-0090273FC14D (EFI_IP6_CONFIG_PROTOCOL)
0x9250: D1405D16-7AFC-4695-BB12-41459D3695A2 (NetworkStackVar GUID)
--*/
#ifndef __UDP6DXE_H__
#define __UDP6DXE_H__
#include "../../uefi_headers/Uefi.h"
#include <Protocol/Network.h>
/*------------------------------------------------------------------------------
* GUID definitions (verified from binary .data section)
*----------------------------------------------------------------------------*/
#define EFI_UDP6_SERVICE_BINDING_PROTOCOL_GUID \
{ 0x4F948815, 0xB9B4, 0x43CB, { 0x8A, 0x33, 0x90, 0xE0, 0x60, 0xB3, 0x49, 0x55 } }
#define EFI_UDP6_PROTOCOL_GUID \
{ 0x2C8759D5, 0x5C2D, 0x66EF, { 0x92, 0x5F, 0xB6, 0x6C, 0x10, 0x19, 0x57, 0xE2 } }
#define EFI_IP6_PROTOCOL_GUID \
{ 0x2C777A10, 0xD5E1, 0x11D4, { 0x9A, 0x46, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D } }
#define EFI_IP6_CONFIG_PROTOCOL_GUID \
{ 0x480F8AE9, 0x0C46, 0x4AA9, { 0xBC, 0x89, 0xDB, 0x9F, 0xBA, 0x61, 0x98, 0x06 } }
#define EFI_DRIVER_BINDING_PROTOCOL_GUID \
{ 0x5B1B31A1, 0x9562, 0x11D2, { 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B } }
#define NETWORK_STACK_VAR_GUID \
{ 0xD1405D16, 0x7AFC, 0x4695, { 0xBB, 0x12, 0x41, 0x45, 0x9D, 0x36, 0x95, 0xA2 } }
/*------------------------------------------------------------------------------
* Forward declarations
*----------------------------------------------------------------------------*/
typedef struct _UDP6_SERVICE UDP6_SERVICE;
typedef struct _UDP6_INSTANCE UDP6_INSTANCE;
/*------------------------------------------------------------------------------
* CR (Container Record) macros for UDP6 structures
*----------------------------------------------------------------------------*/
#define UDP6_INSTANCE_SIGNATURE SIGNATURE_32('U','d','p','S')
#define UDP6_SERVICE_SIGNATURE SIGNATURE_32('U','d','p','6')
#define UDP6_INSTANCE_FROM_PROTOCOL(This) \
CR (This, UDP6_INSTANCE, Protocol, UDP6_INSTANCE_SIGNATURE)
#define UDP6_SERVICE_FROM_PROTOCOL(This) \
CR (This, UDP6_SERVICE, ServiceBinding, UDP6_SERVICE_SIGNATURE)
/*------------------------------------------------------------------------------
* EFI_UDP6_CONFIG_DATA (52 bytes = 0x34)
* Layout matches the template at 0x9318 in .data.
*----------------------------------------------------------------------------*/
typedef struct {
UINT8 AcceptPromiscuous; /* +0x00 */
UINT8 AcceptAnyPort; /* +0x01 */
UINT8 AllowDuplicatePort; /* +0x02 */
UINT8 TrafficClass; /* +0x03 */
UINT8 HopLimit; /* +0x04 */
UINT8 FlowLabel[3]; /* +0x05-0x07 (24-bit big-endian) */
UINT8 ReceiveTimeout; /* +0x08 */
UINT8 TransmitTimeout; /* +0x09 */
UINT16 StationPort; /* +0x0A (network byte order) */
UINT16 RemotePort; /* +0x0C (network byte order) */
UINT8 Pad0[2]; /* +0x0E-0x0F alignment */
EFI_IPv6_ADDRESS StationAddress; /* +0x10 (16 bytes) */
EFI_IPv6_ADDRESS RemoteAddress; /* +0x20 (16 bytes) */
UINT32 Pad1[3]; /* +0x30-0x3B padding (12 bytes) */
} EFI_UDP6_CONFIG_DATA; /* 0x3C bytes? actually 0x34 based on binary usage */
/*------------------------------------------------------------------------------
* EFI_UDP6_PROTOCOL (7 functions, 56 bytes = 0x38)
*----------------------------------------------------------------------------*/
typedef struct _EFI_UDP6_PROTOCOL EFI_UDP6_PROTOCOL;
typedef struct {
EFI_EVENT Event;
EFI_STATUS Status;
union {
VOID *RxData;
VOID *TxData;
} Packet;
} EFI_UDP6_COMPLETION_TOKEN;
typedef EFI_STATUS (EFIAPI *EFI_UDP6_GET_MODE_DATA)(
IN EFI_UDP6_PROTOCOL *This,
OUT EFI_UDP6_CONFIG_DATA *Udp6ConfigData,
OUT VOID *Ip6ModeData,
OUT VOID *McastDb,
OUT VOID *McastDbCount
);
typedef EFI_STATUS (EFIAPI *EFI_UDP6_CONFIGURE)(
IN EFI_UDP6_PROTOCOL *This,
IN EFI_UDP6_CONFIG_DATA *UdpConfigData OPTIONAL
);
typedef EFI_STATUS (EFIAPI *EFI_UDP6_GROUPS)(
IN EFI_UDP6_PROTOCOL *This,
IN BOOLEAN JoinFlag,
IN EFI_IPv6_ADDRESS *MulticastAddress OPTIONAL
);
typedef EFI_STATUS (EFIAPI *EFI_UDP6_TRANSMIT)(
IN EFI_UDP6_PROTOCOL *This,
IN OUT EFI_UDP6_COMPLETION_TOKEN *Token
);
typedef EFI_STATUS (EFIAPI *EFI_UDP6_RECEIVE)(
IN EFI_UDP6_PROTOCOL *This,
IN OUT EFI_UDP6_COMPLETION_TOKEN *Token
);
typedef EFI_STATUS (EFIAPI *EFI_UDP6_CANCEL)(
IN EFI_UDP6_PROTOCOL *This,
IN EFI_UDP6_COMPLETION_TOKEN *Token OPTIONAL
);
typedef EFI_STATUS (EFIAPI *EFI_UDP6_POLL)(
IN EFI_UDP6_PROTOCOL *This
);
struct _EFI_UDP6_PROTOCOL {
EFI_UDP6_GET_MODE_DATA GetModeData; /* +0x00 */
EFI_UDP6_CONFIGURE Configure; /* +0x08 */
EFI_UDP6_GROUPS Groups; /* +0x10 */
EFI_UDP6_TRANSMIT Transmit; /* +0x18 */
EFI_UDP6_RECEIVE Receive; /* +0x20 */
EFI_UDP6_CANCEL Cancel; /* +0x28 */
EFI_UDP6_POLL Poll; /* +0x30 */
};
/*------------------------------------------------------------------------------
* UDP6_INSTANCE - per-open instance of Udp6 protocol (0x158 bytes)
* Offsets verified against binary decompilation (sub_B50, sub_253C, sub_2A58).
*----------------------------------------------------------------------------*/
struct _UDP6_INSTANCE {
UINT32 Signature; /* +0x000: 'UdpS' (0x53706455) */
UINT32 Reserved0; /* +0x004: padding */
LIST_ENTRY ServiceLink; /* +0x008: link to UDP6_SERVICE.InstanceList */
UDP6_SERVICE *Service; /* +0x018: owning UDP6_SERVICE */
EFI_UDP6_PROTOCOL Protocol; /* +0x020: published protocol interface (0x38 bytes) */
EFI_UDP6_CONFIG_DATA ConfigData; /* +0x058: active configuration (0x34 bytes) */
UINT32 Reserved1[5]; /* +0x08C-0x09F: pads to match binary layout */
UINT8 IsConfigured; /* +0x098: TRUE if configured */
UINT8 IsNoReceive; /* +0x099: TRUE if no receive */
UINT8 Pad0[6]; /* +0x09A-0x09F alignment */
NET_MAP TxTokens; /* +0x0A0: pending TX completion tokens (40 bytes) */
NET_MAP RxTokens; /* +0x0C8: pending RX completion tokens (40 bytes) */
NET_MAP McastIps; /* +0x0F0: multicast group list (40 bytes) */
LIST_ENTRY DeliveredDgramQue; /* +0x118: delivered datagram queue (16 bytes) */
UINT8 ExtData[0x30]; /* +0x128-0x157: extra fields (IcmpType, IpInfo, etc.) */
};
/*------------------------------------------------------------------------------
* UDP6_SERVICE - per-controller service instance (0x50 bytes = 80)
*----------------------------------------------------------------------------*/
struct _UDP6_SERVICE {
UINT32 Signature; /* +0x00: 'Udp6' (0x36706455) */
UINT32 Reserved; /* +0x04: padding */
EFI_GUID Guid; /* +0x08? No, ServiceBinding at +0x08 */
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;/* +0x08: CreateChild / DestroyChild */
EFI_HANDLE ImageHandle; /* +0x18: parent image handle */
EFI_HANDLE ControllerHandle; /* +0x20: controller handle */
LIST_ENTRY InstanceList; /* +0x28: list of UDP6_INSTANCE */
UINTN InstanceCount; /* +0x38: number of instances */
VOID *IpIo; /* +0x40: IP I/O interface (allocated 0xA0 = 160 bytes) */
EFI_EVENT TimerEvent; /* +0x48: periodic timer (500ms) */
BOOLEAN InDestroy; /* +0x50? actually at InstanceServiceLink area */
};
/*------------------------------------------------------------------------------
* EFI_UDP6_HEADER (8 bytes)
*----------------------------------------------------------------------------*/
typedef struct {
UINT16 SrcPort; /* +0x00: source port (NBO) */
UINT16 DstPort; /* +0x02: destination port (NBO) */
UINT16 Length; /* +0x04: datagram length (NBO) */
UINT16 Checksum; /* +0x06: UDP checksum (NBO) */
} EFI_UDP6_HEADER; /* 8 bytes */
/*------------------------------------------------------------------------------
* Internal helper function declarations
*----------------------------------------------------------------------------*/
/* Udp6Driver.c */
EFI_STATUS
EFIAPI
Udp6DriverEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
);
EFI_STATUS
EFIAPI
Udp6DriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
);
EFI_STATUS
EFIAPI
Udp6DriverBindingStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
);
EFI_STATUS
EFIAPI
Udp6DriverBindingStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer
);
/* Udp6Main.c */
EFI_STATUS
EFIAPI
Udp6GetModeData (
IN EFI_UDP6_PROTOCOL *This,
OUT EFI_UDP6_CONFIG_DATA *Udp6ConfigData,
OUT VOID *Ip6ModeData,
OUT VOID *McastDb,
OUT VOID *McastDbCount
);
EFI_STATUS
EFIAPI
Udp6Configure (
IN EFI_UDP6_PROTOCOL *This,
IN EFI_UDP6_CONFIG_DATA *UdpConfigData OPTIONAL
);
EFI_STATUS
EFIAPI
Udp6Groups (
IN EFI_UDP6_PROTOCOL *This,
IN BOOLEAN JoinFlag,
IN EFI_IPv6_ADDRESS *MulticastAddress OPTIONAL
);
EFI_STATUS
EFIAPI
Udp6Transmit (
IN EFI_UDP6_PROTOCOL *This,
IN OUT EFI_UDP6_COMPLETION_TOKEN *Token
);
EFI_STATUS
EFIAPI
Udp6Receive (
IN EFI_UDP6_PROTOCOL *This,
IN OUT EFI_UDP6_COMPLETION_TOKEN *Token
);
EFI_STATUS
EFIAPI
Udp6Cancel (
IN EFI_UDP6_PROTOCOL *This,
IN EFI_UDP6_COMPLETION_TOKEN *Token OPTIONAL
);
EFI_STATUS
EFIAPI
Udp6Poll (
IN EFI_UDP6_PROTOCOL *This
);
/* Udp6Impl.c */
EFI_STATUS
Udp6ServiceBindingCreateChild (
IN EFI_SERVICE_BINDING_PROTOCOL *This,
OUT EFI_HANDLE *ChildHandle
);
EFI_STATUS
EFIAPI
Udp6ServiceBindingDestroyChild (
IN EFI_SERVICE_BINDING_PROTOCOL *This,
IN EFI_HANDLE ChildHandle
);
VOID
EFIAPI
Udp6TimerHandler (
IN EFI_EVENT Event,
IN VOID *Context
);
VOID
EFIAPI
Udp6DgramSent (
IN VOID *Context,
IN BOOLEAN IsMulticast,
IN VOID *Packet,
IN VOID *Session,
IN UINT8 IpProtocol
);
VOID
EFIAPI
Udp6DgramRcvd (
IN VOID *Context,
IN BOOLEAN IsMulticast,
IN VOID *Packet,
IN VOID *Session,
IN UINT8 IpProtocol
);
VOID
EFIAPI
Udp6DgramRcvdIcmpError (
IN VOID *Context,
IN BOOLEAN IsMulticast,
IN VOID *Packet,
IN VOID *Session,
IN UINT8 IpProtocol
);
BOOL
Udp6InstanceMatchDgram (
IN UDP6_INSTANCE *Instance,
IN NET_BUF *Packet,
IN UINT16 SrcPort,
IN EFI_IPv6_ADDRESS *SrcAddr,
IN UINT16 DstPort,
IN EFI_IPv6_ADDRESS *DstAddr
);
EFI_STATUS
Udp6DeliverDgram (
IN UDP6_INSTANCE *Instance,
IN NET_BUF *Packet,
IN UINT16 SrcPort,
IN EFI_IPv6_ADDRESS *SrcAddr,
IN UINT16 DstPort,
IN EFI_IPv6_ADDRESS *DstAddr
);
VOID
Udp6RecycleRxData (
IN UDP6_INSTANCE *Instance,
IN VOID *RxData
);
/*------------------------------------------------------------------------------
* Global variables
*----------------------------------------------------------------------------*/
extern EFI_HANDLE gImageHandle;
extern EFI_SYSTEM_TABLE *gSystemTable;
extern EFI_BOOT_SERVICES *gBS;
extern EFI_RUNTIME_SERVICES *gRT;
extern EFI_HANDLE gControllerHandle;
extern UINT16 gUdp6RandomPort;
extern EFI_DRIVER_BINDING_PROTOCOL gUdp6DriverBinding;
extern EFI_COMPONENT_NAME_PROTOCOL gUdp6ComponentName;
extern EFI_COMPONENT_NAME2_PROTOCOL gUdp6ComponentName2;
/*------------------------------------------------------------------------------
* GUID references
*----------------------------------------------------------------------------*/
extern EFI_GUID gEfiDriverBindingProtocolGuid;
extern EFI_GUID gEfiUdp6ServiceBindingProtocolGuid;
extern EFI_GUID gEfiUdp6ProtocolGuid;
extern EFI_GUID gEfiIp6ProtocolGuid;
extern EFI_GUID gEfiIp6ConfigProtocolGuid;
extern EFI_GUID gNetworkStackVarGuid;
#endif /* __UDP6DXE_H__ */