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 NTSTATUS
PortsStartup( PPORT_SET PortSet
,
15 UINT PortsToManage
) {
16 PortSet
->StartingPort
= StartingPort
;
17 PortSet
->PortsToOversee
= PortsToManage
;
19 PortSet
->ProtoBitBuffer
=
20 ExAllocatePoolWithTag( NonPagedPool
, (PortSet
->PortsToOversee
+ 7) / 8,
22 if(!PortSet
->ProtoBitBuffer
) return STATUS_INSUFFICIENT_RESOURCES
;
23 RtlInitializeBitMap( &PortSet
->ProtoBitmap
,
24 PortSet
->ProtoBitBuffer
,
25 PortSet
->PortsToOversee
);
26 RtlClearAllBits( &PortSet
->ProtoBitmap
);
27 ExInitializeFastMutex( &PortSet
->Mutex
);
28 return STATUS_SUCCESS
;
31 VOID
PortsShutdown( PPORT_SET PortSet
) {
32 ExFreePoolWithTag( PortSet
->ProtoBitBuffer
, PORT_SET_TAG
);
35 VOID
DeallocatePort( PPORT_SET PortSet
, ULONG Port
) {
37 ASSERT(Port
>= PortSet
->StartingPort
);
38 ASSERT(Port
< PortSet
->StartingPort
+ PortSet
->PortsToOversee
);
40 ExAcquireFastMutex( &PortSet
->Mutex
);
41 RtlClearBits( &PortSet
->ProtoBitmap
, Port
- PortSet
->StartingPort
, 1 );
42 ExReleaseFastMutex( &PortSet
->Mutex
);
45 BOOLEAN
AllocatePort( PPORT_SET PortSet
, ULONG Port
) {
50 if ((Port
< PortSet
->StartingPort
) ||
51 (Port
>= PortSet
->StartingPort
+ PortSet
->PortsToOversee
))
56 Port
-= PortSet
->StartingPort
;
58 ExAcquireFastMutex( &PortSet
->Mutex
);
59 Clear
= RtlAreBitsClear( &PortSet
->ProtoBitmap
, Port
, 1 );
60 if( Clear
) RtlSetBits( &PortSet
->ProtoBitmap
, Port
, 1 );
61 ExReleaseFastMutex( &PortSet
->Mutex
);
66 ULONG
AllocateAnyPort( PPORT_SET PortSet
) {
69 ExAcquireFastMutex( &PortSet
->Mutex
);
70 AllocatedPort
= RtlFindClearBits( &PortSet
->ProtoBitmap
, 1, 0 );
71 if( AllocatedPort
!= (ULONG
)-1 ) {
72 RtlSetBit( &PortSet
->ProtoBitmap
, AllocatedPort
);
73 AllocatedPort
+= PortSet
->StartingPort
;
74 ExReleaseFastMutex( &PortSet
->Mutex
);
75 return htons(AllocatedPort
);
77 ExReleaseFastMutex( &PortSet
->Mutex
);
82 ULONG
AllocatePortFromRange( PPORT_SET PortSet
, ULONG Lowest
, ULONG Highest
) {
85 if ((Lowest
< PortSet
->StartingPort
) ||
86 (Highest
>= PortSet
->StartingPort
+ PortSet
->PortsToOversee
))
91 Lowest
-= PortSet
->StartingPort
;
92 Highest
-= PortSet
->StartingPort
;
94 ExAcquireFastMutex( &PortSet
->Mutex
);
95 AllocatedPort
= RtlFindClearBits( &PortSet
->ProtoBitmap
, 1, Lowest
);
96 if( AllocatedPort
!= (ULONG
)-1 && AllocatedPort
<= Highest
) {
97 RtlSetBit( &PortSet
->ProtoBitmap
, AllocatedPort
);
98 AllocatedPort
+= PortSet
->StartingPort
;
99 ExReleaseFastMutex( &PortSet
->Mutex
);
100 return htons(AllocatedPort
);
102 ExReleaseFastMutex( &PortSet
->Mutex
);