mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 19:26:32 +00:00
[AFD]
merge r52502, r52510 [TCPIP] merge r52501, r52511 svn path=/branches/GSoC_2011/TcpIpDriver/; revision=52520
This commit is contained in:
@@ -73,6 +73,19 @@ AfdGetInfo(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
||||
InfoReq->Information.Ulong++;
|
||||
CurrentEntry = CurrentEntry->Flink;
|
||||
}
|
||||
|
||||
/* This needs to count too because when this is dispatched
|
||||
* the user-mode IRP has already been completed and therefore
|
||||
* will NOT be in our pending IRP list. We count this as one send
|
||||
* outstanding although it could be multiple since we batch sends
|
||||
* when waiting for the in flight request to return, so this number
|
||||
* may not be accurate but it really doesn't matter that much since
|
||||
* it's more or less a zero/non-zero comparison to determine whether
|
||||
* we can shutdown the socket
|
||||
*/
|
||||
if (FCB->SendIrp.InFlightRequest)
|
||||
InfoReq->Information.Ulong++;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -616,7 +616,8 @@ DisconnectComplete(PDEVICE_OBJECT DeviceObject,
|
||||
FCB->DisconnectIrp.InFlightRequest = NULL;
|
||||
|
||||
ASSERT(FCB->DisconnectPending);
|
||||
//ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_SEND]) || (FCB->DisconnectFlags & TDI_DISCONNECT_ABORT));
|
||||
ASSERT((IsListEmpty(&FCB->PendingIrpList[FUNCTION_SEND]) && !FCB->SendIrp.InFlightRequest) ||
|
||||
(FCB->DisconnectFlags & TDI_DISCONNECT_ABORT));
|
||||
|
||||
if (NT_SUCCESS(Irp->IoStatus.Status) && (FCB->DisconnectFlags & TDI_DISCONNECT_RELEASE))
|
||||
{
|
||||
@@ -666,11 +667,11 @@ static
|
||||
NTSTATUS
|
||||
DoDisconnect(PAFD_FCB FCB)
|
||||
{
|
||||
PAFD_DISCONNECT_INFO DisReq;
|
||||
IO_STATUS_BLOCK Iosb;
|
||||
NTSTATUS Status;
|
||||
|
||||
ASSERT(FCB->DisconnectPending);
|
||||
ASSERT((IsListEmpty(&FCB->PendingIrpList[FUNCTION_SEND]) && !FCB->SendIrp.InFlightRequest) ||
|
||||
(FCB->DisconnectFlags & TDI_DISCONNECT_ABORT));
|
||||
|
||||
if (FCB->DisconnectIrp.InFlightRequest)
|
||||
{
|
||||
@@ -684,13 +685,14 @@ DoDisconnect(PAFD_FCB FCB)
|
||||
|
||||
Status = TdiDisconnect(&FCB->DisconnectIrp.InFlightRequest,
|
||||
FCB->Connection.Object,
|
||||
&DisReq->Timeout,
|
||||
&FCB->DisconnectTimeout,
|
||||
FCB->DisconnectFlags,
|
||||
&Iosb,
|
||||
&FCB->DisconnectIrp.Iosb,
|
||||
DisconnectComplete,
|
||||
FCB,
|
||||
FCB->ConnectCallInfo,
|
||||
FCB->ConnectReturnInfo);
|
||||
|
||||
if (Status != STATUS_PENDING)
|
||||
{
|
||||
FCB->DisconnectPending = FALSE;
|
||||
@@ -704,7 +706,7 @@ RetryDisconnectCompletion(PAFD_FCB FCB)
|
||||
{
|
||||
ASSERT(FCB->RemoteAddress);
|
||||
|
||||
if (IsListEmpty(&FCB->PendingIrpList[FUNCTION_SEND]) && FCB->DisconnectPending)
|
||||
if (IsListEmpty(&FCB->PendingIrpList[FUNCTION_SEND]) && !FCB->SendIrp.InFlightRequest && FCB->DisconnectPending)
|
||||
{
|
||||
/* Sends are done; fire off a TDI_DISCONNECT request */
|
||||
DoDisconnect(FCB);
|
||||
@@ -769,9 +771,10 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
||||
Status = QueueUserModeIrp(FCB, Irp, FUNCTION_DISCONNECT);
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
if (IsListEmpty(&FCB->PendingIrpList[FUNCTION_SEND]) || (FCB->DisconnectFlags & TDI_DISCONNECT_ABORT))
|
||||
if ((IsListEmpty(&FCB->PendingIrpList[FUNCTION_SEND]) && !FCB->SendIrp.InFlightRequest) ||
|
||||
(FCB->DisconnectFlags & TDI_DISCONNECT_ABORT))
|
||||
{
|
||||
/* Go ahead an execute the disconnect because we're ready for it */
|
||||
/* Go ahead and execute the disconnect because we're ready for it */
|
||||
Status = DoDisconnect(FCB);
|
||||
}
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@ static VOID HandleEOFOnIrp(PAFD_FCB FCB, NTSTATUS Status, ULONG_PTR Information)
|
||||
{
|
||||
if ((Status == STATUS_SUCCESS && !Information) || (!NT_SUCCESS(Status)))
|
||||
{
|
||||
/* The socket has been closed */
|
||||
FCB->PollState |= AFD_EVENT_CLOSE;
|
||||
/* The socket has been closed by the remote side */
|
||||
FCB->PollState |= AFD_EVENT_ABORT;
|
||||
FCB->PollStatus[FD_CLOSE_BIT] = Status;
|
||||
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
|
||||
@@ -190,7 +190,10 @@ SendComplete
|
||||
&FCB->SendIrp.Iosb,
|
||||
SendComplete,
|
||||
FCB );
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Nothing is waiting so try to complete a pending disconnect */
|
||||
RetryDisconnectCompletion(FCB);
|
||||
}
|
||||
|
||||
@@ -326,9 +329,28 @@ AfdConnectedSocketWriteData
|
||||
return UnlockAndMaybeComplete( FCB, Status, Irp, Information );
|
||||
}
|
||||
|
||||
if( !(SendReq = LockRequest(Irp, IrpSp)))
|
||||
return UnlockAndMaybeComplete
|
||||
( FCB, STATUS_NO_MEMORY, Irp, TotalBytesCopied );
|
||||
if (FCB->DisconnectPending && (FCB->DisconnectFlags & TDI_DISCONNECT_RELEASE))
|
||||
{
|
||||
/* 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))
|
||||
{
|
||||
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 */
|
||||
return UnlockAndMaybeComplete(FCB, FCB->PollStatus[FD_CLOSE_BIT], Irp, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (!(SendReq = LockRequest(Irp, IrpSp)))
|
||||
return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, TotalBytesCopied);
|
||||
|
||||
SendReq->BufferArray = LockBuffers( SendReq->BufferArray,
|
||||
SendReq->BufferCount,
|
||||
|
||||
@@ -184,6 +184,7 @@ typedef struct _AFD_FCB {
|
||||
UINT ConnSeq;
|
||||
USHORT DisconnectFlags;
|
||||
BOOLEAN DisconnectPending;
|
||||
LARGE_INTEGER DisconnectTimeout;
|
||||
PTRANSPORT_ADDRESS LocalAddress, RemoteAddress;
|
||||
PTDI_CONNECTION_INFORMATION AddressFrom, ConnectCallInfo, ConnectReturnInfo;
|
||||
AFD_TDI_OBJECT AddressFile, Connection;
|
||||
|
||||
@@ -307,9 +307,21 @@ NTSTATUS FileOpenAddress(
|
||||
/* Sanity check */
|
||||
ASSERT(Address->Address[0].Address[0].sin_port == AddrFile->Port);
|
||||
}
|
||||
else if (!AddrIsUnspecified(&AddrFile->Address))
|
||||
{
|
||||
/ The client is trying to bind to a local address so allocate a port now too
|
||||
AddrFile->Port = TCPAllocatePort(0);
|
||||
|
||||
// Check for bind success
|
||||
if (AddrFile->Port == 0xffff)
|
||||
{
|
||||
ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
|
||||
return STATUS_ADDRESS_ALREADY_EXISTS;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The client wants an unspecified port so we wait to see what the TCP library gives us */
|
||||
/* The client wants an unspecified port with an unspecified address so we wait to see what the TCP library gives us */
|
||||
AddrFile->Port = 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user