diff --git a/Kernel/Net/NetworkingManagement.cpp b/Kernel/Net/NetworkingManagement.cpp index 1c91b0dac01..c01e01da8f7 100644 --- a/Kernel/Net/NetworkingManagement.cpp +++ b/Kernel/Net/NetworkingManagement.cpp @@ -45,33 +45,35 @@ NonnullRefPtr NetworkingManagement::loopback_adapter() const void NetworkingManagement::for_each(Function callback) { - MutexLocker locker(m_lock); - for (auto& it : m_adapters) - callback(it); + m_adapters.for_each([&](auto& adapter) { + callback(adapter); + }); } -RefPtr NetworkingManagement::from_ipv4_address(const IPv4Address& address) const +RefPtr NetworkingManagement::from_ipv4_address(IPv4Address const& address) const { - MutexLocker locker(m_lock); - for (auto& adapter : m_adapters) { - if (adapter.ipv4_address() == address || adapter.ipv4_broadcast() == address) - return adapter; - } if (address[0] == 0 && address[1] == 0 && address[2] == 0 && address[3] == 0) return m_loopback_adapter; if (address[0] == 127) return m_loopback_adapter; - return {}; + return m_adapters.with([&](auto& adapters) -> RefPtr { + for (auto& adapter : adapters) { + if (adapter.ipv4_address() == address || adapter.ipv4_broadcast() == address) + return adapter; + } + return nullptr; + }); } + RefPtr NetworkingManagement::lookup_by_name(StringView name) const { - MutexLocker locker(m_lock); - RefPtr found_adapter; - for (auto& it : m_adapters) { - if (it.name() == name) - found_adapter = it; - } - return found_adapter; + return m_adapters.with([&](auto& adapters) -> RefPtr { + for (auto& adapter : adapters) { + if (adapter.name() == name) + return adapter; + } + return nullptr; + }); } ErrorOr> NetworkingManagement::generate_interface_name_from_pci_address(PCI::DeviceIdentifier const& device_identifier) @@ -106,14 +108,13 @@ bool NetworkingManagement::initialize() if (device_identifier.class_code().value() != 0x02) return; if (auto adapter = determine_network_device(device_identifier); !adapter.is_null()) - m_adapters.append(adapter.release_nonnull()); + m_adapters.with([&](auto& adapters) { adapters.append(adapter.release_nonnull()); }); }); } auto loopback = LoopbackAdapter::try_create(); VERIFY(loopback); - m_adapters.append(*loopback); + m_adapters.with([&](auto& adapters) { adapters.append(*loopback); }); m_loopback_adapter = loopback; return true; } - } diff --git a/Kernel/Net/NetworkingManagement.h b/Kernel/Net/NetworkingManagement.h index 78c55e5beab..8ea6a3e0ba3 100644 --- a/Kernel/Net/NetworkingManagement.h +++ b/Kernel/Net/NetworkingManagement.h @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include namespace Kernel { @@ -40,9 +40,8 @@ public: private: RefPtr determine_network_device(PCI::DeviceIdentifier const&) const; - NonnullRefPtrVector m_adapters; + SpinlockProtected> m_adapters; RefPtr m_loopback_adapter; - mutable Mutex m_lock { "Networking" }; }; }