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:
parent
53d0150827
commit
006f11f23d
5 changed files with 8 additions and 6 deletions
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue