mirror of
https://github.com/reactos/reactos.git
synced 2024-09-28 13:34:53 +00:00
[AFD]
- Fix (hopefully) the final disconnect bugs svn path=/trunk/; revision=52783
This commit is contained in:
parent
2374f5b1aa
commit
acd4c15b61
|
@ -603,12 +603,13 @@ DisconnectComplete(PDEVICE_OBJECT DeviceObject,
|
||||||
IoCompleteRequest(CurrentIrp, IO_NETWORK_INCREMENT );
|
IoCompleteRequest(CurrentIrp, IO_NETWORK_INCREMENT );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FCB->DisconnectFlags & TDI_DISCONNECT_RELEASE)
|
if (!(FCB->DisconnectFlags & TDI_DISCONNECT_RELEASE))
|
||||||
FCB->PollState |= AFD_EVENT_DISCONNECT;
|
{
|
||||||
else
|
/* Signal complete connection closure immediately */
|
||||||
FCB->PollState |= AFD_EVENT_ABORT;
|
FCB->PollState |= AFD_EVENT_ABORT;
|
||||||
FCB->PollStatus[FD_CLOSE_BIT] = Irp->IoStatus.Status;
|
FCB->PollStatus[FD_CLOSE_BIT] = Irp->IoStatus.Status;
|
||||||
PollReeval(FCB->DeviceExt, FCB->FileObject);
|
PollReeval(FCB->DeviceExt, FCB->FileObject);
|
||||||
|
}
|
||||||
|
|
||||||
SocketStateUnlock(FCB);
|
SocketStateUnlock(FCB);
|
||||||
|
|
||||||
|
@ -721,6 +722,7 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
FCB->DisconnectFlags = Flags;
|
FCB->DisconnectFlags = Flags;
|
||||||
FCB->DisconnectTimeout = DisReq->Timeout;
|
FCB->DisconnectTimeout = DisReq->Timeout;
|
||||||
FCB->DisconnectPending = TRUE;
|
FCB->DisconnectPending = TRUE;
|
||||||
|
FCB->SendClosed = TRUE;
|
||||||
|
|
||||||
Status = QueueUserModeIrp(FCB, Irp, FUNCTION_DISCONNECT);
|
Status = QueueUserModeIrp(FCB, Irp, FUNCTION_DISCONNECT);
|
||||||
if (Status == STATUS_PENDING)
|
if (Status == STATUS_PENDING)
|
||||||
|
|
|
@ -32,8 +32,8 @@ static VOID HandleEOFOnIrp( PAFD_FCB FCB, NTSTATUS Status, ULONG_PTR Information
|
||||||
{
|
{
|
||||||
FCB->TdiReceiveClosed = TRUE;
|
FCB->TdiReceiveClosed = TRUE;
|
||||||
|
|
||||||
/* Signal unexpected termination immediately */
|
/* Signal complete connection failure immediately */
|
||||||
FCB->PollState |= AFD_EVENT_ABORT;
|
FCB->PollState |= AFD_EVENT_CLOSE;
|
||||||
FCB->PollStatus[FD_CLOSE_BIT] = Status;
|
FCB->PollStatus[FD_CLOSE_BIT] = Status;
|
||||||
|
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
@ -232,13 +232,12 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) {
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
}
|
}
|
||||||
else if (CantReadMore(FCB) &&
|
else if (CantReadMore(FCB) &&
|
||||||
!(FCB->PollState & (AFD_EVENT_ABORT | AFD_EVENT_CLOSE)) &&
|
!(FCB->PollState & (AFD_EVENT_CLOSE | AFD_EVENT_ABORT)))
|
||||||
IsListEmpty(&FCB->PendingIrpList[FUNCTION_RECV]))
|
|
||||||
{
|
{
|
||||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||||
|
|
||||||
/* Signal delayed close event */
|
/* Signal graceful receive shutdown */
|
||||||
FCB->PollState |= AFD_EVENT_ABORT;
|
FCB->PollState |= AFD_EVENT_DISCONNECT;
|
||||||
FCB->PollStatus[FD_CLOSE_BIT] = STATUS_SUCCESS;
|
FCB->PollStatus[FD_CLOSE_BIT] = STATUS_SUCCESS;
|
||||||
|
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
|
@ -351,26 +351,28 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FCB->DisconnectPending && (FCB->DisconnectFlags & TDI_DISCONNECT_RELEASE))
|
if (FCB->PollState & AFD_EVENT_CLOSE)
|
||||||
{
|
{
|
||||||
AFD_DbgPrint(MIN_TRACE,("No more sends\n"));
|
AFD_DbgPrint(MIN_TRACE,("Connection reset by remote peer\n"));
|
||||||
/* We're pending a send shutdown so don't accept anymore sends */
|
|
||||||
return UnlockAndMaybeComplete(FCB, STATUS_FILE_CLOSED, Irp, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FCB->PollState & (AFD_EVENT_CLOSE | AFD_EVENT_DISCONNECT))
|
|
||||||
{
|
|
||||||
AFD_DbgPrint(MIN_TRACE,("No more sends\n"));
|
|
||||||
if (FCB->PollStatus[FD_CLOSE_BIT] == STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
/* This is a local send shutdown or a graceful remote disconnect */
|
|
||||||
return UnlockAndMaybeComplete(FCB, STATUS_FILE_CLOSED, Irp, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* This is an unexpected remote disconnect */
|
/* This is an unexpected remote disconnect */
|
||||||
return UnlockAndMaybeComplete(FCB, FCB->PollStatus[FD_CLOSE_BIT], Irp, 0);
|
return UnlockAndMaybeComplete(FCB, FCB->PollStatus[FD_CLOSE_BIT], Irp, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (FCB->PollState & AFD_EVENT_ABORT)
|
||||||
|
{
|
||||||
|
AFD_DbgPrint(MIN_TRACE,("Connection aborted\n"));
|
||||||
|
|
||||||
|
/* This is an abortive socket closure on our side */
|
||||||
|
return UnlockAndMaybeComplete(FCB, FCB->PollStatus[FD_CLOSE_BIT], Irp, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FCB->SendClosed)
|
||||||
|
{
|
||||||
|
AFD_DbgPrint(MIN_TRACE,("No more sends\n"));
|
||||||
|
|
||||||
|
/* This is a graceful send closure */
|
||||||
|
return UnlockAndMaybeComplete(FCB, STATUS_FILE_CLOSED, Irp, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !(SendReq = LockRequest( Irp, IrpSp )) )
|
if( !(SendReq = LockRequest( Irp, IrpSp )) )
|
||||||
|
|
|
@ -173,7 +173,7 @@ typedef struct _AFD_STORED_DATAGRAM {
|
||||||
} AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
|
} AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
|
||||||
|
|
||||||
typedef struct _AFD_FCB {
|
typedef struct _AFD_FCB {
|
||||||
BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline, TdiReceiveClosed;
|
BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline, TdiReceiveClosed, SendClosed;
|
||||||
UINT State, Flags, GroupID, GroupType;
|
UINT State, Flags, GroupID, GroupType;
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
UINT LockCount;
|
UINT LockCount;
|
||||||
|
|
Loading…
Reference in a new issue