瀏覽代碼

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.
Gunnar Beutner 4 年之前
父節點
當前提交
c160c6b035
共有 1 個文件被更改,包括 8 次插入0 次删除
  1. 8 0
      Kernel/Net/Routing.cpp

+ 8 - 0
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<NetworkAdapter> 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);