diff --git a/Kernel/Net/Routing.cpp b/Kernel/Net/Routing.cpp index 28e44057dd..e207cd35f4 100644 --- a/Kernel/Net/Routing.cpp +++ b/Kernel/Net/Routing.cpp @@ -122,6 +122,11 @@ bool RoutingDecision::is_zero() const 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 through) { auto matches = [&](auto& adapter) { @@ -198,6 +203,9 @@ RoutingDecision route_to(const IPv4Address& target, const IPv4Address& source, c if (target_addr == 0xffffffff && matches(adapter)) 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()); auto addr = arp_table().resource().get(next_hop_ip);