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