mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-28 22:12:56 +00:00
Kernel: Add update option to remove an entry from the ARP table
Allows for specifying whether to set/delete an entry from the table.
This commit is contained in:
parent
99b32073be
commit
f8c104aaaf
Notes:
sideshowbarker
2024-07-18 08:21:34 +09:00
Author: https://github.com/brapru
Commit: f8c104aaaf
Pull-request: https://github.com/SerenityOS/serenity/pull/8996
3 changed files with 13 additions and 5 deletions
|
@ -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.
|
// Someone has this IPv4 address. I guess we can try to remember that.
|
||||||
// FIXME: Protect against ARP spamming.
|
// FIXME: Protect against ARP spamming.
|
||||||
// FIXME: Support static ARP table entries.
|
// 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) {
|
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 my_net = adapter.ipv4_address().to_u32() & adapter.ipv4_netmask().to_u32();
|
||||||
auto their_net = packet.source().to_u32() & adapter.ipv4_netmask().to_u32();
|
auto their_net = packet.source().to_u32() & adapter.ipv4_netmask().to_u32();
|
||||||
if (my_net == their_net)
|
if (my_net == their_net)
|
||||||
update_arp_table(packet.source(), eth.source());
|
update_arp_table(packet.source(), eth.source(), UpdateArp::Set);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -104,10 +104,13 @@ Lockable<HashMap<IPv4Address, MACAddress>>& arp_table()
|
||||||
return *s_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());
|
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);
|
s_arp_table_block_condition->unblock(ip_addr, addr);
|
||||||
|
|
||||||
if constexpr (ROUTING_DEBUG) {
|
if constexpr (ROUTING_DEBUG) {
|
||||||
|
|
|
@ -18,7 +18,12 @@ struct RoutingDecision {
|
||||||
bool is_zero() const;
|
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<NetworkAdapter> through = nullptr);
|
RoutingDecision route_to(const IPv4Address& target, const IPv4Address& source, const RefPtr<NetworkAdapter> through = nullptr);
|
||||||
|
|
||||||
Lockable<HashMap<IPv4Address, MACAddress>>& arp_table();
|
Lockable<HashMap<IPv4Address, MACAddress>>& arp_table();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue