[TCPIP]
[reactos.git] / reactos / lib / drivers / ip / transport / tcp / tcp.c
index ce46f95..68b18f2 100644 (file)
@@ -23,6 +23,8 @@ PORT_SET TCPPorts;
 
 #include "rosip.h"
 
+NPAGED_LOOKASIDE_LIST TdiBucketLookasideList;
+
 VOID NTAPI
 DisconnectTimeoutDpc(PKDPC Dpc,
                      PVOID DeferredContext,
@@ -32,13 +34,12 @@ DisconnectTimeoutDpc(PKDPC Dpc,
     PCONNECTION_ENDPOINT Connection = (PCONNECTION_ENDPOINT)DeferredContext;
     PLIST_ENTRY Entry;
     PTDI_BUCKET Bucket;
-    NTSTATUS Status;
-    
+
     LockObjectAtDpcLevel(Connection);
-    
+
     /* We timed out waiting for pending sends so force it to shutdown */
-    Status = TCPTranslateError(LibTCPShutdown(Connection, 0, 1));
-    
+    TCPTranslateError(LibTCPShutdown(Connection, 0, 1));
+
     while (!IsListEmpty(&Connection->SendRequest))
     {
         Entry = RemoveHeadList(&Connection->SendRequest);
@@ -85,8 +86,8 @@ VOID ConnectionFree(PVOID Object)
 PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext )
 {
     PCONNECTION_ENDPOINT Connection = (PCONNECTION_ENDPOINT)
-        ExAllocatePoolWithTag(NonPagedPool, sizeof(CONNECTION_ENDPOINT),
-                              CONN_ENDPT_TAG);
+        ExAllocatePoolWithTag(NonPagedPool, sizeof(CONNECTION_ENDPOINT), CONN_ENDPT_TAG);
+
     if (!Connection)
         return Connection;
 
@@ -149,12 +150,9 @@ NTSTATUS TCPSocket( PCONNECTION_ENDPOINT Connection,
 NTSTATUS TCPClose( PCONNECTION_ENDPOINT Connection )
 {
     KIRQL OldIrql;
-    PVOID Socket;
 
     LockObject(Connection, &OldIrql);
 
-    Socket = Connection->SocketContext;
-
     FlushAllQueues(Connection, STATUS_CANCELLED);
 
     LibTCPClose(Connection, FALSE, TRUE);
@@ -196,6 +194,14 @@ NTSTATUS TCPStartup(VOID)
     {
         return Status;
     }
+
+    ExInitializeNPagedLookasideList(&TdiBucketLookasideList,
+                                    NULL,
+                                    NULL,
+                                    0,
+                                    sizeof(TDI_BUCKET),
+                                    TDI_BUCKET_TAG,
+                                    0);
     
     /* Initialize our IP library */
     LibIPInitialize();
@@ -218,6 +224,8 @@ NTSTATUS TCPShutdown(VOID)
 {
     if (!TCPInitialized)
         return STATUS_SUCCESS;
+
+    ExDeleteNPagedLookasideList(&TdiBucketLookasideList);
     
     LibIPShutdown();
 
@@ -348,7 +356,7 @@ NTSTATUS TCPConnect
         {
             connaddr.addr = RemoteAddress.Address.IPv4Address;
 
-            Bucket = ExAllocatePoolWithTag( NonPagedPool, sizeof(*Bucket), TDI_BUCKET_TAG );
+            Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
             if (!Bucket)
             {
                 UnlockObject(Connection, OldIrql);
@@ -418,13 +426,13 @@ NTSTATUS TCPDisconnect
                 }
 
                 /* We couldn't complete the request now because we need to wait for outstanding I/O */
-                Bucket = ExAllocatePoolWithTag(NonPagedPool, sizeof(*Bucket), TDI_BUCKET_TAG);
+                Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
                 if (!Bucket)
                 {
                     UnlockObject(Connection, OldIrql);
                     return STATUS_NO_MEMORY;
                 }
-    
+
                 Bucket->Request.RequestNotifyObject = (PVOID)Complete;
                 Bucket->Request.RequestContext = Context;
 
@@ -485,9 +493,7 @@ NTSTATUS TCPReceiveData
 
     if (Status == STATUS_PENDING)
     {
-    
-        /* Freed in TCPSocketState */
-        Bucket = ExAllocatePoolWithTag(NonPagedPool, sizeof(*Bucket), TDI_BUCKET_TAG);
+        Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
         if (!Bucket)
         {
             TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Failed to allocate bucket\n"));
@@ -538,6 +544,7 @@ NTSTATUS TCPSendData
     Status = TCPTranslateError(LibTCPSend(Connection,
                                           BufferData,
                                           SendLength,
+                                          BytesSent,
                                           FALSE));
     
     TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Send: %x, %d\n", Status, SendLength));
@@ -546,7 +553,7 @@ NTSTATUS TCPSendData
     if (Status == STATUS_PENDING)
     {
         /* Freed in TCPSocketState */
-        Bucket = ExAllocatePoolWithTag( NonPagedPool, sizeof(*Bucket), TDI_BUCKET_TAG );
+        Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
         if (!Bucket)
         {
             UnlockObject(Connection, OldIrql);
@@ -556,19 +563,10 @@ NTSTATUS TCPSendData
         
         Bucket->Request.RequestNotifyObject = Complete;
         Bucket->Request.RequestContext = Context;
-        *BytesSent = 0;
         
         InsertTailList( &Connection->SendRequest, &Bucket->Entry );
         TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Queued write irp\n"));
     }
-    else if (Status == STATUS_SUCCESS)
-    {
-        *BytesSent = SendLength;
-    }
-    else
-    {
-        *BytesSent = 0;
-    }
 
     UnlockObject(Connection, OldIrql);
 
@@ -630,6 +628,9 @@ NTSTATUS TCPGetSockAddress
     UnlockObject(Connection, OldIrql);
     
     AddressIP->Address[0].Address[0].in_addr = ipaddr.addr;
+    
+    RtlZeroMemory(&AddressIP->Address[0].Address[0].sin_zero,
+                  sizeof(AddressIP->Address[0].Address[0].sin_zero));
 
     return Status;
 }
@@ -661,7 +662,7 @@ BOOLEAN TCPRemoveIRP( PCONNECTION_ENDPOINT Endpoint, PIRP Irp )
             if( Bucket->Request.RequestContext == Irp )
             {
                 RemoveEntryList( &Bucket->Entry );
-                ExFreePoolWithTag( Bucket, TDI_BUCKET_TAG );
+                ExFreeToNPagedLookasideList(&TdiBucketLookasideList, Bucket);
                 Found = TRUE;
                 break;
             }
@@ -673,4 +674,20 @@ BOOLEAN TCPRemoveIRP( PCONNECTION_ENDPOINT Endpoint, PIRP Irp )
     return Found;
 }
 
+NTSTATUS
+TCPSetNoDelay(
+    PCONNECTION_ENDPOINT Connection,
+    BOOLEAN Set)
+{
+    if (!Connection)
+        return STATUS_UNSUCCESSFUL;
+
+    if (Connection->SocketContext == NULL)
+        return STATUS_UNSUCCESSFUL;
+
+    LibTCPSetNoDelay(Connection->SocketContext, Set);
+    return STATUS_SUCCESS;
+}
+
+
 /* EOF */