mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
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:
parent
99d9c85c54
commit
1b403e9be7
3 changed files with 27 additions and 2 deletions
|
@ -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 */
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue