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