#include "rosip.h"
+NPAGED_LOOKASIDE_LIST TdiBucketLookasideList;
+
VOID NTAPI
DisconnectTimeoutDpc(PKDPC Dpc,
PVOID DeferredContext,
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);
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;
NTSTATUS TCPClose( PCONNECTION_ENDPOINT Connection )
{
KIRQL OldIrql;
- PVOID Socket;
LockObject(Connection, &OldIrql);
- Socket = Connection->SocketContext;
-
FlushAllQueues(Connection, STATUS_CANCELLED);
LibTCPClose(Connection, FALSE, TRUE);
{
return Status;
}
+
+ ExInitializeNPagedLookasideList(&TdiBucketLookasideList,
+ NULL,
+ NULL,
+ 0,
+ sizeof(TDI_BUCKET),
+ TDI_BUCKET_TAG,
+ 0);
/* Initialize our IP library */
LibIPInitialize();
{
if (!TCPInitialized)
return STATUS_SUCCESS;
+
+ ExDeleteNPagedLookasideList(&TdiBucketLookasideList);
LibIPShutdown();
{
connaddr.addr = RemoteAddress.Address.IPv4Address;
- Bucket = ExAllocatePoolWithTag( NonPagedPool, sizeof(*Bucket), TDI_BUCKET_TAG );
+ Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
if (!Bucket)
{
UnlockObject(Connection, OldIrql);
}
/* 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;
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"));
Status = TCPTranslateError(LibTCPSend(Connection,
BufferData,
SendLength,
+ BytesSent,
FALSE));
TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Send: %x, %d\n", Status, SendLength));
if (Status == STATUS_PENDING)
{
/* Freed in TCPSocketState */
- Bucket = ExAllocatePoolWithTag( NonPagedPool, sizeof(*Bucket), TDI_BUCKET_TAG );
+ Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
if (!Bucket)
{
UnlockObject(Connection, OldIrql);
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);
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;
}
if( Bucket->Request.RequestContext == Irp )
{
RemoveEntryList( &Bucket->Entry );
- ExFreePoolWithTag( Bucket, TDI_BUCKET_TAG );
+ ExFreeToNPagedLookasideList(&TdiBucketLookasideList, Bucket);
Found = TRUE;
break;
}
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 */