NetworkAdapter.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/ByteBuffer.h>
  8. #include <AK/Function.h>
  9. #include <AK/MACAddress.h>
  10. #include <AK/SinglyLinkedList.h>
  11. #include <AK/Types.h>
  12. #include <AK/WeakPtr.h>
  13. #include <AK/Weakable.h>
  14. #include <Kernel/KBuffer.h>
  15. #include <Kernel/Net/ARP.h>
  16. #include <Kernel/Net/ICMP.h>
  17. #include <Kernel/Net/IPv4.h>
  18. #include <Kernel/UserOrKernelBuffer.h>
  19. namespace Kernel {
  20. class NetworkAdapter;
  21. using NetworkByteBuffer = AK::Detail::ByteBuffer<1500>;
  22. class NetworkAdapter : public RefCounted<NetworkAdapter> {
  23. public:
  24. template<typename Callback>
  25. static inline void for_each(Callback callback)
  26. {
  27. Locker locker(all_adapters().lock());
  28. for (auto& it : all_adapters().resource())
  29. callback(*it);
  30. }
  31. static RefPtr<NetworkAdapter> from_ipv4_address(const IPv4Address&);
  32. static RefPtr<NetworkAdapter> lookup_by_name(const StringView&);
  33. virtual ~NetworkAdapter();
  34. virtual const char* class_name() const = 0;
  35. const String& name() const { return m_name; }
  36. MACAddress mac_address() { return m_mac_address; }
  37. IPv4Address ipv4_address() const { return m_ipv4_address; }
  38. IPv4Address ipv4_netmask() const { return m_ipv4_netmask; }
  39. IPv4Address ipv4_broadcast() const { return IPv4Address { (m_ipv4_address.to_u32() & m_ipv4_netmask.to_u32()) | ~m_ipv4_netmask.to_u32() }; }
  40. IPv4Address ipv4_gateway() const { return m_ipv4_gateway; }
  41. virtual bool link_up() { return false; }
  42. void set_ipv4_address(const IPv4Address&);
  43. void set_ipv4_netmask(const IPv4Address&);
  44. void set_ipv4_gateway(const IPv4Address&);
  45. void send(const MACAddress&, const ARPPacket&);
  46. KResult send_ipv4(const IPv4Address& source_ipv4, const MACAddress&, const IPv4Address&, IPv4Protocol, const UserOrKernelBuffer& payload, size_t payload_size, u8 ttl);
  47. KResult send_ipv4_fragmented(const IPv4Address& source_ipv4, const MACAddress&, const IPv4Address&, IPv4Protocol, const UserOrKernelBuffer& payload, size_t payload_size, u8 ttl);
  48. size_t dequeue_packet(u8* buffer, size_t buffer_size, Time& packet_timestamp);
  49. bool has_queued_packets() const { return !m_packet_queue.is_empty(); }
  50. u32 mtu() const { return m_mtu; }
  51. void set_mtu(u32 mtu) { m_mtu = mtu; }
  52. u32 packets_in() const { return m_packets_in; }
  53. u32 bytes_in() const { return m_bytes_in; }
  54. u32 packets_out() const { return m_packets_out; }
  55. u32 bytes_out() const { return m_bytes_out; }
  56. Function<void()> on_receive;
  57. protected:
  58. NetworkAdapter();
  59. void set_interface_name(const StringView& basename);
  60. void set_mac_address(const MACAddress& mac_address) { m_mac_address = mac_address; }
  61. virtual void send_raw(ReadonlyBytes) = 0;
  62. void did_receive(ReadonlyBytes);
  63. private:
  64. static Lockable<HashTable<NetworkAdapter*>>& all_adapters();
  65. MACAddress m_mac_address;
  66. IPv4Address m_ipv4_address;
  67. IPv4Address m_ipv4_netmask;
  68. IPv4Address m_ipv4_gateway;
  69. struct PacketWithTimestamp {
  70. KBuffer packet;
  71. Time timestamp;
  72. };
  73. // FIXME: Make this configurable
  74. static constexpr size_t max_packet_buffers = 1024;
  75. SinglyLinkedList<PacketWithTimestamp> m_packet_queue;
  76. size_t m_packet_queue_size { 0 };
  77. SinglyLinkedList<KBuffer> m_unused_packet_buffers;
  78. size_t m_unused_packet_buffers_count { 0 };
  79. String m_name;
  80. u32 m_packets_in { 0 };
  81. u32 m_bytes_in { 0 };
  82. u32 m_packets_out { 0 };
  83. u32 m_bytes_out { 0 };
  84. u32 m_mtu { 1500 };
  85. };
  86. }