Kernel: Cleanup ARPTable code
Packet process is now killed if ARPTable dies. ARP wait loop now just reschecules so timeout actually works.
This commit is contained in:
parent
b2291ce162
commit
dd3641f054
|
@ -31,6 +31,7 @@ namespace Kernel
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static BAN::ErrorOr<BAN::UniqPtr<ARPTable>> create();
|
static BAN::ErrorOr<BAN::UniqPtr<ARPTable>> create();
|
||||||
|
~ARPTable();
|
||||||
|
|
||||||
BAN::ErrorOr<BAN::MACAddress> get_mac_from_ipv4(NetworkInterface&, BAN::IPv4Address);
|
BAN::ErrorOr<BAN::MACAddress> get_mac_from_ipv4(NetworkInterface&, BAN::IPv4Address);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <kernel/LockGuard.h>
|
#include <kernel/LockGuard.h>
|
||||||
#include <kernel/Networking/ARPTable.h>
|
#include <kernel/Networking/ARPTable.h>
|
||||||
|
#include <kernel/Scheduler.h>
|
||||||
#include <kernel/Timer/Timer.h>
|
#include <kernel/Timer/Timer.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel
|
||||||
|
@ -32,12 +33,20 @@ namespace Kernel
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ARPTable::~ARPTable()
|
||||||
|
{
|
||||||
|
if (m_process)
|
||||||
|
m_process->exit(0, SIGKILL);
|
||||||
|
m_process = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<BAN::MACAddress> ARPTable::get_mac_from_ipv4(NetworkInterface& interface, BAN::IPv4Address ipv4_address)
|
BAN::ErrorOr<BAN::MACAddress> ARPTable::get_mac_from_ipv4(NetworkInterface& interface, BAN::IPv4Address ipv4_address)
|
||||||
{
|
{
|
||||||
{
|
|
||||||
LockGuard _(m_lock);
|
|
||||||
if (ipv4_address == s_broadcast_ipv4)
|
if (ipv4_address == s_broadcast_ipv4)
|
||||||
return s_broadcast_mac;
|
return s_broadcast_mac;
|
||||||
|
|
||||||
|
{
|
||||||
|
LockGuard _(m_lock);
|
||||||
if (m_arp_table.contains(ipv4_address))
|
if (m_arp_table.contains(ipv4_address))
|
||||||
return m_arp_table[ipv4_address];
|
return m_arp_table[ipv4_address];
|
||||||
}
|
}
|
||||||
|
@ -64,7 +73,7 @@ namespace Kernel
|
||||||
|
|
||||||
TRY(interface.send_raw_bytes(full_packet));
|
TRY(interface.send_raw_bytes(full_packet));
|
||||||
|
|
||||||
uint64_t timeout = SystemTimer::get().ms_since_boot() + 5'000;
|
uint64_t timeout = SystemTimer::get().ms_since_boot() + 1'000;
|
||||||
while (SystemTimer::get().ms_since_boot() < timeout)
|
while (SystemTimer::get().ms_since_boot() < timeout)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
@ -72,10 +81,10 @@ namespace Kernel
|
||||||
if (m_arp_table.contains(ipv4_address))
|
if (m_arp_table.contains(ipv4_address))
|
||||||
return m_arp_table[ipv4_address];
|
return m_arp_table[ipv4_address];
|
||||||
}
|
}
|
||||||
TRY(Thread::current().block_or_eintr(m_pending_semaphore));
|
Scheduler::get().reschedule();
|
||||||
}
|
}
|
||||||
|
|
||||||
return BAN::Error::from_errno(EINVAL);
|
return BAN::Error::from_errno(ETIMEDOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<void> ARPTable::handle_arp_packet(NetworkInterface& interface, const ARPPacket& packet)
|
BAN::ErrorOr<void> ARPTable::handle_arp_packet(NetworkInterface& interface, const ARPPacket& packet)
|
||||||
|
|
Loading…
Reference in New Issue