From da2a71a27c01abe574a4e3dbf17514147c174767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 22 Dec 2005 11:44:16 +0000 Subject: [PATCH] Remember the last allocated port and try to allocate the next one on the following call (prevents 1024 from being allocated each time) svn path=/trunk/; revision=20297 --- reactos/drivers/lib/ip/network/ports.c | 27 ++++++++++++++++++++++- reactos/drivers/net/tcpip/include/ports.h | 1 + 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/lib/ip/network/ports.c b/reactos/drivers/lib/ip/network/ports.c index 82f100c077d..2b8cb6a9c2b 100644 --- a/reactos/drivers/lib/ip/network/ports.c +++ b/reactos/drivers/lib/ip/network/ports.c @@ -15,6 +15,8 @@ VOID PortsStartup( PPORT_SET PortSet, UINT PortsToManage ) { PortSet->StartingPort = StartingPort; PortSet->PortsToOversee = PortsToManage; + PortSet->LastAllocatedPort = PortSet->StartingPort + + PortSet->PortsToOversee - 1; PortSet->ProtoBitBuffer = PoolAllocateBuffer( (PortSet->PortsToOversee + 7) / 8 ); RtlInitializeBitMap( &PortSet->ProtoBitmap, @@ -52,12 +54,23 @@ BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) { ULONG AllocateAnyPort( PPORT_SET PortSet ) { ULONG AllocatedPort; + ULONG Next; + +__asm__("int $3\n"); + if (PortSet->StartingPort + PortSet->PortsToOversee <= + PortSet->LastAllocatedPort + 1) { + Next = PortSet->StartingPort; + } else { + Next = PortSet->LastAllocatedPort + 1; + } + Next -= PortSet->StartingPort; ExAcquireFastMutex( &PortSet->Mutex ); AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, 0 ); if( AllocatedPort != (ULONG)-1 ) { RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort ); AllocatedPort += PortSet->StartingPort; + PortSet->LastAllocatedPort = AllocatedPort; } ExReleaseFastMutex( &PortSet->Mutex ); @@ -68,16 +81,28 @@ ULONG AllocateAnyPort( PPORT_SET PortSet ) { ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) { ULONG AllocatedPort; + ULONG Next; + if (PortSet->StartingPort + PortSet->PortsToOversee <= + PortSet->LastAllocatedPort + 1) { + Next = PortSet->StartingPort; + } else { + Next = PortSet->LastAllocatedPort + 1; + } + if (Next < Lowest || Highest <= Next) { + Next = Lowest; + } + Next -= PortSet->StartingPort; Lowest -= PortSet->StartingPort; Highest -= PortSet->StartingPort; ExAcquireFastMutex( &PortSet->Mutex ); - AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Lowest ); + AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Next ); if( AllocatedPort != (ULONG)-1 && AllocatedPort >= Lowest && AllocatedPort <= Highest) { RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort ); AllocatedPort += PortSet->StartingPort; + PortSet->LastAllocatedPort = AllocatedPort; } ExReleaseFastMutex( &PortSet->Mutex ); diff --git a/reactos/drivers/net/tcpip/include/ports.h b/reactos/drivers/net/tcpip/include/ports.h index d7408ffe6b0..bc20f34e17e 100644 --- a/reactos/drivers/net/tcpip/include/ports.h +++ b/reactos/drivers/net/tcpip/include/ports.h @@ -16,6 +16,7 @@ typedef struct _PORT_SET { PVOID ProtoBitBuffer; UINT StartingPort; UINT PortsToOversee; + UINT LastAllocatedPort; FAST_MUTEX Mutex; } PORT_SET, *PPORT_SET;