mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 11:18:11 +00:00
Kernel: Generalize the UpdateArp table to UpdateTable
We can use the same enum cases to apply to updates on different networking tables within the Kernel (i.e. a routing table)
This commit is contained in:
parent
03d38e3ab8
commit
0718b20df0
4 changed files with 9 additions and 9 deletions
|
@ -653,7 +653,7 @@ ErrorOr<void> IPv4Socket::ioctl(OpenFileDescription&, unsigned request, Userspac
|
||||||
return EPERM;
|
return EPERM;
|
||||||
if (arp_req.arp_pa.sa_family != AF_INET)
|
if (arp_req.arp_pa.sa_family != AF_INET)
|
||||||
return EAFNOSUPPORT;
|
return EAFNOSUPPORT;
|
||||||
update_arp_table(IPv4Address(((sockaddr_in&)arp_req.arp_pa).sin_addr.s_addr), *(MACAddress*)&arp_req.arp_ha.sa_data[0], UpdateArp::Set);
|
update_arp_table(IPv4Address(((sockaddr_in&)arp_req.arp_pa).sin_addr.s_addr), *(MACAddress*)&arp_req.arp_ha.sa_data[0], UpdateTable::Set);
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
case SIOCDARP:
|
case SIOCDARP:
|
||||||
|
@ -661,7 +661,7 @@ ErrorOr<void> IPv4Socket::ioctl(OpenFileDescription&, unsigned request, Userspac
|
||||||
return EPERM;
|
return EPERM;
|
||||||
if (arp_req.arp_pa.sa_family != AF_INET)
|
if (arp_req.arp_pa.sa_family != AF_INET)
|
||||||
return EAFNOSUPPORT;
|
return EAFNOSUPPORT;
|
||||||
update_arp_table(IPv4Address(((sockaddr_in&)arp_req.arp_pa).sin_addr.s_addr), *(MACAddress*)&arp_req.arp_ha.sa_data[0], UpdateArp::Delete);
|
update_arp_table(IPv4Address(((sockaddr_in&)arp_req.arp_pa).sin_addr.s_addr), *(MACAddress*)&arp_req.arp_ha.sa_data[0], UpdateTable::Delete);
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -158,7 +158,7 @@ void handle_arp(EthernetFrameHeader const& eth, size_t frame_size)
|
||||||
if (!packet.sender_hardware_address().is_zero() && !packet.sender_protocol_address().is_zero()) {
|
if (!packet.sender_hardware_address().is_zero() && !packet.sender_protocol_address().is_zero()) {
|
||||||
// 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.
|
||||||
update_arp_table(packet.sender_protocol_address(), packet.sender_hardware_address(), UpdateArp::Set);
|
update_arp_table(packet.sender_protocol_address(), packet.sender_hardware_address(), UpdateTable::Set);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet.operation() == ARPOperation::Request) {
|
if (packet.operation() == ARPOperation::Request) {
|
||||||
|
@ -206,7 +206,7 @@ void handle_ipv4(EthernetFrameHeader const& eth, size_t frame_size, Time const&
|
||||||
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(), UpdateArp::Set);
|
update_arp_table(packet.source(), eth.source(), UpdateTable::Set);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -110,12 +110,12 @@ SpinlockProtected<HashMap<IPv4Address, MACAddress>>& arp_table()
|
||||||
return *s_arp_table;
|
return *s_arp_table;
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_arp_table(IPv4Address const& ip_addr, MACAddress const& addr, UpdateArp update)
|
void update_arp_table(IPv4Address const& ip_addr, MACAddress const& addr, UpdateTable update)
|
||||||
{
|
{
|
||||||
arp_table().with([&](auto& table) {
|
arp_table().with([&](auto& table) {
|
||||||
if (update == UpdateArp::Set)
|
if (update == UpdateTable::Set)
|
||||||
table.set(ip_addr, addr);
|
table.set(ip_addr, addr);
|
||||||
if (update == UpdateArp::Delete)
|
if (update == UpdateTable::Delete)
|
||||||
table.remove(ip_addr);
|
table.remove(ip_addr);
|
||||||
});
|
});
|
||||||
s_arp_table_blocker_set->unblock_blockers_waiting_for_ipv4_address(ip_addr, addr);
|
s_arp_table_blocker_set->unblock_blockers_waiting_for_ipv4_address(ip_addr, addr);
|
||||||
|
|
|
@ -19,12 +19,12 @@ struct RoutingDecision {
|
||||||
bool is_zero() const;
|
bool is_zero() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class UpdateArp {
|
enum class UpdateTable {
|
||||||
Set,
|
Set,
|
||||||
Delete,
|
Delete,
|
||||||
};
|
};
|
||||||
|
|
||||||
void update_arp_table(IPv4Address const&, MACAddress const&, UpdateArp update);
|
void update_arp_table(IPv4Address const&, MACAddress const&, UpdateTable update);
|
||||||
|
|
||||||
enum class AllowUsingGateway {
|
enum class AllowUsingGateway {
|
||||||
Yes,
|
Yes,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue