adfb2b783ad69c630d63824fca6a6c5f6d83bb92
[reactos.git] / reactos / drivers / net / afd / include / afd.h
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: drivers/net/afd/include/afd.h
6 * PURPOSE: Ancillary functions driver -- constants and structures
7 * PROGRAMMER: Art Yerkes (ayerkes@speakeasy.net)
8 * UPDATE HISTORY:
9 * 20040630 Created
10 */
11
12 #ifndef _AFD_H
13 #define _AFD_H
14
15 #include <ntddk.h>
16 #include <tdi.h>
17 #include <tdikrnl.h>
18 #include <tdiinfo.h>
19 #include <string.h>
20 #define _WINBASE_
21 #define _WINDOWS_H
22 #include <winsock2.h>
23 #include <afd/shared.h>
24
25 #ifndef MIN
26 #define MIN(x,y) (((x)<(y))?(x):(y))
27 #endif
28
29 #define SOCKET_STATE_INVALID_TRANSITION ((DWORD)-1)
30 #define SOCKET_STATE_CREATED 0
31 #define SOCKET_STATE_BOUND 1
32 #define SOCKET_STATE_CONNECTING 2
33 #define SOCKET_STATE_CONNECTED 3
34 #define SOCKET_STATE_LISTENING 4
35 #define SOCKET_STATE_MASK 0x0000ffff
36 #define SOCKET_STATE_EOF_READ 0x20000000
37 #define SOCKET_STATE_LOCKED 0x40000000
38 #define SOCKET_STATE_NEW 0x80000000
39 #define SOCKET_STATE_CLOSED 0x00000100
40
41 #define FUNCTION_CONNECT 0
42 #define FUNCTION_RECV 1
43 #define FUNCTION_SEND 2
44 #define FUNCTION_PREACCEPT 3
45 #define FUNCTION_ACCEPT 4
46 #define FUNCTION_CLOSE 5
47 #define MAX_FUNCTIONS 6
48
49 #define IN_FLIGHT_REQUESTS 3
50
51 #define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed
52 * for ancillary data on packet
53 * requests. */
54
55 #define DEFAULT_SEND_WINDOW_SIZE 16384
56 #define DEFAULT_RECEIVE_WINDOW_SIZE 16384
57
58 #define SGID_CONNECTIONLESS 1 /* XXX Find this flag */
59
60 /* XXX This is a hack we should clean up later
61 * We do this in order to get some storage for the locked handle table
62 * Maybe I'll use some tail item in the irp instead */
63 #define AFD_HANDLES(x) ((PAFD_HANDLE)(x)->Exclusive)
64 #define SET_AFD_HANDLES(x,y) (((x)->Exclusive) = (ULONG)(y))
65
66 typedef struct _AFD_MAPBUF {
67 PVOID BufferAddress;
68 PMDL Mdl;
69 } AFD_MAPBUF, *PAFD_MAPBUF;
70
71 typedef struct _AFD_DEVICE_EXTENSION {
72 PDEVICE_OBJECT DeviceObject;
73 LIST_ENTRY Polls;
74 KSPIN_LOCK Lock;
75 } AFD_DEVICE_EXTENSION, *PAFD_DEVICE_EXTENSION;
76
77 typedef struct _AFD_ACTIVE_POLL {
78 LIST_ENTRY ListEntry;
79 PIRP Irp;
80 PAFD_DEVICE_EXTENSION DeviceExt;
81 KDPC TimeoutDpc;
82 KTIMER Timer;
83 PKEVENT EventObject;
84 BOOLEAN Exclusive;
85 } AFD_ACTIVE_POLL, *PAFD_ACTIVE_POLL;
86
87 typedef struct _IRP_LIST {
88 LIST_ENTRY ListEntry;
89 PIRP Irp;
90 } IRP_LIST, *PIRP_LIST;
91
92 typedef struct _AFD_TDI_OBJECT {
93 PFILE_OBJECT Object;
94 HANDLE Handle;
95 } AFD_TDI_OBJECT, *PAFD_TDI_OBJECT;
96
97 typedef struct _AFD_TDI_OBJECT_QELT {
98 LIST_ENTRY ListEntry;
99 UINT Seq;
100 PTDI_CONNECTION_INFORMATION ConnInfo;
101 AFD_TDI_OBJECT Object;
102 } AFD_TDI_OBJECT_QELT, *PAFD_TDI_OBJECT_QELT;
103
104 typedef struct _AFD_IN_FLIGHT_REQUEST {
105 PIRP InFlightRequest;
106 IO_STATUS_BLOCK Iosb;
107 PTDI_CONNECTION_INFORMATION ConnectionCallInfo;
108 PTDI_CONNECTION_INFORMATION ConnectionReturnInfo;
109 } AFD_IN_FLIGHT_REQUEST, *PAFD_IN_FLIGHT_REQUEST;
110
111 typedef struct _AFD_DATA_WINDOW {
112 PCHAR Window;
113 UINT BytesUsed, Size, Content;
114 } AFD_DATA_WINDOW, *PAFD_DATA_WINDOW;
115
116 typedef struct _AFD_STORED_DATAGRAM {
117 LIST_ENTRY ListEntry;
118 UINT Len;
119 PTRANSPORT_ADDRESS Address;
120 CHAR Buffer[1];
121 } AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
122
123 typedef struct _AFD_FCB {
124 BOOLEAN Locked, Critical, Overread;
125 UINT State, Flags;
126 KIRQL OldIrql;
127 UINT LockCount;
128 PVOID CurrentThread;
129 KSPIN_LOCK SpinLock;
130 PFILE_OBJECT FileObject;
131 PAFD_DEVICE_EXTENSION DeviceExt;
132 BOOLEAN DelayedAccept, NeedsNewListen;
133 UINT ConnSeq;
134 PTRANSPORT_ADDRESS LocalAddress, RemoteAddress;
135 PTDI_CONNECTION_INFORMATION AddressFrom;
136 AFD_TDI_OBJECT AddressFile, Connection;
137 AFD_IN_FLIGHT_REQUEST ConnectIrp, ListenIrp, ReceiveIrp, SendIrp;
138 AFD_DATA_WINDOW Send, Recv;
139 FAST_MUTEX Mutex;
140 KEVENT StateLockedEvent;
141 PKEVENT EventSelect;
142 DWORD EventSelectTriggers;
143 DWORD EventsFired;
144 UNICODE_STRING TdiDeviceName;
145 PVOID Context;
146 DWORD PollState;
147 UINT ContextSize;
148 LIST_ENTRY PendingIrpList[MAX_FUNCTIONS];
149 LIST_ENTRY DatagramList;
150 LIST_ENTRY PendingConnections;
151 } AFD_FCB, *PAFD_FCB;
152
153 /* bind.c */
154
155 NTSTATUS WarmSocketForBind( PAFD_FCB FCB );
156 NTSTATUS STDCALL
157 AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
158 PIO_STACK_LOCATION IrpSp);
159
160 /* connect.c */
161
162 NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB );
163 NTSTATUS WarmSocketForConnection( PAFD_FCB FCB );
164 NTSTATUS STDCALL
165 AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
166 PIO_STACK_LOCATION IrpSp);
167
168 /* context.c */
169
170 NTSTATUS STDCALL
171 AfdGetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
172 PIO_STACK_LOCATION IrpSp );
173 NTSTATUS STDCALL
174 AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
175 PIO_STACK_LOCATION IrpSp );
176
177 /* info.c */
178
179 NTSTATUS STDCALL
180 AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
181 PIO_STACK_LOCATION IrpSp );
182
183 NTSTATUS STDCALL
184 AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
185 PIO_STACK_LOCATION IrpSp, BOOLEAN Local );
186
187 /* listen.c */
188 NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp,
189 PIO_STACK_LOCATION IrpSp );
190
191 NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
192 PIO_STACK_LOCATION IrpSp);
193
194 NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
195 PIO_STACK_LOCATION IrpSp );
196
197 /* lock.c */
198
199 PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
200 PVOID AddressBuf, PINT AddressLen,
201 BOOLEAN Write, BOOLEAN LockAddress );
202 VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address );
203 UINT SocketAcquireStateLock( PAFD_FCB FCB );
204 NTSTATUS DDKAPI UnlockAndMaybeComplete
205 ( PAFD_FCB FCB, NTSTATUS Status, PIRP Irp,
206 UINT Information,
207 PIO_COMPLETION_ROUTINE Completion,
208 BOOL ShouldUnlockIrp );
209 VOID SocketStateUnlock( PAFD_FCB FCB );
210 NTSTATUS LostSocket( PIRP Irp, BOOL ShouldUnlockIrp );
211 PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
212 VOID UnlockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
213 PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
214 VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
215 VOID SocketCalloutEnter( PAFD_FCB FCB );
216 VOID SocketCalloutLeave( PAFD_FCB FCB );
217
218 /* main.c */
219
220 VOID OskitDumpBuffer( PCHAR Buffer, UINT Len );
221 NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function );
222 VOID DestroySocket( PAFD_FCB FCB );
223
224 /* read.c */
225
226 NTSTATUS DDKAPI ReceiveComplete
227 ( PDEVICE_OBJECT DeviceObject,
228 PIRP Irp,
229 PVOID Context );
230
231 NTSTATUS DDKAPI PacketSocketRecvComplete
232 ( PDEVICE_OBJECT DeviceObject,
233 PIRP Irp,
234 PVOID Context );
235
236 NTSTATUS STDCALL
237 AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
238 PIO_STACK_LOCATION IrpSp, BOOLEAN Short);
239 NTSTATUS STDCALL
240 AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
241 PIO_STACK_LOCATION IrpSp );
242
243 /* select.c */
244
245 NTSTATUS STDCALL
246 AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
247 PIO_STACK_LOCATION IrpSp );
248 NTSTATUS STDCALL
249 AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
250 PIO_STACK_LOCATION IrpSp );
251 NTSTATUS STDCALL
252 AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp,
253 PIO_STACK_LOCATION IrpSp );
254 VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceObject, PFILE_OBJECT FileObject );
255 VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt,
256 PFILE_OBJECT FileObject, BOOLEAN ExclusiveOnly );
257
258 /* tdi.c */
259
260 NTSTATUS TdiOpenAddressFile(
261 PUNICODE_STRING DeviceName,
262 PTRANSPORT_ADDRESS Name,
263 PHANDLE AddressHandle,
264 PFILE_OBJECT *AddressObject);
265
266 NTSTATUS TdiAssociateAddressFile(
267 HANDLE AddressHandle,
268 PFILE_OBJECT ConnectionObject);
269
270 NTSTATUS TdiListen
271 ( PIRP *Irp,
272 PFILE_OBJECT ConnectionObject,
273 PTDI_CONNECTION_INFORMATION *RequestConnectionInfo,
274 PTDI_CONNECTION_INFORMATION *ReturnConnectionInfo,
275 PIO_STATUS_BLOCK Iosb,
276 PIO_COMPLETION_ROUTINE CompletionRoutine,
277 PVOID CompletionContext);
278
279 NTSTATUS TdiReceive
280 ( PIRP *Irp,
281 PFILE_OBJECT ConnectionObject,
282 USHORT Flags,
283 PCHAR Buffer,
284 UINT BufferLength,
285 PIO_STATUS_BLOCK Iosb,
286 PIO_COMPLETION_ROUTINE CompletionRoutine,
287 PVOID CompletionContext);
288
289 NTSTATUS TdiSend
290 ( PIRP *Irp,
291 PFILE_OBJECT ConnectionObject,
292 USHORT Flags,
293 PCHAR Buffer,
294 UINT BufferLength,
295 PIO_STATUS_BLOCK Iosb,
296 PIO_COMPLETION_ROUTINE CompletionRoutine,
297 PVOID CompletionContext);
298
299 NTSTATUS TdiReceiveDatagram(
300 PIRP *Irp,
301 PFILE_OBJECT TransportObject,
302 USHORT Flags,
303 PCHAR Buffer,
304 UINT BufferLength,
305 PTDI_CONNECTION_INFORMATION From,
306 PIO_STATUS_BLOCK Iosb,
307 PIO_COMPLETION_ROUTINE CompletionRoutine,
308 PVOID CompletionContext);
309
310 NTSTATUS TdiSendDatagram(
311 PIRP *Irp,
312 PFILE_OBJECT TransportObject,
313 PCHAR Buffer,
314 UINT BufferLength,
315 PTDI_CONNECTION_INFORMATION To,
316 PIO_STATUS_BLOCK Iosb,
317 PIO_COMPLETION_ROUTINE CompletionRoutine,
318 PVOID CompletionContext);
319
320 /* write.c */
321
322 NTSTATUS STDCALL
323 AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
324 PIO_STACK_LOCATION IrpSp, BOOLEAN Short);
325 NTSTATUS STDCALL
326 AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
327 PIO_STACK_LOCATION IrpSp);
328
329 #endif/*_AFD_H*/