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