mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 01:12:44 +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); | ||||
| 
 | ||||
|         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; | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -23,6 +23,8 @@ namespace Kernel { | |||
| 
 | ||||
| class NetworkAdapter; | ||||
| 
 | ||||
| using NetworkByteBuffer = AK::Detail::ByteBuffer<1500>; | ||||
| 
 | ||||
| class NetworkAdapter : public RefCounted<NetworkAdapter> { | ||||
| public: | ||||
|     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 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()); | ||||
|  |  | |||
|  | @ -194,7 +194,7 @@ private: | |||
| 
 | ||||
|     struct OutgoingPacket { | ||||
|         u32 ack_number { 0 }; | ||||
|         ByteBuffer buffer; | ||||
|         NetworkByteBuffer buffer; | ||||
|         int tx_counter { 0 }; | ||||
|     }; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Gunnar Beutner
						Gunnar Beutner