2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
5 * PURPOSE: Port allocation
6 * PROGRAMMERS: arty (ayerkes@speakeasy.net)
8 * arty 20041114 Created
13 VOID
PortsStartup( PPORT_SET PortSet
,
15 UINT PortsToManage
) {
16 PortSet
->StartingPort
= StartingPort
;
17 PortSet
->PortsToOversee
= PortsToManage
;
18 PortSet
->ProtoBitBuffer
=
19 PoolAllocateBuffer( (PortSet
->PortsToOversee
+ 7) / 8 );
20 RtlInitializeBitMap( &PortSet
->ProtoBitmap
,
21 PortSet
->ProtoBitBuffer
,
22 PortSet
->PortsToOversee
);
23 RtlClearAllBits( &PortSet
->ProtoBitmap
);
24 ExInitializeFastMutex( &PortSet
->Mutex
);
27 VOID
PortsShutdown( PPORT_SET PortSet
) {
28 PoolFreeBuffer( PortSet
->ProtoBitBuffer
);
31 VOID
DeallocatePort( PPORT_SET PortSet
, ULONG Port
) {
33 ASSERT(Port
>= PortSet
->StartingPort
);
34 ASSERT(Port
< PortSet
->StartingPort
+ PortSet
->PortsToOversee
);
35 RtlClearBits( &PortSet
->ProtoBitmap
, Port
- PortSet
->StartingPort
, 1 );
38 BOOLEAN
AllocatePort( PPORT_SET PortSet
, ULONG Port
) {
42 ASSERT(Port
>= PortSet
->StartingPort
);
43 Port
-= PortSet
->StartingPort
;
45 ExAcquireFastMutex( &PortSet
->Mutex
);
46 Clear
= RtlAreBitsClear( &PortSet
->ProtoBitmap
, Port
, 1 );
47 if( Clear
) RtlSetBits( &PortSet
->ProtoBitmap
, Port
, 1 );
48 ExReleaseFastMutex( &PortSet
->Mutex
);
53 ULONG
AllocateAnyPort( PPORT_SET PortSet
) {
56 ExAcquireFastMutex( &PortSet
->Mutex
);
57 AllocatedPort
= RtlFindClearBits( &PortSet
->ProtoBitmap
, 1, 0 );
58 if( AllocatedPort
!= (ULONG
)-1 ) {
59 RtlSetBit( &PortSet
->ProtoBitmap
, AllocatedPort
);
60 AllocatedPort
+= PortSet
->StartingPort
;
62 ExReleaseFastMutex( &PortSet
->Mutex
);
64 AllocatedPort
= htons(AllocatedPort
);
69 ULONG
AllocatePortFromRange( PPORT_SET PortSet
, ULONG Lowest
, ULONG Highest
) {
72 Lowest
-= PortSet
->StartingPort
;
73 Highest
-= PortSet
->StartingPort
;
75 ExAcquireFastMutex( &PortSet
->Mutex
);
76 AllocatedPort
= RtlFindClearBits( &PortSet
->ProtoBitmap
, 1, Lowest
);
77 if( AllocatedPort
!= (ULONG
)-1 && AllocatedPort
>= Lowest
&&
78 AllocatedPort
<= Highest
) {
79 RtlSetBit( &PortSet
->ProtoBitmap
, AllocatedPort
);
80 AllocatedPort
+= PortSet
->StartingPort
;
82 ExReleaseFastMutex( &PortSet
->Mutex
);
84 AllocatedPort
= htons(AllocatedPort
);