1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS TCP/IP protocol driver 4 * FILE: include/tcp.h 5 * PURPOSE: Transmission Control Protocol definitions 6 */ 7 8 #pragma once 9 10 typedef VOID 11 (*PTCP_COMPLETION_ROUTINE)( PVOID Context, NTSTATUS Status, ULONG Count ); 12 13 /* TCPv4 header structure */ 14 #include <pshpack1.h> 15 typedef struct TCPv4_HEADER { 16 USHORT SourcePort; /* Source port */ 17 USHORT DestinationPort; /* Destination port */ 18 ULONG SequenceNumber; /* Sequence number */ 19 ULONG AckNumber; /* Acknowledgement number */ 20 UCHAR DataOffset; /* Data offset; 32-bit words (leftmost 4 bits) */ 21 UCHAR Flags; /* Control bits (rightmost 6 bits) */ 22 USHORT Window; /* Maximum acceptable receive window */ 23 USHORT Checksum; /* Checksum of segment */ 24 USHORT Urgent; /* Pointer to urgent data */ 25 } TCPv4_HEADER, *PTCPv4_HEADER; 26 27 #define TCPOPT_END_OF_LIST 0x0 28 #define TCPOPT_NO_OPERATION 0x1 29 #define TCPOPT_MAX_SEG_SIZE 0x2 30 31 #define TCPOPTLEN_MAX_SEG_SIZE 0x4 32 33 /* Data offset; 32-bit words (leftmost 4 bits); convert to bytes */ 34 #define TCP_DATA_OFFSET(DataOffset)(((DataOffset) & 0xF0) >> (4-2)) 35 36 37 /* TCPv4 pseudo header */ 38 typedef struct TCPv4_PSEUDO_HEADER { 39 ULONG SourceAddress; /* Source address */ 40 ULONG DestinationAddress; /* Destination address */ 41 UCHAR Zero; /* Reserved */ 42 UCHAR Protocol; /* Protocol */ 43 USHORT TCPLength; /* Size of TCP segment */ 44 } TCPv4_PSEUDO_HEADER, *PTCPv4_PSEUDO_HEADER; 45 #include <poppack.h> 46 47 typedef struct _SLEEPING_THREAD { 48 LIST_ENTRY Entry; 49 PVOID SleepToken; 50 KEVENT Event; 51 } SLEEPING_THREAD, *PSLEEPING_THREAD; 52 53 typedef struct _CLIENT_DATA { 54 BOOLEAN Unlocked; 55 KSPIN_LOCK Lock; 56 KIRQL OldIrql; 57 } CLIENT_DATA, *PCLIENT_DATA; 58 59 /* Retransmission timeout constants */ 60 61 /* Lower bound for retransmission timeout in TCP timer ticks */ 62 #define TCP_MIN_RETRANSMISSION_TIMEOUT 1*1000 /* 1 tick */ 63 64 /* Upper bound for retransmission timeout in TCP timer ticks */ 65 #define TCP_MAX_RETRANSMISSION_TIMEOUT 1*60*1000 /* 1 tick */ 66 67 /* Smoothing factor */ 68 #define TCP_ALPHA_RETRANSMISSION_TIMEOUT(x)(((x)*8)/10) /* 0.8 */ 69 70 /* Delay variance factor */ 71 #define TCP_BETA_RETRANSMISSION_TIMEOUT(x)(((x)*16)/10) /* 1.6 */ 72 73 #define SEL_CONNECT 1 74 #define SEL_FIN 2 75 #define SEL_RST 4 76 #define SEL_ABRT 8 77 #define SEL_READ 16 78 #define SEL_WRITE 32 79 #define SEL_ACCEPT 64 80 #define SEL_OOB 128 81 #define SEL_ERROR 256 82 #define SEL_FINOUT 512 83 84 #define FREAD 0x0001 85 #define FWRITE 0x0002 86 87 /* Datagram/segment send request flags */ 88 89 #define SRF_URG TCP_URG 90 #define SRF_ACK TCP_ACK 91 #define SRF_PSH TCP_PSH 92 #define SRF_RST TCP_RST 93 #define SRF_SYN TCP_SYN 94 #define SRF_FIN TCP_FIN 95 96 extern LONG TCP_IPIdentification; 97 extern CLIENT_DATA ClientInfo; 98 99 /* accept.c */ 100 NTSTATUS TCPCheckPeerForAccept(PVOID Context, 101 PTDI_REQUEST_KERNEL Request); 102 NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ); 103 BOOLEAN TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener, 104 PCONNECTION_ENDPOINT Connection ); 105 NTSTATUS TCPAccept 106 ( PTDI_REQUEST Request, 107 PCONNECTION_ENDPOINT Listener, 108 PCONNECTION_ENDPOINT Connection, 109 PTCP_COMPLETION_ROUTINE Complete, 110 PVOID Context ); 111 112 /* tcp.c */ 113 PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext ); 114 VOID TCPFreeConnectionEndpoint( PCONNECTION_ENDPOINT Connection ); 115 116 NTSTATUS TCPSocket( PCONNECTION_ENDPOINT Connection, 117 UINT Family, UINT Type, UINT Proto ); 118 119 VOID HandleSignalledConnection(PCONNECTION_ENDPOINT Connection); 120 121 PTCP_SEGMENT TCPCreateSegment( 122 PIP_PACKET IPPacket, 123 PTCPv4_HEADER TCPHeader, 124 ULONG SegmentLength); 125 126 VOID TCPFreeSegment( 127 PTCP_SEGMENT Segment); 128 129 VOID TCPAddSegment( 130 PCONNECTION_ENDPOINT Connection, 131 PTCP_SEGMENT Segment, 132 PULONG Acknowledged); 133 134 NTSTATUS TCPConnect( 135 PCONNECTION_ENDPOINT Connection, 136 PTDI_CONNECTION_INFORMATION ConnInfo, 137 PTDI_CONNECTION_INFORMATION ReturnInfo, 138 PTCP_COMPLETION_ROUTINE Complete, 139 PVOID Context); 140 141 NTSTATUS TCPDisconnect( 142 PCONNECTION_ENDPOINT Connection, 143 UINT Flags, 144 PLARGE_INTEGER Timeout, 145 PTDI_CONNECTION_INFORMATION ConnInfo, 146 PTDI_CONNECTION_INFORMATION ReturnInfo, 147 PTCP_COMPLETION_ROUTINE Complete, 148 PVOID Context); 149 150 NTSTATUS TCPReceiveData( 151 PCONNECTION_ENDPOINT Connection, 152 PNDIS_BUFFER Buffer, 153 ULONG ReceiveLength, 154 PULONG BytesReceived, 155 ULONG ReceiveFlags, 156 PTCP_COMPLETION_ROUTINE Complete, 157 PVOID Context); 158 159 NTSTATUS TCPSendData( 160 PCONNECTION_ENDPOINT Connection, 161 PCHAR Buffer, 162 ULONG DataSize, 163 PULONG DataUsed, 164 ULONG Flags, 165 PTCP_COMPLETION_ROUTINE Complete, 166 PVOID Context); 167 168 NTSTATUS TCPClose( PCONNECTION_ENDPOINT Connection ); 169 170 NTSTATUS TCPTranslateError( const INT8 err ); 171 172 UINT TCPAllocatePort( const UINT HintPort ); 173 174 VOID TCPFreePort( const UINT Port ); 175 176 NTSTATUS TCPGetSockAddress 177 ( PCONNECTION_ENDPOINT Connection, 178 PTRANSPORT_ADDRESS TransportAddress, 179 BOOLEAN RemoteAddress ); 180 181 NTSTATUS TCPStartup( 182 VOID); 183 184 NTSTATUS TCPShutdown( 185 VOID); 186 187 BOOLEAN TCPRemoveIRP( PCONNECTION_ENDPOINT Connection, PIRP Irp ); 188 189 NTSTATUS TCPSetNoDelay(PCONNECTION_ENDPOINT Connection, BOOLEAN Set); 190 191 VOID 192 TCPUpdateInterfaceLinkStatus(PIP_INTERFACE IF); 193 194 VOID 195 TCPUpdateInterfaceIPInformation(PIP_INTERFACE IF); 196 197 VOID 198 FlushListenQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status); 199 200 VOID 201 FlushConnectQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status); 202 203 VOID 204 FlushReceiveQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status, const BOOLEAN interlocked); 205 206 VOID 207 FlushSendQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status, const BOOLEAN interlocked); 208 209 VOID 210 FlushShutdownQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status, const BOOLEAN interlocked); 211 212 VOID 213 FlushAllQueues(PCONNECTION_ENDPOINT Connection, NTSTATUS Status); 214 215 VOID CompleteBucket(PCONNECTION_ENDPOINT Connection, PTDI_BUCKET Bucket, const BOOLEAN Synchronous); 216 217 void 218 LibTCPDumpPcb(PVOID SocketContext); 219 220 NTSTATUS TCPGetSocketStatus(PCONNECTION_ENDPOINT Connection, PULONG State); 221