mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 14:17:36 +00:00
Kernel: Use correct destination MAC address for multicast packets
Previously we'd incorrectly use the default gateway's MAC address. Instead we must use destination MAC addresses that are derived from the multicast IPv4 address. With this patch applied I can query mDNS on a real network.
This commit is contained in:
parent
a569381037
commit
c160c6b035
1 changed files with 8 additions and 0 deletions
|
@ -122,6 +122,11 @@ bool RoutingDecision::is_zero() const
|
||||||
return adapter.is_null() || next_hop.is_zero();
|
return adapter.is_null() || next_hop.is_zero();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static MACAddress multicast_ethernet_address(IPv4Address const& address)
|
||||||
|
{
|
||||||
|
return MACAddress { 0x01, 0x00, 0x5e, (u8)(address[1] & 0x7f), address[2], address[3] };
|
||||||
|
}
|
||||||
|
|
||||||
RoutingDecision route_to(const IPv4Address& target, const IPv4Address& source, const RefPtr<NetworkAdapter> through)
|
RoutingDecision route_to(const IPv4Address& target, const IPv4Address& source, const RefPtr<NetworkAdapter> through)
|
||||||
{
|
{
|
||||||
auto matches = [&](auto& adapter) {
|
auto matches = [&](auto& adapter) {
|
||||||
|
@ -198,6 +203,9 @@ RoutingDecision route_to(const IPv4Address& target, const IPv4Address& source, c
|
||||||
if (target_addr == 0xffffffff && matches(adapter))
|
if (target_addr == 0xffffffff && matches(adapter))
|
||||||
return { adapter, { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } };
|
return { adapter, { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } };
|
||||||
|
|
||||||
|
if ((target_addr & IPv4Address { 240, 0, 0, 0 }.to_u32()) == IPv4Address { 224, 0, 0, 0 }.to_u32())
|
||||||
|
return { adapter, multicast_ethernet_address(target) };
|
||||||
|
|
||||||
{
|
{
|
||||||
Locker locker(arp_table().lock());
|
Locker locker(arp_table().lock());
|
||||||
auto addr = arp_table().resource().get(next_hop_ip);
|
auto addr = arp_table().resource().get(next_hop_ip);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue