Fix firefox exit. Implement a simple work queue for possibly dispatch level
[reactos.git] / reactos / drivers / net / 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 typedef struct TCPv4_HEADER {
15 USHORT SourcePort; /* Source port */
16 USHORT DestinationPort; /* Destination port */
17 ULONG SequenceNumber; /* Sequence number */
18 ULONG AckNumber; /* Acknowledgement number */
19 UCHAR DataOffset; /* Data offset; 32-bit words (leftmost 4 bits) */
20 UCHAR Flags; /* Control bits (rightmost 6 bits) */
21 USHORT Window; /* Maximum acceptable receive window */
22 USHORT Checksum; /* Checksum of segment */
23 USHORT Urgent; /* Pointer to urgent data */
24 } __attribute__((packed)) TCPv4_HEADER, *PTCPv4_HEADER;
25
26 /* TCPv4 header flags */
27 #define TCP_URG 0x20
28 #define TCP_ACK 0x10
29 #define TCP_PSH 0x08
30 #define TCP_RST 0x04
31 #define TCP_SYN 0x02
32 #define TCP_FIN 0x01
33
34
35 #define TCPOPT_END_OF_LIST 0x0
36 #define TCPOPT_NO_OPERATION 0x1
37 #define TCPOPT_MAX_SEG_SIZE 0x2
38
39 #define TCPOPTLEN_MAX_SEG_SIZE 0x4
40
41 #define TCP_CANCEL_DISCONNECT 0
42 #define TCP_CANCEL_CLOSE 1
43
44 /* Data offset; 32-bit words (leftmost 4 bits); convert to bytes */
45 #define TCP_DATA_OFFSET(DataOffset)(((DataOffset) & 0xF0) >> (4-2))
46
47
48 /* TCPv4 pseudo header */
49 typedef struct TCPv4_PSEUDO_HEADER {
50 ULONG SourceAddress; /* Source address */
51 ULONG DestinationAddress; /* Destination address */
52 UCHAR Zero; /* Reserved */
53 UCHAR Protocol; /* Protocol */
54 USHORT TCPLength; /* Size of TCP segment */
55 } __attribute__((packed)) TCPv4_PSEUDO_HEADER, *PTCPv4_PSEUDO_HEADER;
56
57 typedef struct _SLEEPING_THREAD {
58 LIST_ENTRY Entry;
59 PVOID SleepToken;
60 KEVENT Event;
61 } SLEEPING_THREAD, *PSLEEPING_THREAD;
62
63 typedef struct _CANCEL_REQUEST {
64 LIST_ENTRY Entry;
65 PVOID Context;
66 PIRP Irp;
67 UINT Flags, Type;
68 } CANCEL_REQUEST, *PCANCEL_REQUEST;
69
70 /* Retransmission timeout constants */
71
72 /* Lower bound for retransmission timeout in TCP timer ticks */
73 #define TCP_MIN_RETRANSMISSION_TIMEOUT 1*1000 /* 1 tick */
74
75 /* Upper bound for retransmission timeout in TCP timer ticks */
76 #define TCP_MAX_RETRANSMISSION_TIMEOUT 1*60*1000 /* 1 tick */
77
78 /* Smoothing factor */
79 #define TCP_ALPHA_RETRANSMISSION_TIMEOUT(x)(((x)*8)/10) /* 0.8 */
80
81 /* Delay variance factor */
82 #define TCP_BETA_RETRANSMISSION_TIMEOUT(x)(((x)*16)/10) /* 1.6 */
83
84
85 /* Datagram/segment send request flags */
86
87 #define SRF_URG TCP_URG
88 #define SRF_ACK TCP_ACK
89 #define SRF_PSH TCP_PSH
90 #define SRF_RST TCP_RST
91 #define SRF_SYN TCP_SYN
92 #define SRF_FIN TCP_FIN
93
94 extern LONG TCP_IPIdentification;
95 extern LIST_ENTRY SignalledConnections;
96 extern LIST_ENTRY SleepingThreadsList;
97 extern FAST_MUTEX SleepingThreadsLock;
98 extern RECURSIVE_MUTEX TCPLock;
99
100 /* accept.c */
101 NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener,
102 PCONNECTION_ENDPOINT Connection,
103 PTDI_REQUEST_KERNEL Request );
104 NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog );
105 VOID TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener,
106 PCONNECTION_ENDPOINT Connection );
107 NTSTATUS TCPAccept
108 ( PTDI_REQUEST Request,
109 PCONNECTION_ENDPOINT Listener,
110 PCONNECTION_ENDPOINT Connection,
111 PTCP_COMPLETION_ROUTINE Complete,
112 PVOID Context );
113
114 /* tcp.c */
115 PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext );
116 VOID TCPFreeConnectionEndpoint( PCONNECTION_ENDPOINT Connection );
117
118 NTSTATUS TCPSocket( PCONNECTION_ENDPOINT Connection,
119 UINT Family, UINT Type, UINT Proto );
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 PTDI_CONNECTION_INFORMATION ConnInfo,
145 PTDI_CONNECTION_INFORMATION ReturnInfo,
146 PTCP_COMPLETION_ROUTINE Complete,
147 PVOID Context);
148
149 NTSTATUS TCPReceiveData(
150 PCONNECTION_ENDPOINT Connection,
151 PNDIS_BUFFER Buffer,
152 ULONG ReceiveLength,
153 PULONG BytesReceived,
154 ULONG ReceiveFlags,
155 PTCP_COMPLETION_ROUTINE Complete,
156 PVOID Context);
157
158 NTSTATUS TCPSendData(
159 PCONNECTION_ENDPOINT Connection,
160 PCHAR Buffer,
161 ULONG DataSize,
162 PULONG DataUsed,
163 ULONG Flags);
164
165 NTSTATUS TCPClose( PCONNECTION_ENDPOINT Connection );
166
167 PVOID TCPPrepareInterface( PIP_INTERFACE IF );
168
169 VOID TCPDisposeInterfaceData( PVOID Data );
170
171 NTSTATUS TCPTranslateError( int OskitError );
172
173 VOID TCPTimeout();
174
175 UINT TCPAllocatePort( UINT HintPort );
176
177 VOID TCPFreePort( UINT Port );
178
179 NTSTATUS TCPGetPeerAddress
180 ( PCONNECTION_ENDPOINT Connection,
181 PTRANSPORT_ADDRESS TransportAddress );
182
183 NTSTATUS TCPStartup(
184 VOID);
185
186 NTSTATUS TCPShutdown(
187 VOID);
188
189 void TCPMarkForDisconnect(
190 PCONNECTION_ENDPOINT Connection, BOOLEAN Marked );
191
192 #endif /* __TCP_H */