2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
4 * FILE: include/titypes.h
5 * PURPOSE: TCP/IP protocol driver types
11 * VOID ReferenceObject(
14 #define ReferenceObject(Object) \
16 ASSERT((Object)->RefCount); \
17 InterlockedIncrement(&((Object)->RefCount)); \
21 * VOID DereferenceObject(
24 #define DereferenceObject(Object) \
26 ASSERT((Object)->RefCount); \
27 if (InterlockedDecrement(&((Object)->RefCount)) == 0) \
28 (((Object)->Free)(Object)); \
32 * VOID LockObject(PVOID Object, PKIRQL OldIrql)
34 #define LockObject(Object, Irql) \
36 ReferenceObject(Object); \
37 KeAcquireSpinLock(&((Object)->Lock), Irql); \
38 memcpy(&(Object)->OldIrql, Irql, sizeof(KIRQL)); \
42 * VOID LockObjectAtDpcLevel(PVOID Object)
44 #define LockObjectAtDpcLevel(Object) \
46 ReferenceObject(Object); \
47 KeAcquireSpinLockAtDpcLevel(&((Object)->Lock)); \
48 (Object)->OldIrql = DISPATCH_LEVEL; \
52 * VOID UnlockObject(PVOID Object, KIRQL OldIrql)
54 #define UnlockObject(Object, OldIrql) \
56 KeReleaseSpinLock(&((Object)->Lock), OldIrql); \
57 DereferenceObject(Object); \
61 * VOID UnlockObjectFromDpcLevel(PVOID Object)
63 #define UnlockObjectFromDpcLevel(Object) \
65 KeReleaseSpinLockFromDpcLevel(&((Object)->Lock)); \
66 DereferenceObject(Object); \
75 /***************************************************
76 * Connection-less communication support structures *
77 ***************************************************/
79 typedef NTSTATUS (*DATAGRAM_SEND_ROUTINE
)(
80 struct _ADDRESS_FILE
*AddrFile
,
81 PTDI_CONNECTION_INFORMATION ConnInfo
,
86 /* Datagram completion handler prototype */
87 typedef VOID (*DATAGRAM_COMPLETION_ROUTINE
)(
92 typedef DATAGRAM_COMPLETION_ROUTINE PDATAGRAM_COMPLETION_ROUTINE
;
94 typedef struct _DATAGRAM_RECEIVE_REQUEST
{
95 struct _ADDRESS_FILE
*AddressFile
; /* AddressFile on behalf of */
96 LIST_ENTRY ListEntry
; /* Entry on list */
97 IP_ADDRESS RemoteAddress
; /* Remote address we receive from (NULL means any) */
98 USHORT RemotePort
; /* Remote port we receive from (0 means any) */
99 PTDI_CONNECTION_INFORMATION ReturnInfo
;/* Return information */
100 PCHAR Buffer
; /* Pointer to receive buffer */
101 ULONG BufferSize
; /* Size of Buffer */
102 DATAGRAM_COMPLETION_ROUTINE Complete
; /* Completion routine */
103 PVOID Context
; /* Pointer to context information */
104 DATAGRAM_COMPLETION_ROUTINE UserComplete
; /* Completion routine */
105 PVOID UserContext
; /* Pointer to context information */
106 PIRP Irp
; /* IRP on behalf of */
107 } DATAGRAM_RECEIVE_REQUEST
, *PDATAGRAM_RECEIVE_REQUEST
;
109 /* Datagram build routine prototype */
110 typedef NTSTATUS (*DATAGRAM_BUILD_ROUTINE
)(
112 PIP_ADDRESS LocalAddress
,
114 PIP_PACKET
*IPPacket
);
116 typedef struct _DATAGRAM_SEND_REQUEST
{
117 LIST_ENTRY ListEntry
;
118 PNDIS_PACKET PacketToSend
;
119 DATAGRAM_COMPLETION_ROUTINE Complete
; /* Completion routine */
120 PVOID Context
; /* Pointer to context information */
123 IP_ADDRESS RemoteAddress
;
125 ULONG Flags
; /* Protocol specific flags */
126 } DATAGRAM_SEND_REQUEST
, *PDATAGRAM_SEND_REQUEST
;
128 /* Transport address file context structure. The FileObject->FsContext2
129 field holds a pointer to this structure */
130 typedef struct _ADDRESS_FILE
{
131 LIST_ENTRY ListEntry
; /* Entry on list */
132 LONG RefCount
; /* Reference count */
133 OBJECT_FREE_ROUTINE Free
; /* Routine to use to free resources for the object */
134 KSPIN_LOCK Lock
; /* Spin lock to manipulate this structure */
135 KIRQL OldIrql
; /* Currently not used */
136 IP_ADDRESS Address
; /* Address of this address file */
137 USHORT Family
; /* Address family */
138 USHORT Protocol
; /* Protocol number */
139 USHORT Port
; /* Network port (network byte order) */
140 LONG Sharers
; /* Number of file objects with this addr file */
141 UCHAR TTL
; /* Time to live stored in packets sent from this address file */
142 UINT DF
; /* Don't fragment */
143 UINT BCast
; /* Receive broadcast packets */
144 UINT HeaderIncl
; /* Include header in RawIP packets */
145 WORK_QUEUE_ITEM WorkItem
; /* Work queue item handle */
146 DATAGRAM_COMPLETION_ROUTINE Complete
; /* Completion routine for delete request */
147 PVOID Context
; /* Delete request context */
148 DATAGRAM_SEND_ROUTINE Send
; /* Routine to send a datagram */
149 LIST_ENTRY ReceiveQueue
; /* List of outstanding receive requests */
150 LIST_ENTRY TransmitQueue
; /* List of outstanding transmit requests */
151 struct _CONNECTION_ENDPOINT
*Connection
;
152 /* Associated connection or NULL if no associated connection exist */
153 struct _CONNECTION_ENDPOINT
*Listener
;
154 /* Associated listener (see transport/tcp/accept.c) */
155 IP_ADDRESS AddrCache
; /* One entry address cache (destination
156 address of last packet transmitted) */
157 HANDLE ProcessId
; /* Creator process ID */
158 PVOID SubProcessTag
; /* Creator process tag */
159 LARGE_INTEGER CreationTime
; /* Time of creation */
161 /* The following members are used to control event notification */
163 /* Connection indication handler */
164 PTDI_IND_CONNECT ConnectHandler
;
165 PVOID ConnectHandlerContext
;
166 BOOLEAN RegisteredConnectHandler
;
167 /* Disconnect indication handler */
168 PTDI_IND_DISCONNECT DisconnectHandler
;
169 PVOID DisconnectHandlerContext
;
170 BOOLEAN RegisteredDisconnectHandler
;
171 /* Error indication handler */
172 PTDI_IND_ERROR ErrorHandler
;
173 PVOID ErrorHandlerContext
;
174 PVOID ErrorHandlerOwner
;
175 BOOLEAN RegisteredErrorHandler
;
176 /* Receive indication handler */
177 PTDI_IND_RECEIVE ReceiveHandler
;
178 PVOID ReceiveHandlerContext
;
179 BOOLEAN RegisteredReceiveHandler
;
180 /* Receive datagram indication handler */
181 PTDI_IND_RECEIVE_DATAGRAM ReceiveDatagramHandler
;
182 PVOID ReceiveDatagramHandlerContext
;
183 BOOLEAN RegisteredReceiveDatagramHandler
;
184 /* Expedited receive indication handler */
185 PTDI_IND_RECEIVE_EXPEDITED ExpeditedReceiveHandler
;
186 PVOID ExpeditedReceiveHandlerContext
;
187 BOOLEAN RegisteredExpeditedReceiveHandler
;
188 /* Chained receive indication handler */
189 PTDI_IND_CHAINED_RECEIVE ChainedReceiveHandler
;
190 PVOID ChainedReceiveHandlerContext
;
191 BOOLEAN RegisteredChainedReceiveHandler
;
192 /* Chained receive datagram indication handler */
193 PTDI_IND_CHAINED_RECEIVE_DATAGRAM ChainedReceiveDatagramHandler
;
194 PVOID ChainedReceiveDatagramHandlerContext
;
195 BOOLEAN RegisteredChainedReceiveDatagramHandler
;
196 /* Chained expedited receive indication handler */
197 PTDI_IND_CHAINED_RECEIVE_EXPEDITED ChainedReceiveExpeditedHandler
;
198 PVOID ChainedReceiveExpeditedHandlerContext
;
199 BOOLEAN RegisteredChainedReceiveExpeditedHandler
;
200 } ADDRESS_FILE
, *PADDRESS_FILE
;
202 /* Structure used to search through Address Files */
203 typedef struct _AF_SEARCH
{
204 PLIST_ENTRY Next
; /* Next address file to check */
205 PIP_ADDRESS Address
; /* Pointer to address to be found */
206 USHORT Port
; /* Network port */
207 USHORT Protocol
; /* Protocol number */
208 } AF_SEARCH
, *PAF_SEARCH
;
210 /*******************************************************
211 * Connection-oriented communication support structures *
212 *******************************************************/
214 typedef struct _TCP_RECEIVE_REQUEST
{
215 LIST_ENTRY ListEntry
; /* Entry on list */
216 PNDIS_BUFFER Buffer
; /* Pointer to receive buffer */
217 ULONG BufferSize
; /* Size of Buffer */
218 DATAGRAM_COMPLETION_ROUTINE Complete
; /* Completion routine */
219 PVOID Context
; /* Pointer to context information */
220 } TCP_RECEIVE_REQUEST
, *PTCP_RECEIVE_REQUEST
;
222 /* Connection states */
224 ctListen
= 0, /* Waiting for incoming connection requests */
225 ctSynSent
, /* Waiting for matching connection request */
226 ctSynReceived
, /* Waiting for connection request acknowledgment */
227 ctEstablished
, /* Connection is open for data transfer */
228 ctFinWait1
, /* Waiting for termination request or ack. for same */
229 ctFinWait2
, /* Waiting for termination request from remote TCP */
230 ctCloseWait
, /* Waiting for termination request from local user */
231 ctClosing
, /* Waiting for termination ack. from remote TCP */
232 ctLastAck
, /* Waiting for termination request ack. from remote TCP */
233 ctTimeWait
, /* Waiting for enough time to pass to be sure the remote TCP
234 received the ack. of its connection termination request */
235 ctClosed
/* Represents a closed connection */
236 } CONNECTION_STATE
, *PCONNECTION_STATE
;
239 /* Structure for an TCP segment */
240 typedef struct _TCP_SEGMENT
{
241 LIST_ENTRY ListEntry
;
242 PIP_PACKET IPPacket
; /* Pointer to IP packet */
243 PVOID SegmentData
; /* Pointer to segment data */
244 ULONG SequenceNumber
; /* Sequence number of first byte in segment */
245 ULONG Length
; /* Number of bytes in segment */
246 ULONG BytesDelivered
; /* Number of bytes already delivered to the client */
247 } TCP_SEGMENT
, *PTCP_SEGMENT
;
249 typedef struct _TDI_BUCKET
{
251 struct _CONNECTION_ENDPOINT
*AssociatedEndpoint
;
255 } TDI_BUCKET
, *PTDI_BUCKET
;
257 /* Transport connection context structure A.K.A. Transmission Control Block
258 (TCB) in TCP terminology. The FileObject->FsContext2 field holds a pointer
260 typedef struct _CONNECTION_ENDPOINT
{
261 PVOID SocketContext
; /* Context for lower layer (MUST be first member in struct) */
262 LIST_ENTRY ListEntry
; /* Entry on list */
263 LONG RefCount
; /* Reference count */
264 OBJECT_FREE_ROUTINE Free
; /* Routine to use to free resources for the object */
265 KSPIN_LOCK Lock
; /* Spin lock to protect this structure */
266 KIRQL OldIrql
; /* The old irql is stored here for use in HandleSignalledConnection */
267 PVOID ClientContext
; /* Pointer to client context information */
268 PADDRESS_FILE AddressFile
; /* Associated address file object (NULL if none) */
271 LIST_ENTRY ConnectRequest
; /* Queued connect requests */
272 LIST_ENTRY ListenRequest
; /* Queued listen requests */
273 LIST_ENTRY ReceiveRequest
; /* Queued receive requests */
274 LIST_ENTRY SendRequest
; /* Queued send requests */
275 LIST_ENTRY ShutdownRequest
;/* Queued shutdown requests */
277 LIST_ENTRY PacketQueue
; /* Queued received packets waiting to be processed */
279 /* Disconnect Timer */
280 KTIMER DisconnectTimer
;
284 BOOLEAN SendShutdown
;
285 BOOLEAN ReceiveShutdown
;
286 NTSTATUS ReceiveShutdownStatus
;
289 struct _CONNECTION_ENDPOINT
*Next
; /* Next connection in address file list */
290 } CONNECTION_ENDPOINT
, *PCONNECTION_ENDPOINT
;
294 /*************************
295 * TDI support structures *
296 *************************/
298 /* Transport control channel context structure. The FileObject->FsContext2
299 field holds a pointer to this structure */
300 typedef struct _CONTROL_CHANNEL
{
301 LIST_ENTRY ListEntry
; /* Entry on list */
302 LONG RefCount
; /* Reference count */
303 OBJECT_FREE_ROUTINE Free
; /* Routine to use to free resources for the object */
304 KSPIN_LOCK Lock
; /* Spin lock to protect this structure */
305 } CONTROL_CHANNEL
, *PCONTROL_CHANNEL
;
307 /* Transport (TCP/UDP) endpoint context structure. The FileObject->FsContext
308 field holds a pointer to this structure */
309 typedef struct _TRANSPORT_CONTEXT
{
311 HANDLE AddressHandle
;
312 CONNECTION_CONTEXT ConnectionContext
;
313 HANDLE ControlChannel
;
317 } TRANSPORT_CONTEXT
, *PTRANSPORT_CONTEXT
;
319 typedef struct _TI_QUERY_CONTEXT
{
323 TCP_REQUEST_QUERY_INFORMATION_EX QueryInfo
;
324 } TI_QUERY_CONTEXT
, *PTI_QUERY_CONTEXT
;