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)
15 #include <ndk/obtypes.h>
22 #include <afd/shared.h>
23 #include <pseh/pseh2.h>
25 #include "tdi_proto.h"
30 #define MIN(x,y) (((x)<(y))?(x):(y))
33 #define IOCTL_TCP_QUERY_INFORMATION_EX \
34 CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
37 #define IP_MIB_STATS_ID 1
38 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
40 typedef struct IPSNMP_INFO
{
47 ULONG InUnknownProtos
;
51 ULONG RoutingDiscards
;
64 } IPSNMP_INFO
, *PIPSNMP_INFO
;
66 typedef struct IPADDR_ENTRY
{
74 } IPADDR_ENTRY
, *PIPADDR_ENTRY
;
77 ((((dw) & 0xFF000000L) >> 24) | \
78 (((dw) & 0x00FF0000L) >> 8) | \
79 (((dw) & 0x0000FF00L) << 8) | \
80 (((dw) & 0x000000FFL) << 24))
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
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
103 #define IN_FLIGHT_REQUESTS 5
105 #define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed
106 * for ancillary data on packet
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))
115 typedef struct _AFD_MAPBUF
{
118 } AFD_MAPBUF
, *PAFD_MAPBUF
;
120 typedef struct _AFD_DEVICE_EXTENSION
{
121 PDEVICE_OBJECT DeviceObject
;
124 } AFD_DEVICE_EXTENSION
, *PAFD_DEVICE_EXTENSION
;
126 typedef struct _AFD_ACTIVE_POLL
{
127 LIST_ENTRY ListEntry
;
129 PAFD_DEVICE_EXTENSION DeviceExt
;
134 } AFD_ACTIVE_POLL
, *PAFD_ACTIVE_POLL
;
136 typedef struct _IRP_LIST
{
137 LIST_ENTRY ListEntry
;
139 } IRP_LIST
, *PIRP_LIST
;
141 typedef struct _AFD_TDI_OBJECT
{
144 } AFD_TDI_OBJECT
, *PAFD_TDI_OBJECT
;
146 typedef struct _AFD_TDI_OBJECT_QELT
{
147 LIST_ENTRY ListEntry
;
149 PTDI_CONNECTION_INFORMATION ConnInfo
;
150 AFD_TDI_OBJECT Object
;
151 } AFD_TDI_OBJECT_QELT
, *PAFD_TDI_OBJECT_QELT
;
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
;
160 typedef struct _AFD_DATA_WINDOW
{
162 UINT BytesUsed
, Size
, Content
;
163 } AFD_DATA_WINDOW
, *PAFD_DATA_WINDOW
;
165 typedef struct _AFD_STORED_DATAGRAM
{
166 LIST_ENTRY ListEntry
;
168 PTRANSPORT_ADDRESS Address
;
170 } AFD_STORED_DATAGRAM
, *PAFD_STORED_DATAGRAM
;
172 typedef struct _AFD_FCB
{
173 BOOLEAN Locked
, Critical
, Overread
, NonBlocking
, OobInline
, TdiReceiveClosed
, SendClosed
;
174 UINT State
, Flags
, GroupID
, GroupType
;
178 PFILE_OBJECT FileObject
;
179 PAFD_DEVICE_EXTENSION DeviceExt
;
180 BOOLEAN DelayedAccept
;
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
;
192 DWORD EventSelectTriggers
;
193 DWORD EventSelectDisabled
;
194 UNICODE_STRING TdiDeviceName
;
197 NTSTATUS PollStatus
[FD_MAX_EVENTS
];
198 NTSTATUS LastReceiveStatus
;
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
;
219 NTSTATUS
WarmSocketForBind( PAFD_FCB FCB
, ULONG ShareType
);
221 AfdBindSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
222 PIO_STACK_LOCATION IrpSp
);
226 NTSTATUS
MakeSocketIntoConnection( PAFD_FCB FCB
);
227 NTSTATUS
WarmSocketForConnection( PAFD_FCB FCB
);
229 AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
230 PIO_STACK_LOCATION IrpSp
);
232 AfdGetConnectData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
233 PIO_STACK_LOCATION IrpSp
);
235 AfdSetConnectData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
236 PIO_STACK_LOCATION IrpSp
);
238 AfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
239 PIO_STACK_LOCATION IrpSp
);
241 AfdGetConnectOptions(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
242 PIO_STACK_LOCATION IrpSp
);
244 AfdSetConnectOptions(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
245 PIO_STACK_LOCATION IrpSp
);
247 AfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
248 PIO_STACK_LOCATION IrpSp
);
253 AfdGetContext( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
254 PIO_STACK_LOCATION IrpSp
);
256 AfdGetContextSize( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
257 PIO_STACK_LOCATION IrpSp
);
259 AfdSetContext( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
260 PIO_STACK_LOCATION IrpSp
);
265 AfdGetInfo( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
266 PIO_STACK_LOCATION IrpSp
);
269 AfdSetInfo( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
270 PIO_STACK_LOCATION IrpSp
);
273 AfdGetSockName( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
274 PIO_STACK_LOCATION IrpSp
);
277 AfdGetPeerName( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
278 PIO_STACK_LOCATION IrpSp
);
281 NTSTATUS
AfdWaitForListen( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
282 PIO_STACK_LOCATION IrpSp
);
284 NTSTATUS
AfdListenSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
285 PIO_STACK_LOCATION IrpSp
);
287 NTSTATUS
AfdAccept( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
288 PIO_STACK_LOCATION IrpSp
);
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
,
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
);
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
);
321 IO_COMPLETION_ROUTINE ReceiveComplete
;
323 IO_COMPLETION_ROUTINE PacketSocketRecvComplete
;
326 AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
, PIO_STACK_LOCATION IrpSp
, BOOLEAN Short
);
328 AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
329 PIO_STACK_LOCATION IrpSp
);
334 AfdSelect( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
335 PIO_STACK_LOCATION IrpSp
);
337 AfdEventSelect( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
338 PIO_STACK_LOCATION IrpSp
);
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
,
348 PAFD_ACTIVE_POLL Poll OPTIONAL
, PIRP _Irp OPTIONAL
,
349 PAFD_POLL_INFO PollReq
, NTSTATUS Status
);
353 NTSTATUS
TdiOpenAddressFile(
354 PUNICODE_STRING DeviceName
,
355 PTRANSPORT_ADDRESS Name
,
357 PHANDLE AddressHandle
,
358 PFILE_OBJECT
*AddressObject
);
360 NTSTATUS
TdiAssociateAddressFile(
361 HANDLE AddressHandle
,
362 PFILE_OBJECT ConnectionObject
);
364 NTSTATUS
TdiDisassociateAddressFile(
365 PFILE_OBJECT ConnectionObject
);
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
);
378 PFILE_OBJECT ConnectionObject
,
382 PIO_STATUS_BLOCK Iosb
,
383 PIO_COMPLETION_ROUTINE CompletionRoutine
,
384 PVOID CompletionContext
);
388 PFILE_OBJECT ConnectionObject
,
392 PIO_STATUS_BLOCK Iosb
,
393 PIO_COMPLETION_ROUTINE CompletionRoutine
,
394 PVOID CompletionContext
);
396 NTSTATUS
TdiReceiveDatagram(
398 PFILE_OBJECT TransportObject
,
402 PTDI_CONNECTION_INFORMATION From
,
403 PIO_STATUS_BLOCK Iosb
,
404 PIO_COMPLETION_ROUTINE CompletionRoutine
,
405 PVOID CompletionContext
);
407 NTSTATUS
TdiSendDatagram(
409 PFILE_OBJECT TransportObject
,
412 PTDI_CONNECTION_INFORMATION To
,
413 PIO_STATUS_BLOCK Iosb
,
414 PIO_COMPLETION_ROUTINE CompletionRoutine
,
415 PVOID CompletionContext
);
417 NTSTATUS
TdiQueryMaxDatagramLength(
418 PFILE_OBJECT FileObject
,
419 PUINT MaxDatagramLength
);
424 AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
425 PIO_STACK_LOCATION IrpSp
, BOOLEAN Short
);
427 AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
428 PIO_STACK_LOCATION IrpSp
);