merge ROS Shell without integrated explorer part into trunk
[reactos.git] / reactos / drivers / lib / ip / network / ports.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
4 * FILE: tcpip/ports.c
5 * PURPOSE: Port allocation
6 * PROGRAMMERS: arty (ayerkes@speakeasy.net)
7 * REVISIONS:
8 * arty 20041114 Created
9 */
10
11 #include "precomp.h"
12
13 VOID PortsStartup( PPORT_SET PortSet,
14 UINT StartingPort,
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 );
25 }
26
27 VOID PortsShutdown( PPORT_SET PortSet ) {
28 PoolFreeBuffer( PortSet->ProtoBitBuffer );
29 }
30
31 VOID DeallocatePort( PPORT_SET PortSet, ULONG Port ) {
32 Port = htons(Port);
33 ASSERT(Port >= PortSet->StartingPort);
34 ASSERT(Port < PortSet->StartingPort + PortSet->PortsToOversee);
35 RtlClearBits( &PortSet->ProtoBitmap, Port - PortSet->StartingPort, 1 );
36 }
37
38 BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) {
39 BOOLEAN Clear;
40
41 Port = htons(Port);
42 ASSERT(Port >= PortSet->StartingPort);
43 Port -= PortSet->StartingPort;
44
45 ExAcquireFastMutex( &PortSet->Mutex );
46 Clear = RtlAreBitsClear( &PortSet->ProtoBitmap, Port, 1 );
47 if( Clear ) RtlSetBits( &PortSet->ProtoBitmap, Port, 1 );
48 ExReleaseFastMutex( &PortSet->Mutex );
49
50 return Clear;
51 }
52
53 ULONG AllocateAnyPort( PPORT_SET PortSet ) {
54 ULONG AllocatedPort;
55
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;
61 }
62 ExReleaseFastMutex( &PortSet->Mutex );
63
64 AllocatedPort = htons(AllocatedPort);
65
66 return AllocatedPort;
67 }
68
69 ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) {
70 ULONG AllocatedPort;
71
72 Lowest -= PortSet->StartingPort;
73 Highest -= PortSet->StartingPort;
74
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;
81 }
82 ExReleaseFastMutex( &PortSet->Mutex );
83
84 AllocatedPort = htons(AllocatedPort);
85
86 return AllocatedPort;
87 }