- Create KD branch. All debugging support is removed in this branch (no symbols,...
[reactos.git] / reactos / drivers / network / tcpip / include / tcp.h
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 #ifndef __TCP_H
8 #define __TCP_H
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 /* TCPv4 header flags */
28 #define TCP_URG 0x20
29 #define TCP_ACK 0x10
30 #define TCP_PSH 0x08
31 #define TCP_RST 0x04
32 #define TCP_SYN 0x02
33 #define TCP_FIN 0x01
34
35
36 #define TCPOPT_END_OF_LIST 0x0
37 #define TCPOPT_NO_OPERATION 0x1
38 #define TCPOPT_MAX_SEG_SIZE 0x2
39
40 #define TCPOPTLEN_MAX_SEG_SIZE 0x4
41
42 /* Data offset; 32-bit words (leftmost 4 bits); convert to bytes */
43 #define TCP_DATA_OFFSET(DataOffset)(((DataOffset) & 0xF0) >> (4-2))
44
45
46 /* TCPv4 pseudo header */
47 typedef struct TCPv4_PSEUDO_HEADER {
48 ULONG SourceAddress; /* Source address */
49 ULONG DestinationAddress; /* Destination address */
50 UCHAR Zero; /* Reserved */
51 UCHAR Protocol; /* Protocol */
52 USHORT TCPLength; /* Size of TCP segment */
53 } TCPv4_PSEUDO_HEADER, *PTCPv4_PSEUDO_HEADER;
54 #include <poppack.h>
55
56 typedef struct _SLEEPING_THREAD {
57 LIST_ENTRY Entry;
58 PVOID SleepToken;
59 KEVENT Event;
60 } SLEEPING_THREAD, *PSLEEPING_THREAD;
61
62 /* Retransmission timeout constants */
63
64 /* Lower bound for retransmission timeout in TCP timer ticks */
65 #define TCP_MIN_RETRANSMISSION_TIMEOUT 1*1000 /* 1 tick */
66
67 /* Upper bound for retransmission timeout in TCP timer ticks */
68 #define TCP_MAX_RETRANSMISSION_TIMEOUT 1*60*1000 /* 1 tick */
69
70 /* Smoothing factor */
71 #define TCP_ALPHA_RETRANSMISSION_TIMEOUT(x)(((x)*8)/10) /* 0.8 */
72
73 /* Delay variance factor */
74 #define TCP_BETA_RETRANSMISSION_TIMEOUT(x)(((x)*16)/10) /* 1.6 */
75
76
77 /* Datagram/segment send request flags */
78
79 #define SRF_URG TCP_URG
80 #define SRF_ACK TCP_ACK
81 #define SRF_PSH TCP_PSH
82 #define SRF_RST TCP_RST
83 #define SRF_SYN TCP_SYN
84 #define SRF_FIN TCP_FIN
85
86 extern LONG TCP_IPIdentification;
87 extern LIST_ENTRY SignalledConnections;
88 extern LIST_ENTRY SleepingThreadsList;
89 extern FAST_MUTEX SleepingThreadsLock;
90 extern RECURSIVE_MUTEX TCPLock;
91
92 /* accept.c */
93 NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener,
94 PCONNECTION_ENDPOINT Connection,
95 PTDI_REQUEST_KERNEL Request );
96 NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog );
97 VOID TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener,
98 PCONNECTION_ENDPOINT Connection );
99 NTSTATUS TCPAccept
100 ( PTDI_REQUEST Request,
101 PCONNECTION_ENDPOINT Listener,
102 PCONNECTION_ENDPOINT Connection,
103 PTCP_COMPLETION_ROUTINE Complete,
104 PVOID Context );
105
106 /* tcp.c */
107 PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext );
108 VOID TCPFreeConnectionEndpoint( PCONNECTION_ENDPOINT Connection );
109
110 NTSTATUS TCPSocket( PCONNECTION_ENDPOINT Connection,
111 UINT Family, UINT Type, UINT Proto );
112
113 PTCP_SEGMENT TCPCreateSegment(
114 PIP_PACKET IPPacket,
115 PTCPv4_HEADER TCPHeader,
116 ULONG SegmentLength);
117
118 VOID TCPFreeSegment(
119 PTCP_SEGMENT Segment);
120
121 VOID TCPAddSegment(
122 PCONNECTION_ENDPOINT Connection,
123 PTCP_SEGMENT Segment,
124 PULONG Acknowledged);
125
126 NTSTATUS TCPConnect(
127 PCONNECTION_ENDPOINT Connection,
128 PTDI_CONNECTION_INFORMATION ConnInfo,
129 PTDI_CONNECTION_INFORMATION ReturnInfo,
130 PTCP_COMPLETION_ROUTINE Complete,
131 PVOID Context);
132
133 NTSTATUS TCPDisconnect(
134 PCONNECTION_ENDPOINT Connection,
135 UINT Flags,
136 PTDI_CONNECTION_INFORMATION ConnInfo,
137 PTDI_CONNECTION_INFORMATION ReturnInfo,
138 PTCP_COMPLETION_ROUTINE Complete,
139 PVOID Context);
140
141 NTSTATUS TCPReceiveData(
142 PCONNECTION_ENDPOINT Connection,
143 PNDIS_BUFFER Buffer,
144 ULONG ReceiveLength,
145 PULONG BytesReceived,
146 ULONG ReceiveFlags,
147 PTCP_COMPLETION_ROUTINE Complete,
148 PVOID Context);
149
150 NTSTATUS TCPSendData(
151 PCONNECTION_ENDPOINT Connection,
152 PCHAR Buffer,
153 ULONG DataSize,
154 PULONG DataUsed,
155 ULONG Flags,
156 PTCP_COMPLETION_ROUTINE Complete,
157 PVOID Context);
158
159 NTSTATUS TCPClose( PCONNECTION_ENDPOINT Connection );
160
161 PVOID TCPPrepareInterface( PIP_INTERFACE IF );
162
163 VOID TCPDisposeInterfaceData( PVOID Data );
164
165 NTSTATUS TCPTranslateError( int OskitError );
166
167 VOID TCPTimeout();
168
169 UINT TCPAllocatePort( UINT HintPort );
170
171 VOID TCPFreePort( UINT Port );
172
173 NTSTATUS TCPGetPeerAddress
174 ( PCONNECTION_ENDPOINT Connection,
175 PTRANSPORT_ADDRESS TransportAddress );
176
177 NTSTATUS TCPStartup(
178 VOID);
179
180 NTSTATUS TCPShutdown(
181 VOID);
182
183 VOID TCPRemoveIRP( PCONNECTION_ENDPOINT Connection, PIRP Irp );
184
185 #endif /* __TCP_H */