- Update AFD's shared header
[reactos.git] / reactos / 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
32 #ifndef MIN
33 #define MIN(x,y) (((x)<(y))?(x):(y))
34 #endif
35
36 #define IOCTL_TCP_QUERY_INFORMATION_EX \
37 CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
38
39 #define TL_INSTANCE 0
40 #define IP_MIB_STATS_ID 1
41 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
42
43 typedef struct IPSNMP_INFO {
44 ULONG Forwarding;
45 ULONG DefaultTTL;
46 ULONG InReceives;
47 ULONG InHdrErrors;
48 ULONG InAddrErrors;
49 ULONG ForwDatagrams;
50 ULONG InUnknownProtos;
51 ULONG InDiscards;
52 ULONG InDelivers;
53 ULONG OutRequests;
54 ULONG RoutingDiscards;
55 ULONG OutDiscards;
56 ULONG OutNoRoutes;
57 ULONG ReasmTimeout;
58 ULONG ReasmReqds;
59 ULONG ReasmOks;
60 ULONG ReasmFails;
61 ULONG FragOks;
62 ULONG FragFails;
63 ULONG FragCreates;
64 ULONG NumIf;
65 ULONG NumAddr;
66 ULONG NumRoutes;
67 } IPSNMP_INFO, *PIPSNMP_INFO;
68
69 typedef struct IPADDR_ENTRY {
70 ULONG Addr;
71 ULONG Index;
72 ULONG Mask;
73 ULONG BcastAddr;
74 ULONG ReasmSize;
75 USHORT Context;
76 USHORT Pad;
77 } IPADDR_ENTRY, *PIPADDR_ENTRY;
78
79 #define DN2H(dw) \
80 ((((dw) & 0xFF000000L) >> 24) | \
81 (((dw) & 0x00FF0000L) >> 8) | \
82 (((dw) & 0x0000FF00L) << 8) | \
83 (((dw) & 0x000000FFL) << 24))
84
85 #define SOCKET_STATE_INVALID_TRANSITION ((DWORD)-1)
86 #define SOCKET_STATE_CREATED 0
87 #define SOCKET_STATE_BOUND 1
88 #define SOCKET_STATE_CONNECTING 2
89 #define SOCKET_STATE_CONNECTED 3
90 #define SOCKET_STATE_LISTENING 4
91 #define SOCKET_STATE_MASK 0x0000ffff
92 #define SOCKET_STATE_EOF_READ 0x20000000
93 #define SOCKET_STATE_LOCKED 0x40000000
94 #define SOCKET_STATE_NEW 0x80000000
95 #define SOCKET_STATE_CLOSED 0x00000100
96
97 #define FUNCTION_CONNECT 0
98 #define FUNCTION_RECV 1
99 #define FUNCTION_SEND 2
100 #define FUNCTION_PREACCEPT 3
101 #define FUNCTION_ACCEPT 4
102 #define FUNCTION_CLOSE 5
103 #define MAX_FUNCTIONS 6
104
105 #define IN_FLIGHT_REQUESTS 4
106
107 #define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed
108 * for ancillary data on packet
109 * requests. */
110
111 #define DEFAULT_SEND_WINDOW_SIZE 16384
112 #define DEFAULT_RECEIVE_WINDOW_SIZE 16384
113
114 #define SGID_CONNECTIONLESS 1 /* XXX Find this flag */
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;
181 UINT State, Flags, BlockingMode, GroupID, GroupType;
182 KIRQL OldIrql;
183 UINT LockCount;
184 PVOID CurrentThread;
185 KSPIN_LOCK SpinLock;
186 PFILE_OBJECT FileObject;
187 PAFD_DEVICE_EXTENSION DeviceExt;
188 BOOLEAN DelayedAccept, NeedsNewListen;
189 UINT ConnSeq;
190 PTRANSPORT_ADDRESS LocalAddress, RemoteAddress;
191 PTDI_CONNECTION_INFORMATION AddressFrom;
192 AFD_TDI_OBJECT AddressFile, Connection;
193 AFD_IN_FLIGHT_REQUEST ConnectIrp, ListenIrp, ReceiveIrp, SendIrp;
194 AFD_DATA_WINDOW Send, Recv;
195 FAST_MUTEX Mutex;
196 KEVENT StateLockedEvent;
197 PKEVENT EventSelect;
198 DWORD EventSelectTriggers;
199 UNICODE_STRING TdiDeviceName;
200 PVOID Context;
201 DWORD PollState;
202 UINT ContextSize;
203 LIST_ENTRY PendingIrpList[MAX_FUNCTIONS];
204 LIST_ENTRY DatagramList;
205 LIST_ENTRY PendingConnections;
206 } AFD_FCB, *PAFD_FCB;
207
208 /* bind.c */
209
210 NTSTATUS WarmSocketForBind( PAFD_FCB FCB );
211 NTSTATUS NTAPI
212 AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
213 PIO_STACK_LOCATION IrpSp);
214
215 /* connect.c */
216
217 NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB );
218 NTSTATUS WarmSocketForConnection( PAFD_FCB FCB );
219 NTSTATUS NTAPI
220 AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
221 PIO_STACK_LOCATION IrpSp);
222
223 /* context.c */
224
225 NTSTATUS NTAPI
226 AfdGetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
227 PIO_STACK_LOCATION IrpSp );
228 NTSTATUS NTAPI
229 AfdGetContextSize( PDEVICE_OBJECT DeviceObject, PIRP Irp,
230 PIO_STACK_LOCATION IrpSp );
231 NTSTATUS NTAPI
232 AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
233 PIO_STACK_LOCATION IrpSp );
234
235 /* info.c */
236
237 NTSTATUS NTAPI
238 AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
239 PIO_STACK_LOCATION IrpSp );
240
241 NTSTATUS NTAPI
242 AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
243 PIO_STACK_LOCATION IrpSp );
244
245 NTSTATUS NTAPI
246 AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
247 PIO_STACK_LOCATION IrpSp );
248
249 NTSTATUS NTAPI
250 AfdGetPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
251 PIO_STACK_LOCATION IrpSp );
252
253 /* listen.c */
254 NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp,
255 PIO_STACK_LOCATION IrpSp );
256
257 NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
258 PIO_STACK_LOCATION IrpSp);
259
260 NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
261 PIO_STACK_LOCATION IrpSp );
262
263 /* lock.c */
264
265 PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
266 PVOID AddressBuf, PINT AddressLen,
267 BOOLEAN Write, BOOLEAN LockAddress );
268 VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address );
269 UINT SocketAcquireStateLock( PAFD_FCB FCB );
270 NTSTATUS NTAPI UnlockAndMaybeComplete
271 ( PAFD_FCB FCB, NTSTATUS Status, PIRP Irp,
272 UINT Information );
273 VOID SocketStateUnlock( PAFD_FCB FCB );
274 NTSTATUS LostSocket( PIRP Irp );
275 PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
276 VOID UnlockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
277 PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
278 VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
279
280 /* main.c */
281
282 VOID OskitDumpBuffer( PCHAR Buffer, UINT Len );
283 NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function );
284 VOID DestroySocket( PAFD_FCB FCB );
285 VOID NTAPI AfdCancelHandler(PDEVICE_OBJECT DeviceObject,
286 PIRP Irp);
287
288 /* read.c */
289
290 NTSTATUS NTAPI ReceiveComplete
291 ( PDEVICE_OBJECT DeviceObject,
292 PIRP Irp,
293 PVOID Context );
294
295 NTSTATUS NTAPI PacketSocketRecvComplete
296 ( PDEVICE_OBJECT DeviceObject,
297 PIRP Irp,
298 PVOID Context );
299
300 NTSTATUS NTAPI
301 AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
302 PIO_STACK_LOCATION IrpSp, BOOLEAN Short);
303 NTSTATUS NTAPI
304 AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
305 PIO_STACK_LOCATION IrpSp );
306
307 /* select.c */
308
309 NTSTATUS NTAPI
310 AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
311 PIO_STACK_LOCATION IrpSp );
312 NTSTATUS NTAPI
313 AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
314 PIO_STACK_LOCATION IrpSp );
315 NTSTATUS NTAPI
316 AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp,
317 PIO_STACK_LOCATION IrpSp );
318 VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceObject, PFILE_OBJECT FileObject );
319 VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt,
320 PFILE_OBJECT FileObject, BOOLEAN ExclusiveOnly );
321 VOID ZeroEvents( PAFD_HANDLE HandleArray,
322 UINT HandleCount );
323 VOID SignalSocket(
324 PAFD_ACTIVE_POLL Poll OPTIONAL, PIRP _Irp OPTIONAL,
325 PAFD_POLL_INFO PollReq, NTSTATUS Status);
326
327 /* tdi.c */
328
329 NTSTATUS TdiOpenAddressFile(
330 PUNICODE_STRING DeviceName,
331 PTRANSPORT_ADDRESS Name,
332 PHANDLE AddressHandle,
333 PFILE_OBJECT *AddressObject);
334
335 NTSTATUS TdiAssociateAddressFile(
336 HANDLE AddressHandle,
337 PFILE_OBJECT ConnectionObject);
338
339 NTSTATUS TdiListen
340 ( PIRP *Irp,
341 PFILE_OBJECT ConnectionObject,
342 PTDI_CONNECTION_INFORMATION *RequestConnectionInfo,
343 PTDI_CONNECTION_INFORMATION *ReturnConnectionInfo,
344 PIO_STATUS_BLOCK Iosb,
345 PIO_COMPLETION_ROUTINE CompletionRoutine,
346 PVOID CompletionContext);
347
348 NTSTATUS TdiReceive
349 ( PIRP *Irp,
350 PFILE_OBJECT ConnectionObject,
351 USHORT Flags,
352 PCHAR Buffer,
353 UINT BufferLength,
354 PIO_STATUS_BLOCK Iosb,
355 PIO_COMPLETION_ROUTINE CompletionRoutine,
356 PVOID CompletionContext);
357
358 NTSTATUS TdiSend
359 ( PIRP *Irp,
360 PFILE_OBJECT ConnectionObject,
361 USHORT Flags,
362 PCHAR Buffer,
363 UINT BufferLength,
364 PIO_STATUS_BLOCK Iosb,
365 PIO_COMPLETION_ROUTINE CompletionRoutine,
366 PVOID CompletionContext);
367
368 NTSTATUS TdiReceiveDatagram(
369 PIRP *Irp,
370 PFILE_OBJECT TransportObject,
371 USHORT Flags,
372 PCHAR Buffer,
373 UINT BufferLength,
374 PTDI_CONNECTION_INFORMATION From,
375 PIO_STATUS_BLOCK Iosb,
376 PIO_COMPLETION_ROUTINE CompletionRoutine,
377 PVOID CompletionContext);
378
379 NTSTATUS TdiSendDatagram(
380 PIRP *Irp,
381 PFILE_OBJECT TransportObject,
382 PCHAR Buffer,
383 UINT BufferLength,
384 PTDI_CONNECTION_INFORMATION To,
385 PIO_STATUS_BLOCK Iosb,
386 PIO_COMPLETION_ROUTINE CompletionRoutine,
387 PVOID CompletionContext);
388
389 /* write.c */
390
391 NTSTATUS NTAPI
392 AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
393 PIO_STACK_LOCATION IrpSp, BOOLEAN Short);
394 NTSTATUS NTAPI
395 AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
396 PIO_STACK_LOCATION IrpSp);
397
398 #endif/*_AFD_H*/