/** @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__ */