NetworkAdapter.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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/IntrusiveList.h>
  10. #include <AK/MACAddress.h>
  11. #include <AK/Types.h>
  12. #include <AK/WeakPtr.h>
  13. #include <AK/Weakable.h>
  14. #include <Kernel/Bus/PCI/Definitions.h>
  15. #include <Kernel/KBuffer.h>
  16. #include <Kernel/Net/ARP.h>
  17. #include <Kernel/Net/EthernetFrameHeader.h>
  18. #include <Kernel/Net/ICMP.h>
  19. #include <Kernel/Net/IPv4.h>
  20. #include <Kernel/UserOrKernelBuffer.h>
  21. namespace Kernel {
  22. class NetworkAdapter;
  23. using NetworkByteBuffer = AK::Detail::ByteBuffer<1500>;
  24. struct PacketWithTimestamp : public RefCounted<PacketWithTimestamp> {
  25. PacketWithTimestamp(NonnullOwnPtr<KBuffer> buffer, Time timestamp)
  26. : buffer(move(buffer))
  27. , timestamp(timestamp)
  28. {
  29. }
  30. ReadonlyBytes bytes() { return { buffer->data(), buffer->size() }; };
  31. NonnullOwnPtr<KBuffer> buffer;
  32. Time timestamp;
  33. IntrusiveListNode<PacketWithTimestamp, RefPtr<PacketWithTimestamp>> packet_node;
  34. };
  35. class NetworkAdapter : public RefCounted<NetworkAdapter>
  36. , public Weakable<NetworkAdapter> {
  37. public:
  38. static constexpr i32 LINKSPEED_INVALID = -1;
  39. virtual ~NetworkAdapter();
  40. virtual StringView class_name() const = 0;
  41. const String& name() const { return m_name; }
  42. MACAddress mac_address() { return m_mac_address; }
  43. IPv4Address ipv4_address() const { return m_ipv4_address; }
  44. IPv4Address ipv4_netmask() const { return m_ipv4_netmask; }
  45. IPv4Address ipv4_broadcast() const { return IPv4Address { (m_ipv4_address.to_u32() & m_ipv4_netmask.to_u32()) | ~m_ipv4_netmask.to_u32() }; }
  46. IPv4Address ipv4_gateway() const { return m_ipv4_gateway; }
  47. virtual bool link_up() { return false; }
  48. virtual i32 link_speed()
  49. {
  50. // In Mbit/sec.
  51. return LINKSPEED_INVALID;
  52. }
  53. virtual bool link_full_duplex() { return false; }
  54. void set_ipv4_address(const IPv4Address&);
  55. void set_ipv4_netmask(const IPv4Address&);
  56. void set_ipv4_gateway(const IPv4Address&);
  57. void send(const MACAddress&, const ARPPacket&);
  58. void fill_in_ipv4_header(PacketWithTimestamp&, IPv4Address const&, MACAddress const&, IPv4Address const&, IPv4Protocol, size_t, u8);
  59. size_t dequeue_packet(u8* buffer, size_t buffer_size, Time& packet_timestamp);
  60. bool has_queued_packets() const { return !m_packet_queue.is_empty(); }
  61. u32 mtu() const { return m_mtu; }
  62. void set_mtu(u32 mtu) { m_mtu = mtu; }
  63. u32 packets_in() const { return m_packets_in; }
  64. u32 bytes_in() const { return m_bytes_in; }
  65. u32 packets_out() const { return m_packets_out; }
  66. u32 bytes_out() const { return m_bytes_out; }
  67. RefPtr<PacketWithTimestamp> acquire_packet_buffer(size_t);
  68. void release_packet_buffer(PacketWithTimestamp&);
  69. constexpr size_t layer3_payload_offset() const { return sizeof(EthernetFrameHeader); }
  70. constexpr size_t ipv4_payload_offset() const { return layer3_payload_offset() + sizeof(IPv4Packet); }
  71. Function<void()> on_receive;
  72. void send_packet(ReadonlyBytes);
  73. protected:
  74. NetworkAdapter();
  75. void set_interface_name(const PCI::Address&);
  76. void set_mac_address(const MACAddress& mac_address) { m_mac_address = mac_address; }
  77. void did_receive(ReadonlyBytes);
  78. virtual void send_raw(ReadonlyBytes) = 0;
  79. void set_loopback_name();
  80. private:
  81. MACAddress m_mac_address;
  82. IPv4Address m_ipv4_address;
  83. IPv4Address m_ipv4_netmask;
  84. IPv4Address m_ipv4_gateway;
  85. // FIXME: Make this configurable
  86. static constexpr size_t max_packet_buffers = 1024;
  87. using PacketList = IntrusiveList<PacketWithTimestamp, RefPtr<PacketWithTimestamp>, &PacketWithTimestamp::packet_node>;
  88. PacketList m_packet_queue;
  89. size_t m_packet_queue_size { 0 };
  90. PacketList m_unused_packets;
  91. String m_name;
  92. u32 m_packets_in { 0 };
  93. u32 m_bytes_in { 0 };
  94. u32 m_packets_out { 0 };
  95. u32 m_bytes_out { 0 };
  96. u32 m_mtu { 1500 };
  97. };
  98. }