ReactOS 0.4.15-dev-8096-ga0eec98
ports.c
Go to the documentation of this file.
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
14 UINT StartingPort,
15 UINT PortsToManage ) {
16 PortSet->StartingPort = StartingPort;
17 PortSet->PortsToOversee = PortsToManage;
18
19 PortSet->ProtoBitBuffer =
24 PortSet->ProtoBitBuffer,
25 PortSet->PortsToOversee );
26 RtlClearAllBits( &PortSet->ProtoBitmap );
27 KeInitializeSpinLock( &PortSet->Lock );
28 return STATUS_SUCCESS;
29}
30
33}
34
37
38 Port = htons(Port);
39 ASSERT(Port >= PortSet->StartingPort);
40 ASSERT(Port < PortSet->StartingPort + PortSet->PortsToOversee);
41
42 KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
43 RtlClearBits( &PortSet->ProtoBitmap, Port - PortSet->StartingPort, 1 );
44 KeReleaseSpinLock( &PortSet->Lock, OldIrql );
45}
46
50
51 Port = htons(Port);
52
53 if ((Port < PortSet->StartingPort) ||
54 (Port >= PortSet->StartingPort + PortSet->PortsToOversee))
55 {
56 return FALSE;
57 }
58
59 Port -= PortSet->StartingPort;
60
61 KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
62 Clear = RtlAreBitsClear( &PortSet->ProtoBitmap, Port, 1 );
63 if( Clear ) RtlSetBits( &PortSet->ProtoBitmap, Port, 1 );
64 KeReleaseSpinLock( &PortSet->Lock, OldIrql );
65
66 return Clear;
67}
68
70 ULONG AllocatedPort;
72
73 KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
74 AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, 0 );
75 if( AllocatedPort != (ULONG)-1 ) {
76 RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
77 AllocatedPort += PortSet->StartingPort;
78 KeReleaseSpinLock( &PortSet->Lock, OldIrql );
79 return htons(AllocatedPort);
80 }
81 KeReleaseSpinLock( &PortSet->Lock, OldIrql );
82
83 return -1;
84}
85
86ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) {
87 ULONG AllocatedPort;
89
90 if ((Lowest < PortSet->StartingPort) ||
91 (Highest >= PortSet->StartingPort + PortSet->PortsToOversee))
92 {
93 return -1;
94 }
95
96 Lowest -= PortSet->StartingPort;
97 Highest -= PortSet->StartingPort;
98
99 KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
100 AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Lowest );
101 if( AllocatedPort != (ULONG)-1 && AllocatedPort <= Highest) {
102 RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
103 AllocatedPort += PortSet->StartingPort;
104 KeReleaseSpinLock( &PortSet->Lock, OldIrql );
105 return htons(AllocatedPort);
106 }
107 KeReleaseSpinLock( &PortSet->Lock, OldIrql );
108
109 return -1;
110}
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
#define FALSE
Definition: types.h:117
#define PORT_SET_TAG
Definition: tags.h:26
VOID DeallocatePort(PPORT_SET PortSet, ULONG Port)
Definition: ports.c:35
BOOLEAN AllocatePort(PPORT_SET PortSet, ULONG Port)
Definition: ports.c:47
VOID PortsShutdown(PPORT_SET PortSet)
Definition: ports.c:31
NTSTATUS PortsStartup(PPORT_SET PortSet, UINT StartingPort, UINT PortsToManage)
Definition: ports.c:13
ULONG AllocateAnyPort(PPORT_SET PortSet)
Definition: ports.c:69
ULONG AllocatePortFromRange(PPORT_SET PortSet, ULONG Lowest, ULONG Highest)
Definition: ports.c:86
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
#define NonPagedPool
Definition: env_spec_w32.h:307
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
CPPORT Port[4]
Definition: headless.c:35
NTSYSAPI void WINAPI RtlInitializeBitMap(PRTL_BITMAP, PULONG, ULONG)
NTSYSAPI BOOLEAN WINAPI RtlAreBitsClear(PCRTL_BITMAP, ULONG, ULONG)
NTSYSAPI void WINAPI RtlClearAllBits(PRTL_BITMAP)
NTSYSAPI ULONG WINAPI RtlFindClearBits(PCRTL_BITMAP, ULONG, ULONG)
NTSYSAPI void WINAPI RtlClearBits(PRTL_BITMAP, ULONG, ULONG)
NTSYSAPI void WINAPI RtlSetBits(PRTL_BITMAP, ULONG, ULONG)
#define ASSERT(a)
Definition: mode.c:44
#define htons(x)
Definition: module.h:215
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
static void Clear(void)
Definition: treeview.c:386
unsigned int UINT
Definition: ndis.h:50
#define STATUS_SUCCESS
Definition: shellext.h:65
UINT StartingPort
Definition: ports.h:16
RTL_BITMAP ProtoBitmap
Definition: ports.h:14
UINT PortsToOversee
Definition: ports.h:17
PVOID ProtoBitBuffer
Definition: ports.h:15
KSPIN_LOCK Lock
Definition: ports.h:18
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
NTSYSAPI VOID NTAPI RtlSetBit(_In_ PRTL_BITMAP BitMapHeader, _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber)
Definition: bitmap.c:304