From f8c104aaaf4b52f5d8bcf7f41e06b64c16f84b00 Mon Sep 17 00:00:00 2001 From: brapru Date: Sat, 24 Jul 2021 19:37:54 -0400 Subject: [PATCH] Kernel: Add update option to remove an entry from the ARP table Allows for specifying whether to set/delete an entry from the table. --- Kernel/Net/NetworkTask.cpp | 4 ++-- Kernel/Net/Routing.cpp | 7 +++++-- Kernel/Net/Routing.h | 7 ++++++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Kernel/Net/NetworkTask.cpp b/Kernel/Net/NetworkTask.cpp index b66542f8eb..fc4fc9e82b 100644 --- a/Kernel/Net/NetworkTask.cpp +++ b/Kernel/Net/NetworkTask.cpp @@ -151,7 +151,7 @@ void handle_arp(const EthernetFrameHeader& eth, size_t frame_size) // Someone has this IPv4 address. I guess we can try to remember that. // FIXME: Protect against ARP spamming. // FIXME: Support static ARP table entries. - update_arp_table(packet.sender_protocol_address(), packet.sender_hardware_address()); + update_arp_table(packet.sender_protocol_address(), packet.sender_hardware_address(), UpdateArp::Set); } if (packet.operation() == ARPOperation::Request) { @@ -199,7 +199,7 @@ void handle_ipv4(const EthernetFrameHeader& eth, size_t frame_size, const Time& 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()); + update_arp_table(packet.source(), eth.source(), UpdateArp::Set); } }); diff --git a/Kernel/Net/Routing.cpp b/Kernel/Net/Routing.cpp index 23bf3317ba..8298fe585d 100644 --- a/Kernel/Net/Routing.cpp +++ b/Kernel/Net/Routing.cpp @@ -104,10 +104,13 @@ Lockable>& arp_table() return *s_arp_table; } -void update_arp_table(const IPv4Address& ip_addr, const MACAddress& addr) +void update_arp_table(const IPv4Address& ip_addr, const MACAddress& addr, UpdateArp update) { MutexLocker locker(arp_table().lock()); - arp_table().resource().set(ip_addr, addr); + if (update == UpdateArp::Set) + arp_table().resource().set(ip_addr, addr); + if (update == UpdateArp::Delete) + arp_table().resource().remove(ip_addr); s_arp_table_block_condition->unblock(ip_addr, addr); if constexpr (ROUTING_DEBUG) { diff --git a/Kernel/Net/Routing.h b/Kernel/Net/Routing.h index 24f6e8f905..dcf0612cb2 100644 --- a/Kernel/Net/Routing.h +++ b/Kernel/Net/Routing.h @@ -18,7 +18,12 @@ struct RoutingDecision { bool is_zero() const; }; -void update_arp_table(const IPv4Address&, const MACAddress&); +enum class UpdateArp { + Set, + Delete, +}; + +void update_arp_table(const IPv4Address&, const MACAddress&, UpdateArp update); RoutingDecision route_to(const IPv4Address& target, const IPv4Address& source, const RefPtr through = nullptr); Lockable>& arp_table();