mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 01:02:45 +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
	
	 Gunnar Beutner
						Gunnar Beutner