mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 09:22:44 +00:00 
			
		
		
		
	Kernel: Add support for TCP window size scaling
This should allow us to eventually properly saturate high-bandwidth network links when using TCP, once other nonoptimal parts of our network stack are improved.
This commit is contained in:
		
							parent
							
								
									2c51ff763b
								
							
						
					
					
						commit
						785c9d5c2b
					
				
					 6 changed files with 124 additions and 14 deletions
				
			
		|  | @ -430,6 +430,19 @@ void handle_tcp(IPv4Packet const& ipv4_packet, UnixDateTime const& packet_timest | |||
|     dbgln_if(TCP_DEBUG, "handle_tcp: got socket {}; state={}", socket->tuple().to_string(), TCPSocket::to_string(socket->state())); | ||||
| 
 | ||||
|     socket->receive_tcp_packet(tcp_packet, ipv4_packet.payload_size()); | ||||
|     Optional<u8> send_window_scale; | ||||
|     if (tcp_packet.has_syn()) { | ||||
|         tcp_packet.for_each_option([&send_window_scale](auto const& option) { | ||||
|             if (option.kind() != TCPOptionKind::WindowScale) | ||||
|                 return; | ||||
|             if (option.length() != sizeof(TCPOptionWindowScale)) | ||||
|                 return; | ||||
|             auto scale = static_cast<TCPOptionWindowScale const&>(option).value(); | ||||
|             if (scale > 14) | ||||
|                 return; // Maximum allowed as per RFC7323
 | ||||
|             send_window_scale = scale; | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     switch (socket->state()) { | ||||
|     case TCPSocket::State::Closed: | ||||
|  | @ -459,6 +472,8 @@ void handle_tcp(IPv4Packet const& ipv4_packet, UnixDateTime const& packet_timest | |||
|             client->set_ack_number(tcp_packet.sequence_number() + payload_size + 1); | ||||
|             [[maybe_unused]] auto rc2 = client->send_tcp_packet(TCPFlags::SYN | TCPFlags::ACK); | ||||
|             client->set_state(TCPSocket::State::SynReceived); | ||||
|             if (send_window_scale.has_value()) | ||||
|                 client->set_send_window_scale(*send_window_scale); | ||||
|             return; | ||||
|         } | ||||
|         default: | ||||
|  | @ -472,6 +487,8 @@ void handle_tcp(IPv4Packet const& ipv4_packet, UnixDateTime const& packet_timest | |||
|             socket->set_ack_number(tcp_packet.sequence_number() + payload_size + 1); | ||||
|             (void)socket->send_tcp_packet(TCPFlags::SYN | TCPFlags::ACK); | ||||
|             socket->set_state(TCPSocket::State::SynReceived); | ||||
|             if (send_window_scale.has_value()) | ||||
|                 socket->set_send_window_scale(*send_window_scale); | ||||
|             return; | ||||
|         case TCPFlags::ACK | TCPFlags::SYN: | ||||
|             socket->set_ack_number(tcp_packet.sequence_number() + payload_size + 1); | ||||
|  | @ -479,6 +496,8 @@ void handle_tcp(IPv4Packet const& ipv4_packet, UnixDateTime const& packet_timest | |||
|             socket->set_state(TCPSocket::State::Established); | ||||
|             socket->set_setup_state(Socket::SetupState::Completed); | ||||
|             socket->set_connected(true); | ||||
|             if (send_window_scale.has_value()) | ||||
|                 socket->set_send_window_scale(*send_window_scale); | ||||
|             return; | ||||
|         case TCPFlags::ACK | TCPFlags::FIN: | ||||
|             socket->set_ack_number(tcp_packet.sequence_number() + payload_size + 1); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Idan Horowitz
						Idan Horowitz