From 1b403e9be75a0c85beefd901073d0478afdcfcdb Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 3 Aug 2009 20:10:47 +0000 Subject: [PATCH] Broadcast fixes - Treat 255.255.255.255 as an undefined address - Choose the first interface when sending a broadcast packet (fixes failing with STATUS_NETWORK_UNREACHABLE when trying to send a broadcast packet) - Fix a broadcast address check so 255.255.255.255 will also pass (fixes sending queued broadcast packets) - Now a broadcast packet can be successfully sent from an interface with a valid IP address (previously they could only be sent when the interface didn't have an NCE entry) svn path=/trunk/; revision=42375 --- reactos/lib/drivers/ip/network/address.c | 3 ++- reactos/lib/drivers/ip/network/interface.c | 23 ++++++++++++++++++++++ reactos/lib/drivers/ip/network/neighbor.c | 3 ++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/reactos/lib/drivers/ip/network/address.c b/reactos/lib/drivers/ip/network/address.c index 9bd88171bb9..974dc7103a8 100644 --- a/reactos/lib/drivers/ip/network/address.c +++ b/reactos/lib/drivers/ip/network/address.c @@ -122,7 +122,8 @@ BOOLEAN AddrIsUnspecified( { switch (Address->Type) { case IP_ADDRESS_V4: - return (Address->Address.IPv4Address == 0); + return (Address->Address.IPv4Address == 0 || + Address->Address.IPv4Address == 0xFFFFFFFF); case IP_ADDRESS_V6: /* FIXME: IPv6 is not supported */ diff --git a/reactos/lib/drivers/ip/network/interface.c b/reactos/lib/drivers/ip/network/interface.c index 7e3f907f691..4818172465f 100644 --- a/reactos/lib/drivers/ip/network/interface.c +++ b/reactos/lib/drivers/ip/network/interface.c @@ -152,6 +152,26 @@ BOOLEAN HasPrefix( return TRUE; } +static PIP_INTERFACE GetDefaultInterface(VOID) +{ + KIRQL OldIrql; + IF_LIST_ITER(CurrentIF); + + TcpipAcquireSpinLock(&InterfaceListLock, &OldIrql); + ForEachInterface(CurrentIF) { + if (CurrentIF->Context) { + TcpipReleaseSpinLock(&InterfaceListLock, OldIrql); + return CurrentIF; + } + } EndFor(CurrentIF); + TcpipReleaseSpinLock(&InterfaceListLock, OldIrql); + + /* There are no physical interfaces on the system + * so we must pick the loopback interface */ + + return Loopback; +} + PIP_INTERFACE FindOnLinkInterface(PIP_ADDRESS Address) /* * FUNCTION: Checks all on-link prefixes to find out if an address is on-link @@ -167,6 +187,9 @@ PIP_INTERFACE FindOnLinkInterface(PIP_ADDRESS Address) TI_DbgPrint(DEBUG_ROUTER, ("Called. Address (0x%X)\n", Address)); TI_DbgPrint(DEBUG_ROUTER, ("Address (%s)\n", A2S(Address))); + if (AddrIsUnspecified(Address)) + return GetDefaultInterface(); + TcpipAcquireSpinLock(&InterfaceListLock, &OldIrql); ForEachInterface(CurrentIF) { diff --git a/reactos/lib/drivers/ip/network/neighbor.c b/reactos/lib/drivers/ip/network/neighbor.c index 92ba308168c..b8f07691cf5 100644 --- a/reactos/lib/drivers/ip/network/neighbor.c +++ b/reactos/lib/drivers/ip/network/neighbor.c @@ -421,7 +421,8 @@ PNEIGHBOR_CACHE_ENTRY NBFindOrCreateNeighbor( if (NCE == NULL) { TI_DbgPrint(MID_TRACE,("BCAST: %s\n", A2S(&Interface->Broadcast))); - if( AddrIsEqual(Address, &Interface->Broadcast) ) { + if( AddrIsEqual(Address, &Interface->Broadcast) || + AddrIsUnspecified(Address) ) { TI_DbgPrint(MID_TRACE,("Packet targeted at broadcast addr\n")); NCE = NBAddNeighbor(Interface, Address, NULL, Interface->AddressLength, NUD_CONNECTED);