Sync with trunk r58687.
[reactos.git] / drivers / network / afd / include / afd.h
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/net/afd/include/afd.h
5 * PURPOSE: Ancillary functions driver -- constants and structures
6 * PROGRAMMER: Art Yerkes (ayerkes@speakeasy.net)
7 * UPDATE HISTORY:
8 * 20040630 Created
9 */
10
11 #ifndef _AFD_H
12 #define _AFD_H
13
14 #include <ntddk.h>
15 #include <ntifs.h>
16 #include <ndk/obtypes.h>
17 #include <ndk/obfuncs.h>
18 #include <ndk/mmtypes.h>
19 #include <ndk/mmfuncs.h>
20 #include <tdi.h>
21 #include <tdikrnl.h>
22 #include <tdiinfo.h>
23 #include <string.h>
24 #define _WINBASE_
25 #define _WINDOWS_H
26 #define _INC_WINDOWS
27 #include <windef.h>
28 #include <winsock2.h>
29 #include <afd/shared.h>
30 #include <pseh/pseh2.h>
31
32 #include "tdi_proto.h"
33 #include "tdiconn.h"
34 #include "debug.h"
35
36 #ifndef MIN
37 #define MIN(x,y) (((x)<(y))?(x):(y))
38 #endif
39
40 #define IOCTL_TCP_QUERY_INFORMATION_EX \
41 CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
42
43 #define TL_INSTANCE 0
44 #define IP_MIB_STATS_ID 1
45 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
46
47 typedef struct IPSNMP_INFO {
48 ULONG Forwarding;
49 ULONG DefaultTTL;
50 ULONG InReceives;
51 ULONG InHdrErrors;
52 ULONG InAddrErrors;
53 ULONG ForwDatagrams;
54 ULONG InUnknownProtos;
55 ULONG InDiscards;
56 ULONG InDelivers;
57 ULONG OutRequests;
58 ULONG RoutingDiscards;
59 ULONG OutDiscards;
60 ULONG OutNoRoutes;
61 ULONG ReasmTimeout;
62 ULONG ReasmReqds;
63 ULONG ReasmOks;
64 ULONG ReasmFails;
65 ULONG FragOks;
66 ULONG FragFails;
67 ULONG FragCreates;
68 ULONG NumIf;
69 ULONG NumAddr;
70 ULONG NumRoutes;
71 } IPSNMP_INFO, *PIPSNMP_INFO;
72
73 typedef struct IPADDR_ENTRY {
74 ULONG Addr;
75 ULONG Index;
76 ULONG Mask;
77 ULONG BcastAddr;
78 ULONG ReasmSize;
79 USHORT Context;
80 USHORT Pad;
81 } IPADDR_ENTRY, *PIPADDR_ENTRY;
82
83 #define DN2H(dw) \
84 ((((dw) & 0xFF000000L) >> 24) | \
85 (((dw) & 0x00FF0000L) >> 8) | \
86 (((dw) & 0x0000FF00L) << 8) | \
87 (((dw) & 0x000000FFL) << 24))
88
89 #define SOCKET_STATE_INVALID_TRANSITION ((DWORD)-1)
90 #define SOCKET_STATE_CREATED 0
91 #define SOCKET_STATE_BOUND 1
92 #define SOCKET_STATE_CONNECTING 2
93 #define SOCKET_STATE_CONNECTED 3
94 #define SOCKET_STATE_LISTENING 4
95 #define SOCKET_STATE_MASK 0x0000ffff
96 #define SOCKET_STATE_EOF_READ 0x20000000
97 #define SOCKET_STATE_LOCKED 0x40000000
98 #define SOCKET_STATE_NEW 0x80000000
99 #define SOCKET_STATE_CLOSED 0x00000100
100
101 #define FUNCTION_CONNECT 0
102 #define FUNCTION_RECV 1
103 #define FUNCTION_SEND 2
104 #define FUNCTION_PREACCEPT 3
105 #define FUNCTION_ACCEPT 4
106 #define FUNCTION_DISCONNECT 5
107 #define FUNCTION_CLOSE 6
108 #define MAX_FUNCTIONS 7
109
110 #define IN_FLIGHT_REQUESTS 5
111
112 #define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed
113 * for ancillary data on packet
114 * requests. */
115
116 /* XXX This is a hack we should clean up later
117 * We do this in order to get some storage for the locked handle table
118 * Maybe I'll use some tail item in the irp instead */
119 #define AFD_HANDLES(x) ((PAFD_HANDLE)(x)->Exclusive)
120 #define SET_AFD_HANDLES(x,y) (((x)->Exclusive) = (ULONG_PTR)(y))
121
122 typedef struct _AFD_MAPBUF {
123 PVOID BufferAddress;
124 PMDL Mdl;
125 } AFD_MAPBUF, *PAFD_MAPBUF;
126
127 typedef struct _AFD_DEVICE_EXTENSION {
128 PDEVICE_OBJECT DeviceObject;
129 LIST_ENTRY Polls;
130 KSPIN_LOCK Lock;
131 } AFD_DEVICE_EXTENSION, *PAFD_DEVICE_EXTENSION;
132
133 typedef struct _AFD_ACTIVE_POLL {
134 LIST_ENTRY ListEntry;
135 PIRP Irp;
136 PAFD_DEVICE_EXTENSION DeviceExt;
137 KDPC TimeoutDpc;
138 KTIMER Timer;
139 PKEVENT EventObject;
140 BOOLEAN Exclusive;
141 } AFD_ACTIVE_POLL, *PAFD_ACTIVE_POLL;
142
143 typedef struct _IRP_LIST {
144 LIST_ENTRY ListEntry;
145 PIRP Irp;
146 } IRP_LIST, *PIRP_LIST;
147
148 typedef struct _AFD_TDI_OBJECT {
149 PFILE_OBJECT Object;
150 HANDLE Handle;
151 } AFD_TDI_OBJECT, *PAFD_TDI_OBJECT;
152
153 typedef struct _AFD_TDI_OBJECT_QELT {
154 LIST_ENTRY ListEntry;
155 UINT Seq;
156 PTDI_CONNECTION_INFORMATION ConnInfo;
157 AFD_TDI_OBJECT Object;
158 } AFD_TDI_OBJECT_QELT, *PAFD_TDI_OBJECT_QELT;
159
160 typedef struct _AFD_IN_FLIGHT_REQUEST {
161 PIRP InFlightRequest;
162 IO_STATUS_BLOCK Iosb;
163 PTDI_CONNECTION_INFORMATION ConnectionCallInfo;
164 PTDI_CONNECTION_INFORMATION ConnectionReturnInfo;
165 } AFD_IN_FLIGHT_REQUEST, *PAFD_IN_FLIGHT_REQUEST;
166
167 typedef struct _AFD_DATA_WINDOW {
168 PCHAR Window;
169 UINT BytesUsed, Size, Content;
170 } AFD_DATA_WINDOW, *PAFD_DATA_WINDOW;
171
172 typedef struct _AFD_STORED_DATAGRAM {
173 LIST_ENTRY ListEntry;
174 UINT Len;
175 PTRANSPORT_ADDRESS Address;
176 CHAR Buffer[1];
177 } AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
178
179 typedef struct _AFD_FCB {
180 BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline, TdiReceiveClosed, SendClosed;
181 UINT State, Flags, GroupID, GroupType;
182 KIRQL OldIrql;
183 UINT LockCount;
184 PVOID CurrentThread;
185 PFILE_OBJECT FileObject;
186 PAFD_DEVICE_EXTENSION DeviceExt;
187 BOOLEAN DelayedAccept;
188 UINT ConnSeq;
189 USHORT DisconnectFlags;
190 BOOLEAN DisconnectPending;
191 LARGE_INTEGER DisconnectTimeout;
192 PTRANSPORT_ADDRESS LocalAddress, RemoteAddress;
193 PTDI_CONNECTION_INFORMATION AddressFrom, ConnectCallInfo, ConnectReturnInfo;
194 AFD_TDI_OBJECT AddressFile, Connection;
195 AFD_IN_FLIGHT_REQUEST ConnectIrp, ListenIrp, ReceiveIrp, SendIrp, DisconnectIrp;
196 AFD_DATA_WINDOW Send, Recv;
197 KMUTEX Mutex;
198 PKEVENT EventSelect;
199 DWORD EventSelectTriggers;
200 DWORD EventSelectDisabled;
201 UNICODE_STRING TdiDeviceName;
202 PVOID Context;
203 DWORD PollState;
204 NTSTATUS PollStatus[FD_MAX_EVENTS];
205 NTSTATUS LastReceiveStatus;
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*/