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)
23 #include <afd/shared.h>
26 #define MIN(x,y) (((x)<(y))?(x):(y))
29 #define SOCKET_STATE_INVALID_TRANSITION ((DWORD)-1)
30 #define SOCKET_STATE_CREATED 0
31 #define SOCKET_STATE_BOUND 1
32 #define SOCKET_STATE_CONNECTING 2
33 #define SOCKET_STATE_CONNECTED 3
34 #define SOCKET_STATE_LISTENING 4
35 #define SOCKET_STATE_MASK 0x0000ffff
36 #define SOCKET_STATE_EOF_READ 0x20000000
37 #define SOCKET_STATE_LOCKED 0x40000000
38 #define SOCKET_STATE_NEW 0x80000000
39 #define SOCKET_STATE_CLOSED 0x00000100
41 #define FUNCTION_CONNECT 0
42 #define FUNCTION_RECV 1
43 #define FUNCTION_SEND 2
44 #define FUNCTION_PREACCEPT 3
45 #define FUNCTION_ACCEPT 4
46 #define FUNCTION_CLOSE 5
47 #define MAX_FUNCTIONS 6
49 #define IN_FLIGHT_REQUESTS 3
51 #define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed
52 * for ancillary data on packet
55 #define DEFAULT_SEND_WINDOW_SIZE 16384
56 #define DEFAULT_RECEIVE_WINDOW_SIZE 16384
58 #define SGID_CONNECTIONLESS 1 /* XXX Find this flag */
60 /* XXX This is a hack we should clean up later
61 * We do this in order to get some storage for the locked handle table
62 * Maybe I'll use some tail item in the irp instead */
63 #define AFD_HANDLES(x) ((PAFD_HANDLE)(x)->Exclusive)
64 #define SET_AFD_HANDLES(x,y) (((x)->Exclusive) = (ULONG)(y))
66 typedef struct _AFD_MAPBUF
{
69 } AFD_MAPBUF
, *PAFD_MAPBUF
;
71 typedef struct _AFD_DEVICE_EXTENSION
{
72 PDEVICE_OBJECT DeviceObject
;
75 } AFD_DEVICE_EXTENSION
, *PAFD_DEVICE_EXTENSION
;
77 typedef struct _AFD_ACTIVE_POLL
{
80 PAFD_DEVICE_EXTENSION DeviceExt
;
85 } AFD_ACTIVE_POLL
, *PAFD_ACTIVE_POLL
;
87 typedef struct _IRP_LIST
{
90 } IRP_LIST
, *PIRP_LIST
;
92 typedef struct _AFD_TDI_OBJECT
{
95 } AFD_TDI_OBJECT
, *PAFD_TDI_OBJECT
;
97 typedef struct _AFD_TDI_OBJECT_QELT
{
100 PTDI_CONNECTION_INFORMATION ConnInfo
;
101 AFD_TDI_OBJECT Object
;
102 } AFD_TDI_OBJECT_QELT
, *PAFD_TDI_OBJECT_QELT
;
104 typedef struct _AFD_IN_FLIGHT_REQUEST
{
105 PIRP InFlightRequest
;
106 IO_STATUS_BLOCK Iosb
;
107 PTDI_CONNECTION_INFORMATION ConnectionCallInfo
;
108 PTDI_CONNECTION_INFORMATION ConnectionReturnInfo
;
109 } AFD_IN_FLIGHT_REQUEST
, *PAFD_IN_FLIGHT_REQUEST
;
111 typedef struct _AFD_DATA_WINDOW
{
113 UINT BytesUsed
, Size
, Content
;
114 } AFD_DATA_WINDOW
, *PAFD_DATA_WINDOW
;
116 typedef struct _AFD_STORED_DATAGRAM
{
117 LIST_ENTRY ListEntry
;
119 PTRANSPORT_ADDRESS Address
;
121 } AFD_STORED_DATAGRAM
, *PAFD_STORED_DATAGRAM
;
123 typedef struct _AFD_FCB
{
124 BOOLEAN Locked
, Critical
, Overread
;
130 PFILE_OBJECT FileObject
;
131 PAFD_DEVICE_EXTENSION DeviceExt
;
132 BOOLEAN DelayedAccept
, NeedsNewListen
;
134 PTRANSPORT_ADDRESS LocalAddress
, RemoteAddress
;
135 PTDI_CONNECTION_INFORMATION AddressFrom
;
136 AFD_TDI_OBJECT AddressFile
, Connection
;
137 AFD_IN_FLIGHT_REQUEST ConnectIrp
, ListenIrp
, ReceiveIrp
, SendIrp
;
138 AFD_DATA_WINDOW Send
, Recv
;
140 KEVENT StateLockedEvent
;
142 DWORD EventSelectTriggers
;
144 UNICODE_STRING TdiDeviceName
;
148 LIST_ENTRY PendingIrpList
[MAX_FUNCTIONS
];
149 LIST_ENTRY DatagramList
;
150 LIST_ENTRY PendingConnections
;
151 } AFD_FCB
, *PAFD_FCB
;
155 NTSTATUS
WarmSocketForBind( PAFD_FCB FCB
);
157 AfdBindSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
158 PIO_STACK_LOCATION IrpSp
);
162 NTSTATUS
MakeSocketIntoConnection( PAFD_FCB FCB
);
163 NTSTATUS
WarmSocketForConnection( PAFD_FCB FCB
);
165 AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
166 PIO_STACK_LOCATION IrpSp
);
171 AfdGetContext( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
172 PIO_STACK_LOCATION IrpSp
);
174 AfdSetContext( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
175 PIO_STACK_LOCATION IrpSp
);
180 AfdGetInfo( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
181 PIO_STACK_LOCATION IrpSp
);
184 AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
185 PIO_STACK_LOCATION IrpSp
, BOOLEAN Local
);
188 NTSTATUS
AfdWaitForListen( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
189 PIO_STACK_LOCATION IrpSp
);
191 NTSTATUS
AfdListenSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
192 PIO_STACK_LOCATION IrpSp
);
194 NTSTATUS
AfdAccept( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
195 PIO_STACK_LOCATION IrpSp
);
199 PAFD_WSABUF
LockBuffers( PAFD_WSABUF Buf
, UINT Count
,
200 PVOID AddressBuf
, PINT AddressLen
,
201 BOOLEAN Write
, BOOLEAN LockAddress
);
202 VOID
UnlockBuffers( PAFD_WSABUF Buf
, UINT Count
, BOOL Address
);
203 UINT
SocketAcquireStateLock( PAFD_FCB FCB
);
204 NTSTATUS DDKAPI UnlockAndMaybeComplete
205 ( PAFD_FCB FCB
, NTSTATUS Status
, PIRP Irp
,
207 PIO_COMPLETION_ROUTINE Completion
,
208 BOOL ShouldUnlockIrp
);
209 VOID
SocketStateUnlock( PAFD_FCB FCB
);
210 NTSTATUS
LostSocket( PIRP Irp
, BOOL ShouldUnlockIrp
);
211 PAFD_HANDLE
LockHandles( PAFD_HANDLE HandleArray
, UINT HandleCount
);
212 VOID
UnlockHandles( PAFD_HANDLE HandleArray
, UINT HandleCount
);
213 PVOID
LockRequest( PIRP Irp
, PIO_STACK_LOCATION IrpSp
);
214 VOID
UnlockRequest( PIRP Irp
, PIO_STACK_LOCATION IrpSp
);
215 VOID
SocketCalloutEnter( PAFD_FCB FCB
);
216 VOID
SocketCalloutLeave( PAFD_FCB FCB
);
220 VOID
OskitDumpBuffer( PCHAR Buffer
, UINT Len
);
221 NTSTATUS
LeaveIrpUntilLater( PAFD_FCB FCB
, PIRP Irp
, UINT Function
);
222 VOID
DestroySocket( PAFD_FCB FCB
);
226 NTSTATUS DDKAPI ReceiveComplete
227 ( PDEVICE_OBJECT DeviceObject
,
231 NTSTATUS DDKAPI PacketSocketRecvComplete
232 ( PDEVICE_OBJECT DeviceObject
,
237 AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
238 PIO_STACK_LOCATION IrpSp
, BOOLEAN Short
);
240 AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
241 PIO_STACK_LOCATION IrpSp
);
246 AfdSelect( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
247 PIO_STACK_LOCATION IrpSp
);
249 AfdEventSelect( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
250 PIO_STACK_LOCATION IrpSp
);
252 AfdEnumEvents( PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
253 PIO_STACK_LOCATION IrpSp
);
254 VOID
PollReeval( PAFD_DEVICE_EXTENSION DeviceObject
, PFILE_OBJECT FileObject
);
255 VOID
KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt
,
256 PFILE_OBJECT FileObject
, BOOLEAN ExclusiveOnly
);
260 NTSTATUS
TdiOpenAddressFile(
261 PUNICODE_STRING DeviceName
,
262 PTRANSPORT_ADDRESS Name
,
263 PHANDLE AddressHandle
,
264 PFILE_OBJECT
*AddressObject
);
266 NTSTATUS
TdiAssociateAddressFile(
267 HANDLE AddressHandle
,
268 PFILE_OBJECT ConnectionObject
);
272 PFILE_OBJECT ConnectionObject
,
273 PTDI_CONNECTION_INFORMATION
*RequestConnectionInfo
,
274 PTDI_CONNECTION_INFORMATION
*ReturnConnectionInfo
,
275 PIO_STATUS_BLOCK Iosb
,
276 PIO_COMPLETION_ROUTINE CompletionRoutine
,
277 PVOID CompletionContext
);
281 PFILE_OBJECT ConnectionObject
,
285 PIO_STATUS_BLOCK Iosb
,
286 PIO_COMPLETION_ROUTINE CompletionRoutine
,
287 PVOID CompletionContext
);
291 PFILE_OBJECT ConnectionObject
,
295 PIO_STATUS_BLOCK Iosb
,
296 PIO_COMPLETION_ROUTINE CompletionRoutine
,
297 PVOID CompletionContext
);
299 NTSTATUS
TdiReceiveDatagram(
301 PFILE_OBJECT TransportObject
,
305 PTDI_CONNECTION_INFORMATION From
,
306 PIO_STATUS_BLOCK Iosb
,
307 PIO_COMPLETION_ROUTINE CompletionRoutine
,
308 PVOID CompletionContext
);
310 NTSTATUS
TdiSendDatagram(
312 PFILE_OBJECT TransportObject
,
315 PTDI_CONNECTION_INFORMATION To
,
316 PIO_STATUS_BLOCK Iosb
,
317 PIO_COMPLETION_ROUTINE CompletionRoutine
,
318 PVOID CompletionContext
);
323 AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
324 PIO_STACK_LOCATION IrpSp
, BOOLEAN Short
);
326 AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
327 PIO_STACK_LOCATION IrpSp
);