-/* $Id$
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: drivers/net/afd/afd/listen.c
* UPDATE HISTORY:
* 20040708 Created
*/
+
#include "afd.h"
static NTSTATUS SatisfyAccept( PAFD_DEVICE_EXTENSION DeviceExt,
- PIRP Irp,
- PFILE_OBJECT NewFileObject,
- PAFD_TDI_OBJECT_QELT Qelt ) {
+ PIRP Irp,
+ PFILE_OBJECT NewFileObject,
+ PAFD_TDI_OBJECT_QELT Qelt ) {
PAFD_FCB FCB = NewFileObject->FsContext;
NTSTATUS Status;
+ UNREFERENCED_PARAMETER(DeviceExt);
+
if( !SocketAcquireStateLock( FCB ) )
return LostSocket( Irp );
/* Transfer the connection to the new socket, launch the opening read */
- AFD_DbgPrint(MID_TRACE,("Completing a real accept (FCB %x)\n", FCB));
+ AFD_DbgPrint(MID_TRACE,("Completing a real accept (FCB %p)\n", FCB));
FCB->Connection = Qelt->Object;
- if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress );
+ if (FCB->RemoteAddress)
+ {
+ ExFreePoolWithTag(FCB->RemoteAddress, TAG_AFD_TRANSPORT_ADDRESS);
+ }
+
FCB->RemoteAddress =
- TaCopyTransportAddress( Qelt->ConnInfo->RemoteAddress );
+ TaCopyTransportAddress( Qelt->ConnInfo->RemoteAddress );
- if( !FCB->RemoteAddress )
- Status = STATUS_NO_MEMORY;
+ if( !FCB->RemoteAddress )
+ Status = STATUS_NO_MEMORY;
else
- Status = MakeSocketIntoConnection( FCB );
+ Status = MakeSocketIntoConnection( FCB );
if (NT_SUCCESS(Status))
Status = TdiBuildConnectionInfo(&FCB->ConnectCallInfo, FCB->RemoteAddress);
-
+
if (NT_SUCCESS(Status))
Status = TdiBuildConnectionInfo(&FCB->ConnectReturnInfo, FCB->RemoteAddress);
static NTSTATUS SatisfyPreAccept( PIRP Irp, PAFD_TDI_OBJECT_QELT Qelt ) {
PAFD_RECEIVED_ACCEPT_DATA ListenReceive =
- (PAFD_RECEIVED_ACCEPT_DATA)Irp->AssociatedIrp.SystemBuffer;
+ (PAFD_RECEIVED_ACCEPT_DATA)Irp->AssociatedIrp.SystemBuffer;
PTA_IP_ADDRESS IPAddr;
ListenReceive->SequenceNumber = Qelt->Seq;
- AFD_DbgPrint(MID_TRACE,("Giving SEQ %d to userland\n", Qelt->Seq));
- AFD_DbgPrint(MID_TRACE,("Socket Address (K) %x (U) %x\n",
+ AFD_DbgPrint(MID_TRACE,("Giving SEQ %u to userland\n", Qelt->Seq));
+ AFD_DbgPrint(MID_TRACE,("Socket Address (K) %p (U) %p\n",
&ListenReceive->Address,
Qelt->ConnInfo->RemoteAddress));
TaCopyTransportAddressInPlace( &ListenReceive->Address,
- Qelt->ConnInfo->RemoteAddress );
+ Qelt->ConnInfo->RemoteAddress );
IPAddr = (PTA_IP_ADDRESS)&ListenReceive->Address;
AFD_DbgPrint(MID_TRACE,("IPAddr->TAAddressCount %d\n",
IPAddr->TAAddressCount));
- AFD_DbgPrint(MID_TRACE,("IPAddr->Address[0].AddressType %d\n",
+ AFD_DbgPrint(MID_TRACE,("IPAddr->Address[0].AddressType %u\n",
IPAddr->Address[0].AddressType));
- AFD_DbgPrint(MID_TRACE,("IPAddr->Address[0].AddressLength %d\n",
+ AFD_DbgPrint(MID_TRACE,("IPAddr->Address[0].AddressLength %u\n",
IPAddr->Address[0].AddressLength));
AFD_DbgPrint(MID_TRACE,("IPAddr->Address[0].Address[0].sin_port %x\n",
IPAddr->Address[0].Address[0].sin_port));
return STATUS_SUCCESS;
}
-static NTSTATUS NTAPI ListenComplete
-( PDEVICE_OBJECT DeviceObject,
- PIRP Irp,
- PVOID Context ) {
+static IO_COMPLETION_ROUTINE ListenComplete;
+static NTSTATUS NTAPI ListenComplete( PDEVICE_OBJECT DeviceObject,
+ PIRP Irp,
+ PVOID Context ) {
NTSTATUS Status = STATUS_SUCCESS;
PAFD_FCB FCB = (PAFD_FCB)Context;
PAFD_TDI_OBJECT_QELT Qelt;
PLIST_ENTRY NextIrpEntry;
PIRP NextIrp;
+ UNREFERENCED_PARAMETER(DeviceObject);
+
if( !SocketAcquireStateLock( FCB ) )
return STATUS_FILE_CLOSED;
if( FCB->State == SOCKET_STATE_CLOSED ) {
/* Cleanup our IRP queue because the FCB is being destroyed */
while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_PREACCEPT] ) ) {
- NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_PREACCEPT]);
- NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
- NextIrp->IoStatus.Status = STATUS_FILE_CLOSED;
- NextIrp->IoStatus.Information = 0;
- if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
- (void)IoSetCancelRoutine(NextIrp, NULL);
- IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
+ NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_PREACCEPT]);
+ NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
+ NextIrp->IoStatus.Status = STATUS_FILE_CLOSED;
+ NextIrp->IoStatus.Information = 0;
+ if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
+ (void)IoSetCancelRoutine(NextIrp, NULL);
+ IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
}
/* Free ConnectionReturnInfo and ConnectionCallInfo */
if (FCB->ListenIrp.ConnectionReturnInfo)
{
- ExFreePool(FCB->ListenIrp.ConnectionReturnInfo);
+ ExFreePoolWithTag(FCB->ListenIrp.ConnectionReturnInfo,
+ TAG_AFD_TDI_CONNECTION_INFORMATION);
+
FCB->ListenIrp.ConnectionReturnInfo = NULL;
}
if (FCB->ListenIrp.ConnectionCallInfo)
{
- ExFreePool(FCB->ListenIrp.ConnectionCallInfo);
+ ExFreePoolWithTag(FCB->ListenIrp.ConnectionCallInfo,
+ TAG_AFD_TDI_CONNECTION_INFORMATION);
+
FCB->ListenIrp.ConnectionCallInfo = NULL;
}
- SocketStateUnlock( FCB );
- return STATUS_FILE_CLOSED;
+ SocketStateUnlock( FCB );
+ return STATUS_FILE_CLOSED;
}
AFD_DbgPrint(MID_TRACE,("Completing listen request.\n"));
AFD_DbgPrint(MID_TRACE,("IoStatus was %x\n", Irp->IoStatus.Status));
-
+
if (Irp->IoStatus.Status != STATUS_SUCCESS)
{
SocketStateUnlock(FCB);
return Irp->IoStatus.Status;
}
- Qelt = ExAllocatePool( NonPagedPool, sizeof(*Qelt) );
+ Qelt = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(*Qelt),
+ TAG_AFD_ACCEPT_QUEUE);
+
if( !Qelt ) {
- Status = STATUS_NO_MEMORY;
+ Status = STATUS_NO_MEMORY;
} else {
UINT AddressType =
FCB->LocalAddress->Address[0].AddressType;
- Qelt->Object = FCB->Connection;
- Qelt->Seq = FCB->ConnSeq++;
- AFD_DbgPrint(MID_TRACE,("Address Type: %d (RA %x)\n",
+ Qelt->Object = FCB->Connection;
+ Qelt->Seq = FCB->ConnSeq++;
+ AFD_DbgPrint(MID_TRACE,("Address Type: %u (RA %p)\n",
AddressType,
FCB->ListenIrp.
ConnectionReturnInfo->RemoteAddress));
/* Satisfy a pre-accept request if one is available */
if( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_PREACCEPT] ) &&
- !IsListEmpty( &FCB->PendingConnections ) ) {
- PLIST_ENTRY PendingIrp =
- RemoveHeadList( &FCB->PendingIrpList[FUNCTION_PREACCEPT] );
- PLIST_ENTRY PendingConn = FCB->PendingConnections.Flink;
- SatisfyPreAccept
- ( CONTAINING_RECORD( PendingIrp, IRP,
- Tail.Overlay.ListEntry ),
- CONTAINING_RECORD( PendingConn, AFD_TDI_OBJECT_QELT,
- ListEntry ) );
+ !IsListEmpty( &FCB->PendingConnections ) ) {
+ PLIST_ENTRY PendingIrp =
+ RemoveHeadList( &FCB->PendingIrpList[FUNCTION_PREACCEPT] );
+ PLIST_ENTRY PendingConn = FCB->PendingConnections.Flink;
+ SatisfyPreAccept
+ ( CONTAINING_RECORD( PendingIrp, IRP,
+ Tail.Overlay.ListEntry ),
+ CONTAINING_RECORD( PendingConn, AFD_TDI_OBJECT_QELT,
+ ListEntry ) );
}
/* Launch new accept socket */
Status = WarmSocketForConnection( FCB );
-
+
if (NT_SUCCESS(Status))
{
Status = TdiBuildNullConnectionInfoInPlace(FCB->ListenIrp.ConnectionCallInfo,
FCB->LocalAddress->Address[0].AddressType);
ASSERT(Status == STATUS_SUCCESS);
-
+
Status = TdiBuildNullConnectionInfoInPlace(FCB->ListenIrp.ConnectionReturnInfo,
FCB->LocalAddress->Address[0].AddressType);
ASSERT(Status == STATUS_SUCCESS);
-
+
Status = TdiListen( &FCB->ListenIrp.InFlightRequest,
FCB->Connection.Object,
&FCB->ListenIrp.ConnectionCallInfo,
&FCB->ListenIrp.ConnectionReturnInfo,
- &FCB->ListenIrp.Iosb,
ListenComplete,
FCB );
/* Trigger a select return if appropriate */
if( !IsListEmpty( &FCB->PendingConnections ) ) {
- FCB->PollState |= AFD_EVENT_ACCEPT;
+ FCB->PollState |= AFD_EVENT_ACCEPT;
FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS;
PollReeval( FCB->DeviceExt, FCB->FileObject );
} else
return Status;
}
-NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
- PIO_STACK_LOCATION IrpSp) {
+NTSTATUS AfdListenSocket( PDEVICE_OBJECT DeviceObject, PIRP Irp,
+ PIO_STACK_LOCATION IrpSp ) {
NTSTATUS Status = STATUS_SUCCESS;
PFILE_OBJECT FileObject = IrpSp->FileObject;
PAFD_FCB FCB = FileObject->FsContext;
PAFD_LISTEN_DATA ListenReq;
- AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
+ UNREFERENCED_PARAMETER(DeviceObject);
+
+ AFD_DbgPrint(MID_TRACE,("Called on %p\n", FCB));
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
- if( !(ListenReq = LockRequest( Irp, IrpSp )) )
- return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
- 0 );
+ if( !(ListenReq = LockRequest( Irp, IrpSp, FALSE, NULL )) )
+ return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
+ 0 );
if( FCB->State != SOCKET_STATE_BOUND ) {
- Status = STATUS_INVALID_PARAMETER;
- AFD_DbgPrint(MIN_TRACE,("Could not listen an unbound socket\n"));
- return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
+ Status = STATUS_INVALID_PARAMETER;
+ AFD_DbgPrint(MIN_TRACE,("Could not listen an unbound socket\n"));
+ return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
}
FCB->DelayedAccept = ListenReq->UseDelayedAcceptance;
- AFD_DbgPrint(MID_TRACE,("ADDRESSFILE: %x\n", FCB->AddressFile.Handle));
+ AFD_DbgPrint(MID_TRACE,("ADDRESSFILE: %p\n", FCB->AddressFile.Handle));
Status = WarmSocketForConnection( FCB );
if( !NT_SUCCESS(Status) ) return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
Status = TdiBuildNullConnectionInfo
- ( &FCB->ListenIrp.ConnectionCallInfo,
- FCB->LocalAddress->Address[0].AddressType );
+ ( &FCB->ListenIrp.ConnectionCallInfo,
+ FCB->LocalAddress->Address[0].AddressType );
if (!NT_SUCCESS(Status)) return UnlockAndMaybeComplete(FCB, Status, Irp, 0);
Status = TdiBuildNullConnectionInfo
- ( &FCB->ListenIrp.ConnectionReturnInfo,
- FCB->LocalAddress->Address[0].AddressType );
+ ( &FCB->ListenIrp.ConnectionReturnInfo,
+ FCB->LocalAddress->Address[0].AddressType );
if (!NT_SUCCESS(Status))
{
- ExFreePool(FCB->ListenIrp.ConnectionCallInfo);
+ ExFreePoolWithTag(FCB->ListenIrp.ConnectionCallInfo,
+ TAG_AFD_TDI_CONNECTION_INFORMATION);
+
FCB->ListenIrp.ConnectionCallInfo = NULL;
return UnlockAndMaybeComplete(FCB, Status, Irp, 0);
}
FCB->State = SOCKET_STATE_LISTENING;
Status = TdiListen( &FCB->ListenIrp.InFlightRequest,
- FCB->Connection.Object,
- &FCB->ListenIrp.ConnectionCallInfo,
- &FCB->ListenIrp.ConnectionReturnInfo,
- &FCB->ListenIrp.Iosb,
- ListenComplete,
- FCB );
+ FCB->Connection.Object,
+ &FCB->ListenIrp.ConnectionCallInfo,
+ &FCB->ListenIrp.ConnectionReturnInfo,
+ ListenComplete,
+ FCB );
if( Status == STATUS_PENDING )
- Status = STATUS_SUCCESS;
+ Status = STATUS_SUCCESS;
AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
}
NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp,
- PIO_STACK_LOCATION IrpSp ) {
+ PIO_STACK_LOCATION IrpSp ) {
PFILE_OBJECT FileObject = IrpSp->FileObject;
PAFD_FCB FCB = FileObject->FsContext;
NTSTATUS Status;
+ UNREFERENCED_PARAMETER(DeviceObject);
+
AFD_DbgPrint(MID_TRACE,("Called\n"));
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
if( !IsListEmpty( &FCB->PendingConnections ) ) {
- PLIST_ENTRY PendingConn = FCB->PendingConnections.Flink;
+ PLIST_ENTRY PendingConn = FCB->PendingConnections.Flink;
- /* We have a pending connection ... complete this irp right away */
- Status = SatisfyPreAccept
- ( Irp,
- CONTAINING_RECORD
- ( PendingConn, AFD_TDI_OBJECT_QELT, ListEntry ) );
+ /* We have a pending connection ... complete this irp right away */
+ Status = SatisfyPreAccept
+ ( Irp,
+ CONTAINING_RECORD
+ ( PendingConn, AFD_TDI_OBJECT_QELT, ListEntry ) );
- AFD_DbgPrint(MID_TRACE,("Completed a wait for accept\n"));
+ AFD_DbgPrint(MID_TRACE,("Completed a wait for accept\n"));
if ( !IsListEmpty( &FCB->PendingConnections ) )
{
} else
FCB->PollState &= ~AFD_EVENT_ACCEPT;
- SocketStateUnlock( FCB );
- return Status;
+ SocketStateUnlock( FCB );
+ return Status;
} else if (FCB->NonBlocking) {
AFD_DbgPrint(MIN_TRACE,("No connection ready on a non-blocking socket\n"));
-
+
return UnlockAndMaybeComplete(FCB, STATUS_CANT_WAIT, Irp, 0);
} else {
- AFD_DbgPrint(MID_TRACE,("Holding\n"));
+ AFD_DbgPrint(MID_TRACE,("Holding\n"));
- return LeaveIrpUntilLater( FCB, Irp, FUNCTION_PREACCEPT );
+ return LeaveIrpUntilLater( FCB, Irp, FUNCTION_PREACCEPT );
}
}
NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
- PIO_STACK_LOCATION IrpSp ) {
+ PIO_STACK_LOCATION IrpSp ) {
NTSTATUS Status = STATUS_SUCCESS;
PFILE_OBJECT FileObject = IrpSp->FileObject;
PAFD_DEVICE_EXTENSION DeviceExt =
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
+ FCB->EventSelectDisabled &= ~AFD_EVENT_ACCEPT;
+
for( PendingConn = FCB->PendingConnections.Flink;
- PendingConn != &FCB->PendingConnections;
- PendingConn = PendingConn->Flink ) {
- PAFD_TDI_OBJECT_QELT PendingConnObj =
- CONTAINING_RECORD( PendingConn, AFD_TDI_OBJECT_QELT, ListEntry );
+ PendingConn != &FCB->PendingConnections;
+ PendingConn = PendingConn->Flink ) {
+ PAFD_TDI_OBJECT_QELT PendingConnObj =
+ CONTAINING_RECORD( PendingConn, AFD_TDI_OBJECT_QELT, ListEntry );
- AFD_DbgPrint(MID_TRACE,("Comparing Seq %d to Q %d\n",
- AcceptData->SequenceNumber,
- PendingConnObj->Seq));
+ AFD_DbgPrint(MID_TRACE,("Comparing Seq %u to Q %u\n",
+ AcceptData->SequenceNumber,
+ PendingConnObj->Seq));
- if( PendingConnObj->Seq == AcceptData->SequenceNumber ) {
- PFILE_OBJECT NewFileObject = NULL;
+ if( PendingConnObj->Seq == AcceptData->SequenceNumber ) {
+ PFILE_OBJECT NewFileObject = NULL;
- RemoveEntryList( PendingConn );
+ RemoveEntryList( PendingConn );
- Status = ObReferenceObjectByHandle
- ( AcceptData->ListenHandle,
- FILE_ALL_ACCESS,
- NULL,
- KernelMode,
- (PVOID *)&NewFileObject,
- NULL );
+ Status = ObReferenceObjectByHandle
+ ( AcceptData->ListenHandle,
+ FILE_ALL_ACCESS,
+ NULL,
+ KernelMode,
+ (PVOID *)&NewFileObject,
+ NULL );
if( !NT_SUCCESS(Status) ) return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
ASSERT(NewFileObject != FileObject);
ASSERT(NewFileObject->FsContext != FCB);
- /* We have a pending connection ... complete this irp right away */
- Status = SatisfyAccept( DeviceExt, Irp, NewFileObject, PendingConnObj );
+ /* We have a pending connection ... complete this irp right away */
+ Status = SatisfyAccept( DeviceExt, Irp, NewFileObject, PendingConnObj );
- ObDereferenceObject( NewFileObject );
+ ObDereferenceObject( NewFileObject );
- AFD_DbgPrint(MID_TRACE,("Completed a wait for accept\n"));
+ AFD_DbgPrint(MID_TRACE,("Completed a wait for accept\n"));
- ExFreePool( PendingConnObj );
-
- FCB->EventSelectDisabled &= ~AFD_EVENT_ACCEPT;
+ ExFreePoolWithTag(PendingConnObj, TAG_AFD_ACCEPT_QUEUE);
- if( !IsListEmpty( &FCB->PendingConnections ) )
- {
- FCB->PollState |= AFD_EVENT_ACCEPT;
- FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS;
- PollReeval( FCB->DeviceExt, FCB->FileObject );
- } else
- FCB->PollState &= ~AFD_EVENT_ACCEPT;
+ if( !IsListEmpty( &FCB->PendingConnections ) )
+ {
+ FCB->PollState |= AFD_EVENT_ACCEPT;
+ FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
+ } else
+ FCB->PollState &= ~AFD_EVENT_ACCEPT;
- SocketStateUnlock( FCB );
- return Status;
- }
+ SocketStateUnlock( FCB );
+ return Status;
+ }
}
-
+
AFD_DbgPrint(MIN_TRACE,("No connection waiting\n"));
return UnlockAndMaybeComplete( FCB, STATUS_UNSUCCESSFUL, Irp, 0 );