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/tcpi…
==============================================================================
--- 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/add…
==============================================================================
--- 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.…
==============================================================================
--- 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/loo…
==============================================================================
--- 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/u…
==============================================================================
--- 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 )))
{