Kernel: Make TCP sockets use the new ring buffer

Also fix race condition that sometimes prevented window updates not
being sent after zero window effectively hanging the whole socket
This commit is contained in:
2026-02-28 14:22:08 +02:00
parent 8b8af1a9d9
commit 812ae77cd7
2 changed files with 84 additions and 121 deletions

View File

@@ -4,7 +4,7 @@
#include <BAN/Endianness.h>
#include <BAN/Queue.h>
#include <kernel/Lock/Mutex.h>
#include <kernel/Memory/VirtualRange.h>
#include <kernel/Memory/ByteRingBuffer.h>
#include <kernel/Networking/NetworkInterface.h>
#include <kernel/Networking/NetworkSocket.h>
#include <kernel/Thread.h>
@@ -93,36 +93,32 @@ namespace Kernel
struct RecvWindowInfo
{
uint32_t start_seq { 0 }; // sequence number of first byte in buffer
uint32_t start_seq { 0 }; // sequence number of first byte in buffer
bool has_ghost_byte { false };
bool has_ghost_byte { false };
uint32_t data_tail { 0 };
uint32_t data_size { 0 }; // number of bytes in this buffer
uint8_t scale_shift { 0 }; // window scale
BAN::UniqPtr<VirtualRange> buffer;
uint8_t scale_shift { 0 }; // window scale
BAN::UniqPtr<ByteRingBuffer> buffer;
};
struct SendWindowInfo
{
uint32_t mss { 0 }; // maximum segment size
uint16_t non_scaled_size { 0 }; // window size without scaling
uint8_t scale_shift { 0 }; // window scale
uint32_t scaled_size() const { return (uint32_t)non_scaled_size << scale_shift; }
uint32_t mss { 0 }; // maximum segment size
uint16_t non_scaled_size { 0 }; // window size without scaling
uint8_t scale_shift { 0 }; // window scale
uint32_t scaled_size() const { return (uint32_t)non_scaled_size << scale_shift; }
uint32_t start_seq { 0 }; // sequence number of first byte in buffer
uint32_t current_seq { 0 }; // sequence number of next send
uint32_t current_ack { 0 }; // sequence number aknowledged by connection
uint32_t start_seq { 0 }; // sequence number of first byte in buffer
uint32_t current_seq { 0 }; // sequence number of next send
uint32_t current_ack { 0 }; // sequence number aknowledged by connection
uint64_t last_send_ms { 0 }; // last send time, used for retransmission timeout
uint64_t last_send_ms { 0 }; // last send time, used for retransmission timeout
bool has_ghost_byte { false };
bool had_zero_window { false };
bool has_ghost_byte { false };
bool had_zero_window { false };
uint32_t data_tail { 0 };
uint32_t data_size { 0 }; // number of bytes in this buffer
uint32_t sent_size { 0 }; // number of bytes in this buffer that have been sent
BAN::UniqPtr<VirtualRange> buffer;
uint32_t sent_size { 0 }; // number of bytes in this buffer that have been sent
BAN::UniqPtr<ByteRingBuffer> buffer;
};
struct ConnectionInfo
@@ -180,8 +176,8 @@ namespace Kernel
bool m_keep_alive { false };
bool m_no_delay { false };
bool m_should_send_ack { false };
bool m_should_send_zero_window { false };
bool m_should_send_window_update { false };
uint64_t m_time_wait_start_ms { 0 };