- Cancel the in-flight disconnect IRP during socket closure
[TCPIP]
- Make a disconnect IRP cancelable

svn path=/trunk/; revision=53016
This commit is contained in:
Cameron Gutman 2011-08-01 03:54:19 +00:00
parent a90824eeae
commit f34cad36e2
3 changed files with 17 additions and 9 deletions

View file

@ -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++ ) {

View file

@ -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

View file

@ -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) {