Net: Make NetworkAdapter reference-counted

The idea behind WeakPtr<NetworkAdapter> was to support hot-pluggable
network adapters, but on closer thought, that's super impractical so
let's not go down that road.
This commit is contained in:
Andreas Kling 2020-02-08 00:19:46 +01:00
parent f3a5985bb2
commit a3f39fe789
Notes: sideshowbarker 2024-07-19 09:32:30 +09:00
7 changed files with 19 additions and 19 deletions

View file

@ -128,7 +128,7 @@ void E1000NetworkAdapter::detect(const PCI::Address& address)
if (id != qemu_bochs_vbox_id)
return;
u8 irq = PCI::get_interrupt_line(address);
new E1000NetworkAdapter(address, irq);
(void)adopt(*new E1000NetworkAdapter(address, irq)).leak_ref();
}
E1000NetworkAdapter::E1000NetworkAdapter(PCI::Address pci_address, u8 irq)
@ -376,7 +376,7 @@ void E1000NetworkAdapter::send_raw(const u8* data, size_t length)
#endif
auto& descriptor = m_tx_descriptors[tx_current];
ASSERT(length <= 8192);
auto *vptr = (void*)(descriptor.addr + 0xc0000000);
auto* vptr = (void*)(descriptor.addr + 0xc0000000);
memcpy(vptr, data, length);
descriptor.length = length;
descriptor.status = 0;

View file

@ -49,26 +49,26 @@ void NetworkAdapter::for_each(Function<void(NetworkAdapter&)> callback)
callback(*it);
}
WeakPtr<NetworkAdapter> NetworkAdapter::from_ipv4_address(const IPv4Address& address)
RefPtr<NetworkAdapter> NetworkAdapter::from_ipv4_address(const IPv4Address& address)
{
LOCKER(all_adapters().lock());
for (auto* adapter : all_adapters().resource()) {
if (adapter->ipv4_address() == address)
return adapter->make_weak_ptr();
return adapter;
}
if (address[0] == 127)
return LoopbackAdapter::the().make_weak_ptr();
return LoopbackAdapter::the();
return nullptr;
}
WeakPtr<NetworkAdapter> NetworkAdapter::lookup_by_name(const StringView& name)
RefPtr<NetworkAdapter> NetworkAdapter::lookup_by_name(const StringView& name)
{
NetworkAdapter* found_adapter = nullptr;
for_each([&](auto& adapter) {
if (adapter.name() == name)
found_adapter = &adapter;
});
return found_adapter ? found_adapter->make_weak_ptr() : nullptr;
return found_adapter;
}
NetworkAdapter::NetworkAdapter()

View file

@ -40,11 +40,11 @@
class NetworkAdapter;
class NetworkAdapter : public Weakable<NetworkAdapter> {
class NetworkAdapter : public RefCounted<NetworkAdapter> {
public:
static void for_each(Function<void(NetworkAdapter&)>);
static WeakPtr<NetworkAdapter> from_ipv4_address(const IPv4Address&);
static WeakPtr<NetworkAdapter> lookup_by_name(const StringView&);
static RefPtr<NetworkAdapter> from_ipv4_address(const IPv4Address&);
static RefPtr<NetworkAdapter> lookup_by_name(const StringView&);
virtual ~NetworkAdapter();
virtual const char* class_name() const = 0;

View file

@ -132,7 +132,7 @@ void RTL8139NetworkAdapter::detect(const PCI::Address& address)
if (id != rtl8139_id)
return;
u8 irq = PCI::get_interrupt_line(address);
new RTL8139NetworkAdapter(address, irq);
(void)adopt(*new RTL8139NetworkAdapter(address, irq)).leak_ref();
}
RTL8139NetworkAdapter::RTL8139NetworkAdapter(PCI::Address pci_address, u8 irq)

View file

@ -46,13 +46,13 @@ bool RoutingDecision::is_zero() const
RoutingDecision route_to(const IPv4Address& target, const IPv4Address& source)
{
if (target[0] == 127)
return { LoopbackAdapter::the().make_weak_ptr(), {} };
return { LoopbackAdapter::the(), {} };
auto target_addr = target.to_u32();
auto source_addr = source.to_u32();
WeakPtr<NetworkAdapter> local_adapter = nullptr;
WeakPtr<NetworkAdapter> gateway_adapter = nullptr;
RefPtr<NetworkAdapter> local_adapter = nullptr;
RefPtr<NetworkAdapter> gateway_adapter = nullptr;
NetworkAdapter::for_each([source_addr, &target_addr, &local_adapter, &gateway_adapter](auto& adapter) {
auto adapter_addr = adapter.ipv4_address().to_u32();
@ -62,10 +62,10 @@ RoutingDecision route_to(const IPv4Address& target, const IPv4Address& source)
return;
if ((target_addr & adapter_mask) == (adapter_addr & adapter_mask))
local_adapter = adapter.make_weak_ptr();
local_adapter = adapter;
if (adapter.ipv4_gateway().to_u32() != 0)
gateway_adapter = adapter.make_weak_ptr();
gateway_adapter = adapter;
});
if (!local_adapter && !gateway_adapter) {
@ -76,7 +76,7 @@ RoutingDecision route_to(const IPv4Address& target, const IPv4Address& source)
return { nullptr, {} };
}
WeakPtr<NetworkAdapter> adapter = nullptr;
RefPtr<NetworkAdapter> adapter = nullptr;
IPv4Address next_hop_ip;
if (local_adapter) {

View file

@ -30,7 +30,7 @@
struct RoutingDecision
{
WeakPtr<NetworkAdapter> adapter;
RefPtr<NetworkAdapter> adapter;
MACAddress next_hop;
bool is_zero() const;

View file

@ -182,7 +182,7 @@ private:
HashMap<IPv4SocketTuple, NonnullRefPtr<TCPSocket>> m_pending_release_for_accept;
Direction m_direction { Direction::Unspecified };
Error m_error { Error::None };
WeakPtr<NetworkAdapter> m_adapter;
RefPtr<NetworkAdapter> m_adapter;
u32 m_sequence_number { 0 };
u32 m_ack_number { 0 };
State m_state { State::Closed };