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
This commit is contained in:
Cameron Gutman 2009-08-03 20:10:47 +00:00
parent 99d9c85c54
commit 1b403e9be7
3 changed files with 27 additions and 2 deletions

View file

@ -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 */

View file

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

View file

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