From f34cad36e20cb5f8cc70f13be1905b52bab8f227 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 1 Aug 2011 03:54:19 +0000 Subject: [PATCH] [AFD] - Cancel the in-flight disconnect IRP during socket closure [TCPIP] - Make a disconnect IRP cancelable svn path=/trunk/; revision=53016 --- reactos/drivers/network/afd/afd/main.c | 1 + reactos/drivers/network/afd/include/afd.h | 2 +- .../drivers/network/tcpip/tcpip/dispatch.c | 23 ++++++++++++------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/reactos/drivers/network/afd/afd/main.c b/reactos/drivers/network/afd/afd/main.c index be104105323..a1e664f6dab 100644 --- a/reactos/drivers/network/afd/afd/main.c +++ b/reactos/drivers/network/afd/afd/main.c @@ -436,6 +436,7 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, InFlightRequest[1] = &FCB->ReceiveIrp; InFlightRequest[2] = &FCB->SendIrp; InFlightRequest[3] = &FCB->ConnectIrp; + InFlightRequest[4] = &FCB->DisconnectIrp; /* Cancel our pending requests */ for( i = 0; i < IN_FLIGHT_REQUESTS; i++ ) { diff --git a/reactos/drivers/network/afd/include/afd.h b/reactos/drivers/network/afd/include/afd.h index b66c3a18512..04464ffff26 100644 --- a/reactos/drivers/network/afd/include/afd.h +++ b/reactos/drivers/network/afd/include/afd.h @@ -108,7 +108,7 @@ typedef struct IPADDR_ENTRY { #define FUNCTION_CLOSE 6 #define MAX_FUNCTIONS 7 -#define IN_FLIGHT_REQUESTS 4 +#define IN_FLIGHT_REQUESTS 5 #define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed * for ancillary data on packet diff --git a/reactos/drivers/network/tcpip/tcpip/dispatch.c b/reactos/drivers/network/tcpip/tcpip/dispatch.c index e0869aaf400..6bc4cc4db77 100644 --- a/reactos/drivers/network/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/network/tcpip/tcpip/dispatch.c @@ -543,15 +543,22 @@ NTSTATUS DispTdiDisconnect( Status = STATUS_INVALID_PARAMETER; goto done; } + + Status = DispPrepareIrpForCancel + (TranContext->Handle.ConnectionContext, + Irp, + (PDRIVER_CANCEL)DispCancelRequest); - Status = TCPDisconnect( - TranContext->Handle.ConnectionContext, - DisReq->RequestFlags, - DisReq->RequestSpecific, - DisReq->RequestConnectionInformation, - DisReq->ReturnConnectionInformation, - DispDataRequestComplete, - Irp ); + if (NT_SUCCESS(Status)) + { + Status = TCPDisconnect(TranContext->Handle.ConnectionContext, + DisReq->RequestFlags, + DisReq->RequestSpecific, + DisReq->RequestConnectionInformation, + DisReq->ReturnConnectionInformation, + DispDataRequestComplete, + Irp); + } done: if (Status != STATUS_PENDING) {