mirror of
https://github.com/reactos/reactos.git
synced 2024-09-30 14:37:45 +00:00
- Merge aicom-network-fixes up to r37010
- Most of the port allocation problems are now fixed svn path=/trunk/; revision=37011
This commit is contained in:
parent
cb0c6f03f5
commit
47e8c2cf0b
|
@ -16,7 +16,6 @@ typedef struct _PORT_SET {
|
|||
PVOID ProtoBitBuffer;
|
||||
UINT StartingPort;
|
||||
UINT PortsToOversee;
|
||||
UINT LastAllocatedPort;
|
||||
FAST_MUTEX Mutex;
|
||||
} PORT_SET, *PPORT_SET;
|
||||
|
||||
|
|
|
@ -285,6 +285,14 @@ NTSTATUS FileOpenAddress(
|
|||
case IPPROTO_TCP:
|
||||
AddrFile->Port =
|
||||
TCPAllocatePort(Address->Address[0].Address[0].sin_port);
|
||||
|
||||
if (Address->Address[0].Address[0].sin_port &&
|
||||
AddrFile->Port != Address->Address[0].Address[0].sin_port)
|
||||
{
|
||||
ExFreePool(AddrFile);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
AddrFile->Send = NULL; /* TCPSendData */
|
||||
break;
|
||||
|
||||
|
@ -292,6 +300,14 @@ NTSTATUS FileOpenAddress(
|
|||
TI_DbgPrint(MID_TRACE,("Allocating udp port\n"));
|
||||
AddrFile->Port =
|
||||
UDPAllocatePort(Address->Address[0].Address[0].sin_port);
|
||||
|
||||
if (Address->Address[0].Address[0].sin_port &&
|
||||
AddrFile->Port != Address->Address[0].Address[0].sin_port)
|
||||
{
|
||||
ExFreePool(AddrFile);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
TI_DbgPrint(MID_TRACE,("Setting port %d (wanted %d)\n",
|
||||
AddrFile->Port,
|
||||
Address->Address[0].Address[0].sin_port));
|
||||
|
|
|
@ -15,8 +15,7 @@ NTSTATUS PortsStartup( PPORT_SET PortSet,
|
|||
UINT PortsToManage ) {
|
||||
PortSet->StartingPort = StartingPort;
|
||||
PortSet->PortsToOversee = PortsToManage;
|
||||
PortSet->LastAllocatedPort = PortSet->StartingPort +
|
||||
PortSet->PortsToOversee - 1;
|
||||
|
||||
PortSet->ProtoBitBuffer =
|
||||
PoolAllocateBuffer( (PortSet->PortsToOversee + 7) / 8 );
|
||||
if(!PortSet->ProtoBitBuffer) return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
@ -43,8 +42,13 @@ BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) {
|
|||
BOOLEAN Clear;
|
||||
|
||||
Port = htons(Port);
|
||||
ASSERT(Port >= PortSet->StartingPort);
|
||||
ASSERT(Port < PortSet->StartingPort + PortSet->PortsToOversee);
|
||||
|
||||
if ((Port < PortSet->StartingPort) ||
|
||||
(Port >= PortSet->StartingPort + PortSet->PortsToOversee))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Port -= PortSet->StartingPort;
|
||||
|
||||
ExAcquireFastMutex( &PortSet->Mutex );
|
||||
|
@ -57,64 +61,41 @@ BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) {
|
|||
|
||||
ULONG AllocateAnyPort( PPORT_SET PortSet ) {
|
||||
ULONG AllocatedPort;
|
||||
ULONG Next;
|
||||
|
||||
if (PortSet->StartingPort + PortSet->PortsToOversee <=
|
||||
PortSet->LastAllocatedPort + 1) {
|
||||
Next = PortSet->StartingPort;
|
||||
} else {
|
||||
Next = PortSet->LastAllocatedPort + 1;
|
||||
}
|
||||
Next -= PortSet->StartingPort;
|
||||
|
||||
ExAcquireFastMutex( &PortSet->Mutex );
|
||||
AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Next );
|
||||
AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, 0 );
|
||||
if( AllocatedPort != (ULONG)-1 ) {
|
||||
RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
|
||||
AllocatedPort += PortSet->StartingPort;
|
||||
PortSet->LastAllocatedPort = AllocatedPort;
|
||||
ExReleaseFastMutex( &PortSet->Mutex );
|
||||
return htons(AllocatedPort);
|
||||
}
|
||||
ExReleaseFastMutex( &PortSet->Mutex );
|
||||
|
||||
AllocatedPort = htons(AllocatedPort);
|
||||
|
||||
ASSERT(AllocatedPort >= PortSet->StartingPort);
|
||||
ASSERT(AllocatedPort < PortSet->StartingPort + PortSet->PortsToOversee);
|
||||
|
||||
return AllocatedPort;
|
||||
return -1;
|
||||
}
|
||||
|
||||
ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) {
|
||||
ULONG AllocatedPort;
|
||||
ULONG Next;
|
||||
|
||||
if (PortSet->StartingPort + PortSet->PortsToOversee <=
|
||||
PortSet->LastAllocatedPort + 1) {
|
||||
Next = PortSet->StartingPort;
|
||||
} else {
|
||||
Next = PortSet->LastAllocatedPort + 1;
|
||||
if ((Lowest < PortSet->StartingPort) ||
|
||||
(Highest >= PortSet->StartingPort + PortSet->PortsToOversee))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
if (Next < Lowest || Highest <= Next) {
|
||||
Next = Lowest;
|
||||
}
|
||||
Next -= PortSet->StartingPort;
|
||||
|
||||
Lowest -= PortSet->StartingPort;
|
||||
Highest -= PortSet->StartingPort;
|
||||
|
||||
ExAcquireFastMutex( &PortSet->Mutex );
|
||||
AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Next );
|
||||
if( AllocatedPort != (ULONG)-1 && AllocatedPort >= Lowest &&
|
||||
AllocatedPort <= Highest) {
|
||||
AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Lowest );
|
||||
if( AllocatedPort != (ULONG)-1 && AllocatedPort <= Highest) {
|
||||
RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
|
||||
AllocatedPort += PortSet->StartingPort;
|
||||
PortSet->LastAllocatedPort = AllocatedPort;
|
||||
ExReleaseFastMutex( &PortSet->Mutex );
|
||||
return htons(AllocatedPort);
|
||||
}
|
||||
ExReleaseFastMutex( &PortSet->Mutex );
|
||||
|
||||
AllocatedPort = htons(AllocatedPort);
|
||||
|
||||
ASSERT(AllocatedPort >= PortSet->StartingPort);
|
||||
ASSERT(AllocatedPort < PortSet->StartingPort + PortSet->PortsToOversee);
|
||||
|
||||
return AllocatedPort;
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -223,8 +223,10 @@ NTSTATUS RawIPSendDatagram(
|
|||
|
||||
TI_DbgPrint(MID_TRACE,("About to get route to destination\n"));
|
||||
|
||||
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress )))
|
||||
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
|
||||
FreeNdisPacket(Packet.NdisPacket);
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
TI_DbgPrint(MID_TRACE,("About to send datagram\n"));
|
||||
|
||||
|
|
|
@ -33,16 +33,20 @@ NTSTATUS AddUDPHeaderIPv4(
|
|||
*/
|
||||
{
|
||||
PUDP_HEADER UDPHeader;
|
||||
NTSTATUS Status;
|
||||
|
||||
TI_DbgPrint(MID_TRACE, ("Packet: %x NdisPacket %x\n",
|
||||
IPPacket, IPPacket->NdisPacket));
|
||||
|
||||
AddGenericHeaderIPv4
|
||||
Status = AddGenericHeaderIPv4
|
||||
( RemoteAddress, RemotePort,
|
||||
LocalAddress, LocalPort,
|
||||
IPPacket, DataLength, IPPROTO_UDP,
|
||||
sizeof(UDP_HEADER), (PVOID *)&UDPHeader );
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
/* Build UDP header */
|
||||
UDPHeader = (PUDP_HEADER)((ULONG_PTR)IPPacket->Data - sizeof(UDP_HEADER));
|
||||
/* Port values are already big-endian values */
|
||||
|
@ -195,8 +199,10 @@ NTSTATUS UDPSendDatagram(
|
|||
if( !NT_SUCCESS(Status) )
|
||||
return Status;
|
||||
|
||||
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress )))
|
||||
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
|
||||
FreeNdisPacket(Packet.NdisPacket);
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
IPSendDatagram( &Packet, NCE, UDPSendPacketComplete, NULL );
|
||||
|
||||
|
@ -305,7 +311,7 @@ NTSTATUS UDPStartup(
|
|||
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = PortsStartup( &UDPPorts, 1, 0xfffe );
|
||||
Status = PortsStartup( &UDPPorts, 1, UDP_STARTING_PORT + UDP_DYNAMIC_PORTS );
|
||||
|
||||
if( !NT_SUCCESS(Status) ) return Status;
|
||||
|
||||
|
|
Loading…
Reference in a new issue