Sfoglia il codice sorgente

Kernel: Avoid allocations when handling network packets

Gunnar Beutner 4 anni fa
parent
commit
006f11f23d

+ 1 - 1
Kernel/Net/NE2000NetworkAdapter.cpp

@@ -406,7 +406,7 @@ void NE2000NetworkAdapter::receive()
         dbgln_if(NE2000_DEBUG, "NE2000NetworkAdapter: Packet received {} length={}", (packet_ok ? "intact" : "damaged"), header.length);
 
         if (packet_ok) {
-            auto packet = ByteBuffer::create_uninitialized(sizeof(received_packet_header) + header.length);
+            auto packet = NetworkByteBuffer::create_uninitialized(sizeof(received_packet_header) + header.length);
             int bytes_left = packet.size();
             int current_offset = 0;
             int ring_offset = header_address;

+ 3 - 3
Kernel/Net/NetworkAdapter.cpp

@@ -65,7 +65,7 @@ NetworkAdapter::~NetworkAdapter()
 void NetworkAdapter::send(const MACAddress& destination, const ARPPacket& packet)
 {
     size_t size_in_bytes = sizeof(EthernetFrameHeader) + sizeof(ARPPacket);
-    auto buffer = ByteBuffer::create_zeroed(size_in_bytes);
+    auto buffer = NetworkByteBuffer::create_zeroed(size_in_bytes);
     auto* eth = (EthernetFrameHeader*)buffer.data();
     eth->set_source(mac_address());
     eth->set_destination(destination);
@@ -83,7 +83,7 @@ KResult NetworkAdapter::send_ipv4(const IPv4Address& source_ipv4, const MACAddre
         return send_ipv4_fragmented(source_ipv4, destination_mac, destination_ipv4, protocol, payload, payload_size, ttl);
 
     size_t ethernet_frame_size = sizeof(EthernetFrameHeader) + sizeof(IPv4Packet) + payload_size;
-    auto buffer = ByteBuffer::create_zeroed(ethernet_frame_size);
+    auto buffer = NetworkByteBuffer::create_zeroed(ethernet_frame_size);
     auto& eth = *(EthernetFrameHeader*)buffer.data();
     eth.set_source(mac_address());
     eth.set_destination(destination_mac);
@@ -121,7 +121,7 @@ KResult NetworkAdapter::send_ipv4_fragmented(const IPv4Address& source_ipv4, con
     for (size_t packet_index = 0; packet_index < fragment_block_count; ++packet_index) {
         auto is_last_block = packet_index + 1 == fragment_block_count;
         auto packet_payload_size = is_last_block ? last_block_size : packet_boundary_size;
-        auto buffer = ByteBuffer::create_zeroed(ethernet_frame_size);
+        auto buffer = NetworkByteBuffer::create_zeroed(ethernet_frame_size);
         auto& eth = *(EthernetFrameHeader*)buffer.data();
         eth.set_source(mac_address());
         eth.set_destination(destination_mac);

+ 2 - 0
Kernel/Net/NetworkAdapter.h

@@ -23,6 +23,8 @@ namespace Kernel {
 
 class NetworkAdapter;
 
+using NetworkByteBuffer = AK::Detail::ByteBuffer<1500>;
+
 class NetworkAdapter : public RefCounted<NetworkAdapter> {
 public:
     template<typename Callback>

+ 1 - 1
Kernel/Net/TCPSocket.cpp

@@ -186,7 +186,7 @@ KResult TCPSocket::send_tcp_packet(u16 flags, const UserOrKernelBuffer* payload,
     const size_t options_size = has_mss_option ? sizeof(TCPOptionMSS) : 0;
     const size_t header_size = sizeof(TCPPacket) + options_size;
     const size_t buffer_size = header_size + payload_size;
-    auto buffer = ByteBuffer::create_zeroed(buffer_size);
+    auto buffer = NetworkByteBuffer::create_zeroed(buffer_size);
     auto& tcp_packet = *(TCPPacket*)(buffer.data());
     VERIFY(local_port());
     tcp_packet.set_source_port(local_port());

+ 1 - 1
Kernel/Net/TCPSocket.h

@@ -194,7 +194,7 @@ private:
 
     struct OutgoingPacket {
         u32 ack_number { 0 };
-        ByteBuffer buffer;
+        NetworkByteBuffer buffer;
         int tx_counter { 0 };
     };