11 modified files
reactos/drivers/net/tcpip/datalink
diff -u -r1.29 -r1.30
--- lan.c	30 Nov 2004 00:10:41 -0000	1.29
+++ lan.c	1 Dec 2004 08:14:15 -0000	1.30
@@ -276,6 +276,8 @@
     PLAN_WQ_ITEM WQItem;
     PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
 
+    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+
     if( Status != NDIS_STATUS_SUCCESS ) return;
     WQItem = ExAllocatePool( NonPagedPool, sizeof(LAN_WQ_ITEM) );
     if( !WQItem ) return;
 
reactos/drivers/net/tcpip/include
diff -u -r1.11 -r1.12
--- debug.h	16 Nov 2004 18:07:57 -0000	1.11
+++ debug.h	1 Dec 2004 08:14:15 -0000	1.12
@@ -31,6 +31,7 @@
 #define DEBUG_RCACHE   0x00200000
 #define DEBUG_NCACHE   0x00400000
 #define DEBUG_CPOINT   0x00800000
+#define DEBUG_LOCK     0x01000000
 #define DEBUG_ULTRA    0xFFFFFFFF
 
 #ifdef DBG
 
reactos/drivers/net/tcpip/include
diff -u -r1.12 -r1.13
--- tcp.h	25 Nov 2004 23:56:59 -0000	1.12
+++ tcp.h	1 Dec 2004 08:14:15 -0000	1.13
@@ -81,11 +81,15 @@
 #define SRF_SYN   TCP_SYN
 #define SRF_FIN   TCP_FIN
 
+extern LONG TCP_IPIdentification;
+extern LIST_ENTRY SignalledConnections;
+extern LIST_ENTRY SleepingThreadsList;
+extern FAST_MUTEX SleepingThreadsLock;
+extern RECURSIVE_MUTEX TCPLock;
+
 PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext );
 VOID TCPFreeConnectionEndpoint( PCONNECTION_ENDPOINT Connection );
 
-VOID TCPCancelReceiveRequest( PVOID Context );
-
 NTSTATUS TCPSocket( PCONNECTION_ENDPOINT Connection, 
 		    UINT Family, UINT Type, UINT Proto );
 
 
reactos/drivers/net/tcpip/include
diff -u -r1.16 -r1.17
--- titypes.h	30 Nov 2004 00:10:41 -0000	1.16
+++ titypes.h	1 Dec 2004 08:14:15 -0000	1.17
@@ -321,6 +321,12 @@
     LIST_ENTRY ConnectRequest; /* Queued connect rqueusts */
     LIST_ENTRY ListenRequest;  /* Queued listen requests */
     LIST_ENTRY ReceiveRequest; /* Queued receive requests */
+
+    /* Signals */
+    LIST_ENTRY SignalList;     /* Entry in the list of sockets waiting for
+				* notification service to the client */
+    UINT    SignalState;       /* Active signals from oskit */
+    BOOLEAN Signalled;         /* Are we a member of the signal list */
 } CONNECTION_ENDPOINT, *PCONNECTION_ENDPOINT;
 
 
 
reactos/drivers/net/tcpip/tcpip
diff -u -r1.28 -r1.29
--- dispatch.c	26 Nov 2004 08:26:24 -0000	1.28
+++ dispatch.c	1 Dec 2004 08:14:15 -0000	1.29
@@ -71,20 +71,18 @@
 
     FileObject  = (PFILE_OBJECT)Context;
     TranContext = (PTRANSPORT_CONTEXT)FileObject->FsContext;
-    
-    IoAcquireCancelSpinLock(&OldIrql);
 
-    TI_DbgPrint(DEBUG_IRP, ("Setting TranContext->CleanupEvent to signaled.\n"));
     /* Set the cleanup event */
     KeSetEvent(&TranContext->CleanupEvent, 0, FALSE);
 
+    /* We are expected to release the cancel spin lock */
     IoReleaseCancelSpinLock(OldIrql);
 
     TI_DbgPrint(DEBUG_IRP, ("Leaving.\n"));
 }
 
 
-VOID DispCancelRequest(
+VOID DDKAPI DispCancelRequest(
     PDEVICE_OBJECT Device,
     PIRP Irp)
 /*
@@ -180,8 +178,6 @@
 
     IoSetCancelRoutine(Irp, NULL);
 
-    KeSetEvent(&TranContext->CleanupEvent, 0, FALSE);
-
     if (Irp->Cancel || TranContext->CancelIrps) {
         /* The IRP has been cancelled */
 
@@ -647,7 +643,7 @@
   Status = DispPrepareIrpForCancel
       (TranContext->Handle.ConnectionContext, 
        Irp, 
-       (PDRIVER_CANCEL)TCPCancelReceiveRequest);
+       (PDRIVER_CANCEL)DispCancelRequest);
 
   TI_DbgPrint(MID_TRACE,("TCPIP<<< Got an MDL: %x\n", Irp->MdlAddress));
   if (NT_SUCCESS(Status))
@@ -663,12 +659,8 @@
       if (Status != STATUS_PENDING)
       {
           DispDataRequestComplete(Irp, Status, BytesReceived);
-      }
-    }
-
-  if (Status != STATUS_PENDING)
-    {
-      IrpSp->Control &= ~SL_PENDING_RETURNED;
+      } else
+	  IoMarkIrpPending(Irp);
     }
 
   TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status));
@@ -735,15 +727,10 @@
 	  &BytesReceived,
 	  (PDATAGRAM_COMPLETION_ROUTINE)DispDataRequestComplete,
 	  Irp);
-      if (Status != STATUS_PENDING)
-        {
+      if (Status != STATUS_PENDING) {
           DispDataRequestComplete(Irp, Status, BytesReceived);
-        }
-    }
-
-  if (Status != STATUS_PENDING)
-    {
-      IrpSp->Control &= ~SL_PENDING_RETURNED;
+      } else
+	  IoMarkIrpPending(Irp);
     }
 
   TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status));
@@ -809,12 +796,8 @@
 	if (Status != STATUS_PENDING)
 	{
 	    DispDataRequestComplete(Irp, Status, BytesReceived);
-	}
-    }
-
-  if (Status != STATUS_PENDING)
-    {
-      IrpSp->Control &= ~SL_PENDING_RETURNED;
+	} else 
+	    IoMarkIrpPending( Irp );
     }
 
   TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status));
@@ -883,7 +866,8 @@
             /* Return STATUS_PENDING because DispPrepareIrpForCancel
                marks Irp as pending */
             Status = STATUS_PENDING;
-        }
+        } else
+	    IoMarkIrpPending( Irp );
     }
 
     TI_DbgPrint(DEBUG_IRP, ("Leaving.\n"));
 
reactos/drivers/net/tcpip/tcpip
diff -u -r1.26 -r1.27
--- fileobjs.c	30 Nov 2004 00:10:41 -0000	1.26
+++ fileobjs.c	1 Dec 2004 08:14:15 -0000	1.27
@@ -378,7 +378,6 @@
   if( !Connection ) return STATUS_NO_MEMORY;
 
   Status = TCPSocket( Connection, AF_INET, SOCK_STREAM, IPPROTO_TCP );
-  DbgPrint("STATUS from OSKITTCP was %08x\n", Status);
 
   /* Return connection endpoint file object */
   Request->Handle.ConnectionContext = Connection;
 
reactos/drivers/net/tcpip/tcpip
diff -u -r1.1 -r1.2
--- lock.c	7 Nov 2004 20:37:19 -0000	1.1
+++ lock.c	1 Dec 2004 08:14:15 -0000	1.2
@@ -49,9 +49,14 @@
 }
 
 UINT TcpipRecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOL ToWrite ) {
-    return RecursiveMutexEnter( RecMutex, ToWrite );
+    UINT Ret;
+    TI_DbgPrint(DEBUG_LOCK,("Locking\n"));
+    Ret = RecursiveMutexEnter( RecMutex, ToWrite );
+    TI_DbgPrint(DEBUG_LOCK,("Locked\n"));
+    return Ret;
 }
 
 VOID TcpipRecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex ) {
+    TI_DbgPrint(DEBUG_LOCK,("Unlocking\n"));
     RecursiveMutexLeave( RecMutex );
 }
 
reactos/drivers/net/tcpip/tcpip
diff -u -r1.43 -r1.44
--- main.c	30 Nov 2004 00:10:41 -0000	1.43
+++ main.c	1 Dec 2004 08:14:15 -0000	1.44
@@ -12,7 +12,7 @@
 #define NDEBUG
 
 #ifndef NDEBUG
-DWORD DebugTraceLevel = 0x7fffffff;
+DWORD DebugTraceLevel = DEBUG_TCP;
 #else
 DWORD DebugTraceLevel = 0; /*DEBUG_IP | DEBUG_PBUFFER | DEBUG_DATALINK;*/
 #endif /* NDEBUG */
 
reactos/drivers/lib/ip/network
diff -u -r1.4 -r1.5
--- interface.c	25 Nov 2004 23:56:58 -0000	1.4
+++ interface.c	1 Dec 2004 08:14:15 -0000	1.5
@@ -11,7 +11,6 @@
 
 #include "precomp.h"
 
-
 NTSTATUS GetInterfaceIPv4Address( PIP_INTERFACE Interface, 
 				  ULONG TargetType,
 				  PULONG Address ) {
 
reactos/drivers/lib/ip/transport/tcp
diff -u -r1.9 -r1.10
--- event.c	30 Nov 2004 00:10:41 -0000	1.9
+++ event.c	1 Dec 2004 08:14:15 -0000	1.10
@@ -10,137 +10,34 @@
 
 #include "precomp.h"
 
-extern ULONG TCP_IPIdentification;
-extern LIST_ENTRY SleepingThreadsList;
-extern FAST_MUTEX SleepingThreadsLock;
-extern RECURSIVE_MUTEX TCPLock;
+extern VOID DrainSignals();
 
 int TCPSocketState(void *ClientData,
 		   void *WhichSocket, 
 		   void *WhichConnection,
 		   OSK_UINT NewState ) {
-    NTSTATUS Status = STATUS_SUCCESS;
     PCONNECTION_ENDPOINT Connection = WhichConnection;
-    PTCP_COMPLETION_ROUTINE Complete;
-    PTDI_BUCKET Bucket;
-    PLIST_ENTRY Entry;
 
-    TI_DbgPrint(MID_TRACE,("Called: NewState %x (Conn %x) (Change %x)\n", 
+    TI_DbgPrint(DEBUG_TCP,("Called: NewState %x (Conn %x) (Change %x)\n", 
 			   NewState, Connection,
 			   Connection ? Connection->State ^ NewState : 
 			   NewState));
 
-    TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-
     if( !Connection ) {
-	TI_DbgPrint(MID_TRACE,("Socket closing.\n"));
+	TI_DbgPrint(DEBUG_TCP,("Socket closing.\n"));
 	Connection = FileFindConnectionByContext( WhichSocket );
 	if( !Connection ) {
 	    TcpipRecursiveMutexLeave( &TCPLock );
 	    return 0;
 	} else 
-	    TI_DbgPrint(MID_TRACE,("Found socket %x\n", Connection));
+	    TI_DbgPrint(DEBUG_TCP,("Found socket %x\n", Connection));
     }
 
-    if( ((NewState & SEL_CONNECT) || (NewState & SEL_FIN)) &&
-	!(Connection->State & (SEL_CONNECT | SEL_FIN)) ) {
-	while( !IsListEmpty( &Connection->ConnectRequest ) ) {
-	    Connection->State |= NewState & (SEL_CONNECT | SEL_FIN);
-	    Entry = RemoveHeadList( &Connection->ConnectRequest );
-	    Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
-	    Complete = Bucket->Request.RequestNotifyObject;
-	    TI_DbgPrint(MID_TRACE,
-			("Completing Connect Request %x\n", Bucket->Request));
-	    if( NewState & SEL_FIN ) Status = STATUS_CONNECTION_REFUSED;
-	    TcpipRecursiveMutexLeave( &TCPLock );
-	    Complete( Bucket->Request.RequestContext, Status, 0 );
-	    TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-	    /* Frees the bucket allocated in TCPConnect */
-	    PoolFreeBuffer( Bucket );
-	}
+    if( !Connection->Signalled ) {
+	Connection->Signalled = TRUE;
+	Connection->SignalState = NewState;
+	InsertTailList( &SignalledConnections, &Connection->SignalList );
     }
-    if( (NewState & SEL_READ) || (NewState & SEL_FIN) ) {
-	TI_DbgPrint(MID_TRACE,("Readable (or closed): irp list %s\n",
-			       IsListEmpty(&Connection->ReceiveRequest) ?
-			       "empty" : "nonempty"));
-
-	while( !IsListEmpty( &Connection->ReceiveRequest ) ) {
-	    PIRP Irp;
-	    OSK_UINT RecvLen = 0, Received = 0;
-	    OSK_PCHAR RecvBuffer = 0;
-	    PMDL Mdl;
-	    NTSTATUS Status;
-
-	    Entry = RemoveHeadList( &Connection->ReceiveRequest );
-	    Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
-	    Complete = Bucket->Request.RequestNotifyObject;
-
-	    TI_DbgPrint(MID_TRACE,
-			("Readable, Completing read request %x\n", 
-			 Bucket->Request));
-
-	    Irp = Bucket->Request.RequestContext;
-	    Mdl = Irp->MdlAddress;
-
-	    TI_DbgPrint(MID_TRACE,
-			("Getting the user buffer from %x\n", Mdl));
-
-	    NdisQueryBuffer( Mdl, &RecvBuffer, &RecvLen );
-
-	    TI_DbgPrint(MID_TRACE,
-			("Reading %d bytes to %x\n", RecvLen, RecvBuffer));
-
-	    if( (NewState & SEL_FIN) && !RecvLen ) {
-		TI_DbgPrint(MID_TRACE, ("EOF From socket\n"));
-		Status = STATUS_END_OF_FILE;
-		Received = 0;
-	    } else {
-		TI_DbgPrint(MID_TRACE, ("Connection: %x\n", Connection));
-		TI_DbgPrint
-		    (MID_TRACE, 
-		     ("Connection->SocketContext: %x\n", 
-		      Connection->SocketContext));
-		TI_DbgPrint(MID_TRACE, ("RecvBuffer: %x\n", RecvBuffer));
-
-		Status = TCPTranslateError
-		    ( OskitTCPRecv( Connection->SocketContext,
-				    RecvBuffer,
-				    RecvLen,
-				    &Received,
-				    0 ) );
-	    }
-
-	    TI_DbgPrint(MID_TRACE,("TCP Bytes: %d\n", Received));
-
-	    if( Status == STATUS_SUCCESS && Received != 0 ) {
-		TI_DbgPrint(MID_TRACE,("Received %d bytes with status %x\n",
-				       Received, Status));
-		
-		TI_DbgPrint(MID_TRACE,
-			    ("Completing Receive Request: %x\n", 
-			     Bucket->Request));
-
-		TcpipRecursiveMutexLeave( &TCPLock );
-		Complete( Bucket->Request.RequestContext,
-			  STATUS_SUCCESS, Received );
-		TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-	    } else if( Status == STATUS_PENDING || 
-		       (Status == STATUS_SUCCESS && Received == 0) ) {
-		InsertHeadList( &Connection->ReceiveRequest,
-				&Bucket->Entry );
-		break;
-	    } else {
-		TI_DbgPrint(MID_TRACE,
-			    ("Completing Receive request: %x %x\n",
-			     Bucket->Request, Status));
-		TcpipRecursiveMutexLeave( &TCPLock );
-		Complete( Bucket->Request.RequestContext, Status, 0 );
-		TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-	    }
-	}
-    } 
-
-    TcpipRecursiveMutexLeave( &TCPLock );
 
     return 0;
 }
@@ -148,9 +45,9 @@
 void TCPPacketSendComplete( PVOID Context,
 			    PNDIS_PACKET NdisPacket,
 			    NDIS_STATUS NdisStatus ) {
-    TI_DbgPrint(MID_TRACE,("called %x\n", NdisPacket));
+    TI_DbgPrint(DEBUG_TCP,("called %x\n", NdisPacket));
     FreeNdisPacket(NdisPacket);
-    TI_DbgPrint(MID_TRACE,("done\n"));
+    TI_DbgPrint(DEBUG_TCP,("done\n"));
 }
 
 #define STRINGIFY(x) #x
@@ -175,10 +72,6 @@
 
     RemoteAddress.Type = LocalAddress.Type = IP_ADDRESS_V4;
 
-    DbgPrint("OSKIT SENDING PACKET *** %x -> %x\n",
-	     LocalAddress.Address.IPv4Address,
-	     RemoteAddress.Address.IPv4Address);
-    
     if(!(NCE = RouteGetRouteToDestination( &RemoteAddress )))
 	return OSK_EADDRNOTAVAIL;
 
@@ -186,7 +79,7 @@
 					   MaxLLHeaderSize + len );
     
     if (NdisStatus != NDIS_STATUS_SUCCESS) {
-	TI_DbgPrint(MAX_TRACE, ("Error from NDIS: %08x\n", NdisStatus));
+	TI_DbgPrint(DEBUG_TCP, ("Error from NDIS: %08x\n", NdisStatus));
 	return STATUS_NO_MEMORY;
     }
 
@@ -201,7 +94,7 @@
     Packet.DstAddr = RemoteAddress;
 
     IPSendDatagram( &Packet, NCE, TCPPacketSendComplete, NULL );
-
+    
     if( !NT_SUCCESS(NdisStatus) ) return OSK_EINVAL;
     else return 0;
 }
@@ -223,7 +116,7 @@
 	      int tmio ) {
     PSLEEPING_THREAD SleepingThread;
     
-    TI_DbgPrint(MID_TRACE,
+    TI_DbgPrint(DEBUG_TCP,
 		("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n",
 		 token, priority, msg, tmio));
 
@@ -236,7 +129,7 @@
 	InsertTailList( &SleepingThreadsList, &SleepingThread->Entry );
 	TcpipReleaseFastMutex( &SleepingThreadsLock );
 
-	TI_DbgPrint(MID_TRACE,("Waiting on %x\n", token));
+	TI_DbgPrint(DEBUG_TCP,("Waiting on %x\n", token));
 	KeWaitForSingleObject( &SleepingThread->Event,
 			       WrSuspended,
 			       KernelMode,
@@ -249,7 +142,7 @@
 
 	PoolFreeBuffer( SleepingThread );
     }
-    TI_DbgPrint(MID_TRACE,("Waiting finished: %x\n", token));
+    TI_DbgPrint(DEBUG_TCP,("Waiting finished: %x\n", token));
     return 0;
 }
 
@@ -261,9 +154,9 @@
     Entry = SleepingThreadsList.Flink;
     while( Entry != &SleepingThreadsList ) {
 	SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry);
-	TI_DbgPrint(MID_TRACE,("Sleeper @ %x\n", SleepingThread));
+	TI_DbgPrint(DEBUG_TCP,("Sleeper @ %x\n", SleepingThread));
 	if( SleepingThread->SleepToken == token ) {
-	    TI_DbgPrint(MID_TRACE,("Setting event to wake %x\n", token));
+	    TI_DbgPrint(DEBUG_TCP,("Setting event to wake %x\n", token));
 	    KeSetEvent( &SleepingThread->Event, IO_NETWORK_INCREMENT, FALSE );
 	}
 	Entry = Entry->Flink;
 
reactos/drivers/lib/ip/transport/tcp
diff -u -r1.11 -r1.12
--- tcp.c	30 Nov 2004 00:10:41 -0000	1.11
+++ tcp.c	1 Dec 2004 08:14:15 -0000	1.12
@@ -13,10 +13,126 @@
 LONG TCP_IPIdentification = 0;
 static BOOLEAN TCPInitialized = FALSE;
 static NPAGED_LOOKASIDE_LIST TCPSegmentList;
+LIST_ENTRY SignalledConnections;
 LIST_ENTRY SleepingThreadsList;
 FAST_MUTEX SleepingThreadsLock;
 RECURSIVE_MUTEX TCPLock;
 
+static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection,
+				       ULONG NewState ) {
+    NTSTATUS Status = STATUS_SUCCESS;
+    PTCP_COMPLETION_ROUTINE Complete;
+    PTDI_BUCKET Bucket;
+    PLIST_ENTRY Entry;
+
+    if( ((NewState & SEL_CONNECT) || (NewState & SEL_FIN)) &&
+
+	!(Connection->State & (SEL_CONNECT | SEL_FIN)) ) {
+	while( !IsListEmpty( &Connection->ConnectRequest ) ) {
+	    Connection->State |= NewState & (SEL_CONNECT | SEL_FIN);
+	    Entry = RemoveHeadList( &Connection->ConnectRequest );
+	    Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
+	    Complete = Bucket->Request.RequestNotifyObject;
+	    TI_DbgPrint(DEBUG_TCP,
+			("Completing Connect Request %x\n", Bucket->Request));
+	    if( NewState & SEL_FIN ) Status = STATUS_CONNECTION_REFUSED;
+	    Complete( Bucket->Request.RequestContext, Status, 0 );
+	    /* Frees the bucket allocated in TCPConnect */
+	    PoolFreeBuffer( Bucket );
+	}
+    }
+    if( (NewState & SEL_READ) || (NewState & SEL_FIN) ) {
+	TI_DbgPrint(DEBUG_TCP,("Readable (or closed): irp list %s\n",
+			       IsListEmpty(&Connection->ReceiveRequest) ?
+			       "empty" : "nonempty"));
+
+	while( !IsListEmpty( &Connection->ReceiveRequest ) ) {
+	    PIRP Irp;
+	    OSK_UINT RecvLen = 0, Received = 0;
+	    OSK_PCHAR RecvBuffer = 0;
+	    PMDL Mdl;
+	    NTSTATUS Status;
+
+	    Entry = RemoveHeadList( &Connection->ReceiveRequest );
+	    Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
+	    Complete = Bucket->Request.RequestNotifyObject;
+
+	    TI_DbgPrint(DEBUG_TCP,
+			("Readable, Completing read request %x\n", 
+			 Bucket->Request));
+
+	    Irp = Bucket->Request.RequestContext;
+	    Mdl = Irp->MdlAddress;
+
+	    TI_DbgPrint(DEBUG_TCP,
+			("Getting the user buffer from %x\n", Mdl));
+
+	    NdisQueryBuffer( Mdl, &RecvBuffer, &RecvLen );
+
+	    TI_DbgPrint(DEBUG_TCP,
+			("Reading %d bytes to %x\n", RecvLen, RecvBuffer));
+
+	    if( (NewState & SEL_FIN) && !RecvLen ) {
+		TI_DbgPrint(DEBUG_TCP, ("EOF From socket\n"));
+		Status = STATUS_END_OF_FILE;
+		Received = 0;
+	    } else {
+		TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection));
+		TI_DbgPrint
+		    (DEBUG_TCP, 
+		     ("Connection->SocketContext: %x\n", 
+		      Connection->SocketContext));
+		TI_DbgPrint(DEBUG_TCP, ("RecvBuffer: %x\n", RecvBuffer));
+
+		Status = TCPTranslateError
+		    ( OskitTCPRecv( Connection->SocketContext,
+				    RecvBuffer,
+				    RecvLen,
+				    &Received,
+				    0 ) );
+	    }
+
+	    TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Received));
+
+	    if( Status == STATUS_SUCCESS && Received != 0 ) {
+		TI_DbgPrint(DEBUG_TCP,("Received %d bytes with status %x\n",
+				       Received, Status));
+		
+		TI_DbgPrint(DEBUG_TCP,
+			    ("Completing Receive Request: %x\n", 
+			     Bucket->Request));
+
+		Complete( Bucket->Request.RequestContext,
+			  STATUS_SUCCESS, Received );
+	    } else if( Status == STATUS_PENDING || 
+		       (Status == STATUS_SUCCESS && Received == 0) ) {
+		InsertHeadList( &Connection->ReceiveRequest,
+				&Bucket->Entry );
+		break;
+	    } else {
+		TI_DbgPrint(DEBUG_TCP,
+			    ("Completing Receive request: %x %x\n",
+			     Bucket->Request, Status));
+		Complete( Bucket->Request.RequestContext, Status, 0 );
+	    }
+	}
+    } 
+
+    Connection->Signalled = FALSE;
+}
+
+VOID DrainSignals() {
+    PCONNECTION_ENDPOINT Connection;
+    PLIST_ENTRY ListEntry;
+
+    while( !IsListEmpty( &SignalledConnections ) ) {
+	ListEntry = RemoveHeadList( &SignalledConnections );
+	Connection = CONTAINING_RECORD( ListEntry, CONNECTION_ENDPOINT,
+					SignalList );
+	HandleSignalledConnection( Connection, Connection->SignalState );
+    }
+}
+
 PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext ) {
     PCONNECTION_ENDPOINT Connection = 
 	ExAllocatePool(NonPagedPool, sizeof(CONNECTION_ENDPOINT));
@@ -49,7 +165,7 @@
 		    UINT Family, UINT Type, UINT Proto ) {
     NTSTATUS Status;
 
-    TI_DbgPrint(MID_TRACE,("Called: Connection %x, Family %d, Type %d, "
+    TI_DbgPrint(DEBUG_TCP,("Called: Connection %x, Family %d, Type %d, "
 			   "Proto %d\n",
 			   Connection, Family, Type, Proto));
 
@@ -62,7 +178,7 @@
 
     ASSERT_KM_POINTER(Connection->SocketContext);
 
-    TI_DbgPrint(MID_TRACE,("Connection->SocketContext %x\n",
+    TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n",
 			   Connection->SocketContext));
 
     TcpipRecursiveMutexLeave( &TCPLock );
@@ -79,7 +195,7 @@
  *     This is the low level interface for receiving TCP data
  */
 {
-    TI_DbgPrint(MID_TRACE,("Sending packet %d (%d) to oskit\n", 
+    TI_DbgPrint(DEBUG_TCP,("Sending packet %d (%d) to oskit\n", 
 			   IPPacket->TotalSize,
 			   IPPacket->HeaderSize));
 
@@ -89,6 +205,8 @@
 			     IPPacket->TotalSize, 
 			     IPPacket->HeaderSize );
 
+    DrainSignals();
+
     TcpipRecursiveMutexLeave( &TCPLock );
 }
 
@@ -138,6 +256,7 @@
     TcpipRecursiveMutexInit( &TCPLock );
     ExInitializeFastMutex( &SleepingThreadsLock );
     InitializeListHead( &SleepingThreadsList );    
+    InitializeListHead( &SignalledConnections );
 
     RegisterOskitTCPEventHandlers( &EventHandlers );
     InitOskitTCP();
@@ -196,7 +315,7 @@
     default: Status = STATUS_INVALID_CONNECTION; break;
     }
 
-    TI_DbgPrint(MID_TRACE,("Error %d -> %x\n", OskitError, Status));
+    TI_DbgPrint(DEBUG_TCP,("Error %d -> %x\n", OskitError, Status));
     return Status;
 }
 
@@ -209,7 +328,7 @@
     PIP_ADDRESS LocalAddress;
     USHORT LocalPort;
 
-    TI_DbgPrint(MID_TRACE,("Called\n"));
+    TI_DbgPrint(DEBUG_TCP,("Called\n"));
 
     Status = AddrBuildAddress
 	((PTA_ADDRESS)ConnInfo->LocalAddress,
@@ -227,7 +346,7 @@
 			   &AddressToBind, 
 			   sizeof(AddressToBind));
 
-    TI_DbgPrint(MID_TRACE,("Leaving %x\n", Status));
+    TI_DbgPrint(DEBUG_TCP,("Leaving %x\n", Status));
 
     return Status;
 }
@@ -268,7 +387,7 @@
 	     RemotePort);
 
     if (!NT_SUCCESS(Status)) {
-	TI_DbgPrint(MID_TRACE, ("Could not AddrBuildAddress in TCPConnect\n"));
+	TI_DbgPrint(DEBUG_TCP, ("Could not AddrBuildAddress in TCPConnect\n"));
 	return Status;
     }
     
@@ -302,15 +421,18 @@
 ( PCONNECTION_ENDPOINT Connection ) {
     NTSTATUS Status;
     
-    TI_DbgPrint(MID_TRACE,("TCPClose started\n"));
+    TI_DbgPrint(DEBUG_TCP,("TCPClose started\n"));
 
     TcpipRecursiveMutexEnter( &TCPLock, TRUE );
 
     Status = TCPTranslateError( OskitTCPClose( Connection->SocketContext ) );
 
+    if( Connection->Signalled ) 
+	RemoveEntryList( &Connection->SignalList );
+
     TcpipRecursiveMutexLeave( &TCPLock );
     
-    TI_DbgPrint(MID_TRACE,("TCPClose finished %x\n", Status));
+    TI_DbgPrint(DEBUG_TCP,("TCPClose finished %x\n", Status));
 
     return Status;
 }
@@ -322,9 +444,9 @@
   PVOID Context) {
    NTSTATUS Status;
 
-   TI_DbgPrint(MID_TRACE,("TCPListen started\n"));
+   TI_DbgPrint(DEBUG_TCP,("TCPListen started\n"));
 
-   TI_DbgPrint(MID_TRACE,("Connection->SocketContext %x\n",
+   TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n",
      Connection->SocketContext));
 
    ASSERT(Connection);
@@ -337,7 +459,7 @@
    
    TcpipRecursiveMutexLeave( &TCPLock );
 
-   TI_DbgPrint(MID_TRACE,("TCPListen finished %x\n", Status));
+   TI_DbgPrint(DEBUG_TCP,("TCPListen finished %x\n", Status));
    
    return Status;
 }
@@ -347,25 +469,12 @@
   VOID **NewSocketContext ) {
    NTSTATUS Status;
 
-   TI_DbgPrint(MID_TRACE,("TCPAccept started\n"));
+   TI_DbgPrint(DEBUG_TCP,("TCPAccept started\n"));
    Status = STATUS_UNSUCCESSFUL;
-   TI_DbgPrint(MID_TRACE,("TCPAccept finished %x\n", Status));
+   TI_DbgPrint(DEBUG_TCP,("TCPAccept finished %x\n", Status));
    return Status;
 }
 
-VOID TCPCancelReceiveRequest( PVOID Context ) {
-    PLIST_ENTRY ListEntry;
-    PCONNECTION_ENDPOINT Connection = (PCONNECTION_ENDPOINT)Context;
-
-    TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-    for( ListEntry = Connection->ReceiveRequest.Flink; 
-	 ListEntry != &Connection->ReceiveRequest;
-	 ListEntry = ListEntry->Flink ) {
-	
-    }
-    TcpipRecursiveMutexLeave( &TCPLock );
-}
-
 NTSTATUS TCPReceiveData
 ( PCONNECTION_ENDPOINT Connection,
   PNDIS_BUFFER Buffer,
@@ -379,7 +488,7 @@
     NTSTATUS Status;
     PTDI_BUCKET Bucket;
 
-    TI_DbgPrint(MID_TRACE,("Called for %d bytes\n", ReceiveLength));
+    TI_DbgPrint(DEBUG_TCP,("Called for %d bytes\n", ReceiveLength));
 
     ASSERT_KM_POINTER(Connection->SocketContext);
 
@@ -387,7 +496,7 @@
 
     NdisQueryBuffer( Buffer, &DataBuffer, &DataLen );
 
-    TI_DbgPrint(MID_TRACE,("TCP>|< Got an MDL %x (%x:%d)\n", Buffer, DataBuffer, DataLen));
+    TI_DbgPrint(DEBUG_TCP,("TCP>|< Got an MDL %x (%x:%d)\n", Buffer, DataBuffer, DataLen));
 
     Status = TCPTranslateError
 	( OskitTCPRecv
@@ -397,7 +506,7 @@
 	    &Received,
 	    ReceiveFlags ) );
 
-    TI_DbgPrint(MID_TRACE,("OskitTCPReceive: %x, %d\n", Status, Received));
+    TI_DbgPrint(DEBUG_TCP,("OskitTCPReceive: %x, %d\n", Status, Received));
 
     /* Keep this request around ... there was no data yet */
     if( Status == STATUS_PENDING || 
@@ -405,7 +514,7 @@
 	/* Freed in TCPSocketState */
 	Bucket = ExAllocatePool( NonPagedPool, sizeof(*Bucket) );
 	if( !Bucket ) {
-	    TI_DbgPrint(MID_TRACE,("Failed to allocate bucket\n"));
+	    TI_DbgPrint(DEBUG_TCP,("Failed to allocate bucket\n"));
 	    TcpipRecursiveMutexLeave( &TCPLock );
 	    return STATUS_NO_MEMORY;
 	}
@@ -416,15 +525,15 @@
 
 	InsertHeadList( &Connection->ReceiveRequest, &Bucket->Entry );
 	Status = STATUS_PENDING;
-	TI_DbgPrint(MID_TRACE,("Queued read irp\n"));
+	TI_DbgPrint(DEBUG_TCP,("Queued read irp\n"));
     } else {
-	TI_DbgPrint(MID_TRACE,("Got status %x, bytes %d\n", Status, Received));
+	TI_DbgPrint(DEBUG_TCP,("Got status %x, bytes %d\n", Status, Received));
 	*BytesReceived = Received;
     }
 
     TcpipRecursiveMutexLeave( &TCPLock );
 
-    TI_DbgPrint(MID_TRACE,("Status %x\n", Status));
+    TI_DbgPrint(DEBUG_TCP,("Status %x\n", Status));
 
     return Status;
 }
@@ -441,8 +550,8 @@
 
     TcpipRecursiveMutexEnter( &TCPLock, TRUE );
 
-    TI_DbgPrint(MID_TRACE,("Connection = %x\n", Connection));
-    TI_DbgPrint(MID_TRACE,("Connection->SocketContext = %x\n",
+    TI_DbgPrint(DEBUG_TCP,("Connection = %x\n", Connection));
+    TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext = %x\n",
 			   Connection->SocketContext));
 
     Status = OskitTCPSend( Connection->SocketContext, 
@@ -455,11 +564,12 @@
 
 VOID TCPTimeout(VOID) { 
     static int Times = 0;
+    TcpipRecursiveMutexEnter( &TCPLock, TRUE );
     if( (Times++ % 5) == 0 ) {
-	TcpipRecursiveMutexEnter( &TCPLock, TRUE );
 	TimerOskitTCP();
-	TcpipRecursiveMutexLeave( &TCPLock );
     }
+    DrainSignals();
+    TcpipRecursiveMutexLeave( &TCPLock );
 }
 
 /* EOF */
 
CVSspam 0.2.8