Merge aicom-network-branch (without NDIS changes for now)
[reactos.git] / reactos / lib / drivers / ip / transport / tcp / accept.c
index ee1f3bf..643f59d 100644 (file)
@@ -10,6 +10,7 @@
 
 #include "precomp.h"
 
+/* Listener->Lock MUST be acquired */
 NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener,
                     PCONNECTION_ENDPOINT Connection,
                     PTDI_REQUEST_KERNEL Request ) {
@@ -19,8 +20,6 @@ NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener,
     PTA_IP_ADDRESS RequestAddressReturn;
     PTDI_CONNECTION_INFORMATION WhoIsConnecting;
 
-    ASSERT_LOCKED(&TCPLock);
-
     /* Unpack TDI info -- We need the return connection information
      * struct to return the address so it can be filtered if needed
      * by WSAAccept -- The returned address will be passed on to
@@ -31,6 +30,7 @@ NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener,
     Status = TCPTranslateError
     ( OskitTCPAccept( Listener->SocketContext,
               &Connection->SocketContext,
+              Connection,
               &OutAddr,
               sizeof(OutAddr),
               &OutAddrLen,
@@ -69,13 +69,13 @@ NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener,
 NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ) {
     NTSTATUS Status = STATUS_SUCCESS;
     SOCKADDR_IN AddressToBind;
-
-    TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+    KIRQL OldIrql;
 
     ASSERT(Connection);
-    ASSERT_KM_POINTER(Connection->SocketContext);
     ASSERT_KM_POINTER(Connection->AddressFile);
 
+    LockObject(Connection, &OldIrql);
+
     TI_DbgPrint(DEBUG_TCP,("TCPListen started\n"));
 
     TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n",
@@ -96,20 +96,21 @@ NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ) {
     if (NT_SUCCESS(Status))
         Status = TCPTranslateError( OskitTCPListen( Connection->SocketContext, Backlog ) );
 
-    TcpipRecursiveMutexLeave( &TCPLock );
+    UnlockObject(Connection, OldIrql);
 
     TI_DbgPrint(DEBUG_TCP,("TCPListen finished %x\n", Status));
 
     return Status;
 }
 
-VOID TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener,
+BOOLEAN TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener,
                   PCONNECTION_ENDPOINT Connection ) {
     PLIST_ENTRY ListEntry;
     PTDI_BUCKET Bucket;
     KIRQL OldIrql;
+    BOOLEAN Found = FALSE;
 
-    KeAcquireSpinLock(&Listener->Lock, &OldIrql);
+    LockObject(Listener, &OldIrql);
 
     ListEntry = Listener->ListenRequest.Flink;
     while ( ListEntry != &Listener->ListenRequest ) {
@@ -117,14 +118,17 @@ VOID TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener,
 
     if( Bucket->AssociatedEndpoint == Connection ) {
         RemoveEntryList( &Bucket->Entry );
-        exFreePool( Bucket );
+        ExFreePoolWithTag( Bucket, TDI_BUCKET_TAG );
+        Found = TRUE;
         break;
     }
 
     ListEntry = ListEntry->Flink;
     }
 
-    KeReleaseSpinLock(&Listener->Lock, OldIrql);
+    UnlockObject(Listener, OldIrql);
+
+    return Found;
 }
 
 NTSTATUS TCPAccept ( PTDI_REQUEST Request,
@@ -135,29 +139,31 @@ NTSTATUS TCPAccept ( PTDI_REQUEST Request,
 {
     NTSTATUS Status;
     PTDI_BUCKET Bucket;
+    KIRQL OldIrql;
 
     TI_DbgPrint(DEBUG_TCP,("TCPAccept started\n"));
 
-    TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+    LockObject(Listener, &OldIrql);
 
     Status = TCPServiceListeningSocket( Listener, Connection,
                        (PTDI_REQUEST_KERNEL)Request );
 
-    TcpipRecursiveMutexLeave( &TCPLock );
-
     if( Status == STATUS_PENDING ) {
-        Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) );
+        Bucket = ExAllocatePoolWithTag( NonPagedPool, sizeof(*Bucket),
+                                        TDI_BUCKET_TAG );
 
         if( Bucket ) {
+            ReferenceObject(Connection);
             Bucket->AssociatedEndpoint = Connection;
             Bucket->Request.RequestNotifyObject = Complete;
             Bucket->Request.RequestContext = Context;
-            IoMarkIrpPending((PIRP)Context);
-            ExInterlockedInsertTailList( &Listener->ListenRequest, &Bucket->Entry, &Listener->Lock );
+            InsertTailList( &Listener->ListenRequest, &Bucket->Entry );
         } else
             Status = STATUS_NO_MEMORY;
     }
 
+    UnlockObject(Listener, OldIrql);
+
     TI_DbgPrint(DEBUG_TCP,("TCPAccept finished %x\n", Status));
     return Status;
 }