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