diff --git a/kernel/include/net/tcp_layer.hpp b/kernel/include/net/tcp_layer.hpp index 1379c948..241b9e1b 100644 --- a/kernel/include/net/tcp_layer.hpp +++ b/kernel/include/net/tcp_layer.hpp @@ -46,6 +46,9 @@ struct tcp_connection { uint32_t ack_number = 0; ///< The next ack number uint32_t seq_number = 0; ///< The next sequence number + uint32_t fina_ack_number = 0; ///< The next ack number (from finalize) + uint32_t fina_seq_number = 0; ///< The next sequence number (from finalize) + network::socket* socket = nullptr; ///< Pointer to the user socket tcp_connection() : listening(false) { diff --git a/kernel/src/net/tcp_layer.cpp b/kernel/src/net/tcp_layer.cpp index 92525832..86bc3e4d 100644 --- a/kernel/src/net/tcp_layer.cpp +++ b/kernel/src/net/tcp_layer.cpp @@ -465,6 +465,9 @@ std::expected network::tcp::layer::finalize_packet(network::interface_desc if (correct_ack) { logging::logf(logging::log_level::TRACE, "tcp:finalize: Received ACK\n"); + connection.fina_ack_number = switch_endian_32(tcp_header->ack_number); + connection.fina_seq_number = switch_endian_32(tcp_header->sequence_number); + received = true; break; @@ -529,6 +532,9 @@ std::expected network::tcp::layer::connect(network::socket& sock, networ return std::make_unexpected(status.error()); } + connection.seq_number = connection.fina_ack_number; + connection.ack_number = connection.fina_seq_number + 1; + // The SYN/ACK is ensured by finalize_packet logging::logf(logging::log_level::TRACE, "tcp:connect: Received SYN/ACK\n"); @@ -639,6 +645,10 @@ std::expected network::tcp::layer::accept(network::socket& socket){ child_sock.connection_data = &child_connection; child_connection.socket = &child_sock; + // Child connection numbers + child_connection.seq_number = connection.seq_number; + child_connection.ack_number = connection.ack_number; + child_connection.connected = true; auto& interface = network::select_interface(source_address); @@ -678,7 +688,7 @@ std::expected network::tcp::layer::accept(network::socket& socket){ } std::expected network::tcp::layer::accept(network::socket& socket, size_t ms){ - + //TODO } std::expected network::tcp::layer::server_start(network::socket& sock, size_t server_port, network::ip::address server) {