#ifndef __IP6DXE_H__
#define __IP6DXE_H__
#include "../../bios_source/uefi_headers/Uefi.h"
#include <stdint.h>
/*
* Ip6Dxe - IPv6 Network Stack DXE Driver
*
* Source: AmiNetworkPkg/UefiNetworkStack/Ipv6/Ip6Dxe/
* PE: Index 0152, Ip6Dxe.efi (sha256: c559cc7b50c059a3214ad238f60dc15176cba015c6267094e38b9be2820537d0)
*
* Implements:
* - EFI_IP6_SERVICE_BINDING_PROTOCOL (GUID 2C8759D5-5C2D-66EF-925F-B66C101957E2)
* - EFI_IP6_PROTOCOL (GUID 18A031AB-B443-4D1A-A5C0-0C09261E9F71)
* - EFI_IP6_CONFIG_PROTOCOL (GUID 107A772C-D5E1-11D4-9A46-0090273FC14D)
* - EFI_HII_CONFIG_ACCESS_PROTOCOL
*
* ============================================================
* THIS IS A REFERENCE HEADER FOR THE RECONSTRUCTED SOURCE
* ============================================================
*/
/* ------------------------------------------------------------------ */
/* Source files (from debug build paths) */
/* ------------------------------------------------------------------ */
/* Ip6Driver.c - Driver entry, DriverBinding, service create/destroy */
/* Ip6Impl.c - EFI_IP6_PROTOCOL (GetModeData, Configure, Groups, */
/* Routes, Neighbors, Transmit, Receive, Cancel, Poll) */
/* Ip6ConfigImpl.c - EFI_IP6_CONFIG_PROTOCOL (SetData, GetData, */
/* RegisterNotify, UnregisterNotify) */
/* Ip6ConfigNv.c - HII Configuration (EFI_HII_CONFIG_ACCESS) */
/* Ip6Common.c - Address info, prefix match, neighbor cache mgmt */
/* Ip6Output.c - IPv6 packet output, fragmentation, header building */
/* Ip6Nd.c - Neighbor Discovery (RFC 4861) */
/* Ip6Mld.c - Multicast Listener Discovery (MLDv2, RFC 3810) */
/* ------------------------------------------------------------------ */
/* ------------------------------------------------------------------ */
/* Protocol GUIDs (parsed from .rdata at known offsets) */
/* ------------------------------------------------------------------ */
#define EFI_MANAGED_NETWORK_SERVICE_BINDING_PROTOCOL_GUID \
{ 0xF36FF770, 0xA7E1, 0x42CF, { 0x9E, 0xD2, 0x56, 0xF0, 0xF2, 0x71, 0xF4, 0x4C } }
#define EFI_MANAGED_NETWORK_PROTOCOL_GUID \
{ 0xF44C00EE, 0x1F2C, 0x4A00, { 0xAA, 0x09, 0x1C, 0x9F, 0x3E, 0x08, 0x00, 0xA3 } }
#define EFI_IP6_SERVICE_BINDING_PROTOCOL_GUID \
{ 0x2C8759D5, 0x5C2D, 0x66EF, { 0x92, 0x5F, 0xB6, 0x6C, 0x10, 0x19, 0x57, 0xE2 } }
#define EFI_IP6_PROTOCOL_GUID \
{ 0x18A031AB, 0xB443, 0x4D1A, { 0xA5, 0xC0, 0x0C, 0x09, 0x26, 0x1E, 0x9F, 0x71 } }
#define EFI_IP6_CONFIG_PROTOCOL_GUID \
{ 0x107A772C, 0xD5E1, 0x11D4, { 0x9A, 0x46, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D } }
#define EFI_HII_DATABASE_PROTOCOL_GUID \
{ 0x0FD96974, 0x23AA, 0x4CDC, { 0xB9, 0xCB, 0x98, 0xD1, 0x77, 0x50, 0x32, 0x2A } }
#define EFI_HII_STRING_PROTOCOL_GUID \
{ 0xEF9FC172, 0xA1B2, 0x4693, { 0xB3, 0x27, 0x6D, 0x32, 0xFC, 0x41, 0x60, 0x42 } }
#define EFI_HII_CONFIG_ROUTING_PROTOCOL_GUID \
{ 0x587E72D7, 0xCC50, 0x4F79, { 0x82, 0x09, 0xCA, 0x29, 0x1F, 0xC1, 0xA1, 0x0F } }
/* ------------------------------------------------------------------ */
/* Key constants */
/* ------------------------------------------------------------------ */
/* CR has Bad Signature: pointers checked at known offsets from data */
/* Ip6Sb->Signature: ('I'|'P'<<8)|(('6'|'S'<<8)<<16) = 0x53365049 = 'IP6S' */
/* Ip6ConfigNv checks: *(a1-4)==0x49434649 ('IFCI'), *(v8-246)==0x43365049 ('IP6C') */
#define IP6_SERVICE_SIGNATURE 0x53365049 /* 'IP6S' */
#define IP6_INSTANCE_SIGNATURE 0x49365049 /* 'IP6I' */
#define IP6_P_CONFIG_SIGNATURE 0x50365049 /* 'IP6P' */
#define IP6_CONFIG_NV_SIGNATURE 0x49434649 /* 'IFCI' */
#define IP6C_CONFIG_SIGNATURE 0x43365049 /* 'IP6C' */
#define NET_BUF_SIGNATURE 0x6675626E /* 'nbuf' */
#define IP6_LINK_MTU 1280
#define IP6_DEFAULT_NEIGHBOR_TIMEOUT 30000 /* ms */
#define IP6_DEFAULT_ROUTER_TIMEOUT 1000 /* ms */
#define IP6_MAX_NEIGHBOR_CACHE 128
#define IP6_MAX_MLD_GROUPS 127
#define IP6_IFR_FRAME_SIZE 1592
/* ------------------------------------------------------------------ */
/* IP6_SERVICE - per-controller instance (allocated at sub_C80, ~4KB) */
/* Signature at +0: 0x53364950 ('IP6S') */
/* Layout determined by analyzing sub_9C4 (destroy) offsets */
/* ------------------------------------------------------------------ */
typedef struct _IP6_SERVICE {
UINT32 Signature; /* +0x00: 0x53364950 'IP6S' */
UINT32 State; /* +0x04: Lifecycle state */
/* +0x08: Reserved for service binding fields */
EFI_HANDLE ControllerHandle; /* +0x28 (from driver) */
EFI_HANDLE ImageHandle; /* +0x30 */
EFI_HANDLE MnpChildHandle; /* +0x60 (offset 96): MNP child */
VOID *MnpSb; /* +0x68: MNP service binding */
VOID *MnpProtocol; /* +0x70: MNP protocol */
VOID *DefaultInterface; /* +0x48 (offset 72): IpIf */
UINT8 IsConfigured; /* +0x58: bool */
UINT8 ConfigData[52]; /* +0x5C: Config parameters */
/* Timer and event fields */
VOID *TimerEvent; /* +0x48 from some refs */
/* Link-local address at +0x890 (2192) */
UINT8 LinkLocalAddr[16]; /* +0x890 */
UINT8 LinkLocalFlag; /* +0x8A0 */
UINT8 Destroying; /* +0x8A1 */
/* Controller + MNP refs at high offsets */
UINT64 SomeHandle; /* +0x910 (2320) */
UINT64 MnpCloseHandle; /* +0x918 (2328) */
UINT64 MnpProtocolHandle; /* +0x920 (2336) */
UINT64 MnpTxRxInterface; /* +0x928 (2344) */
/* Timers */
VOID *TimerMap; /* +0xBD8 (3032) */
VOID *EventMap; /* +0xBE0 (3040) */
/* Interface counts */
UINT32 InterfaceCount; /* +0x1058 (4184) */
} IP6_SERVICE;
/* ------------------------------------------------------------------ */
/* IP6_INSTANCE - per-child protocol instance */
/* Allocated at sub_1694, Signature at [-8] = 0x49365049 */
/* ------------------------------------------------------------------ */
typedef struct _IP6_INSTANCE {
UINT32 Signature; /* +0x00: 0x49365049 'IP6I' */
IP6_SERVICE *Service; /* +0x08: Back pointer */
UINT8 IsConfigured; /* +0x58 (88): bool */
UINT32 State; /* +0x128 (296): Instance state */
UINT8 StationAddress[16]; /* +0x12C (300): IPv6 address */
UINT32 PrefixLength; /* +0x13C (316) */
} IP6_INSTANCE;
/* ------------------------------------------------------------------ */
/* IP6_CONFIG_NV - HII config NV instance (size ~1592) */
/* Allocated at sub_FCC0, Signature at [-16] = 0x4E365049 */
/* ------------------------------------------------------------------ */
typedef struct _IP6_CONFIG_NV {
UINT32 Signature; /* +0x00: 0x4E365049 'IP6N' */
/* +4: parent back pointer */
UINT8 InterfaceId[8]; /* Interface ID */
UINT32 HostAddressCount;
UINT32 GatewayCount;
UINT32 DnsCount;
UINT8 HostAddresses[510]; /* +62: Host addr data */
UINT8 GatewayAddresses[510]; /* +572: Gateway addr data */
UINT8 DnsAddresses[510]; /* +1082: DNS addr data */
/* Route data, policy, DAD settings */
} IP6_CONFIG_NV;
/* ------------------------------------------------------------------ */
/* IP6_NEIGHBOR_ENTRY - neighbor cache entry (~48 bytes) */
/* ------------------------------------------------------------------ */
typedef struct _IP6_NEIGHBOR_ENTRY {
LIST_ENTRY Link; /* List link */
UINT8 Neighbor[16]; /* IPv6 address */
UINT8 MacAddress[6]; /* Link-layer address */
UINT8 Padding[2];
UINT32 State; /* Neighbor state */
UINT32 TicksRemaining; /* Timer ticks */
UINT32 RetransCount; /* Retransmission count */
} IP6_NEIGHBOR_ENTRY;
/* ------------------------------------------------------------------ */
/* IP6_ROUTE_ENTRY - routing table entry (~56 bytes) */
/* ------------------------------------------------------------------ */
typedef struct _IP6_ROUTE_ENTRY {
LIST_ENTRY Link; /* List link */
UINT8 Destination[16]; /* Destination prefix */
UINT8 PrefixLength; /* Prefix length */
UINT8 NextHop[16]; /* Next hop address */
UINT32 Flag; /* Route flags */
UINT32 RefCnt; /* Reference count */
UINT8 Pad[4];
} IP6_ROUTE_ENTRY;
/* ------------------------------------------------------------------ */
/* IP6_PREFIX_ENTRY - prefix list entry */
/* ------------------------------------------------------------------ */
typedef struct _IP6_PREFIX_ENTRY {
LIST_ENTRY Link;
UINT8 Prefix[16];
UINT8 PrefixLength;
UINT32 Lifetime;
UINT32 PreferredLifetime;
} IP6_PREFIX_ENTRY;
/* ------------------------------------------------------------------ */
/* IP6_ADDRESS_INFO - address information entry */
/* ------------------------------------------------------------------ */
typedef struct _IP6_ADDRESS_INFO {
LIST_ENTRY Link;
UINT8 Address[16];
UINT8 IsAnycast;
UINT8 PrefixLength;
UINT32 ValidLifetime;
UINT32 PreferredLifetime;
} IP6_ADDRESS_INFO;
/* ------------------------------------------------------------------ */
/* IP6_MLD_GROUP - MLD multicast group entry */
/* ------------------------------------------------------------------ */
typedef struct _IP6_MLD_GROUP {
LIST_ENTRY Link;
UINT8 GroupAddress[16];
UINT32 RefCnt;
UINT32 RetransTicks; /* Retransmission timer */
UINT32 FilterMode; /* MLDv2 filter mode */
} IP6_MLD_GROUP;
/* ------------------------------------------------------------------ */
/* Global state variables (stored in .data at 0x1AC00-0x1C240) */
/* ------------------------------------------------------------------ */
/* 0x1C178: SystemTable (gST) */
/* 0x1C180: BootServices (gBS) */
/* 0x1C188: ImageHandle (gImageHandle) */
/* 0x1C190: RuntimeServices (gRT) */
/* 0x1C1A0: HobList pointer */
/* 0x1C1A8: gHiiConfigRouting */
/* 0x1C1B0: gHiiDatabase */
/* 0x1C1B8: gHiiImage (presumed) */
/* 0x1C1C0: gHiiString */
/* 0x1C1C8: gHiiConfigAccess (presumed) */
/* 0x1C1E0: gDpcProtocol */
/* 0x1C170: gHostNameList (parsed from NetworkStackVar) */
/* 0x1BDA8: ImageHandle_0 (first driver binding handle) */
/* 0x1BDB0: ImageHandle_1 (second driver binding handle) */
/* ------------------------------------------------------------------ */
/* Ip6ConfigNv DataTypes (question IDs from sub_FCC0) */
/* ------------------------------------------------------------------ */
#define IP6_CONFIG_NV_INTERFACE_ID 257
#define IP6_CONFIG_NV_HOST_ADDRESS 258
#define IP6_CONFIG_NV_GATEWAY 259
#define IP6_CONFIG_NV_DNS 260
#define IP6_CONFIG_NV_SAVE 261
#define IP6_CONFIG_NV_COMMIT 262
#define IP6_CONFIG_NV_REFRESH 263
#define IP6_CONFIG_NV_FRAME_SIZE 264
/* ------------------------------------------------------------------ */
/* Signature constants for CR macro */
/* ------------------------------------------------------------------ */
/* Ip6Impl.c Verifies CR(IpSb, IP6_SERVICE_SIGNATURE) at +96 from data ptr */
/* Ip6ConfigNv.c Verifies CR(ConfigNv, IP6_CONFIG_NV) at different offsets */
#endif /* __IP6DXE_H__ */