Allow cancelling of listen IRPs
Modified: trunk/reactos/drivers/lib/ip/transport/tcp/accept.c
Modified: trunk/reactos/drivers/net/afd/afd/listen.c
Modified: trunk/reactos/drivers/net/tcpip/tcpip/dispatch.c
_____
Modified: trunk/reactos/drivers/lib/ip/transport/tcp/accept.c
--- trunk/reactos/drivers/lib/ip/transport/tcp/accept.c 2005-03-13
21:41:44 UTC (rev 14036)
+++ trunk/reactos/drivers/lib/ip/transport/tcp/accept.c 2005-03-13
21:47:04 UTC (rev 14037)
@@ -109,16 +109,16 @@
TcpipRecursiveMutexEnter( &TCPLock, TRUE );
- for( ListEntry = Listener->ListenRequest.Flink;
- ListEntry != &Listener->ListenRequest;
- ListEntry = ListEntry->Flink ) {
+ ListEntry = Listener->ListenRequest.Flink;
+ while ( ListEntry != &Listener->ListenRequest ) {
Bucket = CONTAINING_RECORD(ListEntry, TDI_BUCKET, Entry);
+ ListEntry = ListEntry->Flink;
- if( Bucket->Request.Handle.ConnectionContext == Connection ) {
+ if( Bucket->AssociatedEndpoint == Connection ) {
#ifdef MEMTRACK
UntrackFL( __FILE__, __LINE__,
Bucket->Request.RequestContext );
#endif
- RemoveEntryList( ListEntry );
+ RemoveEntryList( ListEntry->Blink );
ExFreePool( Bucket );
}
}
_____
Modified: trunk/reactos/drivers/net/afd/afd/listen.c
--- trunk/reactos/drivers/net/afd/afd/listen.c 2005-03-13 21:41:44 UTC
(rev 14036)
+++ trunk/reactos/drivers/net/afd/afd/listen.c 2005-03-13 21:47:04 UTC
(rev 14037)
@@ -80,6 +80,11 @@
PAFD_FCB FCB = (PAFD_FCB)Context;
PAFD_TDI_OBJECT_QELT Qelt;
+ if ( Irp->Cancel ) {
+ /* FIXME: is this anything else we need to do? */
+ return STATUS_SUCCESS;
+ }
+
if( !SocketAcquireStateLock( FCB ) ) return Status;
FCB->ListenIrp.InFlightRequest = NULL;
_____
Modified: trunk/reactos/drivers/net/tcpip/tcpip/dispatch.c
--- trunk/reactos/drivers/net/tcpip/tcpip/dispatch.c 2005-03-13
21:41:44 UTC (rev 14036)
+++ trunk/reactos/drivers/net/tcpip/tcpip/dispatch.c 2005-03-13
21:47:04 UTC (rev 14037)
@@ -219,6 +219,52 @@
}
+VOID DDKAPI DispCancelListenRequest(
+ PDEVICE_OBJECT Device,
+ PIRP Irp)
+/*
+ * FUNCTION: Cancels a listen IRP
+ * ARGUMENTS:
+ * Device = Pointer to device object
+ * Irp = Pointer to an I/O request packet
+ */
+{
+ PIO_STACK_LOCATION IrpSp;
+ PTRANSPORT_CONTEXT TranContext;
+ PFILE_OBJECT FileObject;
+ PCONNECTION_ENDPOINT Connection;
+ /*NTSTATUS Status = STATUS_SUCCESS;*/
+
+ TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
+
+ IrpSp = IoGetCurrentIrpStackLocation(Irp);
+ FileObject = IrpSp->FileObject;
+ TranContext = (PTRANSPORT_CONTEXT)FileObject->FsContext;
+ ASSERT( TDI_LISTEN == IrpSp->MinorFunction);
+
+ TI_DbgPrint(DEBUG_IRP, ("IRP at (0x%X).\n", Irp));
+
+#ifdef DBG
+ if (!Irp->Cancel)
+ TI_DbgPrint(MIN_TRACE, ("Irp->Cancel is FALSE, should be
TRUE.\n"));
+#endif
+
+ /* Try canceling the request */
+ Connection =
(PCONNECTION_ENDPOINT)TranContext->Handle.ConnectionContext;
+ TCPAbortListenForSocket(
+ Connection->AddressFile->Listener,
+ Connection );
+
+ IoReleaseCancelSpinLock(Irp->CancelIrql);
+
+ DispDataRequestComplete(Irp, STATUS_CANCELLED, 0);
+
+ DispCancelComplete(FileObject);
+
+ TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
+}
+
+
NTSTATUS DispTdiAccept(
PIRP Irp)
/*
@@ -536,6 +582,12 @@
Status = TCPListen( Connection->AddressFile->Listener, 1024 );
/* BACKLOG */
}
+ if( NT_SUCCESS(Status) ) {
+ Status = DispPrepareIrpForCancel
+ (TranContext->Handle.ConnectionContext,
+ Irp,
+ (PDRIVER_CANCEL)DispCancelListenRequest);
+ }
if( NT_SUCCESS(Status) ) {
Status = TCPAccept
Show replies by date