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)
17 #include <ndk/obtypes.h>
18 #include <ndk/obfuncs.h>
19 #include <ndk/mmtypes.h>
20 #include <ndk/mmfuncs.h>
30 #include <afd/shared.h>
33 #define MIN(x,y) (((x)<(y))?(x):(y))
36 #define IOCTL_TCP_QUERY_INFORMATION_EX \
37 CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
40 #define IP_MIB_STATS_ID 1
41 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
43 typedef struct IPSNMP_INFO
{
50 ULONG InUnknownProtos
;
54 ULONG RoutingDiscards
;
67 } IPSNMP_INFO
, *PIPSNMP_INFO
;
69 typedef struct IPADDR_ENTRY
{
77 } IPADDR_ENTRY
, *PIPADDR_ENTRY
;
80 ((((dw) & 0xFF000000L) >> 24) | \
81 (((dw) & 0x00FF0000L) >> 8) | \
82 (((dw) & 0x0000FF00L) << 8) | \
83 (((dw) & 0x000000FFL) << 24))
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
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
105 #define IN_FLIGHT_REQUESTS 4
107 #define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed
108 * for ancillary data on packet
111 #define DEFAULT_SEND_WINDOW_SIZE 16384
112 #define DEFAULT_RECEIVE_WINDOW_SIZE 16384
114 #define SGID_CONNECTIONLESS 1 /* XXX Find this flag */
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
;
186 PFILE_OBJECT FileObject
;
187 PAFD_DEVICE_EXTENSION DeviceExt
;
188 BOOLEAN DelayedAccept
, NeedsNewListen
;
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
;
196 KEVENT StateLockedEvent
;
198 DWORD EventSelectTriggers
;
200 UNICODE_STRING TdiDeviceName
;
204 LIST_ENTRY PendingIrpList
[MAX_FUNCTIONS
];
205 LIST_ENTRY DatagramList
;
206 LIST_ENTRY PendingConnections
;
207 } AFD_FCB
, *PAFD_FCB
;
211 NTSTATUS
WarmSocketForBind( PAFD_FCB FCB
);
213 AfdBindSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
214 PIO_STACK_LOCATION IrpSp
);
218 NTSTATUS
MakeSocketIntoConnection( PAFD_FCB FCB
);
219 NTSTATUS
WarmSocketForConnection( PAFD_FCB FCB
);
221 AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
222 PIO_STACK_LOCATION IrpSp
);
227 AfdGetContext( 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 AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
241 PIO_STACK_LOCATION IrpSp
, BOOLEAN Local
);
244 NTSTATUS
AfdWaitForListen( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
245 PIO_STACK_LOCATION IrpSp
);
247 NTSTATUS
AfdListenSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
248 PIO_STACK_LOCATION IrpSp
);
250 NTSTATUS
AfdAccept( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
251 PIO_STACK_LOCATION IrpSp
);
255 PAFD_WSABUF
LockBuffers( PAFD_WSABUF Buf
, UINT Count
,
256 PVOID AddressBuf
, PINT AddressLen
,
257 BOOLEAN Write
, BOOLEAN LockAddress
);
258 VOID
UnlockBuffers( PAFD_WSABUF Buf
, UINT Count
, BOOL Address
);
259 UINT
SocketAcquireStateLock( PAFD_FCB FCB
);
260 NTSTATUS NTAPI UnlockAndMaybeComplete
261 ( PAFD_FCB FCB
, NTSTATUS Status
, PIRP Irp
,
263 PIO_COMPLETION_ROUTINE Completion
);
264 VOID
SocketStateUnlock( PAFD_FCB FCB
);
265 NTSTATUS
LostSocket( PIRP Irp
);
266 PAFD_HANDLE
LockHandles( PAFD_HANDLE HandleArray
, UINT HandleCount
);
267 VOID
UnlockHandles( PAFD_HANDLE HandleArray
, UINT HandleCount
);
268 PVOID
LockRequest( PIRP Irp
, PIO_STACK_LOCATION IrpSp
);
269 VOID
UnlockRequest( PIRP Irp
, PIO_STACK_LOCATION IrpSp
);
270 VOID
SocketCalloutEnter( PAFD_FCB FCB
);
271 VOID
SocketCalloutLeave( PAFD_FCB FCB
);
275 VOID
OskitDumpBuffer( PCHAR Buffer
, UINT Len
);
276 NTSTATUS
LeaveIrpUntilLater( PAFD_FCB FCB
, PIRP Irp
, UINT Function
);
277 VOID
DestroySocket( PAFD_FCB FCB
);
281 NTSTATUS NTAPI ReceiveComplete
282 ( PDEVICE_OBJECT DeviceObject
,
286 NTSTATUS NTAPI PacketSocketRecvComplete
287 ( PDEVICE_OBJECT DeviceObject
,
292 AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
293 PIO_STACK_LOCATION IrpSp
, BOOLEAN Short
);
295 AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
296 PIO_STACK_LOCATION IrpSp
);
301 AfdSelect( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
302 PIO_STACK_LOCATION IrpSp
);
304 AfdEventSelect( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
305 PIO_STACK_LOCATION IrpSp
);
307 AfdEnumEvents( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
308 PIO_STACK_LOCATION IrpSp
);
309 VOID
PollReeval( PAFD_DEVICE_EXTENSION DeviceObject
, PFILE_OBJECT FileObject
);
310 VOID
KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt
,
311 PFILE_OBJECT FileObject
, BOOLEAN ExclusiveOnly
);
315 NTSTATUS
TdiOpenAddressFile(
316 PUNICODE_STRING DeviceName
,
317 PTRANSPORT_ADDRESS Name
,
318 PHANDLE AddressHandle
,
319 PFILE_OBJECT
*AddressObject
);
321 NTSTATUS
TdiAssociateAddressFile(
322 HANDLE AddressHandle
,
323 PFILE_OBJECT ConnectionObject
);
327 PFILE_OBJECT ConnectionObject
,
328 PTDI_CONNECTION_INFORMATION
*RequestConnectionInfo
,
329 PTDI_CONNECTION_INFORMATION
*ReturnConnectionInfo
,
330 PIO_STATUS_BLOCK Iosb
,
331 PIO_COMPLETION_ROUTINE CompletionRoutine
,
332 PVOID CompletionContext
);
336 PFILE_OBJECT ConnectionObject
,
340 PIO_STATUS_BLOCK Iosb
,
341 PIO_COMPLETION_ROUTINE CompletionRoutine
,
342 PVOID CompletionContext
);
346 PFILE_OBJECT ConnectionObject
,
350 PIO_STATUS_BLOCK Iosb
,
351 PIO_COMPLETION_ROUTINE CompletionRoutine
,
352 PVOID CompletionContext
);
354 NTSTATUS
TdiReceiveDatagram(
356 PFILE_OBJECT TransportObject
,
360 PTDI_CONNECTION_INFORMATION From
,
361 PIO_STATUS_BLOCK Iosb
,
362 PIO_COMPLETION_ROUTINE CompletionRoutine
,
363 PVOID CompletionContext
);
365 NTSTATUS
TdiSendDatagram(
367 PFILE_OBJECT TransportObject
,
370 PTDI_CONNECTION_INFORMATION To
,
371 PIO_STATUS_BLOCK Iosb
,
372 PIO_COMPLETION_ROUTINE CompletionRoutine
,
373 PVOID CompletionContext
);
378 AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
379 PIO_STACK_LOCATION IrpSp
, BOOLEAN Short
);
381 AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
382 PIO_STACK_LOCATION IrpSp
);