From c03cbf83abcb969ab135eb73e566e85d7e9314c4 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 30 Apr 2021 22:07:41 +0200 Subject: [PATCH] Kernel: Record MAC addresses for incoming IPv4 packets This way we don't have to do ARP just to send packets back to an address which just sent us a packet. --- Kernel/Net/NetworkTask.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Kernel/Net/NetworkTask.cpp b/Kernel/Net/NetworkTask.cpp index 7757fb040f4..92dd3aca6b1 100644 --- a/Kernel/Net/NetworkTask.cpp +++ b/Kernel/Net/NetworkTask.cpp @@ -183,6 +183,15 @@ void handle_ipv4(const EthernetFrameHeader& eth, size_t frame_size, const Time& dbgln_if(IPV4_DEBUG, "handle_ipv4: source={}, destination={}", packet.source(), packet.destination()); + NetworkAdapter::for_each([&](auto& adapter) { + if (adapter.link_up()) { + auto my_net = adapter.ipv4_address().to_u32() & adapter.ipv4_netmask().to_u32(); + auto their_net = packet.source().to_u32() & adapter.ipv4_netmask().to_u32(); + if (my_net == their_net) + update_arp_table(packet.source(), eth.source()); + } + }); + switch ((IPv4Protocol)packet.protocol()) { case IPv4Protocol::ICMP: return handle_icmp(eth, packet, packet_timestamp);