Forráskód Böngészése

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.
Andreas Kling 5 éve
szülő
commit
a3f39fe789

+ 2 - 2
Kernel/Net/E1000NetworkAdapter.cpp

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

+ 5 - 5
Kernel/Net/NetworkAdapter.cpp

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

+ 3 - 3
Kernel/Net/NetworkAdapter.h

@@ -40,11 +40,11 @@
 
 
 class NetworkAdapter;
 class NetworkAdapter;
 
 
-class NetworkAdapter : public Weakable<NetworkAdapter> {
+class NetworkAdapter : public RefCounted<NetworkAdapter> {
 public:
 public:
     static void for_each(Function<void(NetworkAdapter&)>);
     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 ~NetworkAdapter();
 
 
     virtual const char* class_name() const = 0;
     virtual const char* class_name() const = 0;

+ 1 - 1
Kernel/Net/RTL8139NetworkAdapter.cpp

@@ -132,7 +132,7 @@ void RTL8139NetworkAdapter::detect(const PCI::Address& address)
     if (id != rtl8139_id)
     if (id != rtl8139_id)
         return;
         return;
     u8 irq = PCI::get_interrupt_line(address);
     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)
 RTL8139NetworkAdapter::RTL8139NetworkAdapter(PCI::Address pci_address, u8 irq)

+ 6 - 6
Kernel/Net/Routing.cpp

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

+ 1 - 1
Kernel/Net/Routing.h

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

+ 1 - 1
Kernel/Net/TCPSocket.h

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