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
->LastAllocatedPort
= PortSet
->StartingPort
+
19 PortSet
->PortsToOversee
- 1;
20 PortSet
->ProtoBitBuffer
=
21 PoolAllocateBuffer( (PortSet
->PortsToOversee
+ 7) / 8 );
22 RtlInitializeBitMap( &PortSet
->ProtoBitmap
,
23 PortSet
->ProtoBitBuffer
,
24 PortSet
->PortsToOversee
);
25 RtlClearAllBits( &PortSet
->ProtoBitmap
);
26 ExInitializeFastMutex( &PortSet
->Mutex
);
29 VOID
PortsShutdown( PPORT_SET PortSet
) {
30 PoolFreeBuffer( PortSet
->ProtoBitBuffer
);
33 VOID
DeallocatePort( PPORT_SET PortSet
, ULONG Port
) {
35 ASSERT(Port
>= PortSet
->StartingPort
);
36 ASSERT(Port
< PortSet
->StartingPort
+ PortSet
->PortsToOversee
);
37 RtlClearBits( &PortSet
->ProtoBitmap
, Port
- PortSet
->StartingPort
, 1 );
40 BOOLEAN
AllocatePort( PPORT_SET PortSet
, ULONG Port
) {
44 ASSERT(Port
>= PortSet
->StartingPort
);
45 Port
-= PortSet
->StartingPort
;
47 ExAcquireFastMutex( &PortSet
->Mutex
);
48 Clear
= RtlAreBitsClear( &PortSet
->ProtoBitmap
, Port
, 1 );
49 if( Clear
) RtlSetBits( &PortSet
->ProtoBitmap
, Port
, 1 );
50 ExReleaseFastMutex( &PortSet
->Mutex
);
55 ULONG
AllocateAnyPort( PPORT_SET PortSet
) {
59 if (PortSet
->StartingPort
+ PortSet
->PortsToOversee
<=
60 PortSet
->LastAllocatedPort
+ 1) {
61 Next
= PortSet
->StartingPort
;
63 Next
= PortSet
->LastAllocatedPort
+ 1;
65 Next
-= PortSet
->StartingPort
;
67 ExAcquireFastMutex( &PortSet
->Mutex
);
68 AllocatedPort
= RtlFindClearBits( &PortSet
->ProtoBitmap
, 1, 0 );
69 if( AllocatedPort
!= (ULONG
)-1 ) {
70 RtlSetBit( &PortSet
->ProtoBitmap
, AllocatedPort
);
71 AllocatedPort
+= PortSet
->StartingPort
;
72 PortSet
->LastAllocatedPort
= AllocatedPort
;
74 ExReleaseFastMutex( &PortSet
->Mutex
);
76 AllocatedPort
= htons(AllocatedPort
);
81 ULONG
AllocatePortFromRange( PPORT_SET PortSet
, ULONG Lowest
, ULONG Highest
) {
85 if (PortSet
->StartingPort
+ PortSet
->PortsToOversee
<=
86 PortSet
->LastAllocatedPort
+ 1) {
87 Next
= PortSet
->StartingPort
;
89 Next
= PortSet
->LastAllocatedPort
+ 1;
91 if (Next
< Lowest
|| Highest
<= Next
) {
94 Next
-= PortSet
->StartingPort
;
95 Lowest
-= PortSet
->StartingPort
;
96 Highest
-= PortSet
->StartingPort
;
98 ExAcquireFastMutex( &PortSet
->Mutex
);
99 AllocatedPort
= RtlFindClearBits( &PortSet
->ProtoBitmap
, 1, Next
);
100 if( AllocatedPort
!= (ULONG
)-1 && AllocatedPort
>= Lowest
&&
101 AllocatedPort
<= Highest
) {
102 RtlSetBit( &PortSet
->ProtoBitmap
, AllocatedPort
);
103 AllocatedPort
+= PortSet
->StartingPort
;
104 PortSet
->LastAllocatedPort
= AllocatedPort
;
106 ExReleaseFastMutex( &PortSet
->Mutex
);
108 AllocatedPort
= htons(AllocatedPort
);
110 return AllocatedPort
;