diff --git a/Kernel/Net/TCPSocket.cpp b/Kernel/Net/TCPSocket.cpp index 0a23ae177f..f4fc3546e1 100644 --- a/Kernel/Net/TCPSocket.cpp +++ b/Kernel/Net/TCPSocket.cpp @@ -321,6 +321,9 @@ void TCPSocket::receive_tcp_packet(TCPPacket const& packet, u16 size) if (old_adapter) old_adapter->release_packet_buffer(*packet.buffer); TCPPacket& tcp_packet = *(TCPPacket*)(packet.buffer->buffer->data() + packet.ipv4_payload_offset); + if (m_send_window_size != tcp_packet.window_size()) { + m_send_window_size = tcp_packet.window_size(); + } auto payload_size = packet.buffer->buffer->data() + packet.buffer->buffer->size() - (u8*)tcp_packet.payload(); unacked_packets.size -= payload_size; evaluate_block_conditions(); diff --git a/Kernel/Net/TCPSocket.h b/Kernel/Net/TCPSocket.h index 19b415ed13..a2d58df05e 100644 --- a/Kernel/Net/TCPSocket.h +++ b/Kernel/Net/TCPSocket.h @@ -223,7 +223,8 @@ private: UnixDateTime m_last_retransmit_time; u32 m_retransmit_attempts { 0 }; - // FIXME: Parse window size TCP option from the peer + // Default to maximum window size. receive_tcp_packet() will update from the + // peer's advertised window size. u32 m_send_window_size { 64 * KiB }; IntrusiveListNode m_retransmit_list_node;