1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-19 20:35:06 +00:00

Kernel: Avoid allocations when handling network packets

This commit is contained in:
Gunnar Beutner 2021-05-15 22:45:22 +02:00 committed by Andreas Kling
parent 53d0150827
commit 006f11f23d
5 changed files with 8 additions and 6 deletions

View file

@ -406,7 +406,7 @@ void NE2000NetworkAdapter::receive()
dbgln_if(NE2000_DEBUG, "NE2000NetworkAdapter: Packet received {} length={}", (packet_ok ? "intact" : "damaged"), header.length); dbgln_if(NE2000_DEBUG, "NE2000NetworkAdapter: Packet received {} length={}", (packet_ok ? "intact" : "damaged"), header.length);
if (packet_ok) { 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 bytes_left = packet.size();
int current_offset = 0; int current_offset = 0;
int ring_offset = header_address; int ring_offset = header_address;

View file

@ -65,7 +65,7 @@ NetworkAdapter::~NetworkAdapter()
void NetworkAdapter::send(const MACAddress& destination, const ARPPacket& packet) void NetworkAdapter::send(const MACAddress& destination, const ARPPacket& packet)
{ {
size_t size_in_bytes = sizeof(EthernetFrameHeader) + sizeof(ARPPacket); 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(); auto* eth = (EthernetFrameHeader*)buffer.data();
eth->set_source(mac_address()); eth->set_source(mac_address());
eth->set_destination(destination); 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); 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; 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(); auto& eth = *(EthernetFrameHeader*)buffer.data();
eth.set_source(mac_address()); eth.set_source(mac_address());
eth.set_destination(destination_mac); 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) { for (size_t packet_index = 0; packet_index < fragment_block_count; ++packet_index) {
auto is_last_block = packet_index + 1 == fragment_block_count; auto is_last_block = packet_index + 1 == fragment_block_count;
auto packet_payload_size = is_last_block ? last_block_size : packet_boundary_size; 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(); auto& eth = *(EthernetFrameHeader*)buffer.data();
eth.set_source(mac_address()); eth.set_source(mac_address());
eth.set_destination(destination_mac); eth.set_destination(destination_mac);

View file

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

View file

@ -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 options_size = has_mss_option ? sizeof(TCPOptionMSS) : 0;
const size_t header_size = sizeof(TCPPacket) + options_size; const size_t header_size = sizeof(TCPPacket) + options_size;
const size_t buffer_size = header_size + payload_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()); auto& tcp_packet = *(TCPPacket*)(buffer.data());
VERIFY(local_port()); VERIFY(local_port());
tcp_packet.set_source_port(local_port()); tcp_packet.set_source_port(local_port());

View file

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