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;
|
PVOID ProtoBitBuffer;
|
||||||
UINT StartingPort;
|
UINT StartingPort;
|
||||||
UINT PortsToOversee;
|
UINT PortsToOversee;
|
||||||
UINT LastAllocatedPort;
|
|
||||||
FAST_MUTEX Mutex;
|
FAST_MUTEX Mutex;
|
||||||
} PORT_SET, *PPORT_SET;
|
} PORT_SET, *PPORT_SET;
|
||||||
|
|
||||||
|
|
|
@ -285,6 +285,14 @@ NTSTATUS FileOpenAddress(
|
||||||
case IPPROTO_TCP:
|
case IPPROTO_TCP:
|
||||||
AddrFile->Port =
|
AddrFile->Port =
|
||||||
TCPAllocatePort(Address->Address[0].Address[0].sin_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 */
|
AddrFile->Send = NULL; /* TCPSendData */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -292,6 +300,14 @@ NTSTATUS FileOpenAddress(
|
||||||
TI_DbgPrint(MID_TRACE,("Allocating udp port\n"));
|
TI_DbgPrint(MID_TRACE,("Allocating udp port\n"));
|
||||||
AddrFile->Port =
|
AddrFile->Port =
|
||||||
UDPAllocatePort(Address->Address[0].Address[0].sin_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",
|
TI_DbgPrint(MID_TRACE,("Setting port %d (wanted %d)\n",
|
||||||
AddrFile->Port,
|
AddrFile->Port,
|
||||||
Address->Address[0].Address[0].sin_port));
|
Address->Address[0].Address[0].sin_port));
|
||||||
|
|
|
@ -15,8 +15,7 @@ NTSTATUS PortsStartup( PPORT_SET PortSet,
|
||||||
UINT PortsToManage ) {
|
UINT PortsToManage ) {
|
||||||
PortSet->StartingPort = StartingPort;
|
PortSet->StartingPort = StartingPort;
|
||||||
PortSet->PortsToOversee = PortsToManage;
|
PortSet->PortsToOversee = PortsToManage;
|
||||||
PortSet->LastAllocatedPort = PortSet->StartingPort +
|
|
||||||
PortSet->PortsToOversee - 1;
|
|
||||||
PortSet->ProtoBitBuffer =
|
PortSet->ProtoBitBuffer =
|
||||||
PoolAllocateBuffer( (PortSet->PortsToOversee + 7) / 8 );
|
PoolAllocateBuffer( (PortSet->PortsToOversee + 7) / 8 );
|
||||||
if(!PortSet->ProtoBitBuffer) return STATUS_INSUFFICIENT_RESOURCES;
|
if(!PortSet->ProtoBitBuffer) return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
@ -43,8 +42,13 @@ BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) {
|
||||||
BOOLEAN Clear;
|
BOOLEAN Clear;
|
||||||
|
|
||||||
Port = htons(Port);
|
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;
|
Port -= PortSet->StartingPort;
|
||||||
|
|
||||||
ExAcquireFastMutex( &PortSet->Mutex );
|
ExAcquireFastMutex( &PortSet->Mutex );
|
||||||
|
@ -57,64 +61,41 @@ BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) {
|
||||||
|
|
||||||
ULONG AllocateAnyPort( PPORT_SET PortSet ) {
|
ULONG AllocateAnyPort( PPORT_SET PortSet ) {
|
||||||
ULONG AllocatedPort;
|
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 );
|
ExAcquireFastMutex( &PortSet->Mutex );
|
||||||
AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Next );
|
AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, 0 );
|
||||||
if( AllocatedPort != (ULONG)-1 ) {
|
if( AllocatedPort != (ULONG)-1 ) {
|
||||||
RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
|
RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
|
||||||
AllocatedPort += PortSet->StartingPort;
|
AllocatedPort += PortSet->StartingPort;
|
||||||
PortSet->LastAllocatedPort = AllocatedPort;
|
ExReleaseFastMutex( &PortSet->Mutex );
|
||||||
|
return htons(AllocatedPort);
|
||||||
}
|
}
|
||||||
ExReleaseFastMutex( &PortSet->Mutex );
|
ExReleaseFastMutex( &PortSet->Mutex );
|
||||||
|
|
||||||
AllocatedPort = htons(AllocatedPort);
|
return -1;
|
||||||
|
|
||||||
ASSERT(AllocatedPort >= PortSet->StartingPort);
|
|
||||||
ASSERT(AllocatedPort < PortSet->StartingPort + PortSet->PortsToOversee);
|
|
||||||
|
|
||||||
return AllocatedPort;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) {
|
ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) {
|
||||||
ULONG AllocatedPort;
|
ULONG AllocatedPort;
|
||||||
ULONG Next;
|
|
||||||
|
|
||||||
if (PortSet->StartingPort + PortSet->PortsToOversee <=
|
if ((Lowest < PortSet->StartingPort) ||
|
||||||
PortSet->LastAllocatedPort + 1) {
|
(Highest >= PortSet->StartingPort + PortSet->PortsToOversee))
|
||||||
Next = PortSet->StartingPort;
|
{
|
||||||
} else {
|
return -1;
|
||||||
Next = PortSet->LastAllocatedPort + 1;
|
|
||||||
}
|
}
|
||||||
if (Next < Lowest || Highest <= Next) {
|
|
||||||
Next = Lowest;
|
|
||||||
}
|
|
||||||
Next -= PortSet->StartingPort;
|
|
||||||
Lowest -= PortSet->StartingPort;
|
Lowest -= PortSet->StartingPort;
|
||||||
Highest -= PortSet->StartingPort;
|
Highest -= PortSet->StartingPort;
|
||||||
|
|
||||||
ExAcquireFastMutex( &PortSet->Mutex );
|
ExAcquireFastMutex( &PortSet->Mutex );
|
||||||
AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Next );
|
AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Lowest );
|
||||||
if( AllocatedPort != (ULONG)-1 && AllocatedPort >= Lowest &&
|
if( AllocatedPort != (ULONG)-1 && AllocatedPort <= Highest) {
|
||||||
AllocatedPort <= Highest) {
|
|
||||||
RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
|
RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
|
||||||
AllocatedPort += PortSet->StartingPort;
|
AllocatedPort += PortSet->StartingPort;
|
||||||
PortSet->LastAllocatedPort = AllocatedPort;
|
ExReleaseFastMutex( &PortSet->Mutex );
|
||||||
|
return htons(AllocatedPort);
|
||||||
}
|
}
|
||||||
ExReleaseFastMutex( &PortSet->Mutex );
|
ExReleaseFastMutex( &PortSet->Mutex );
|
||||||
|
|
||||||
AllocatedPort = htons(AllocatedPort);
|
return -1;
|
||||||
|
|
||||||
ASSERT(AllocatedPort >= PortSet->StartingPort);
|
|
||||||
ASSERT(AllocatedPort < PortSet->StartingPort + PortSet->PortsToOversee);
|
|
||||||
|
|
||||||
return AllocatedPort;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,8 +223,10 @@ NTSTATUS RawIPSendDatagram(
|
||||||
|
|
||||||
TI_DbgPrint(MID_TRACE,("About to get route to destination\n"));
|
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;
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
TI_DbgPrint(MID_TRACE,("About to send datagram\n"));
|
TI_DbgPrint(MID_TRACE,("About to send datagram\n"));
|
||||||
|
|
||||||
|
|
|
@ -33,16 +33,20 @@ NTSTATUS AddUDPHeaderIPv4(
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
PUDP_HEADER UDPHeader;
|
PUDP_HEADER UDPHeader;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
TI_DbgPrint(MID_TRACE, ("Packet: %x NdisPacket %x\n",
|
TI_DbgPrint(MID_TRACE, ("Packet: %x NdisPacket %x\n",
|
||||||
IPPacket, IPPacket->NdisPacket));
|
IPPacket, IPPacket->NdisPacket));
|
||||||
|
|
||||||
AddGenericHeaderIPv4
|
Status = AddGenericHeaderIPv4
|
||||||
( RemoteAddress, RemotePort,
|
( RemoteAddress, RemotePort,
|
||||||
LocalAddress, LocalPort,
|
LocalAddress, LocalPort,
|
||||||
IPPacket, DataLength, IPPROTO_UDP,
|
IPPacket, DataLength, IPPROTO_UDP,
|
||||||
sizeof(UDP_HEADER), (PVOID *)&UDPHeader );
|
sizeof(UDP_HEADER), (PVOID *)&UDPHeader );
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
/* Build UDP header */
|
/* Build UDP header */
|
||||||
UDPHeader = (PUDP_HEADER)((ULONG_PTR)IPPacket->Data - sizeof(UDP_HEADER));
|
UDPHeader = (PUDP_HEADER)((ULONG_PTR)IPPacket->Data - sizeof(UDP_HEADER));
|
||||||
/* Port values are already big-endian values */
|
/* Port values are already big-endian values */
|
||||||
|
@ -195,8 +199,10 @@ NTSTATUS UDPSendDatagram(
|
||||||
if( !NT_SUCCESS(Status) )
|
if( !NT_SUCCESS(Status) )
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress )))
|
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
|
||||||
|
FreeNdisPacket(Packet.NdisPacket);
|
||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
IPSendDatagram( &Packet, NCE, UDPSendPacketComplete, NULL );
|
IPSendDatagram( &Packet, NCE, UDPSendPacketComplete, NULL );
|
||||||
|
|
||||||
|
@ -305,7 +311,7 @@ NTSTATUS UDPStartup(
|
||||||
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
Status = PortsStartup( &UDPPorts, 1, 0xfffe );
|
Status = PortsStartup( &UDPPorts, 1, UDP_STARTING_PORT + UDP_DYNAMIC_PORTS );
|
||||||
|
|
||||||
if( !NT_SUCCESS(Status) ) return Status;
|
if( !NT_SUCCESS(Status) ) return Status;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue