Fixed broadcast UDP. lan: Added calculation of broadcast address. fileobjs: Check for broadcast receive. neighbor: Check for broadcast send. interface: Use cached broadcast address. udp: Fix port allocation. Modified: trunk/reactos/drivers/lib/ip/network/interface.c Modified: trunk/reactos/drivers/lib/ip/network/neighbor.c Modified: trunk/reactos/drivers/lib/ip/transport/udp/udp.c Modified: trunk/reactos/drivers/net/tcpip/datalink/lan.c Modified: trunk/reactos/drivers/net/tcpip/tcpip/fileobjs.c _____
Modified: trunk/reactos/drivers/lib/ip/network/interface.c --- trunk/reactos/drivers/lib/ip/network/interface.c 2005-01-23 01:33:35 UTC (rev 13222) +++ trunk/reactos/drivers/lib/ip/network/interface.c 2005-01-23 09:51:03 UTC (rev 13223) @@ -24,9 +24,7 @@
break;
case ADE_BROADCAST: - *Address = - Interface->Unicast.Address.IPv4Address | - ~Interface->Netmask.Address.IPv4Address; + *Address = Interface->Broadcast.Address.IPv4Address; break;
case ADE_POINTOPOINT: _____
Modified: trunk/reactos/drivers/lib/ip/network/neighbor.c --- trunk/reactos/drivers/lib/ip/network/neighbor.c 2005-01-23 01:33:35 UTC (rev 13222) +++ trunk/reactos/drivers/lib/ip/network/neighbor.c 2005-01-23 09:51:03 UTC (rev 13223) @@ -407,10 +407,19 @@
NCE = NBLocateNeighbor(Address); if (NCE == NULL) { - NCE = NBAddNeighbor(Interface, Address, NULL, - Interface->AddressLength, NUD_INCOMPLETE); - NCE->EventTimer = 1; - NCE->EventCount = 0; + TI_DbgPrint(MID_TRACE,("BCAST: %s\n", A2S(&Interface->Broadcast))); + if( AddrIsEqual(Address, &Interface->Broadcast) ) { + TI_DbgPrint(MID_TRACE,("Packet targeted at broadcast addr\n")); + NCE = NBAddNeighbor(Interface, Address, NULL, + Interface->AddressLength, NUD_CONNECTED); + NCE->EventTimer = 0; + NCE->EventCount = 0; + } else { + NCE = NBAddNeighbor(Interface, Address, NULL, + Interface->AddressLength, NUD_INCOMPLETE); + NCE->EventTimer = 1; + NCE->EventCount = 0; + } }
return NCE; _____
Modified: trunk/reactos/drivers/lib/ip/transport/udp/udp.c --- trunk/reactos/drivers/lib/ip/transport/udp/udp.c 2005-01-23 01:33:35 UTC (rev 13222) +++ trunk/reactos/drivers/lib/ip/transport/udp/udp.c 2005-01-23 09:51:03 UTC (rev 13223) @@ -14,7 +14,6 @@
BOOLEAN UDPInitialized = FALSE; PORT_SET UDPPorts;
- NTSTATUS AddUDPHeaderIPv4( PIP_ADDRESS RemoteAddress, USHORT RemotePort, @@ -408,7 +407,7 @@ RtlZeroMemory(&UDPStats, sizeof(UDP_STATISTICS)); #endif
- PortsStartup( &UDPPorts, UDP_STARTING_PORT, UDP_DYNAMIC_PORTS ); + PortsStartup( &UDPPorts, 1, 0xfffe );
/* Register this protocol with IP layer */ IPRegisterProtocol(IPPROTO_UDP, UDPReceive); @@ -440,9 +439,11 @@
UINT UDPAllocatePort( UINT HintPort ) { if( HintPort ) { - if( AllocatePort( &UDPPorts, HintPort ) ) return HintPort; - else return (UINT)-1; - } else return AllocateAnyPort( &UDPPorts ); + if( AllocatePort( &UDPPorts, HintPort ) ) return HintPort; + else return (UINT)-1; + } else return AllocatePortFromRange + ( &UDPPorts, UDP_STARTING_PORT, + UDP_STARTING_PORT + UDP_DYNAMIC_PORTS ); }
VOID UDPFreePort( UINT Port ) { _____
Modified: trunk/reactos/drivers/net/tcpip/datalink/lan.c --- trunk/reactos/drivers/net/tcpip/datalink/lan.c 2005-01-23 01:33:35 UTC (rev 13222) +++ trunk/reactos/drivers/net/tcpip/datalink/lan.c 2005-01-23 09:51:03 UTC (rev 13223) @@ -907,6 +907,14 @@
if(NT_SUCCESS(Status)) Status = ReadIPAddressFromRegistry( RegHandle, L"SubnetMask", &IF->Netmask ); + + IF->Broadcast.Type = IP_ADDRESS_V4; + IF->Broadcast.Address.IPv4Address = + IF->Unicast.Address.IPv4Address | + ~IF->Netmask.Address.IPv4Address; + + TI_DbgPrint(MID_TRACE,("BCAST(IF) %s\n", A2S(&IF->Broadcast))); + if(NT_SUCCESS(Status)) { Status = ReadStringFromRegistry( RegHandle, L"DeviceDesc", &IF->Name ); _____
Modified: trunk/reactos/drivers/net/tcpip/tcpip/fileobjs.c --- trunk/reactos/drivers/net/tcpip/tcpip/fileobjs.c 2005-01-23 01:33:35 UTC (rev 13222) +++ trunk/reactos/drivers/net/tcpip/tcpip/fileobjs.c 2005-01-23 09:51:03 UTC (rev 13223) @@ -43,6 +43,20 @@
return AddrSearchNext(SearchContext); }
+BOOLEAN AddrIsBroadcast( + PIP_ADDRESS PossibleMatch, + PIP_ADDRESS TargetAddress ) { + IF_LIST_ITER(IF); + + ForEachInterface(IF) { + if( AddrIsEqual( &IF->Unicast, PossibleMatch ) && + AddrIsEqual( &IF->Broadcast, TargetAddress ) ) + return TRUE; + } EndFor(IF); + + return FALSE; +} + /* * FUNCTION: Searches through address file entries to find next match * ARGUMENTS: @@ -80,10 +94,11 @@ A2S(SearchContext->Address)));
/* See if this address matches the search criteria */ - if (((Current->Port == SearchContext->Port) && + if ((Current->Port == SearchContext->Port) && (Current->Protocol == SearchContext->Protocol) && - (AddrIsEqual(IPAddress, SearchContext->Address))) || - (AddrIsUnspecified(IPAddress))) { + (AddrIsEqual(IPAddress, SearchContext->Address) || + AddrIsBroadcast(IPAddress, SearchContext->Address) || + AddrIsUnspecified(IPAddress))) { /* We've found a match */ Found = TRUE; break; @@ -277,7 +292,9 @@ TI_DbgPrint(MID_TRACE,("Allocating udp port\n")); AddrFile->Port = UDPAllocatePort(Address->Address[0].Address[0].sin_port); - TI_DbgPrint(MID_TRACE,("Setting port %d\n", AddrFile->Port)); + TI_DbgPrint(MID_TRACE,("Setting port %d (wanted %d)\n", + AddrFile->Port, + Address->Address[0].Address[0].sin_port)); AddrFile->Send = UDPSendDatagram; break;