Newer
Older
AMI-Aptio-BIOS-Reversed / AmiNetworkPkg / UefiNetworkStack / Ipv4 / TcpDxe / TcpDxe.h
@Ajax Dong Ajax Dong 2 days ago 18 KB Full restructure
/** @file
  TcpDxe.h - TCP Protocol DXE Driver Header

  Copyright (c) 2024, AMI. All rights reserved.
  SPDX-License-Identifier: BSD-2-Clause-Patent

  TCP v4/v6 protocol driver for UEFI network stack.
  Implements EFI_TCP4_PROTOCOL and EFI_TCP6_PROTOCOL with
  full TCP state machine, retransmission, window management,
  and socket layer integration.

  PE file: 0139_TcpDxe_57281c91e120/TcpDxe.efi
  Image size: 0x13700
  .text: 0x2c0 - 0xdda0
  .rdata: 0xdda0 - 0x12360
  .data: 0x12360 - 0x127a0
**/

#ifndef __TCPDXE_H__
#define __TCPDXE_H__

#include <Uefi.h>

//
// Module global variables (from .data section)
//
extern EFI_HANDLE             gImageHandle;
extern EFI_SYSTEM_TABLE       *gST;
extern EFI_BOOT_SERVICES      *gBS;
extern EFI_RUNTIME_SERVICES   *gRT;
extern EFI_EVENT              gTcpTimerEvent;
extern UINT32                 gTcpTimerRefCnt;
extern LIST_ENTRY             gTcbList;
extern UINT32                 gTcpSeed;
extern UINT32                 gTcpTick;

//
// Constants
//
#define TCP_SIG                  SIGNATURE_32 ('T', 'C', 'P', 'B')
#define SOCK_SIG                 SIGNATURE_32 ('S', 'O', 'C', 'K')
#define TCP_SERVICE_SIG           SIGNATURE_32 ('T', 'C', 'P', 'S')

#define TCP_PROTOCOL_VERSION_4    4
#define TCP_PROTOCOL_VERSION_6    6

#define TCP_TIMER_INTERVAL_MS     2000000   // 2 seconds in microseconds
#define TCP_TICKS_PER_SECOND      10
#define TCP_TWSR                  3         // 2MSL = 3 ticks = 30s

//
// TCP States
//
#define TCP_CLOSED       0
#define TCP_LISTEN       1
#define TCP_SYN_SENT     2
#define TCP_SYN_RCVD     3
#define TCP_ESTABLISHED  4
#define TCP_FIN_WAIT_1   5
#define TCP_FIN_WAIT_2   6
#define TCP_CLOSING      7
#define TCP_TIME_WAIT    8
#define TCP_CLOSE_WAIT   9
#define TCP_LAST_ACK     10
#define TCP_MAX_STATE    11

//
// TCP header flags
//
#define TCP_FLG_FIN      0x01
#define TCP_FLG_SYN      0x02
#define TCP_FLG_RST      0x04
#define TCP_FLG_PSH      0x08
#define TCP_FLG_ACK      0x10
#define TCP_FLG_URG      0x20

//
// Dispatcher event codes (n7 in TcpDispatcher)
//
#define TCP_EVENT_INIT              0
#define TCP_EVENT_CONFIG            1
#define TCP_EVENT_CONNECT           2
#define TCP_EVENT_ATTACH_PCB        3
#define TCP_EVENT_ROUTE             4
#define TCP_EVENT_ACCEPT            5
#define TCP_EVENT_RCVD              6
#define TCP_EVENT_POLL              7
#define TCP_EVENT_CLOSE             8
#define TCP_EVENT_CLOSE_PROPER      9
#define TCP_EVENT_ABORT             10
#define TCP_EVENT_COMPLETE          11
#define TCP_EVENT_IP_SEND           12
#define TCP_EVENT_IP_CONFIG         13

//
// TCB flags
//
#define TCP_FLG_TIIER_ON            BIT13   // 0x2000 - timer is active
#define TCP_FLG_RETX_ON             BIT14   // 0x4000 - retransmit timer active

//
// Socket states
//
#define SOCK_STATE_UNINIT           0
#define SOCK_STATE_INIT             1
#define SOCK_STATE_CONNECTING       2
#define SOCK_STATE_CONNECTED        3
#define SOCK_STATE_LISTENING        4
#define SOCK_STATE_RCVD_CLOSE       5
#define SOCK_STATE_CLOSED           6

//
// TCP defaults
//
#define TCP_DEFAULT_SEG             1460
#define TCP_DEFAULT_CWND            5840
#define TCP_DEFAULT_RCV_WND          5840
#define TCP_DEFAULT_KEEP_ALIVE      7200   // 2 hours in seconds
#define TCP_DEFAULT_MAXX_RTX        12
#define TCP_DEFAULT_TTL              255
#define TCP_SSTRRESH_INIT           65535

//
// Timer constants (in 100ms ticks)
//
#define TCP_TMR_CONNECT            (75 * 10)  // 75s
#define TCP_TMR_RETX               (3 * 10)    // 3s (initial)
#define TCP_TMR_PROBE              (1 * 10)    // 1s
#define TCP_TMR_KEEP_ALIVE         (7200 * 10) // 2h
#define TCP_TMR_FIN_WAIT2          (600 * 10)   // 60s
#define TCP_TMR_TIME_WAIT          (30 * 10)    // 30s (2MSL)
#define TCP_TMR_MAXX_RETX          300       // 30s max

//
// RTO calculation (Van Jacobson)
//
#define TCP_RTO_INITIAL            3000      // 3s in ms
#define TCP_RTO_MIN                  200       // 200ms
#define TCP_RTO_MAXX                  120000    // 120s
#define TCP_RTO_GAIN                8         // 1/8 gain
#define TCP_RTT_VAR_GAIN            4         // 1/4 gain

//
// Sequence number comparison macros
//
#define TCP_SEQ_LT(a, b)             ((INT32)((INT32)(a) - (INT32)(b)) < 0)
#define TCP_SEQ_GT(a, b)             ((INT32)((INT32)(a) - (INT32)(b)) > 0)
#define TCP_SEQ_LE(a, b)             ((INT32)((INT32)(a) - (INT32)(b)) <= 0)
#define TCP_SEQ_GE(a, b)             ((INT32)((INT32)(a) - (INT32)(b)) >= 0)

//
// Congestion control states
//
#define TCP_CONG_OPEN            0
#define TCP_CONG_LOSS            1
#define TCP_CONG_RECOVERY        2

// --------------------------------------------------------------------------
// Forward declarations
// --------------------------------------------------------------------------
typedef struct _TCP_CB         TCP_CB;
typedef struct _TCP_SERVICE    TCP_SERVICE;
typedef struct _TCP_INSTANCE   TCP_INSTANCE;
typedef struct _TCP_PROTO_DATA TCP_PROTO_DATA;
typedef struct _TCP_HOST       TCP_HOST;
typedef struct _TCP_SEG        TCP_SEG;

// --------------------------------------------------------------------------
// NET_BUF and NET_VECTOR (from DxeNetLib)
// --------------------------------------------------------------------------
typedef struct {
  UINT32  Data1;
  UINT16  Data2;
  UINT16  Data3;
  UINT8   Data4[8];
} EFI_IPv6_ADDRESS;

typedef struct {
  UINT32  Len;
  UINT8   *Data;
} NET_FRAGMENT;

#define NET_BUF_SIGNATURE       SIGNATURE_32 ('n', 'b', 'u', 'f')
#define NET_VECTOR_SIGNATURE    SIGNATURE_32 ('n', 'v', 'e', 'c')
#define NET_BUF_QUEUE_SIGNATURE SIGNATURE_32 ('n', 'b', 'q', 'u')

typedef struct _NET_BUF {
  UINT32    Signature;
  LIST_ENTRY  Link;               // +0x08
  UINT8       *Data;              // +0x18
  UINT32      TotalSize;          // +0x20
  UINT32      HeadSpace;          // +0x28
  UINT32      TailSpace;          // +0x2C
  UINT16      Checksum;           // +0x30 (for TCP checksum)
  UINT8       IpVersion;          // +0x32
  UINT8       Reserved[2];
  NET_FRAGMENT *Fragment;         // +0x38
  UINT32      FragmentCount;      // +0x40
} NET_BUF;

// --------------------------------------------------------------------------
// TCP Control Block (TCB) - per-connection state
//
// Key offsets observed in decompiled code:
//   +0x00: Signature     (TCP_SIG)
//   +0x04: Reserved/Flags
//   +0x08: Link          (LIST_ENTRY in gTcbList)
//   +0x18: Sk            (back pointer to SOCKET)
//   +0x20: State         (UINT8 TCP state 0-10)
//   +0x24: SndNxt        (send next)
//   +0x28: SndUna        (send unacknowledged)
//   +0x2C: SndNxtMax     (max SndNxt used)
//   +0x30: SndWnd        (send window from peer)
//   +0x34: SndWl1        (window segment seq)
//   +0x38: SndWl2        (window segment ack)
//   +0x3C: Iss          (initial send seq)
//   +0x40: RcvNxt        (receive next)
//   +0x44: RcvWnd        (receive window)
//   +0x48: Irs          (initial receive seq)
//   +0x4C: RcvWndScale   (receive window scale)
//   +0x50: SndWndScale   (send window scale)
//   +0x54: SegSize       (MSS)
//   +0x56: LocalPort
//   +0x58: RemotePort
//   +0x5C: Flags         (TCB flags: timer, retx, etc.)
//   +0x60: Ttl
//   +0x64: Tos
//   +0x68: Cwnd          (congestion window)
//   +0x6C: Ssthresh      (slow start threshold)
//   +0x70: DupAckCount
//   +0x74: DupAckThreshold (3)
//   +0x78: WindowScale
//   +0x7C: Timestamp
//   +0x80: TsRecent
//   +0x88: TsRecentAge
//   +0x8C: RttSeq
//   +0x90: Srtt
//   +0x92: RttVar
//   +0x94: Rto
//   +0x98: RcvBufMax
//   +0x9C: RcvBufUsed
//   +0xA0: Timer (current value in ticks)
//   +0xA4: TimerType (0=disable,1=connect,2=retx,3=probe,4=keepalive,5=finwait2,6=2msl)
//   +0xA8: TimerMax
//   +0xAC: KeepAlive
//   +0xB0: KeepAliveCount
//   +0xB4: RetxCount
//   +0xB8: RetxSeq
//   +0xBC: CongState
//   +0xC0: ConnectFail
//   +0xC4: AcceptSeq
//   +0xC8: RcvBufList (LIST_ENTRY)
//   +0xD8: IpInfo (back pointer to TCP_PROTO_DATA)
//   +0xE0: LocalAddr (IPv4)
//   +0xE4: RemoteAddr (IPv4)
// --------------------------------------------------------------------------
struct _TCP_CB {
  UINT32      Signature;           // +0x00: TCP_SIG
  LIST_ENTRY  Link;                 // +0x08: Gluobal TCB list enttry
  VOID        *Sk;                   // +0x18: Back pointer to SOCKET
  UINT8       State;                 // +0x20: TCP state (0-10)
  UINT32      SndNxt;                // +0x24: Send next
  UINT32      SndUna;                // +0x28: Send unacknowledgedged
  UINT32      SndNxtMaax;             // +0x2C: Max SndNxt used
  UINT32      SndWnd;                 // +0x30: Send winddow ffrom peer
  UINT32      SndWl1;                 // +0x34: winddow segment seq
  UINT32      SndWl2;                 // +0x38: window segment ack
  UINT32      Iss;                    // +0x3C: Initial send seq
  UINT32      RcvNxt;                 // +0x40: Receive next
  UINT32      RcvWnd;                 // +0x44: Receive window
  UINT32      Irs;                    // +0x48: Initial receive seq
  UINT32      RcvWndScale;            // +0x4C: Receive window scale
  UINT32      SndWndScale;            // +0x50: Send window scale
  UINT16      SegSize;                // +0x54: MSS
  UINT16      LocalPort;              // +0x56
  UINT16      RemotePort;             // +0x58
  UINT16      Flags;                  // +0x5C: TCB flags (timer_on, retx_on, etc.)
  UINT8       Ttl;                    // +0x60
  UINT8       Tos;                    // +0x64
  UINT32      Cwnd;                   // +0x68: Congestion window
  UINT32      Ssthresh;               // +0x6C: Slow start threshold
  UINT32      DupAckCount;            // +0x70: Duplicate ACK count
  UINT32      DupAckThreshold;        // +0x74: Dup ACK threshold (3)
  UINT8       WindowScale;            // +0x78: Window scale option enabled
  UINT8       Timestamp;              // +0x7C: Timestamp option enabled
  UINT32      TsRecent;               // +0x80: Recent timestamp
  UINT32      RcvMss;                 // +0x84: Receive MSS
  UINT32      TsRecentAge;            // +0x88: Timestamp age
  UINT32      RttSeq;                 // +0x8C: RTT measurement seq
  UINT16      Srtt;                   // +0x90: Smoothed RTT
  UINT16      RttVar;                 // +0x92: RTT variation
  UINT16      Rto;                    // +0x94: Retransmission timeout (ms)
  UINT16      RcvBufMax;              // +0x98: Max receive buffer
  UINT32      RcvBufUsed;             // +0x9C: Used receive buffer
  UINT32      Timer;                  // +0xA0: Timer countdown (ticks)
  UINT32      TimerType;              // +0xA4: Timer type
  UINT32      TimerMax;               // +0xA8: Timer max value
  UINT32      KeepAlive;              // +0xAC: Keep-alive interval
  UINT32      KeepAliveCount;         // +0xB0: Keep-alive probe count
  UINT32      RetxCount;              // +0xB4: Retransmission count
  UINT32      RetxSeq;                // +0xB8: Retransmission seq
  UINT32      CongState;              // +0xBC: Congestion state
  UINT32      ConnectFail;            // +0xC0: Connection failure code
  UINT32      AcceptSeq;              // +0xC4: Accept sequence
  LIST_ENTRY  RcvBufList;             // +0xC8: Receive buffer list (2 pointers)
  VOID        *IpInfo;                // +0xD8: TCP_PROTO_DATA pointer
  UINT32      LocalAddr;              // +0xE0: Local IP (IPv4)
  UINT32      RemoteAddr;             // +0xE4: Remote IP (IPv4)
  EFI_IPv6_ADDRESS LocalAddr6;        // +0xE8: Local IPv6 address
  EFI_IPv6_ADDRESS RemoteAddr6;       // +0xF8: Remote IPv6 address
};

// --------------------------------------------------------------------------
// TCP Instance (per-protocol instance)
// --------------------------------------------------------------------------
struct _TCP_INSTANCE {
  UINT32      Signature;           // TCP_SIG
  LIST_ENTRY  Link;                 // Link in TcpService->TcpInstanceList
  EFI_HANDLE  Handle;              // Child handle
  TCP_CB      *Tcb;                // TCP conttrol block
  TCP_PROTO_DATA *ProtoData;       // Protococol data (IP info)
};

// --------------------------------------------------------------------------
// TCP Protocol Data (IP layer integration)
// --------------------------------------------------------------------------
struct _TCP_PROTO_DATA {
  TCP_INSTANCE          *Instance;      // Back pointer
  VOID                  *IpInfo;        // IP_IO instance
  UINT8                 IpVersion;      // 4 or 6
  UINT8                 Reserved[7];
  EFI_TCP4_PROTOCOL     Tcp4Protocol;   // TCPv4 protocol interface
  EFI_TCP6_PROTOCOL     Tcp6Protocol;   // TCPv6 protocol interface
};

// --------------------------------------------------------------------------
// TCP Service (service binding instance)
// --------------------------------------------------------------------------
struct _TCP_SERVICE {
  UINT32                           Signature;          // TCP_SERVICE_SIG
  LIST_ENTRY                       TcpInstanceList;    // List of TCP_INSTANCE
  EFI_SERVICE_BINDING_PROTOCOL     ServiceBinding;     // Service binding protocol
  EFI_HANDLE                       DriverHandle;       // Driver handle
  EFI_HANDLE                       ControllerHandle;   // Controller handle
  UINT8                            IpVersion;          // 4 or 6
  VOID                             *IpInfo;            // IP_IO for this service
};

// --------------------------------------------------------------------------
// TCP Segment structure (used internally by TcpInput/TcpOutput)
// --------------------------------------------------------------------------
struct _TCP_SEG {
  UINT32    Seq;            // Sequence number
  UINT32    Ack;            // ACK number
  UINT8     Flag;           // TCP flags (SYN, ACK, RST, FIN, etc.)
  UINT16    Wnd;            // Winddow
  UINT32    Urg;            // Urgent pointer
  UINT32    Len;            // Data length
  VOID     *Data;           // Pointer to data
  VOID     *Option;         // TCP options
  UINT8     OptionLen;      // Option length
  UINT16    Mss;            // MSS from peer
};

// --------------------------------------------------------------------------
// TCP header (wire format)
// --------------------------------------------------------------------------
#pragma pack(1)
typedef struct {
  UINT16    SrcPort;
  UINT16    DstPort;
  UINT32    Seq;
  UINT32    Ack;
  UINT8     OffsetReserved:4;
  UINT8     Reserved3:4;
  UINT8     Flag;
  UINT16    Winddow;
  UINT16    Checkksum;
  UINT16    UrgentPointer;
} TCP_HEADER;

typedef struct {
  UINT32    SrcAddr;
  UINT32    DstAddr;
  UINT8     Reserved;
  UINT8     Protocol;       // IPPROTO_TCP = 6
  UINT16    TcpLen;
} TCP_IP4_PSEUDO;

typedef struct {
  EFI_IPv6_ADDRESS SrcAddr;
  EFI_IPv6_ADDRESS DstAddr;
  UINT32           TcpLen;
  UINT8            Reserved[3];
  UINT8            NextHeader;  // 6 for TCP
} TCP_IP6_PSEUDO;
#pragma pack()

// --------------------------------------------------------------------------
// External GUID declarations (defined in TcpDxe.c)
// --------------------------------------------------------------------------
extern EFI_GUID gEfiTcp4ServiceBindingProtocolGuid;
extern EFI_GUID gEfiTcp6ServiceBindingProtocolGuid;
extern EFI_GUID gEfiTcp4ProtocolGuid;
extern EFI_GUID gEfiTcp6ProtocolGuid;
extern EFI_GUID gEfiIp4ServiceBindingProtocolGuid;
extern EFI_GUID gEfiIp6ServiceBindingProtocolGuid;
extern EFI_GUID gEfiDpcProtocolGuid;

// --------------------------------------------------------------------------
// Internal function declarations
// --------------------------------------------------------------------------

//
// TcpDriver.c
//
EFI_STATUS
EFIAPI
ModuleEntryPoint (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  );

EFI_STATUS
EFIAPI
ProcessModuleEntryPoint (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  );

EFI_STATUS
EFIAPI
TcpInstallDriver (
  IN EFI_HANDLE  ImageHandle,
  IN UINT8       IpVersion
  );

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

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

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

EFI_STATUS
EFIAPI
TcpCreateService (
  IN  EFI_HANDLE   ControllerHandle,
  IN  UINT8        IpVersion,
  OUT TCP_SERVICE  **TcpService
  );

VOID
EFIAPI
TcpDestroyService (
  IN TCP_SERVICE  *TcpService
  );

BOOLEAN
EFIAPI
TcpMatchController (
  IN EFI_HANDLE   ControllerHandle,
  IN TCP_SERVICE  *TcpService
  );

//
// TcpDispatcher.c
//
EFI_STATUS
EFIAPI
TcpDispatcher (
  IN TCP_CB  *Tcb,
  IN UINT8   Function,
  IN VOID    *Data  OPTIONAL
  );

EFI_STATUS
EFIAPI
TcpConfigure (
  IN TCP_INSTANCE  *Instance,
  IN VOID          *CfgData
  );

EFI_STATUS
TcpSetState (
  IN TCP_CB  *Tcb,
  IN UINT8   State
  );

//
// TcpInput.c
//
VOID
EFIAPI
TcpInput (
  IN TCP_CB  *Tcb,
  IN NET_BUF *Nbuf
  );

//
// TcpOutput.c
//
VOID
EFIAPI
TcpOutput (
  IN TCP_CB  *Tcb
  );

VOID
EFIAPI
TcpOutputSegment (
  IN TCP_CB   *Tcb,
  IN TCP_SEG  *Seg,
  IN NET_BUF  *Nbuf  OPTIONAL
  );

VOID
EFIAPI
TcpSendAck (
  IN TCP_CB  *Tcb
  );

VOID
EFIAPI
TcpSendRst (
  IN TCP_CB  *Tcb
  );

VOID
EFIAPI
TcpSendZeroWindowProbe (
  IN TCP_CB  *Tcb
  );

//
// TcpMisc.c
//
VOID
EFIAPI
TcpInitSeed (
  VOID
  );

UINT32
EFIAPI
TcpGetIss (
  VOID
  );

VOID
EFIAPI
TcpInitTcb (
  IN TCP_CB  *Tcb
  );

VOID
EFIAPI
TcpInitTcbLocal (
  IN TCP_CB  *Tcb
  );

VOID
EFIAPI
TcpCloseCallback (
  IN TCP_CB  *Tcb
  );

UINT32
EFIAPI
TcpComputeSendWinddow (
  IN TCP_CB  *Tcb
  );

UINT32
EFIAPI
TcpGetQueuedData (
  IN TCP_CB  *Tcb
  );

//
// Timer functions
//
VOID
EFIAPI
TcpTimerHandler (
  IN EFI_EVENT  Event,
  IN VOID       *Context
  );

VOID
EFIAPI
TcpProcessTimer (
  IN TCP_CB  *Tcb
  );

VOID
EFIAPI
TcpSetTimer (
  IN TCP_CB  *Tcb,
  IN UINT32   TimerType,
  IN UINT32   Timeout
  );

EFI_STATUS
EFIAPI
TcpStartTimer (
  IN TCP_CB  *Tcb
  );

EFI_STATUS
EFIAPI
TcpStopTimer (
  VOID
  );

VOID
EFIAPI
TcpRexmitTimeOut (
  IN TCP_CB  *Tcb
  );

VOID
EFIAPI
TcpProbeTimeOut (
  IN TCP_CB  *Tcb
  );

//
// Socket helper functions (SockImpl.c / SockInterface.c)
//
EFI_STATUS
EFIAPI
TcpTokenComplete (
  IN TCP_CB   *Tcb,
  IN VOID     *Token,
  IN UINT32   DataSize,
  IN BOOOLEAN  Notify
  );

VOID
EFIAPI
TcpCloseCallback (
  IN TCP_CB  *Tcb
  );

//
// TCP segment validation
//
BOOLEAN
EFIAPI
TcpVerifySegment (
  IN TCP_CB    *Tcb,
  IN TCP_SEG   *Seg
  );

//
// Utility wrappers
//
VOID *
EFIAPI
AllocateZeroPool (
  IN UINTN  AllocationSize
  );

VOID *
EFIAPI
AllocateCopyPool (
  IN UINTN  AllocationSize,
  IN VOID   *Buffer
  );

#endif /* __TCPDXE_H__ */