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)
16 #include <ndk/obtypes.h>
17 #include <ndk/obfuncs.h>
18 #include <ndk/mmtypes.h>
19 #include <ndk/mmfuncs.h>
29 #include <afd/shared.h>
30 #include <pseh/pseh2.h>
32 #include "tdi_proto.h"
37 #define MIN(x,y) (((x)<(y))?(x):(y))
40 #define IOCTL_TCP_QUERY_INFORMATION_EX \
41 CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
44 #define IP_MIB_STATS_ID 1
45 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
47 typedef struct IPSNMP_INFO
{
54 ULONG InUnknownProtos
;
58 ULONG RoutingDiscards
;
71 } IPSNMP_INFO
, *PIPSNMP_INFO
;
73 typedef struct IPADDR_ENTRY
{
81 } IPADDR_ENTRY
, *PIPADDR_ENTRY
;
84 ((((dw) & 0xFF000000L) >> 24) | \
85 (((dw) & 0x00FF0000L) >> 8) | \
86 (((dw) & 0x0000FF00L) << 8) | \
87 (((dw) & 0x000000FFL) << 24))
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
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
110 #define IN_FLIGHT_REQUESTS 5
112 #define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed
113 * for ancillary data on packet
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))
122 typedef struct _AFD_MAPBUF
{
125 } AFD_MAPBUF
, *PAFD_MAPBUF
;
127 typedef struct _AFD_DEVICE_EXTENSION
{
128 PDEVICE_OBJECT DeviceObject
;
131 } AFD_DEVICE_EXTENSION
, *PAFD_DEVICE_EXTENSION
;
133 typedef struct _AFD_ACTIVE_POLL
{
134 LIST_ENTRY ListEntry
;
136 PAFD_DEVICE_EXTENSION DeviceExt
;
141 } AFD_ACTIVE_POLL
, *PAFD_ACTIVE_POLL
;
143 typedef struct _IRP_LIST
{
144 LIST_ENTRY ListEntry
;
146 } IRP_LIST
, *PIRP_LIST
;
148 typedef struct _AFD_TDI_OBJECT
{
151 } AFD_TDI_OBJECT
, *PAFD_TDI_OBJECT
;
153 typedef struct _AFD_TDI_OBJECT_QELT
{
154 LIST_ENTRY ListEntry
;
156 PTDI_CONNECTION_INFORMATION ConnInfo
;
157 AFD_TDI_OBJECT Object
;
158 } AFD_TDI_OBJECT_QELT
, *PAFD_TDI_OBJECT_QELT
;
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
;
167 typedef struct _AFD_DATA_WINDOW
{
169 UINT BytesUsed
, Size
, Content
;
170 } AFD_DATA_WINDOW
, *PAFD_DATA_WINDOW
;
172 typedef struct _AFD_STORED_DATAGRAM
{
173 LIST_ENTRY ListEntry
;
175 PTRANSPORT_ADDRESS Address
;
177 } AFD_STORED_DATAGRAM
, *PAFD_STORED_DATAGRAM
;
179 typedef struct _AFD_FCB
{
180 BOOLEAN Locked
, Critical
, Overread
, NonBlocking
, OobInline
, TdiReceiveClosed
, SendClosed
;
181 UINT State
, Flags
, GroupID
, GroupType
;
185 PFILE_OBJECT FileObject
;
186 PAFD_DEVICE_EXTENSION DeviceExt
;
187 BOOLEAN DelayedAccept
;
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
;
199 DWORD EventSelectTriggers
;
200 DWORD EventSelectDisabled
;
201 UNICODE_STRING TdiDeviceName
;
204 NTSTATUS PollStatus
[FD_MAX_EVENTS
];
205 NTSTATUS LastReceiveStatus
;
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
;
226 NTSTATUS
WarmSocketForBind( PAFD_FCB FCB
, ULONG ShareType
);
228 AfdBindSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
229 PIO_STACK_LOCATION IrpSp
);
233 NTSTATUS
MakeSocketIntoConnection( PAFD_FCB FCB
);
234 NTSTATUS
WarmSocketForConnection( PAFD_FCB FCB
);
236 AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
237 PIO_STACK_LOCATION IrpSp
);
239 AfdGetConnectData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
240 PIO_STACK_LOCATION IrpSp
);
242 AfdSetConnectData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
243 PIO_STACK_LOCATION IrpSp
);
245 AfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
246 PIO_STACK_LOCATION IrpSp
);
248 AfdGetConnectOptions(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
249 PIO_STACK_LOCATION IrpSp
);
251 AfdSetConnectOptions(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
252 PIO_STACK_LOCATION IrpSp
);
254 AfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
255 PIO_STACK_LOCATION IrpSp
);
260 AfdGetContext( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
261 PIO_STACK_LOCATION IrpSp
);
263 AfdGetContextSize( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
264 PIO_STACK_LOCATION IrpSp
);
266 AfdSetContext( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
267 PIO_STACK_LOCATION IrpSp
);
272 AfdGetInfo( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
273 PIO_STACK_LOCATION IrpSp
);
276 AfdSetInfo( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
277 PIO_STACK_LOCATION IrpSp
);
280 AfdGetSockName( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
281 PIO_STACK_LOCATION IrpSp
);
284 AfdGetPeerName( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
285 PIO_STACK_LOCATION IrpSp
);
288 NTSTATUS
AfdWaitForListen( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
289 PIO_STACK_LOCATION IrpSp
);
291 NTSTATUS
AfdListenSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
292 PIO_STACK_LOCATION IrpSp
);
294 NTSTATUS
AfdAccept( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
295 PIO_STACK_LOCATION IrpSp
);
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
,
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
);
320 VOID
OskitDumpBuffer( PCHAR Buffer
, UINT Len
);
321 VOID
DestroySocket( PAFD_FCB FCB
);
322 VOID NTAPI
AfdCancelHandler(PDEVICE_OBJECT DeviceObject
,
324 VOID
RetryDisconnectCompletion(PAFD_FCB FCB
);
325 BOOLEAN
CheckUnlockExtraBuffers(PAFD_FCB FCB
, PIO_STACK_LOCATION IrpSp
);
329 NTSTATUS NTAPI ReceiveComplete
330 ( PDEVICE_OBJECT DeviceObject
,
334 NTSTATUS NTAPI PacketSocketRecvComplete
335 ( PDEVICE_OBJECT DeviceObject
,
340 AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
341 PIO_STACK_LOCATION IrpSp
, BOOLEAN Short
);
343 AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
344 PIO_STACK_LOCATION IrpSp
);
349 AfdSelect( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
350 PIO_STACK_LOCATION IrpSp
);
352 AfdEventSelect( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
353 PIO_STACK_LOCATION IrpSp
);
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
,
363 PAFD_ACTIVE_POLL Poll OPTIONAL
, PIRP _Irp OPTIONAL
,
364 PAFD_POLL_INFO PollReq
, NTSTATUS Status
);
368 NTSTATUS
TdiOpenAddressFile(
369 PUNICODE_STRING DeviceName
,
370 PTRANSPORT_ADDRESS Name
,
372 PHANDLE AddressHandle
,
373 PFILE_OBJECT
*AddressObject
);
375 NTSTATUS
TdiAssociateAddressFile(
376 HANDLE AddressHandle
,
377 PFILE_OBJECT ConnectionObject
);
379 NTSTATUS
TdiDisassociateAddressFile(
380 PFILE_OBJECT ConnectionObject
);
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
);
393 PFILE_OBJECT ConnectionObject
,
397 PIO_STATUS_BLOCK Iosb
,
398 PIO_COMPLETION_ROUTINE CompletionRoutine
,
399 PVOID CompletionContext
);
403 PFILE_OBJECT ConnectionObject
,
407 PIO_STATUS_BLOCK Iosb
,
408 PIO_COMPLETION_ROUTINE CompletionRoutine
,
409 PVOID CompletionContext
);
411 NTSTATUS
TdiReceiveDatagram(
413 PFILE_OBJECT TransportObject
,
417 PTDI_CONNECTION_INFORMATION From
,
418 PIO_STATUS_BLOCK Iosb
,
419 PIO_COMPLETION_ROUTINE CompletionRoutine
,
420 PVOID CompletionContext
);
422 NTSTATUS
TdiSendDatagram(
424 PFILE_OBJECT TransportObject
,
427 PTDI_CONNECTION_INFORMATION To
,
428 PIO_STATUS_BLOCK Iosb
,
429 PIO_COMPLETION_ROUTINE CompletionRoutine
,
430 PVOID CompletionContext
);
432 NTSTATUS
TdiQueryMaxDatagramLength(
433 PFILE_OBJECT FileObject
,
434 PUINT MaxDatagramLength
);
439 AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
440 PIO_STACK_LOCATION IrpSp
, BOOLEAN Short
);
442 AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
443 PIO_STACK_LOCATION IrpSp
);