Newer
Older
AMI-Aptio-BIOS-Reversed / Dhcp6Dxe / Dhcp6Dxe.h
@Ajax Dong Ajax Dong 2 days ago 18 KB Init
#ifndef __DHCP6DXE_H__
#define __DHCP6DXE_H__

#include "Uefi.h"

/*============================================================================
 * Dhcp6Dxe - DHCPv6 DXE Driver
 * Source files:
 *   Dhcp6Driver.c    - Driver binding, entry point, Start/Stop
 *   Dhcp6Impl.c      - EFI_DHCP6_PROTOCOL implementation (Solicit/Request/Renew/Decline/Release)
 *   Dhcp6Io.c        - DHCPv6 network I/O (packet TX/RX, retransmission, state machine)
 *   Dhcp6Utility.c   - DHCP option encoding/decoding helpers
 * External:
 *   DxeUdpIoLib.c    - UdpIo wrapper (UDP TX/RX)
 *   DxeNetLib         - NetBuffer, CopyMem, ZeroMem, etc.
 *   DxeIpIoLib        - IpIo wrapper (IP-level I/O)
 *============================================================================*/

/*============================================================================
 * Protocol GUIDs
 *============================================================================*/
#define DHCP6_SERVICE_SIGNATURE  0x49506455   /* 'UdpI' -- UdpIo wrapper instance */
#define DHCP6_INSTANCE_SIGNATURE 0x53706455   /* 'UdpS' -- Udp6 service instance */

/* EFI DHCP6 Protocol (AMI) */
#define EFI_DHCP6_PROTOCOL_GUID  {0x8f3c7a8b,0xc884,0x4e3b,\
                                  {0x9e,0x7e,0x5c,0x7b,0x4c,0x7b,0x4c,0x7b}}

/*============================================================================
 * DHCPv6 Message Types
 *============================================================================*/
#define DHCP6_MSG_SOLICIT    1
#define DHCP6_MSG_ADVERTISE  2
#define DHCP6_MSG_REQUEST    3
#define DHCP6_MSG_CONFIRM    4
#define DHCP6_MSG_RENEW      5
#define DHCP6_MSG_REBIND     6
#define DHCP6_MSG_REPLY      7
#define DHCP6_MSG_RELEASE    8
#define DHCP6_MSG_DECLINE    9
#define DHCP6_MSG_RECONFIGURE  10
#define DHCP6_MSG_INFORMATION_REQ 11
#define DHCP6_MSG_RELAY_FORWARD  12
#define DHCP6_MSG_RELAY_REPLY    13

/*============================================================================
 * DHCPv6 Option Codes
 *============================================================================*/
#define DHCP6_OPT_CLIENTID      1
#define DHCP6_OPT_SERVERID      2
#define DHCP6_OPT_IA_NA         3
#define DHCP6_OPT_IA_TA         4
#define DHCP6_OPT_IAADDR        5
#define DHCP6_OPT_ORO           6
#define DHCP6_OPT_PREFERENCE    7
#define DHCP6_OPT_ELAPSED_TIME  8
#define DHCP6_OPT_RELAY_MSG     9
#define DHCP6_OPT_AUTH          11
#define DHCP6_OPT_UNICAST       12
#define DHCP6_OPT_STATUS_CODE   13
#define DHCP6_OPT_RAPID_COMMIT  14

/*============================================================================
 * DHCPv6 Status Codes (RFC 3315)
 *============================================================================*/
#define DHCP6_STATUS_SUCCESS    0
#define DHCP6_STATUS_UNSPEC     1
#define DHCP6_STATUS_NOADDRS    2
#define DHCP6_STATUS_NOBINDING  3
#define DHCP6_STATUS_INVALID    4
#define DHCP6_STATUS_NOSERVER   5

/*============================================================================
 * DHCPv6 Duid Types
 *============================================================================*/
#define DHCP6_DUID_LLT          1
#define DHCP6_DUID_EN           2
#define DHCP6_DUID_LL           3

/*============================================================================
 * Constants
 *============================================================================*/
#define DHCP6_DEFAULT_IRT            1       /* Initial retransmission time */
#define DHCP6_DEFAULT_MRT            120     /* Max retransmission time */
#define DHCP6_DEFAULT_MRC            0       /* Max retransmission count */
#define DHCP6_DEFAULT_MRD            0       /* Max retransmission duration */

#define DHCP6_PACKET_SIZE            1024
#define DHCP6_MAX_IA_ADDRESSES       16
#define DHCP6_MAX_OPTION_COUNT       20

/*============================================================================
 * DHCPv6 Option TLV structure
 *============================================================================*/
typedef struct {
  UINT16  OpCode;      /* Network byte order */
  UINT16  OpLen;       /* Network byte order */
  UINT8   Data[0];     /* Variable-length data */
} DHCP6_OPTION_HEADER;

/*============================================================================
 * DHCPv6 Packet Header
 *============================================================================*/
typedef struct {
  UINT32  Size;         /* Allocated buffer size */
  UINT32  Length;       /* Actual data length */
  UINT8   MessageType;  /* DHCPv6 message type */
  UINT8   TransactionId[3]; /* Transaction ID (3 bytes) */
  /* Options follow... */
} DHCP6_PACKET;

/*============================================================================
 * Client Identifier (DUID)
 *============================================================================*/
typedef struct {
  UINT16  DuidType;    /* Network byte order */
  UINT16  HardwareType; /* Network byte order */
  UINT8   LinkLayerAddress[0]; /* Variable length */
} DHCP6_DUID_HEADER;

/*============================================================================
 * IA Address Option (RFC 3315 Section 22.6)
 *============================================================================*/
typedef struct {
  UINT8   IpAddress[16];  /* IPv6 address */
  UINT32  PreferredLifetime;  /* Network byte order */
  UINT32  ValidLifetime;      /* Network byte order */
} DHCP6_IA_ADDRESS;

/*============================================================================
 * IA_NA Option (RFC 3315 Section 22.4)
 *============================================================================*/
typedef struct {
  UINT32  IaId;         /* Network byte order */
  UINT32  T1;           /* Network byte order */
  UINT32  T2;           /* Network byte order */
} DHCP6_IA_NA_HEADER;

/*============================================================================
 * DHCPv6 Configuration Data (user-provided config for protocol)
 *============================================================================*/
typedef struct {
  UINT16  OptionCount;               /* Number of option entries */
  DHCP6_OPTION_HEADER **OptionList;  /* Pointer array to option descriptors */
  UINT16  IaDescriptorType;          /* IA_NA(3) or IA_TA(4) */
  UINT32  IaId;                      /* IA ID value */
  DHCP6_DUID_HEADER *ClientId;       /* Client ID option data */
  UINT16  ClientIdLen;               /* Client ID length (big-endian) */
  UINT8   IaAddressInfo[24];         /* T1/T2 + IA address list */
} DHCP6_CONFIG_DATA;

/*============================================================================
 * IA Control Block (Cached IA information)
 *============================================================================*/
typedef struct {
  UINT32  IaState;            /* One of DHCP6_STATE_* below */
  DHCP6_DUID_HEADER *LastReply; /* Server ID from last REPLY */
  UINT32  IaAddressCount;     /* Number of IA addresses */
  UINT8   Reserved[4];
  /* IA addresses follow - each is:
   *   UINT8  IpAddr[16];
   *   UINT32 PreferredLifetime;
   *   UINT32 ValidLifetime;
   */
} IA_CB;

/*============================================================================
 * DHCPv6 States (matching UEFI spec)
 *============================================================================*/
#define DHCP6_STATE_INIT          0
#define DHCP6_STATE_SELECTING     1
#define DHCP6_STATE_REQUESTING    2
#define DHCP6_STATE_DECLINING     3
#define DHCP6_STATE_CONFIRMING    4
#define DHCP6_STATE_RELEASING     5
#define DHCP6_STATE_BOUND         6
#define DHCP6_STATE_RENEWING      7
#define DHCP6_STATE_REBINDING     8

/*============================================================================
 * Dhcp6 TX/RX Control Block (per-transaction)
 *============================================================================*/
typedef struct {
  LIST_ENTRY  Link;           /* Forward/Back link */
  UINT32      TransactionId;  /* Transaction ID (lower bytes) */
  DHCP6_PACKET *TxPacket;     /* Current TX packet */
  UINT64      Token;          /* Completion token */
  UINT8       RetransmitCount;    /* Retransmission attempt counter */
  UINT8       RetransmitMaxCount; /* MRC */
  UINT32      RetransmitCurTimeout;   /* Current RT */
  UINT32      RetransmitTimeout;   /* IRT */
  UINT32      RetransmitMaxTimeout;   /* MRT */
  UINT32      RetransmitDuration;  /* MRD */
  UINT32      RetransmitTotal;    /* Sum of all RTs */

  /* Solicitation retry counter (for Solicit-only retries) */
  UINT32      SolicitRetryCount;
  UINT32      SolicitMaxRetryCount;

  BOOLEAN     IsDecline;      /* true if this is a DECLINE/RELEASE */
} DHCP6_TX_CB;

/*============================================================================
 * Dhcp6 Advertise Selection (stored Advertise options for selecting server)
 *============================================================================*/
typedef struct {
  DHCP6_PACKET  *Packet;      /* Received Advertise packet */
  DHCP6_TX_CB   *TxCb;       /* Associated TX control block */
} DHCP6_AD_SELECT;

/*============================================================================
 * Dhcp6 Service structure (Dhcp6Driver.c - per-controller)
 *============================================================================*/
typedef struct _DHCP6_SERVICE {
  UINT32          Signature;       /* DHCP6_SERVICE_SIGNATURE */
  EFI_HANDLE      ControllerHandle;
  EFI_HANDLE      DriverBindingHandle;
  UINT32          NumOfChild;      /* Number of child protocol instances */

  /* IP/IO interfaces */
  VOID            *IpIo;            /* IPv6 IpIo */
  EFI_HANDLE      UdpIoHandle;      /* Created UDP 6 handle */
  VOID            *UdpIo;           /* UdpIo wrapper */
  VOID            *Udp6;            /* Udp6 protocol */

  /* UDP receive token and callback context */
  VOID            *RecvRequest;     /* outstanding recv request */
  VOID            *Udp6CfgData;     /* UDP6 config data */

  /* Client ID DUID */
  DHCP6_DUID_HEADER *ClientId;
  UINT32          TransactionIdSeed;    /* Seed for generating xid */

  /* Protocol instance list */
  LIST_ENTRY      InstanceList;

  /* Timer tick event */
  EFI_EVENT       TimerEvent;
} DHCP6_SERVICE;

/*============================================================================
 * Dhcp6 Protocol Instance structure
 *============================================================================*/
typedef struct _DHCP6_INSTANCE {
  UINT32            Signature;           /* DHCP6_INSTANCE_SIGNATURE */
  LIST_ENTRY        Link;                /* Link in service instance list */
  EFI_HANDLE        Handle;              /* Protocol handle */
  DHCP6_SERVICE     *Service;            /* Back pointer to service */

  /* Configuration + state */
  DHCP6_CONFIG_DATA *Config;             /* User-configured parameters */
  IA_CB             *IaCb;               /* IA control block */
  BOOLEAN           Configured;          /* Tracks if Configured */

  /* Advertise selection */
  DHCP6_AD_SELECT   *AdSelect;           /* Selected Advertise */
  UINT8             IaState;             /* Current IA state */
  EFI_STATUS        CompletionStatus;    /* Last Udp6Wrapped Status */

  /* TX control list head */
  LIST_ENTRY        TxList;              /* TX control blocks */
  LIST_ENTRY        RetryList;           /* TX retry blocks */

  /* Retransmission parameters for current TX state */
  UINT32            IaCbRetransmit;      /* IaCb state-driven retry */
  UINT32            RetransmitT1;        /* T1 or IRT */
  UINT32            RetransmitT2;        /* T2 or MRD */

  /* Elapsed time for current exchange */
  UINT64            StartTime;
  UINT64            IaTime;              /* Last bound/renewal time */
  UINT64            MediaPresent;
} DHCP6_INSTANCE;

/*============================================================================
 * EFI DHCP6 Protocol interfaces (mapped to function pointers)
 *============================================================================*/
typedef struct _EFI_DHCP6_PROTOCOL {
  EFI_STATUS (EFIAPI *Start)    (VOID *This);
  EFI_STATUS (EFIAPI *Stop)     (VOID *This);
  EFI_STATUS (EFIAPI *Solicit)  (VOID *This, UINT32 OptionCount,
                                 VOID *OptionList, VOID *IaCbData);
  EFI_STATUS (EFIAPI *Request)  (VOID *This, UINT32 OptionCount,
                                 VOID *OptionList, VOID *ClientId,
                                 VOID *IaCbData, UINT32 IaId);
  EFI_STATUS (EFIAPI *Renew)    (VOID *This, UINT32 OptionCount,
                                 VOID *OptionList);
  EFI_STATUS (EFIAPI *Decline)  (VOID *This, UINT32 OptionCount,
                                 VOID *OptionList);
  EFI_STATUS (EFIAPI *Release)  (VOID *This, UINT32 OptionCount,
                                 VOID *OptionList);
} EFI_DHCP6_PROTOCOL;

/*============================================================================
 * Global variable declarations (defined in Dhcp6Dxe.c)
 *============================================================================*/
extern EFI_HANDLE           gImageHandle;
extern EFI_SYSTEM_TABLE     *gSystemTable;
extern EFI_BOOT_SERVICES    *gBootServices;
extern EFI_RUNTIME_SERVICES *gRuntimeServices;

/*============================================================================
 * Forward declarations
 *============================================================================*/
/* Driver binding */
EFI_STATUS
EFIAPI
Dhcp6DriverEntryPoint (
  IN EFI_HANDLE            ImageHandle,
  IN EFI_SYSTEM_TABLE      *SystemTable
  );

EFI_STATUS
EFIAPI
Dhcp6DriverBindingSupported (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
  );

EFI_STATUS
EFIAPI
Dhcp6DriverBindingStart (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
  );

EFI_STATUS
EFIAPI
Dhcp6DriverBindingStop (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN UINTN                        NumberOfChildren,
  IN EFI_HANDLE                   *ChildHandleBuffer
  );

/* Protocol implementation (Dhcp6Impl.c) */
EFI_STATUS
EFIAPI
Dhcp6Start (
  IN EFI_DHCP6_PROTOCOL  *This
  );

EFI_STATUS
EFIAPI
Dhcp6Stop (
  IN EFI_DHCP6_PROTOCOL  *This
  );

EFI_STATUS
EFIAPI
Dhcp6Solicit (
  IN EFI_DHCP6_PROTOCOL  *This,
  IN UINT32              OptionCount,
  IN VOID                *OptionList,
  IN VOID                *ClientId,
  IN VOID                *IaCbData,
  IN UINT32              IaId
  );

EFI_STATUS
EFIAPI
Dhcp6Request (
  IN EFI_DHCP6_PROTOCOL  *This,
  IN UINT32              OptionCount,
  IN VOID                *OptionList,
  IN VOID                *ClientId,
  IN VOID                *IaCbData,
  IN UINT32              IaId
  );

EFI_STATUS
EFIAPI
Dhcp6Renew (
  IN EFI_DHCP6_PROTOCOL  *This
  );

EFI_STATUS
EFIAPI
Dhcp6Rebind (
  IN EFI_DHCP6_PROTOCOL  *This,
  IN UINT32              OptionCount,
  IN VOID                *OptionList
  );

EFI_STATUS
EFIAPI
Dhcp6RenewRebind (
  IN EFI_DHCP6_PROTOCOL  *This,
  IN UINT32              OptionCount,
  IN VOID                *OptionList
  );

EFI_STATUS
EFIAPI
Dhcp6Decline (
  IN EFI_DHCP6_PROTOCOL  *This,
  IN UINT32              OptionCount,
  IN VOID                *OptionList
  );

EFI_STATUS
EFIAPI
Dhcp6Release (
  IN EFI_DHCP6_PROTOCOL  *This,
  IN UINT32              OptionCount,
  IN VOID                *OptionList
  );

/*============================================================================
 * Internal function declarations (Dhcp6Io.c / Dhcp6Utility.c)
 *============================================================================*/
EFI_STATUS
Dhcp6BuildSolicitAdvertiseFw (
  IN DHCP6_INSTANCE  *Instance,
  IN OUT VOID        **Packet
  );

EFI_STATUS
Dhcp6BuildRequestFw (
  IN DHCP6_INSTANCE  *Instance,
  IN UINT16          *ServerId,
  OUT VOID           **Packet
  );

EFI_STATUS
Dhcp6BuildRenewFw (
  IN DHCP6_INSTANCE  *Instance,
  IN UINT16          *ServerId,
  OUT VOID           **Packet
  );

EFI_STATUS
Dhcp6BuildDeclineFw (
  IN DHCP6_INSTANCE  *Instance,
  IN UINT16          *IaOption,
  OUT VOID           **Packet
  );

EFI_STATUS
Dhcp6BuildReleaseFw (
  IN DHCP6_INSTANCE  *Instance,
  IN UINT16          *ServerId,
  OUT VOID           **Packet
  );

VOID
EFIAPI
Dhcp6TimerTicking (
  IN EFI_EVENT        Event,
  IN DHCP6_INSTANCE   *Instance
  );

EFI_STATUS
Dhcp6Transmit (
  IN DHCP6_INSTANCE   *Instance,
  IN DHCP6_PACKET     *Packet,
  IN DHCP6_TX_CB      *TxCb
  );

VOID
EFIAPI
Dhcp6ReceiveCallback (
  IN VOID             *Udp6Wrap,
  IN EFI_STATUS       Status,
  IN VOID             *Context,
  IN VOID             *RxToken
  );

VOID
Dhcp6AppendOption (
  IN VOID             *Buffer,
  IN UINT16           OpCode,
  IN UINT16           OpLen,
  IN VOID             *Data
  );

VOID *
Dhcp6FindOption (
  IN VOID             *Buffer,
  IN UINT16           BufLen,
  IN UINT16           OpCode
  );

VOID *
Dhcp6FindIaOption (
  IN VOID             *IaOptions,
  IN UINT16           IaLen,
  IN UINT16           IaType,
  IN VOID             *Config
  );

VOID
Dhcp6ParseIaAddresses (
  IN IA_CB            *IaCb,
  IN VOID             *IaOption,
  IN UINT16           IaLen,
  OUT VOID            *AddressArray,
  OUT UINT32          *AddressCount
  );

EFI_STATUS
Dhcp6UpdateIaAddress (
  IN DHCP6_INSTANCE   *Instance,
  IN VOID             *IaOption,
  IN UINT16           IaLen,
  IN UINT32           T1,
  IN UINT32           T2
  );

UINT32
Dhcp6CalculateIaT1T2 (
  IN UINT32           ValidLifetime,
  IN UINT32           T1,
  IN UINT32           T2
  );

EFI_STATUS
Dhcp6SolicitStateMachine (
  IN DHCP6_INSTANCE   *Instance,
  IN DHCP6_PACKET     *Packet,
  IN DHCP6_AD_SELECT  *AdSelect
  );

EFI_STATUS
Dhcp6MediaPresent (
  IN DHCP6_INSTANCE   *Instance,
  OUT BOOLEAN         *MediaPresent
  );

VOID    *Dhcp6AllocatePool   (UINTN Size);
VOID    *Dhcp6AllocateZeroPool (UINTN Size);
VOID    Dhcp6FreePool        (VOID *Buffer);
VOID    *Dhcp6CopyMem       (VOID *Dest, VOID *Src, UINTN Length);
VOID    Dhcp6ZeroMem        (VOID *Buffer, UINTN Length);
INTN    Dhcp6CompareMem     (VOID *Dest, VOID *Src, UINTN Length);
UINT16  Dhcp6SwapUint16     (UINT16 Value);
UINT32  Dhcp6SwapUint32     (UINT32 Value);

VOID    Dhcp6InitializeListHead (LIST_ENTRY *ListHead);
BOOLEAN Dhcp6IsListEmpty        (LIST_ENTRY *ListHead);
VOID    Dhcp6InsertHeadList     (LIST_ENTRY *ListHead, LIST_ENTRY *Entry);
VOID    Dhcp6InsertTailList     (LIST_ENTRY *ListHead, LIST_ENTRY *Entry);
VOID    Dhcp6RemoveEntryList    (LIST_ENTRY *Entry);

EFI_STATUS
UdpIoCreateService (
  IN  EFI_HANDLE     DriverBindingHandle,
  IN  EFI_HANDLE     ControllerHandle,
  IN  EFI_GUID       *ProtocolGuid,
  OUT VOID           **UdpIo
  );

VOID
UdpIoFreeService (
  IN VOID            *UdpIo
  );

EFI_STATUS
UdpIoRecv (
  IN VOID            *UdpIo,
  IN VOID            *Context,
  IN EFI_EVENT       *Event OPTIONAL
  );

VOID
UdpIoSend (
  IN VOID            *UdpIo,
  IN VOID            *Nbuf,
  IN EFI_STATUS      Status,
  IN VOID            *Context
  );

#endif /* __DHCP6DXE_H__ */