From ef8182271e00f12e29d1c79abeffcb8af094c44f Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sun, 18 Sep 2016 11:24:55 +0200 Subject: [PATCH] Store the UDP "connections" --- kernel/include/conc/rw_lock.hpp | 8 ++-- kernel/include/net/connection_handler.hpp | 8 ++-- kernel/src/net/tcp_layer.cpp | 4 ++ kernel/src/net/udp_layer.cpp | 47 ++++++++++++++++++++++- 4 files changed, 56 insertions(+), 11 deletions(-) diff --git a/kernel/include/conc/rw_lock.hpp b/kernel/include/conc/rw_lock.hpp index d77f6fb2..9cb364d3 100644 --- a/kernel/include/conc/rw_lock.hpp +++ b/kernel/include/conc/rw_lock.hpp @@ -159,19 +159,19 @@ private: bool writer = false; ///< Boolean flag indicating if there is a writer }; -void writer_rw_lock::lock(){ +inline void writer_rw_lock::lock(){ l.read_lock(); } -void writer_rw_lock::unlock(){ +inline void writer_rw_lock::unlock(){ l.read_unlock(); } -void reader_rw_lock::lock(){ +inline void reader_rw_lock::lock(){ l.write_lock(); } -void reader_rw_lock::unlock(){ +inline void reader_rw_lock::unlock(){ l.write_unlock(); } diff --git a/kernel/include/net/connection_handler.hpp b/kernel/include/net/connection_handler.hpp index 7ef7bea3..86ff664a 100644 --- a/kernel/include/net/connection_handler.hpp +++ b/kernel/include/net/connection_handler.hpp @@ -8,6 +8,8 @@ #ifndef NET_CONNECTION_HANDLER_H #define NET_CONNECTION_HANDLER_H +#include + #include "conc/rw_lock.hpp" namespace network { @@ -33,11 +35,7 @@ struct connection_handler { auto lock = connections_lock.writer_lock(); std::lock_guard l(lock); - auto& connection = connections.emplace_back(); - - connection.listening = false; - - return connection; + return connections.emplace_back(); } void remove_connection(connection_type& connection) { diff --git a/kernel/src/net/tcp_layer.cpp b/kernel/src/net/tcp_layer.cpp index 33b5e2d0..7adf9b7b 100644 --- a/kernel/src/net/tcp_layer.cpp +++ b/kernel/src/net/tcp_layer.cpp @@ -54,6 +54,10 @@ struct tcp_connection { uint32_t seq_number = 0; ///< The next sequence number network::socket* socket = nullptr; + + tcp_connection(){ + listening = false; + } }; network::connection_handler connections; diff --git a/kernel/src/net/udp_layer.cpp b/kernel/src/net/udp_layer.cpp index 51c195d7..c6d365e0 100644 --- a/kernel/src/net/udp_layer.cpp +++ b/kernel/src/net/udp_layer.cpp @@ -5,14 +5,29 @@ // http://www.opensource.org/licenses/MIT) //======================================================================= +#include "net/connection_handler.hpp" #include "net/udp_layer.hpp" #include "net/dns_layer.hpp" #include "net/checksum.hpp" +#include "tlib/errors.hpp" + #include "kernel_utils.hpp" namespace { +struct udp_connection { + size_t local_port; ///< The local source port + size_t server_port; ///< The server port + network::ip::address server_address; ///< The server address + + bool connected = false; + + network::socket* socket = nullptr; +}; + +network::connection_handler connections; + void compute_checksum(network::ethernet::packet& packet){ auto* ip_header = reinterpret_cast(packet.payload + packet.tag(1)); auto* udp_header = reinterpret_cast(packet.payload + packet.index); @@ -109,10 +124,38 @@ std::expected network::udp::finalize_packet(network::interface_descriptor& return network::ip::finalize_packet(interface, p); } -std::expected network::udp::client_bind(network::socket& socket, network::interface_descriptor& interface, size_t local_port, size_t server_port, network::ip::address server){ +std::expected network::udp::client_bind(network::socket& sock, network::interface_descriptor& interface, size_t local_port, size_t server_port, network::ip::address server){ + // Create the connection + auto& connection = connections.create_connection(); + + connection.local_port = local_port; + connection.server_port = server_port; + connection.server_address = server; + + // Link the socket and connection + sock.connection_data = &connection; + connection.socket = &sock; + + // Mark the connection as connected + + connection.connected = true; + + return {}; } -std::expected network::udp::client_unbind(network::socket& socket){ +std::expected network::udp::client_unbind(network::socket& sock){ + auto& connection = sock.get_connection_data(); + if(!connection.connected){ + return std::make_unexpected(std::ERROR_SOCKET_NOT_CONNECTED); + } + + // Mark the connection as not connected + + connection.connected = false; + + connections.remove_connection(connection); + + return {}; }