Newer
Older
AMI-Aptio-BIOS-Reversed / Udp6Dxe / Udp6Dxe.h
@Ajax Dong Ajax Dong 2 days ago 13 KB Init
/*++

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__ */