Author: cmihail
Date: Sun Jul  3 19:40:40 2011
New Revision: 52520

URL: http://svn.reactos.org/svn/reactos?rev=52520&view=rev
Log:
[AFD]
merge r52502, r52510

[TCPIP]
merge r52501, r52511

Modified:
    branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/info.c
    branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/main.c
    branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/read.c
    branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/write.c
    branches/GSoC_2011/TcpIpDriver/drivers/network/afd/include/afd.h
    branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/fileobjs.c

Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/info.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/info.c?rev=52520&r1=52519&r2=52520&view=diff
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/info.c [iso-8859-1] 
(original)
+++ branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/info.c [iso-8859-1] 
Sun Jul  3 19:40:40 2011
@@ -73,6 +73,19 @@
                         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:

Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/main.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/main.c?rev=52520&r1=52519&r2=52520&view=diff
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/main.c [iso-8859-1] 
(original)
+++ branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/main.c [iso-8859-1] 
Sun Jul  3 19:40:40 2011
@@ -616,7 +616,8 @@
     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 @@
 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 @@
 
     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 @@
 {
     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 @@
         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);
             }
             

Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/read.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/read.c?rev=52520&r1=52519&r2=52520&view=diff
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/read.c [iso-8859-1] 
(original)
+++ branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/read.c [iso-8859-1] 
Sun Jul  3 19:40:40 2011
@@ -30,8 +30,8 @@
 {
        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 );

Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/write.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/write.c?rev=52520&r1=52519&r2=52520&view=diff
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/write.c [iso-8859-1] 
(original)
+++ branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/write.c [iso-8859-1] 
Sun Jul  3 19:40:40 2011
@@ -190,7 +190,10 @@
                                                  &FCB->SendIrp.Iosb,
                                                  SendComplete,
                                                  FCB );
-
+    }
+    else
+    {
+        /* Nothing is waiting so try to complete a pending disconnect */
         RetryDisconnectCompletion(FCB);
     }
 
@@ -326,9 +329,28 @@
         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,

Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/afd/include/afd.h
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/afd/include/afd.h?rev=52520&r1=52519&r2=52520&view=diff
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/drivers/network/afd/include/afd.h 
[iso-8859-1] (original)
+++ branches/GSoC_2011/TcpIpDriver/drivers/network/afd/include/afd.h 
[iso-8859-1] Sun Jul  3 19:40:40 2011
@@ -184,6 +184,7 @@
     UINT ConnSeq;
     USHORT DisconnectFlags;
     BOOLEAN DisconnectPending;
+    LARGE_INTEGER DisconnectTimeout;
     PTRANSPORT_ADDRESS LocalAddress, RemoteAddress;
     PTDI_CONNECTION_INFORMATION AddressFrom, ConnectCallInfo, 
ConnectReturnInfo;
     AFD_TDI_OBJECT AddressFile, Connection;

Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/fileobjs.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/fileobjs.c?rev=52520&r1=52519&r2=52520&view=diff
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/fileobjs.c 
[iso-8859-1] (original)
+++ branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/fileobjs.c 
[iso-8859-1] Sun Jul  3 19:40:40 2011
@@ -307,9 +307,21 @@
                 /* 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;
             }
 


Reply via email to