- Wait to signal a graceful receive shutdown until all buffered transport data is read by the application

svn path=/trunk/; revision=52774
This commit is contained in:
Cameron Gutman 2011-07-22 04:11:50 +00:00
parent 5965cf4895
commit 2e54713de3
2 changed files with 27 additions and 9 deletions

View file

@ -28,27 +28,32 @@
static VOID HandleEOFOnIrp( PAFD_FCB FCB, NTSTATUS Status, ULONG_PTR Information )
{
if( ( Status == STATUS_SUCCESS && !Information ) ||
( !NT_SUCCESS( Status ) ) )
if (Status != STATUS_SUCCESS)
{
/* The socket has been closed by the remote side */
FCB->TdiReceiveClosed = TRUE;
/* Signal unexpected termination immediately */
FCB->PollState |= AFD_EVENT_ABORT;
FCB->PollStatus[FD_CLOSE_BIT] = Status;
PollReeval( FCB->DeviceExt, FCB->FileObject );
}
else if (Status == STATUS_SUCCESS && !Information)
{
/* Wait to signal graceful close until all data is read */
FCB->TdiReceiveClosed = TRUE;
}
}
static BOOLEAN CantReadMore( PAFD_FCB FCB ) {
UINT BytesAvailable = FCB->Recv.Content - FCB->Recv.BytesUsed;
return !BytesAvailable &&
(FCB->PollState & (AFD_EVENT_CLOSE | AFD_EVENT_ABORT));
return !BytesAvailable && FCB->TdiReceiveClosed;
}
static VOID RefillSocketBuffer( PAFD_FCB FCB ) {
if( !FCB->ReceiveIrp.InFlightRequest &&
!(FCB->PollState & (AFD_EVENT_CLOSE | AFD_EVENT_ABORT)) ) {
!FCB->TdiReceiveClosed ) {
AFD_DbgPrint(MID_TRACE,("Replenishing buffer\n"));
TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
@ -225,9 +230,22 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) {
FCB->PollState |= AFD_EVENT_RECEIVE;
FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
PollReeval( FCB->DeviceExt, FCB->FileObject );
} else
}
else if (CantReadMore(FCB) && !(FCB->PollState & (AFD_EVENT_ABORT | AFD_EVENT_CLOSE)))
{
FCB->PollState &= ~AFD_EVENT_RECEIVE;
/* Signal delayed close event */
FCB->PollState |= AFD_EVENT_ABORT;
FCB->PollStatus[FD_CLOSE_BIT] = STATUS_SUCCESS;
PollReeval( FCB->DeviceExt, FCB->FileObject );
}
else
{
FCB->PollState &= ~AFD_EVENT_RECEIVE;
}
AFD_DbgPrint(MID_TRACE,("RetStatus for irp %x is %x\n", Irp, RetStatus));
/* Sometimes we're called with a NULL Irp */

View file

@ -173,7 +173,7 @@ typedef struct _AFD_STORED_DATAGRAM {
} AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
typedef struct _AFD_FCB {
BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline;
BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline, TdiReceiveClosed;
UINT State, Flags, GroupID, GroupType;
KIRQL OldIrql;
UINT LockCount;