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>
23 #include <afd/shared.h>
24 #include <pseh/pseh2.h>
26 #include "tdi_proto.h"
31 #define MIN(x,y) (((x)<(y))?(x):(y))
35 #define IP_MIB_STATS_ID 1
36 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
38 typedef struct IPADDR_ENTRY
{
46 } IPADDR_ENTRY
, *PIPADDR_ENTRY
;
49 ((((dw) & 0xFF000000L) >> 24) | \
50 (((dw) & 0x00FF0000L) >> 8) | \
51 (((dw) & 0x0000FF00L) << 8) | \
52 (((dw) & 0x000000FFL) << 24))
54 #define SOCKET_STATE_INVALID_TRANSITION ((DWORD)-1)
55 #define SOCKET_STATE_CREATED 0
56 #define SOCKET_STATE_BOUND 1
57 #define SOCKET_STATE_CONNECTING 2
58 #define SOCKET_STATE_CONNECTED 3
59 #define SOCKET_STATE_LISTENING 4
60 #define SOCKET_STATE_MASK 0x0000ffff
61 #define SOCKET_STATE_EOF_READ 0x20000000
62 #define SOCKET_STATE_LOCKED 0x40000000
63 #define SOCKET_STATE_NEW 0x80000000
64 #define SOCKET_STATE_CLOSED 0x00000100
66 #define FUNCTION_CONNECT 0
67 #define FUNCTION_RECV 1
68 #define FUNCTION_SEND 2
69 #define FUNCTION_PREACCEPT 3
70 #define FUNCTION_ACCEPT 4
71 #define FUNCTION_DISCONNECT 5
72 #define FUNCTION_CLOSE 6
73 #define MAX_FUNCTIONS 7
75 #define IN_FLIGHT_REQUESTS 5
77 #define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed
78 * for ancillary data on packet
81 /* XXX This is a hack we should clean up later
82 * We do this in order to get some storage for the locked handle table
83 * Maybe I'll use some tail item in the irp instead */
84 #define AFD_HANDLES(x) ((PAFD_HANDLE)(x)->Exclusive)
85 #define SET_AFD_HANDLES(x,y) (((x)->Exclusive) = (ULONG_PTR)(y))
87 typedef struct _AFD_MAPBUF
{
90 } AFD_MAPBUF
, *PAFD_MAPBUF
;
92 typedef struct _AFD_DEVICE_EXTENSION
{
93 PDEVICE_OBJECT DeviceObject
;
96 } AFD_DEVICE_EXTENSION
, *PAFD_DEVICE_EXTENSION
;
98 typedef struct _AFD_ACTIVE_POLL
{
101 PAFD_DEVICE_EXTENSION DeviceExt
;
106 } AFD_ACTIVE_POLL
, *PAFD_ACTIVE_POLL
;
108 typedef struct _IRP_LIST
{
109 LIST_ENTRY ListEntry
;
111 } IRP_LIST
, *PIRP_LIST
;
113 typedef struct _AFD_TDI_OBJECT
{
116 } AFD_TDI_OBJECT
, *PAFD_TDI_OBJECT
;
118 typedef struct _AFD_TDI_OBJECT_QELT
{
119 LIST_ENTRY ListEntry
;
121 PTDI_CONNECTION_INFORMATION ConnInfo
;
122 AFD_TDI_OBJECT Object
;
123 } AFD_TDI_OBJECT_QELT
, *PAFD_TDI_OBJECT_QELT
;
125 typedef struct _AFD_IN_FLIGHT_REQUEST
{
126 PIRP InFlightRequest
;
127 PTDI_CONNECTION_INFORMATION ConnectionCallInfo
;
128 PTDI_CONNECTION_INFORMATION ConnectionReturnInfo
;
129 } AFD_IN_FLIGHT_REQUEST
, *PAFD_IN_FLIGHT_REQUEST
;
131 typedef struct _AFD_DATA_WINDOW
{
133 UINT BytesUsed
, Size
, Content
;
134 } AFD_DATA_WINDOW
, *PAFD_DATA_WINDOW
;
136 typedef struct _AFD_STORED_DATAGRAM
{
137 LIST_ENTRY ListEntry
;
139 PTRANSPORT_ADDRESS Address
;
141 } AFD_STORED_DATAGRAM
, *PAFD_STORED_DATAGRAM
;
143 typedef struct _AFD_FCB
{
144 BOOLEAN Locked
, Critical
, Overread
, NonBlocking
, OobInline
, TdiReceiveClosed
, SendClosed
;
145 UINT State
, Flags
, GroupID
, GroupType
;
149 PFILE_OBJECT FileObject
;
150 PAFD_DEVICE_EXTENSION DeviceExt
;
151 BOOLEAN DelayedAccept
;
153 USHORT DisconnectFlags
;
154 BOOLEAN DisconnectPending
;
155 LARGE_INTEGER DisconnectTimeout
;
156 PTRANSPORT_ADDRESS LocalAddress
, RemoteAddress
;
157 PTDI_CONNECTION_INFORMATION AddressFrom
, ConnectCallInfo
, ConnectReturnInfo
;
158 AFD_TDI_OBJECT AddressFile
, Connection
;
159 AFD_IN_FLIGHT_REQUEST ConnectIrp
, ListenIrp
, ReceiveIrp
, SendIrp
, DisconnectIrp
;
160 AFD_DATA_WINDOW Send
, Recv
;
163 DWORD EventSelectTriggers
;
164 DWORD EventSelectDisabled
;
165 UNICODE_STRING TdiDeviceName
;
168 NTSTATUS PollStatus
[FD_MAX_EVENTS
];
169 NTSTATUS LastReceiveStatus
;
172 UINT FilledConnectData
;
173 UINT ConnectDataSize
;
174 PVOID DisconnectData
;
175 UINT FilledDisconnectData
;
176 UINT DisconnectDataSize
;
177 PVOID ConnectOptions
;
178 UINT FilledConnectOptions
;
179 UINT ConnectOptionsSize
;
180 PVOID DisconnectOptions
;
181 UINT FilledDisconnectOptions
;
182 UINT DisconnectOptionsSize
;
183 LIST_ENTRY PendingIrpList
[MAX_FUNCTIONS
];
184 LIST_ENTRY DatagramList
;
185 LIST_ENTRY PendingConnections
;
186 } AFD_FCB
, *PAFD_FCB
;
190 NTSTATUS
WarmSocketForBind( PAFD_FCB FCB
, ULONG ShareType
);
192 AfdBindSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
193 PIO_STACK_LOCATION IrpSp
);
197 NTSTATUS
MakeSocketIntoConnection( PAFD_FCB FCB
);
198 NTSTATUS
WarmSocketForConnection( PAFD_FCB FCB
);
200 AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
201 PIO_STACK_LOCATION IrpSp
);
203 AfdGetConnectData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
204 PIO_STACK_LOCATION IrpSp
);
206 AfdSetConnectData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
207 PIO_STACK_LOCATION IrpSp
);
209 AfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
210 PIO_STACK_LOCATION IrpSp
);
212 AfdGetConnectOptions(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
213 PIO_STACK_LOCATION IrpSp
);
215 AfdSetConnectOptions(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
216 PIO_STACK_LOCATION IrpSp
);
218 AfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
219 PIO_STACK_LOCATION IrpSp
);
224 AfdGetContext( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
225 PIO_STACK_LOCATION IrpSp
);
227 AfdGetContextSize( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
228 PIO_STACK_LOCATION IrpSp
);
230 AfdSetContext( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
231 PIO_STACK_LOCATION IrpSp
);
236 AfdGetInfo( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
237 PIO_STACK_LOCATION IrpSp
);
240 AfdSetInfo( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
241 PIO_STACK_LOCATION IrpSp
);
244 AfdGetSockName( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
245 PIO_STACK_LOCATION IrpSp
);
248 AfdGetPeerName( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
249 PIO_STACK_LOCATION IrpSp
);
252 NTSTATUS
AfdWaitForListen( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
253 PIO_STACK_LOCATION IrpSp
);
255 NTSTATUS
AfdListenSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
256 PIO_STACK_LOCATION IrpSp
);
258 NTSTATUS
AfdAccept( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
259 PIO_STACK_LOCATION IrpSp
);
263 PAFD_WSABUF
LockBuffers( PAFD_WSABUF Buf
, UINT Count
,
264 PVOID AddressBuf
, PINT AddressLen
,
265 BOOLEAN Write
, BOOLEAN LockAddress
,
266 KPROCESSOR_MODE LockMode
);
267 VOID
UnlockBuffers( PAFD_WSABUF Buf
, UINT Count
, BOOL Address
);
268 BOOLEAN
SocketAcquireStateLock( PAFD_FCB FCB
);
269 NTSTATUS NTAPI UnlockAndMaybeComplete
270 ( PAFD_FCB FCB
, NTSTATUS Status
, PIRP Irp
,
272 VOID
SocketStateUnlock( PAFD_FCB FCB
);
273 NTSTATUS
LostSocket( PIRP Irp
);
274 PAFD_HANDLE
LockHandles( PAFD_HANDLE HandleArray
, UINT HandleCount
);
275 VOID
UnlockHandles( PAFD_HANDLE HandleArray
, UINT HandleCount
);
276 PVOID
LockRequest( PIRP Irp
, PIO_STACK_LOCATION IrpSp
, BOOLEAN Output
, KPROCESSOR_MODE
*LockMode
);
277 VOID
UnlockRequest( PIRP Irp
, PIO_STACK_LOCATION IrpSp
);
278 PVOID
GetLockedData( PIRP Irp
, PIO_STACK_LOCATION IrpSp
);
279 NTSTATUS
LeaveIrpUntilLater( PAFD_FCB FCB
, PIRP Irp
, UINT Function
);
280 NTSTATUS
QueueUserModeIrp(PAFD_FCB FCB
, PIRP Irp
, UINT Function
);
284 VOID
OskitDumpBuffer( PCHAR Buffer
, UINT Len
);
285 VOID
DestroySocket( PAFD_FCB FCB
);
286 DRIVER_CANCEL AfdCancelHandler
;
287 VOID
RetryDisconnectCompletion(PAFD_FCB FCB
);
288 BOOLEAN
CheckUnlockExtraBuffers(PAFD_FCB FCB
, PIO_STACK_LOCATION IrpSp
);
292 IO_COMPLETION_ROUTINE ReceiveComplete
;
294 IO_COMPLETION_ROUTINE PacketSocketRecvComplete
;
297 AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
, PIO_STACK_LOCATION IrpSp
, BOOLEAN Short
);
299 AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
300 PIO_STACK_LOCATION IrpSp
);
305 AfdSelect( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
306 PIO_STACK_LOCATION IrpSp
);
308 AfdEventSelect( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
309 PIO_STACK_LOCATION IrpSp
);
311 AfdEnumEvents( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
312 PIO_STACK_LOCATION IrpSp
);
313 VOID
PollReeval( PAFD_DEVICE_EXTENSION DeviceObject
, PFILE_OBJECT FileObject
);
314 VOID
KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt
,
315 PFILE_OBJECT FileObject
, BOOLEAN ExclusiveOnly
);
316 VOID
ZeroEvents( PAFD_HANDLE HandleArray
,
319 PAFD_ACTIVE_POLL Poll OPTIONAL
, PIRP _Irp OPTIONAL
,
320 PAFD_POLL_INFO PollReq
, NTSTATUS Status
);
324 NTSTATUS
TdiOpenAddressFile(
325 PUNICODE_STRING DeviceName
,
326 PTRANSPORT_ADDRESS Name
,
328 PHANDLE AddressHandle
,
329 PFILE_OBJECT
*AddressObject
);
331 NTSTATUS
TdiAssociateAddressFile(
332 HANDLE AddressHandle
,
333 PFILE_OBJECT ConnectionObject
);
335 NTSTATUS
TdiDisassociateAddressFile(
336 PFILE_OBJECT ConnectionObject
);
340 PFILE_OBJECT ConnectionObject
,
341 PTDI_CONNECTION_INFORMATION
*RequestConnectionInfo
,
342 PTDI_CONNECTION_INFORMATION
*ReturnConnectionInfo
,
343 PIO_COMPLETION_ROUTINE CompletionRoutine
,
344 PVOID CompletionContext
);
348 PFILE_OBJECT ConnectionObject
,
352 PIO_COMPLETION_ROUTINE CompletionRoutine
,
353 PVOID CompletionContext
);
357 PFILE_OBJECT ConnectionObject
,
361 PIO_COMPLETION_ROUTINE CompletionRoutine
,
362 PVOID CompletionContext
);
364 NTSTATUS
TdiReceiveDatagram(
366 PFILE_OBJECT TransportObject
,
370 PTDI_CONNECTION_INFORMATION From
,
371 PIO_COMPLETION_ROUTINE CompletionRoutine
,
372 PVOID CompletionContext
);
374 NTSTATUS
TdiSendDatagram(
376 PFILE_OBJECT TransportObject
,
379 PTDI_CONNECTION_INFORMATION To
,
380 PIO_COMPLETION_ROUTINE CompletionRoutine
,
381 PVOID CompletionContext
);
383 NTSTATUS
TdiQueryMaxDatagramLength(
384 PFILE_OBJECT FileObject
,
385 PUINT MaxDatagramLength
);
390 AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
391 PIO_STACK_LOCATION IrpSp
, BOOLEAN Short
);
393 AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
394 PIO_STACK_LOCATION IrpSp
);