diff --git a/kernel/include/net/socket.hpp b/kernel/include/net/socket.hpp index 7f435695..b6a1be5d 100644 --- a/kernel/include/net/socket.hpp +++ b/kernel/include/net/socket.hpp @@ -9,7 +9,7 @@ #define NET_SOCKET_H #include -#include +#include #include #include #include @@ -38,8 +38,8 @@ struct socket { std::vector packets; ///< Packets that are prepared with their fd - std::vector listen_packets; ///< The packets that wait to be read in listen mode - condition_variable listen_queue; ///< Condition variable to wait for packets + std::queue listen_packets; ///< The packets that wait to be read in listen mode + condition_variable listen_queue; ///< Condition variable to wait for packets socket() {} socket(size_t id, socket_domain domain, socket_type type, socket_protocol protocol, size_t next_fd, bool listen) diff --git a/kernel/include/net/tcp_layer.hpp b/kernel/include/net/tcp_layer.hpp index 60746e53..1379c948 100644 --- a/kernel/include/net/tcp_layer.hpp +++ b/kernel/include/net/tcp_layer.hpp @@ -10,7 +10,7 @@ #include #include -#include +#include #include "conc/condition_variable.hpp" @@ -37,7 +37,7 @@ struct tcp_connection { std::atomic listening; ///< Indicates if a kernel thread is listening on this connection condition_variable queue; ///< The listening queue - std::vector packets; ///< The packets for the listening queue + std::queue packets; ///< The packets for the listening queue bool connected = false; ///< Indicate if the connection is connnected bool server = false; ///< Indicate if the connection is a server (true) or a client (false) diff --git a/kernel/src/net/network.cpp b/kernel/src/net/network.cpp index 7a4a1464..09cc2d03 100644 --- a/kernel/src/net/network.cpp +++ b/kernel/src/net/network.cpp @@ -879,8 +879,8 @@ std::expected network::wait_for_packet(char* buffer, socket_fd_t socket_ socket.listen_queue.wait(); } - auto packet = socket.listen_packets.back(); - socket.listen_packets.pop_back(); + auto packet = socket.listen_packets.top(); + socket.listen_packets.pop(); std::copy_n(packet->payload, packet->payload_size, buffer); @@ -912,8 +912,8 @@ std::expected network::wait_for_packet(char* buffer, socket_fd_t socket_ } } - auto packet = socket.listen_packets.back(); - socket.listen_packets.pop_back(); + auto packet = socket.listen_packets.top(); + socket.listen_packets.pop(); std::copy_n(packet->payload, packet->payload_size, buffer); @@ -940,7 +940,7 @@ void network::propagate_packet(const packet_p& packet, socket_protocol protocol) // Note: Stream and datagram sockets are responsible for propagation if (propagate) { - socket.listen_packets.push_back(packet); + socket.listen_packets.push(packet); socket.listen_queue.notify_one(); } } diff --git a/kernel/src/net/tcp_layer.cpp b/kernel/src/net/tcp_layer.cpp index bd71b81f..74c6cbf3 100644 --- a/kernel/src/net/tcp_layer.cpp +++ b/kernel/src/net/tcp_layer.cpp @@ -166,7 +166,7 @@ void network::tcp::layer::decode(network::interface_descriptor& interface, netwo if (connection.listening.load()) { logging::logf(logging::log_level::TRACE, "tcp:decode: Propagated to connection\n"); - connection.packets.push_back(packet); + connection.packets.push(packet); connection.queue.notify_one(); } @@ -187,7 +187,7 @@ void network::tcp::layer::decode(network::interface_descriptor& interface, netwo if (socket.listen) { logging::logf(logging::log_level::TRACE, "tcp:decode: Propagated to socket\n"); - socket.listen_packets.push_back(packet); + socket.listen_packets.push(packet); socket.listen_queue.notify_one(); } } @@ -264,8 +264,8 @@ std::expected network::tcp::layer::receive(char* buffer, network::socket socket.listen_queue.wait(); } - auto packet = socket.listen_packets.back(); - socket.listen_packets.pop_back(); + auto packet = socket.listen_packets.top(); + socket.listen_packets.pop(); logging::logf(logging::log_level::TRACE, "tcp:receive: Received packet\n"); @@ -302,8 +302,8 @@ std::expected network::tcp::layer::receive(char* buffer, network::socket } } - auto packet = socket.listen_packets.back(); - socket.listen_packets.pop_back(); + auto packet = socket.listen_packets.top(); + socket.listen_packets.pop(); logging::logf(logging::log_level::TRACE, "tcp:receive: Received packet\n"); @@ -403,8 +403,8 @@ std::expected network::tcp::layer::finalize_packet(network::interface_desc thor_assert(!connection.packets.empty(), "Should not be notified if queue not empty"); - auto received_packet = connection.packets.back(); - connection.packets.pop_back(); + auto received_packet = connection.packets.top(); + connection.packets.pop(); auto* tcp_header = reinterpret_cast(received_packet->payload + received_packet->tag(2)); auto flags = switch_endian_16(tcp_header->flags); @@ -551,8 +551,8 @@ std::expected network::tcp::layer::accept(network::socket& socket){ connection.queue.wait(); } - auto received_packet = connection.packets.back(); - connection.packets.pop_back(); + auto received_packet = connection.packets.top(); + connection.packets.pop(); auto* tcp_header = reinterpret_cast(received_packet->payload + received_packet->index); auto flags = switch_endian_16(tcp_header->flags); @@ -722,8 +722,8 @@ std::expected network::tcp::layer::disconnect(network::socket& sock) { auto remaining = timeout_ms - (after - before); if(connection.queue.wait_for(remaining)){ - auto received_packet = connection.packets.back(); - connection.packets.pop_back(); + auto received_packet = connection.packets.top(); + connection.packets.pop(); auto* tcp_header = reinterpret_cast(received_packet->payload + received_packet->index); auto flags = switch_endian_16(tcp_header->flags); @@ -788,8 +788,8 @@ std::expected network::tcp::layer::disconnect(network::socket& sock) { } } - auto received_packet = connection.packets.back(); - connection.packets.pop_back(); + auto received_packet = connection.packets.top(); + connection.packets.pop(); auto* tcp_header = reinterpret_cast(received_packet->payload + received_packet->index); auto flags = switch_endian_16(tcp_header->flags); diff --git a/kernel/src/net/udp_layer.cpp b/kernel/src/net/udp_layer.cpp index c4931202..ea8afb4d 100644 --- a/kernel/src/net/udp_layer.cpp +++ b/kernel/src/net/udp_layer.cpp @@ -101,7 +101,7 @@ void network::udp::layer::decode(network::interface_descriptor& interface, netwo auto& socket = *connection.socket; if (socket.listen) { - socket.listen_packets.push_back(packet); + socket.listen_packets.push(packet); socket.listen_queue.notify_one(); } } @@ -294,8 +294,8 @@ std::expected network::udp::layer::receive(char* buffer, network::socket socket.listen_queue.wait(); } - auto packet = socket.listen_packets.back(); - socket.listen_packets.pop_back(); + auto packet = socket.listen_packets.top(); + socket.listen_packets.pop(); auto* udp_header = reinterpret_cast(packet->payload + packet->tag(2)); auto payload_len = switch_endian_16(udp_header->length); @@ -327,8 +327,8 @@ std::expected network::udp::layer::receive(char* buffer, network::socket } } - auto packet = socket.listen_packets.back(); - socket.listen_packets.pop_back(); + auto packet = socket.listen_packets.top(); + socket.listen_packets.pop(); auto* udp_header = reinterpret_cast(packet->payload + packet->tag(2)); auto payload_len = switch_endian_16(udp_header->length); @@ -356,8 +356,8 @@ std::expected network::udp::layer::receive_from(char* buffer, network::s socket.listen_queue.wait(); } - auto packet = socket.listen_packets.back(); - socket.listen_packets.pop_back(); + auto packet = socket.listen_packets.top(); + socket.listen_packets.pop(); auto* udp_header = reinterpret_cast(packet->payload + packet->tag(2)); auto payload_len = switch_endian_16(udp_header->length); @@ -396,8 +396,8 @@ std::expected network::udp::layer::receive_from(char* buffer, network::s } } - auto packet = socket.listen_packets.back(); - socket.listen_packets.pop_back(); + auto packet = socket.listen_packets.top(); + socket.listen_packets.pop(); auto* udp_header = reinterpret_cast(packet->payload + packet->tag(2)); auto payload_len = switch_endian_16(udp_header->length);