From d7fc1a0c608f78f835b4c0660da30a001471f019 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Thu, 15 Sep 2016 22:37:17 +0200 Subject: [PATCH] Insert the listener only once --- kernel/src/net/tcp_layer.cpp | 52 +++++++++++++++++------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/kernel/src/net/tcp_layer.cpp b/kernel/src/net/tcp_layer.cpp index d996c621..80e25820 100644 --- a/kernel/src/net/tcp_layer.cpp +++ b/kernel/src/net/tcp_layer.cpp @@ -48,6 +48,23 @@ struct tcp_listener { // Note: We need a list to not invalidate the values during insertions std::list listeners; +tcp_listener* get_listener(size_t source_port, size_t target_port){ + auto end = listeners.end(); + auto it = listeners.begin(); + + while(it != end){ + auto& listener = *it; + + if(listener.source_port == source_port && listener.target_port == target_port){ + return &listener; + } + + ++it; + } + + return nullptr; +} + void compute_checksum(network::ethernet::packet& packet) { auto* ip_header = reinterpret_cast(packet.payload + packet.tag(1)); auto* tcp_header = reinterpret_cast(packet.payload + packet.index); @@ -196,9 +213,14 @@ void network::tcp::finalize_packet(network::interface_descriptor& interface, net auto source = socket.local_port; auto target = socket.server_port; - // TODO Wait for ACK or resend + auto listener_ptr = get_listener(target, source); - auto& listener = listeners.emplace_back(target, source); + if(!listener_ptr){ + logging::logf(logging::log_level::ERROR, "tcp: Unable to find listener!\n"); + return; + } + + auto& listener = *listener_ptr; listener.active = true; @@ -236,18 +258,6 @@ void network::tcp::finalize_packet(network::interface_descriptor& interface, net socket.seq_number = ack; socket.ack_number = seq; - - auto end = listeners.end(); - auto it = listeners.begin(); - - while (it != end) { - if (&(*it) == &listener) { - listeners.erase(it); - break; - } - - ++it; - } } std::expected network::tcp::connect(network::socket& sock, network::interface_descriptor& interface) { @@ -336,18 +346,6 @@ std::expected network::tcp::connect(network::socket& sock, network::interf tcp::finalize_packet(interface, *packet); } - auto end = listeners.end(); - auto it = listeners.begin(); - - while (it != end) { - if (&(*it) == &listener) { - listeners.erase(it); - break; - } - - ++it; - } - return {}; } @@ -372,8 +370,6 @@ std::expected network::tcp::disconnect(network::socket& sock, network::int (flag_ack(&flags)) = 1; tcp_header->flags = switch_endian_16(flags); - // Create the listener - auto& listener = listeners.emplace_back(target, source); listener.active = true;