NetworkingManagement.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Singleton.h>
  7. #include <Kernel/CommandLine.h>
  8. #include <Kernel/IO.h>
  9. #include <Kernel/Memory/AnonymousVMObject.h>
  10. #include <Kernel/Multiboot.h>
  11. #include <Kernel/Net/E1000ENetworkAdapter.h>
  12. #include <Kernel/Net/E1000NetworkAdapter.h>
  13. #include <Kernel/Net/LoopbackAdapter.h>
  14. #include <Kernel/Net/NE2000NetworkAdapter.h>
  15. #include <Kernel/Net/NetworkingManagement.h>
  16. #include <Kernel/Net/RTL8139NetworkAdapter.h>
  17. #include <Kernel/Net/RTL8168NetworkAdapter.h>
  18. #include <Kernel/Sections.h>
  19. namespace Kernel {
  20. static Singleton<NetworkingManagement> s_the;
  21. NetworkingManagement& NetworkingManagement::the()
  22. {
  23. return *s_the;
  24. }
  25. bool NetworkingManagement::is_initialized()
  26. {
  27. return s_the.is_initialized();
  28. }
  29. UNMAP_AFTER_INIT NetworkingManagement::NetworkingManagement()
  30. {
  31. }
  32. NonnullRefPtr<NetworkAdapter> NetworkingManagement::loopback_adapter() const
  33. {
  34. return *m_loopback_adapter;
  35. }
  36. void NetworkingManagement::for_each(Function<void(NetworkAdapter&)> callback)
  37. {
  38. MutexLocker locker(m_lock);
  39. for (auto& it : m_adapters)
  40. callback(it);
  41. }
  42. RefPtr<NetworkAdapter> NetworkingManagement::from_ipv4_address(const IPv4Address& address) const
  43. {
  44. MutexLocker locker(m_lock);
  45. for (auto& adapter : m_adapters) {
  46. if (adapter.ipv4_address() == address || adapter.ipv4_broadcast() == address)
  47. return adapter;
  48. }
  49. if (address[0] == 0 && address[1] == 0 && address[2] == 0 && address[3] == 0)
  50. return m_loopback_adapter;
  51. if (address[0] == 127)
  52. return m_loopback_adapter;
  53. return {};
  54. }
  55. RefPtr<NetworkAdapter> NetworkingManagement::lookup_by_name(const StringView& name) const
  56. {
  57. MutexLocker locker(m_lock);
  58. RefPtr<NetworkAdapter> found_adapter;
  59. for (auto& it : m_adapters) {
  60. if (it.name() == name)
  61. found_adapter = it;
  62. }
  63. return found_adapter;
  64. }
  65. UNMAP_AFTER_INIT RefPtr<NetworkAdapter> NetworkingManagement::determine_network_device(PCI::Address address) const
  66. {
  67. if (auto candidate = E1000NetworkAdapter::try_to_initialize(address); !candidate.is_null())
  68. return candidate;
  69. if (auto candidate = E1000ENetworkAdapter::try_to_initialize(address); !candidate.is_null())
  70. return candidate;
  71. if (auto candidate = RTL8139NetworkAdapter::try_to_initialize(address); !candidate.is_null())
  72. return candidate;
  73. if (auto candidate = RTL8168NetworkAdapter::try_to_initialize(address); !candidate.is_null())
  74. return candidate;
  75. if (auto candidate = NE2000NetworkAdapter::try_to_initialize(address); !candidate.is_null())
  76. return candidate;
  77. return {};
  78. }
  79. bool NetworkingManagement::initialize()
  80. {
  81. if (!kernel_command_line().is_physical_networking_disabled()) {
  82. PCI::enumerate([&](const PCI::Address& address, PCI::ID) {
  83. // Note: PCI class 2 is the class of Network devices
  84. if (PCI::get_class(address) != 0x02)
  85. return;
  86. if (auto adapter = determine_network_device(address); !adapter.is_null())
  87. m_adapters.append(adapter.release_nonnull());
  88. });
  89. }
  90. auto loopback = LoopbackAdapter::try_create();
  91. VERIFY(loopback);
  92. m_adapters.append(*loopback);
  93. m_loopback_adapter = loopback;
  94. return true;
  95. }
  96. }