Synchronize with trunk's revision r57599.
[reactos.git] / drivers / network / 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 <ntifs.h>
17 #include <ndk/obtypes.h>
18 #include <ndk/obfuncs.h>
19 #include <ndk/mmtypes.h>
20 #include <ndk/mmfuncs.h>
21 #include <tdi.h>
22 #include <tdikrnl.h>
23 #include <tdiinfo.h>
24 #include <string.h>
25 #define _WINBASE_
26 #define _WINDOWS_H
27 #define _INC_WINDOWS
28 #include <windef.h>
29 #include <winsock2.h>
30 #include <afd/shared.h>
31 #include <pseh/pseh2.h>
32
33 #include "tdi_proto.h"
34 #include "tdiconn.h"
35 #include "debug.h"
36
37 #ifndef MIN
38 #define MIN(x,y) (((x)<(y))?(x):(y))
39 #endif
40
41 #define IOCTL_TCP_QUERY_INFORMATION_EX \
42 CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
43
44 #define TL_INSTANCE 0
45 #define IP_MIB_STATS_ID 1
46 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
47
48 typedef struct IPSNMP_INFO {
49 ULONG Forwarding;
50 ULONG DefaultTTL;
51 ULONG InReceives;
52 ULONG InHdrErrors;
53 ULONG InAddrErrors;
54 ULONG ForwDatagrams;
55 ULONG InUnknownProtos;
56 ULONG InDiscards;
57 ULONG InDelivers;
58 ULONG OutRequests;
59 ULONG RoutingDiscards;
60 ULONG OutDiscards;
61 ULONG OutNoRoutes;
62 ULONG ReasmTimeout;
63 ULONG ReasmReqds;
64 ULONG ReasmOks;
65 ULONG ReasmFails;
66 ULONG FragOks;
67 ULONG FragFails;
68 ULONG FragCreates;
69 ULONG NumIf;
70 ULONG NumAddr;
71 ULONG NumRoutes;
72 } IPSNMP_INFO, *PIPSNMP_INFO;
73
74 typedef struct IPADDR_ENTRY {
75 ULONG Addr;
76 ULONG Index;
77 ULONG Mask;
78 ULONG BcastAddr;
79 ULONG ReasmSize;
80 USHORT Context;
81 USHORT Pad;
82 } IPADDR_ENTRY, *PIPADDR_ENTRY;
83
84 #define DN2H(dw) \
85 ((((dw) & 0xFF000000L) >> 24) | \
86 (((dw) & 0x00FF0000L) >> 8) | \
87 (((dw) & 0x0000FF00L) << 8) | \
88 (((dw) & 0x000000FFL) << 24))
89
90 #define SOCKET_STATE_INVALID_TRANSITION ((DWORD)-1)
91 #define SOCKET_STATE_CREATED 0
92 #define SOCKET_STATE_BOUND 1
93 #define SOCKET_STATE_CONNECTING 2
94 #define SOCKET_STATE_CONNECTED 3
95 #define SOCKET_STATE_LISTENING 4
96 #define SOCKET_STATE_MASK 0x0000ffff
97 #define SOCKET_STATE_EOF_READ 0x20000000
98 #define SOCKET_STATE_LOCKED 0x40000000
99 #define SOCKET_STATE_NEW 0x80000000
100 #define SOCKET_STATE_CLOSED 0x00000100
101
102 #define FUNCTION_CONNECT 0
103 #define FUNCTION_RECV 1
104 #define FUNCTION_SEND 2
105 #define FUNCTION_PREACCEPT 3
106 #define FUNCTION_ACCEPT 4
107 #define FUNCTION_DISCONNECT 5
108 #define FUNCTION_CLOSE 6
109 #define MAX_FUNCTIONS 7
110
111 #define IN_FLIGHT_REQUESTS 5
112
113 #define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed
114 * for ancillary data on packet
115 * requests. */
116
117 /* XXX This is a hack we should clean up later
118 * We do this in order to get some storage for the locked handle table
119 * Maybe I'll use some tail item in the irp instead */
120 #define AFD_HANDLES(x) ((PAFD_HANDLE)(x)->Exclusive)
121 #define SET_AFD_HANDLES(x,y) (((x)->Exclusive) = (ULONG_PTR)(y))
122
123 typedef struct _AFD_MAPBUF {
124 PVOID BufferAddress;
125 PMDL Mdl;
126 } AFD_MAPBUF, *PAFD_MAPBUF;
127
128 typedef struct _AFD_DEVICE_EXTENSION {
129 PDEVICE_OBJECT DeviceObject;
130 LIST_ENTRY Polls;
131 KSPIN_LOCK Lock;
132 } AFD_DEVICE_EXTENSION, *PAFD_DEVICE_EXTENSION;
133
134 typedef struct _AFD_ACTIVE_POLL {
135 LIST_ENTRY ListEntry;
136 PIRP Irp;
137 PAFD_DEVICE_EXTENSION DeviceExt;
138 KDPC TimeoutDpc;
139 KTIMER Timer;
140 PKEVENT EventObject;
141 BOOLEAN Exclusive;
142 } AFD_ACTIVE_POLL, *PAFD_ACTIVE_POLL;
143
144 typedef struct _IRP_LIST {
145 LIST_ENTRY ListEntry;
146 PIRP Irp;
147 } IRP_LIST, *PIRP_LIST;
148
149 typedef struct _AFD_TDI_OBJECT {
150 PFILE_OBJECT Object;
151 HANDLE Handle;
152 } AFD_TDI_OBJECT, *PAFD_TDI_OBJECT;
153
154 typedef struct _AFD_TDI_OBJECT_QELT {
155 LIST_ENTRY ListEntry;
156 UINT Seq;
157 PTDI_CONNECTION_INFORMATION ConnInfo;
158 AFD_TDI_OBJECT Object;
159 } AFD_TDI_OBJECT_QELT, *PAFD_TDI_OBJECT_QELT;
160
161 typedef struct _AFD_IN_FLIGHT_REQUEST {
162 PIRP InFlightRequest;
163 IO_STATUS_BLOCK Iosb;
164 PTDI_CONNECTION_INFORMATION ConnectionCallInfo;
165 PTDI_CONNECTION_INFORMATION ConnectionReturnInfo;
166 } AFD_IN_FLIGHT_REQUEST, *PAFD_IN_FLIGHT_REQUEST;
167
168 typedef struct _AFD_DATA_WINDOW {
169 PCHAR Window;
170 UINT BytesUsed, Size, Content;
171 } AFD_DATA_WINDOW, *PAFD_DATA_WINDOW;
172
173 typedef struct _AFD_STORED_DATAGRAM {
174 LIST_ENTRY ListEntry;
175 UINT Len;
176 PTRANSPORT_ADDRESS Address;
177 CHAR Buffer[1];
178 } AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
179
180 typedef struct _AFD_FCB {
181 BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline, TdiReceiveClosed, SendClosed;
182 UINT State, Flags, GroupID, GroupType;
183 KIRQL OldIrql;
184 UINT LockCount;
185 PVOID CurrentThread;
186 PFILE_OBJECT FileObject;
187 PAFD_DEVICE_EXTENSION DeviceExt;
188 BOOLEAN DelayedAccept;
189 UINT ConnSeq;
190 USHORT DisconnectFlags;
191 BOOLEAN DisconnectPending;
192 LARGE_INTEGER DisconnectTimeout;
193 PTRANSPORT_ADDRESS LocalAddress, RemoteAddress;
194 PTDI_CONNECTION_INFORMATION AddressFrom, ConnectCallInfo, ConnectReturnInfo;
195 AFD_TDI_OBJECT AddressFile, Connection;
196 AFD_IN_FLIGHT_REQUEST ConnectIrp, ListenIrp, ReceiveIrp, SendIrp, DisconnectIrp;
197 AFD_DATA_WINDOW Send, Recv;
198 KMUTEX Mutex;
199 PKEVENT EventSelect;
200 DWORD EventSelectTriggers;
201 DWORD EventSelectDisabled;
202 UNICODE_STRING TdiDeviceName;
203 PVOID Context;
204 DWORD PollState;
205 NTSTATUS PollStatus[FD_MAX_EVENTS];
206 UINT ContextSize;
207 PVOID ConnectData;
208 UINT FilledConnectData;
209 UINT ConnectDataSize;
210 PVOID DisconnectData;
211 UINT FilledDisconnectData;
212 UINT DisconnectDataSize;
213 PVOID ConnectOptions;
214 UINT FilledConnectOptions;
215 UINT ConnectOptionsSize;
216 PVOID DisconnectOptions;
217 UINT FilledDisconnectOptions;
218 UINT DisconnectOptionsSize;
219 LIST_ENTRY PendingIrpList[MAX_FUNCTIONS];
220 LIST_ENTRY DatagramList;
221 LIST_ENTRY PendingConnections;
222 } AFD_FCB, *PAFD_FCB;
223
224 /* bind.c */
225
226 NTSTATUS WarmSocketForBind( PAFD_FCB FCB, ULONG ShareType );
227 NTSTATUS NTAPI
228 AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
229 PIO_STACK_LOCATION IrpSp);
230
231 /* connect.c */
232
233 NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB );
234 NTSTATUS WarmSocketForConnection( PAFD_FCB FCB );
235 NTSTATUS NTAPI
236 AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
237 PIO_STACK_LOCATION IrpSp);
238 NTSTATUS NTAPI
239 AfdGetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
240 PIO_STACK_LOCATION IrpSp);
241 NTSTATUS NTAPI
242 AfdSetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
243 PIO_STACK_LOCATION IrpSp);
244 NTSTATUS NTAPI
245 AfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
246 PIO_STACK_LOCATION IrpSp);
247 NTSTATUS NTAPI
248 AfdGetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
249 PIO_STACK_LOCATION IrpSp);
250 NTSTATUS NTAPI
251 AfdSetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
252 PIO_STACK_LOCATION IrpSp);
253 NTSTATUS NTAPI
254 AfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
255 PIO_STACK_LOCATION IrpSp);
256
257 /* context.c */
258
259 NTSTATUS NTAPI
260 AfdGetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
261 PIO_STACK_LOCATION IrpSp );
262 NTSTATUS NTAPI
263 AfdGetContextSize( PDEVICE_OBJECT DeviceObject, PIRP Irp,
264 PIO_STACK_LOCATION IrpSp );
265 NTSTATUS NTAPI
266 AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
267 PIO_STACK_LOCATION IrpSp );
268
269 /* info.c */
270
271 NTSTATUS NTAPI
272 AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
273 PIO_STACK_LOCATION IrpSp );
274
275 NTSTATUS NTAPI
276 AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
277 PIO_STACK_LOCATION IrpSp );
278
279 NTSTATUS NTAPI
280 AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
281 PIO_STACK_LOCATION IrpSp );
282
283 NTSTATUS NTAPI
284 AfdGetPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
285 PIO_STACK_LOCATION IrpSp );
286
287 /* listen.c */
288 NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp,
289 PIO_STACK_LOCATION IrpSp );
290
291 NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
292 PIO_STACK_LOCATION IrpSp);
293
294 NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
295 PIO_STACK_LOCATION IrpSp );
296
297 /* lock.c */
298
299 PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
300 PVOID AddressBuf, PINT AddressLen,
301 BOOLEAN Write, BOOLEAN LockAddress,
302 KPROCESSOR_MODE LockMode );
303 VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address );
304 BOOLEAN SocketAcquireStateLock( PAFD_FCB FCB );
305 NTSTATUS NTAPI UnlockAndMaybeComplete
306 ( PAFD_FCB FCB, NTSTATUS Status, PIRP Irp,
307 UINT Information );
308 VOID SocketStateUnlock( PAFD_FCB FCB );
309 NTSTATUS LostSocket( PIRP Irp );
310 PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
311 VOID UnlockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
312 PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output, KPROCESSOR_MODE *LockMode );
313 VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
314 PVOID GetLockedData( PIRP Irp, PIO_STACK_LOCATION IrpSp );
315 NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function );
316 NTSTATUS QueueUserModeIrp(PAFD_FCB FCB, PIRP Irp, UINT Function);
317
318 /* main.c */
319
320 VOID OskitDumpBuffer( PCHAR Buffer, UINT Len );
321 VOID DestroySocket( PAFD_FCB FCB );
322 VOID NTAPI AfdCancelHandler(PDEVICE_OBJECT DeviceObject,
323 PIRP Irp);
324 VOID RetryDisconnectCompletion(PAFD_FCB FCB);
325 BOOLEAN CheckUnlockExtraBuffers(PAFD_FCB FCB, PIO_STACK_LOCATION IrpSp);
326
327 /* read.c */
328
329 NTSTATUS NTAPI ReceiveComplete
330 ( PDEVICE_OBJECT DeviceObject,
331 PIRP Irp,
332 PVOID Context );
333
334 NTSTATUS NTAPI PacketSocketRecvComplete
335 ( PDEVICE_OBJECT DeviceObject,
336 PIRP Irp,
337 PVOID Context );
338
339 NTSTATUS NTAPI
340 AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
341 PIO_STACK_LOCATION IrpSp, BOOLEAN Short);
342 NTSTATUS NTAPI
343 AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
344 PIO_STACK_LOCATION IrpSp );
345
346 /* select.c */
347
348 NTSTATUS NTAPI
349 AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
350 PIO_STACK_LOCATION IrpSp );
351 NTSTATUS NTAPI
352 AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
353 PIO_STACK_LOCATION IrpSp );
354 NTSTATUS NTAPI
355 AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp,
356 PIO_STACK_LOCATION IrpSp );
357 VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceObject, PFILE_OBJECT FileObject );
358 VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt,
359 PFILE_OBJECT FileObject, BOOLEAN ExclusiveOnly );
360 VOID ZeroEvents( PAFD_HANDLE HandleArray,
361 UINT HandleCount );
362 VOID SignalSocket(
363 PAFD_ACTIVE_POLL Poll OPTIONAL, PIRP _Irp OPTIONAL,
364 PAFD_POLL_INFO PollReq, NTSTATUS Status);
365
366 /* tdi.c */
367
368 NTSTATUS TdiOpenAddressFile(
369 PUNICODE_STRING DeviceName,
370 PTRANSPORT_ADDRESS Name,
371 ULONG ShareType,
372 PHANDLE AddressHandle,
373 PFILE_OBJECT *AddressObject);
374
375 NTSTATUS TdiAssociateAddressFile(
376 HANDLE AddressHandle,
377 PFILE_OBJECT ConnectionObject);
378
379 NTSTATUS TdiDisassociateAddressFile(
380 PFILE_OBJECT ConnectionObject);
381
382 NTSTATUS TdiListen
383 ( PIRP *Irp,
384 PFILE_OBJECT ConnectionObject,
385 PTDI_CONNECTION_INFORMATION *RequestConnectionInfo,
386 PTDI_CONNECTION_INFORMATION *ReturnConnectionInfo,
387 PIO_STATUS_BLOCK Iosb,
388 PIO_COMPLETION_ROUTINE CompletionRoutine,
389 PVOID CompletionContext);
390
391 NTSTATUS TdiReceive
392 ( PIRP *Irp,
393 PFILE_OBJECT ConnectionObject,
394 USHORT Flags,
395 PCHAR Buffer,
396 UINT BufferLength,
397 PIO_STATUS_BLOCK Iosb,
398 PIO_COMPLETION_ROUTINE CompletionRoutine,
399 PVOID CompletionContext);
400
401 NTSTATUS TdiSend
402 ( PIRP *Irp,
403 PFILE_OBJECT ConnectionObject,
404 USHORT Flags,
405 PCHAR Buffer,
406 UINT BufferLength,
407 PIO_STATUS_BLOCK Iosb,
408 PIO_COMPLETION_ROUTINE CompletionRoutine,
409 PVOID CompletionContext);
410
411 NTSTATUS TdiReceiveDatagram(
412 PIRP *Irp,
413 PFILE_OBJECT TransportObject,
414 USHORT Flags,
415 PCHAR Buffer,
416 UINT BufferLength,
417 PTDI_CONNECTION_INFORMATION From,
418 PIO_STATUS_BLOCK Iosb,
419 PIO_COMPLETION_ROUTINE CompletionRoutine,
420 PVOID CompletionContext);
421
422 NTSTATUS TdiSendDatagram(
423 PIRP *Irp,
424 PFILE_OBJECT TransportObject,
425 PCHAR Buffer,
426 UINT BufferLength,
427 PTDI_CONNECTION_INFORMATION To,
428 PIO_STATUS_BLOCK Iosb,
429 PIO_COMPLETION_ROUTINE CompletionRoutine,
430 PVOID CompletionContext);
431
432 NTSTATUS TdiQueryMaxDatagramLength(
433 PFILE_OBJECT FileObject,
434 PUINT MaxDatagramLength);
435
436 /* write.c */
437
438 NTSTATUS NTAPI
439 AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
440 PIO_STACK_LOCATION IrpSp, BOOLEAN Short);
441 NTSTATUS NTAPI
442 AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
443 PIO_STACK_LOCATION IrpSp);
444
445 #endif/*_AFD_H*/