Author: arty Date: Sun Feb 15 15:52:56 2009 New Revision: 39613
URL: http://svn.reactos.org/svn/reactos?rev=39613&view=rev Log: Fix loopback adapter locking and make traffic work consistently. Fix zero-address binding. Local tcp services should work now.
Modified: trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c trunk/reactos/lib/drivers/ip/network/address.c trunk/reactos/lib/drivers/ip/network/ip.c trunk/reactos/lib/drivers/ip/network/loopback.c trunk/reactos/lib/drivers/ip/transport/udp/udp.c
Modified: trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip... ============================================================================== --- trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c [iso-8859-1] Sun Feb 15 15:52:56 2009 @@ -242,7 +242,6 @@ PVOID Options) { IPv4_RAW_ADDRESS IPv4Address; - BOOLEAN Matched; PADDRESS_FILE AddrFile;
TI_DbgPrint(MID_TRACE, ("Called (Proto %d).\n", Protocol)); @@ -260,21 +259,19 @@ AddrFile->Free = AddrFileFree;
/* Make sure address is a local unicast address or 0 */ - - /* Locate address entry. If specified address is 0, a random address is chosen */ - /* FIXME: IPv4 only */ AddrFile->Family = Address->Address[0].AddressType; IPv4Address = Address->Address[0].Address[0].in_addr; - if (IPv4Address == 0) - Matched = IPGetDefaultAddress(&AddrFile->Address); + if (IPv4Address != 0 && + !AddrLocateADEv4(IPv4Address, &AddrFile->Address)) { + exFreePool(AddrFile); + TI_DbgPrint(MIN_TRACE, ("Non-local address given (0x%X).\n", DN2H(IPv4Address))); + return STATUS_INVALID_PARAMETER; + } else - Matched = AddrLocateADEv4(IPv4Address, &AddrFile->Address); - - if (!Matched) { - exFreePool(AddrFile); - TI_DbgPrint(MIN_TRACE, ("Non-local address given (0x%X).\n", DN2H(IPv4Address))); - return STATUS_INVALID_PARAMETER; + { + /* Bound to the default address ... Copy the address type */ + AddrFile->Address.Type = IP_ADDRESS_V4; }
TI_DbgPrint(MID_TRACE, ("Opening address %s for communication (P=%d U=%d).\n",
Modified: trunk/reactos/lib/drivers/ip/network/address.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/addr... ============================================================================== --- trunk/reactos/lib/drivers/ip/network/address.c [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/network/address.c [iso-8859-1] Sun Feb 15 15:52:56 2009 @@ -223,6 +223,7 @@ { if (Address1->Type != Address2->Type) { DbgPrint("AddrIsEqual: Unequal Address Types\n"); + ASSERT(FALSE); return FALSE; }
Modified: trunk/reactos/lib/drivers/ip/network/ip.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/ip.c... ============================================================================== --- trunk/reactos/lib/drivers/ip/network/ip.c [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/network/ip.c [iso-8859-1] Sun Feb 15 15:52:56 2009 @@ -195,6 +195,8 @@
INIT_TAG(IF, TAG('F','A','C','E'));
+ RtlZeroMemory(IF, sizeof(IP_INTERFACE)); + IF->Free = FreeIF; IF->Context = BindInfo->Context; IF->HeaderSize = BindInfo->HeaderSize; @@ -209,6 +211,11 @@ IF->Address = BindInfo->Address; IF->AddressLength = BindInfo->AddressLength; IF->Transmit = BindInfo->Transmit; + + IF->Unicast.Type = IP_ADDRESS_V4; + IF->PointToPoint.Type = IP_ADDRESS_V4; + IF->Netmask.Type = IP_ADDRESS_V4; + IF->Broadcast.Type = IP_ADDRESS_V4;
TcpipInitializeSpinLock(&IF->Lock);
Modified: trunk/reactos/lib/drivers/ip/network/loopback.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/loop... ============================================================================== --- trunk/reactos/lib/drivers/ip/network/loopback.c [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/network/loopback.c [iso-8859-1] Sun Feb 15 15:52:56 2009 @@ -32,49 +32,57 @@ UINT BytesTransferred; PNDIS_BUFFER NdisBuffer; IP_PACKET IPPacket; + KIRQL OldIrql;
TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
- while( (ListEntry = - ExInterlockedRemoveHeadList( &LoopWorkList, &LoopWorkLock )) ) { - WorkItem = CONTAINING_RECORD(ListEntry, LAN_WQ_ITEM, ListEntry); - - TI_DbgPrint(DEBUG_DATALINK, ("WorkItem: %x\n", WorkItem)); - - Packet = WorkItem->Packet; - Adapter = WorkItem->Adapter; - BytesTransferred = WorkItem->BytesTransferred; - - exFreePool( WorkItem ); - + TcpipAcquireSpinLock( &LoopWorkLock, &OldIrql ); + while( !IsListEmpty(&LoopWorkList) ) + { + ListEntry = RemoveHeadList( &LoopWorkList ); + TcpipReleaseSpinLock( &LoopWorkLock, OldIrql ); + + WorkItem = CONTAINING_RECORD(ListEntry, LAN_WQ_ITEM, ListEntry); + + TI_DbgPrint(DEBUG_DATALINK, ("WorkItem: %x\n", WorkItem)); + + Packet = WorkItem->Packet; + Adapter = WorkItem->Adapter; + BytesTransferred = WorkItem->BytesTransferred; + + exFreePool( WorkItem ); + IPPacket.NdisPacket = Packet; - + TI_DbgPrint(DEBUG_DATALINK, ("Packet %x Adapter %x Trans %x\n", Packet, Adapter, BytesTransferred)); - + NdisGetFirstBufferFromPacket(Packet, &NdisBuffer, &IPPacket.Header, &IPPacket.ContigSize, &IPPacket.TotalSize);
- IPPacket.ContigSize = IPPacket.TotalSize = BytesTransferred; + IPPacket.ContigSize = IPPacket.TotalSize = BytesTransferred; /* Determine which upper layer protocol that should receive this packet and pass it to the correct receive handler */ - - TI_DbgPrint(MID_TRACE, - ("ContigSize: %d, TotalSize: %d, BytesTransferred: %d\n", - IPPacket.ContigSize, IPPacket.TotalSize, - BytesTransferred)); - - IPPacket.Position = 0; - + + TI_DbgPrint + (MID_TRACE, + ("ContigSize: %d, TotalSize: %d, BytesTransferred: %d\n", + IPPacket.ContigSize, IPPacket.TotalSize, + BytesTransferred)); + + IPPacket.Position = 0; + IPReceive(Loopback, &IPPacket); - - FreeNdisPacket( Packet ); + + FreeNdisPacket( Packet ); + TcpipAcquireSpinLock( &LoopWorkLock, &OldIrql ); } TI_DbgPrint(DEBUG_DATALINK, ("Leaving\n")); LoopReceiveWorkerBusy = FALSE; + TcpipReleaseSpinLock( &LoopWorkLock, OldIrql ); }
VOID LoopSubmitReceiveWork(
Modified: trunk/reactos/lib/drivers/ip/transport/udp/udp.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/ud... ============================================================================== --- trunk/reactos/lib/drivers/ip/transport/udp/udp.c [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/transport/udp/udp.c [iso-8859-1] Sun Feb 15 15:52:56 2009 @@ -9,7 +9,6 @@ */
#include "precomp.h" -
BOOLEAN UDPInitialized = FALSE; PORT_SET UDPPorts; @@ -164,41 +163,48 @@ IP_PACKET Packet; PTA_IP_ADDRESS RemoteAddressTa = (PTA_IP_ADDRESS)ConnInfo->RemoteAddress; IP_ADDRESS RemoteAddress; + IP_ADDRESS LocalAddress; USHORT RemotePort; NTSTATUS Status; PNEIGHBOR_CACHE_ENTRY NCE;
TI_DbgPrint(MID_TRACE,("Sending Datagram(%x %x %x %d)\n", - AddrFile, ConnInfo, BufferData, DataSize)); + AddrFile, ConnInfo, BufferData, DataSize)); TI_DbgPrint(MID_TRACE,("RemoteAddressTa: %x\n", RemoteAddressTa));
switch( RemoteAddressTa->Address[0].AddressType ) { case TDI_ADDRESS_TYPE_IP: - RemoteAddress.Type = IP_ADDRESS_V4; - RemoteAddress.Address.IPv4Address = - RemoteAddressTa->Address[0].Address[0].in_addr; - RemotePort = RemoteAddressTa->Address[0].Address[0].sin_port; - break; + RemoteAddress.Type = IP_ADDRESS_V4; + RemoteAddress.Address.IPv4Address = + RemoteAddressTa->Address[0].Address[0].in_addr; + RemotePort = RemoteAddressTa->Address[0].Address[0].sin_port; + break;
default: - return STATUS_UNSUCCESSFUL; - } + return STATUS_UNSUCCESSFUL; + } + + if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) { + return STATUS_UNSUCCESSFUL; + } + + LocalAddress = AddrFile->Address; + if (AddrIsUnspecified(&LocalAddress)) + { + if (!IPGetDefaultAddress(&LocalAddress)) + return FALSE; + }
Status = BuildUDPPacket( &Packet, - &RemoteAddress, - RemotePort, - &AddrFile->Address, - AddrFile->Port, - BufferData, - DataSize ); + &RemoteAddress, + RemotePort, + &LocalAddress, + AddrFile->Port, + BufferData, + DataSize );
if( !NT_SUCCESS(Status) ) - return Status; - - if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) { - FreeNdisPacket(Packet.NdisPacket); - return STATUS_UNSUCCESSFUL; - } + return Status;
if (!NT_SUCCESS(Status = IPSendDatagram( &Packet, NCE, UDPSendPacketComplete, NULL ))) {
Hi Arty!
On Sun, Feb 15, 2009 at 4:52 PM, arty@svn.reactos.org wrote:
URL: http://svn.reactos.org/svn/reactos?rev=39613&view=rev Log: Fix loopback adapter locking and make traffic work consistently. Fix zero-address binding. Local tcp services should work now.
I take this to mean telnetd should be talking on the network now? Hello remote process control and the 1980's!
Thanks a lot of looking in to this. When I have time I am going to do further cleanup of telnetd and move it in to the ReactOS tree proper. Next on my list is a tftp server I found which I will attempt to get license clarification on, cleanup and add to ReactOS so that we can look in to using ReactOS tftpd to support kickstart like deployment with netboot.
Thanks