NetworkingManagement.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Checked.h>
  7. #include <AK/Singleton.h>
  8. #include <Kernel/CommandLine.h>
  9. #include <Kernel/Debug.h>
  10. #include <Kernel/IO.h>
  11. #include <Kernel/Multiboot.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/Panic.h>
  18. #include <Kernel/VM/AnonymousVMObject.h>
  19. namespace Kernel {
  20. static AK::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. Locker 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. Locker 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. Locker 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 = RTL8139NetworkAdapter::try_to_initialize(address); !candidate.is_null())
  70. return candidate;
  71. if (auto candidate = NE2000NetworkAdapter::try_to_initialize(address); !candidate.is_null())
  72. return candidate;
  73. return {};
  74. }
  75. bool NetworkingManagement::initialize()
  76. {
  77. if (!kernel_command_line().is_physical_networking_disabled()) {
  78. PCI::enumerate([&](const PCI::Address& address, PCI::ID) {
  79. // Note: PCI class 2 is the class of Network devices
  80. if (PCI::get_class(address) != 0x02)
  81. return;
  82. if (auto adapter = determine_network_device(address); !adapter.is_null())
  83. m_adapters.append(adapter.release_nonnull());
  84. });
  85. }
  86. auto loopback = LoopbackAdapter::create();
  87. m_adapters.append(loopback);
  88. m_loopback_adapter = loopback;
  89. return true;
  90. }
  91. }