From e58b7343632f8b5bb0e03a436d9db5872084d236 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 4 Aug 2019 21:22:22 +0200 Subject: [PATCH] Net: Use KBuffers for network adapter packet queues This further reduces pressure on the kmalloc heap. :^) --- Kernel/Net/NetworkAdapter.cpp | 4 ++-- Kernel/Net/NetworkAdapter.h | 5 +++-- Kernel/Net/NetworkTask.cpp | 11 ++++++----- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Kernel/Net/NetworkAdapter.cpp b/Kernel/Net/NetworkAdapter.cpp index f4ef012c4f..6476305daa 100644 --- a/Kernel/Net/NetworkAdapter.cpp +++ b/Kernel/Net/NetworkAdapter.cpp @@ -81,10 +81,10 @@ void NetworkAdapter::send_ipv4(const MACAddress& destination_mac, const IPv4Addr void NetworkAdapter::did_receive(const u8* data, int length) { InterruptDisabler disabler; - m_packet_queue.append(ByteBuffer::copy(data, length)); + m_packet_queue.append(KBuffer::copy(data, length)); } -ByteBuffer NetworkAdapter::dequeue_packet() +RefPtr NetworkAdapter::dequeue_packet() { InterruptDisabler disabler; if (m_packet_queue.is_empty()) diff --git a/Kernel/Net/NetworkAdapter.h b/Kernel/Net/NetworkAdapter.h index 2052b3cc43..d2b4c10862 100644 --- a/Kernel/Net/NetworkAdapter.h +++ b/Kernel/Net/NetworkAdapter.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -28,7 +29,7 @@ public: void send(const MACAddress&, const ARPPacket&); void send_ipv4(const MACAddress&, const IPv4Address&, IPv4Protocol, ByteBuffer&& payload); - ByteBuffer dequeue_packet(); + RefPtr dequeue_packet(); bool has_queued_packets() const { return !m_packet_queue.is_empty(); } @@ -42,6 +43,6 @@ protected: private: MACAddress m_mac_address; IPv4Address m_ipv4_address; - SinglyLinkedList m_packet_queue; + SinglyLinkedList> m_packet_queue; String m_name; }; diff --git a/Kernel/Net/NetworkTask.cpp b/Kernel/Net/NetworkTask.cpp index cb23144a44..4ff8b1c9bd 100644 --- a/Kernel/Net/NetworkTask.cpp +++ b/Kernel/Net/NetworkTask.cpp @@ -44,10 +44,10 @@ void NetworkTask_main() if (adapter) adapter->set_ipv4_address(IPv4Address(192, 168, 5, 2)); - auto dequeue_packet = [&]() -> ByteBuffer { + auto dequeue_packet = [&]() -> RefPtr { auto packet = LoopbackAdapter::the().dequeue_packet(); if (!packet.is_null()) { - dbgprintf("Receive loopback packet (%d bytes)\n", packet.size()); + dbgprintf("Receive loopback packet (%d bytes)\n", packet->size()); return packet; } if (adapter && adapter->has_queued_packets()) @@ -57,8 +57,8 @@ void NetworkTask_main() kprintf("NetworkTask: Enter main loop.\n"); for (;;) { - auto packet = dequeue_packet(); - if (packet.is_null()) { + auto packet_maybe_null = dequeue_packet(); + if (packet_maybe_null.is_null()) { (void)current->block_until("Networking", [] { if (LoopbackAdapter::the().has_queued_packets()) return true; @@ -70,11 +70,12 @@ void NetworkTask_main() }); continue; } + auto& packet = *packet_maybe_null; if (packet.size() < (int)(sizeof(EthernetFrameHeader))) { kprintf("NetworkTask: Packet is too small to be an Ethernet packet! (%d)\n", packet.size()); continue; } - auto& eth = *(const EthernetFrameHeader*)packet.pointer(); + auto& eth = *(const EthernetFrameHeader*)packet.data(); #ifdef ETHERNET_DEBUG kprintf("NetworkTask: From %s to %s, ether_type=%w, packet_length=%u\n", eth.source().to_string().characters(),