- 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:
Cameron Gutman 2008-10-27 05:16:14 +00:00
parent cb0c6f03f5
commit 47e8c2cf0b
5 changed files with 50 additions and 46 deletions

View file

@ -16,7 +16,6 @@ typedef struct _PORT_SET {
PVOID ProtoBitBuffer;
UINT StartingPort;
UINT PortsToOversee;
UINT LastAllocatedPort;
FAST_MUTEX Mutex;
} PORT_SET, *PPORT_SET;

View file

@ -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));

View file

@ -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;
}

View file

@ -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"));

View file

@ -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;