From 900b6d3e46ace70641efaeff9f49352efe73c494 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sun, 18 Sep 2016 11:04:24 +0200 Subject: [PATCH] Prepare UDP "connection" handling --- kernel/include/net/network.hpp | 2 +- kernel/include/net/udp_layer.hpp | 3 +++ kernel/src/net/network.cpp | 20 ++++++++++++++++---- kernel/src/net/udp_layer.cpp | 8 ++++++++ kernel/src/system_calls.cpp | 3 ++- tlib/include/tlib/net.hpp | 5 +++-- tlib/src/dns.cpp | 2 +- tlib/src/net.cpp | 10 +++++----- 8 files changed, 39 insertions(+), 14 deletions(-) diff --git a/kernel/include/net/network.hpp b/kernel/include/net/network.hpp index 0f796e52..2881670d 100644 --- a/kernel/include/net/network.hpp +++ b/kernel/include/net/network.hpp @@ -113,7 +113,7 @@ std::expected listen(socket_fd_t socket_fd, bool listen); * \param socket_fd The file descriptor of the packet * \return the allocated port on success and a negative error code otherwise */ -std::expected client_bind(socket_fd_t socket_fd); +std::expected client_bind(socket_fd_t socket_fd, network::ip::address address); /*! * \brief Bind a socket stream as a client (bind a local random port) diff --git a/kernel/include/net/udp_layer.hpp b/kernel/include/net/udp_layer.hpp index 1ccaabdc..ae3f3a28 100644 --- a/kernel/include/net/udp_layer.hpp +++ b/kernel/include/net/udp_layer.hpp @@ -31,6 +31,9 @@ std::expected kernel_prepare_packet(network::interfac std::expected user_prepare_packet(char* buffer, network::interface_descriptor& interface, const packet_descriptor* descriptor); std::expected finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p); +std::expected client_bind(network::socket& socket, network::interface_descriptor& interface, size_t local_port, size_t server_port, network::ip::address server); +std::expected client_unbind(network::socket& socket); + } // end of upd namespace } // end of network namespace diff --git a/kernel/src/net/network.cpp b/kernel/src/net/network.cpp index 37a0e629..818b9c67 100644 --- a/kernel/src/net/network.cpp +++ b/kernel/src/net/network.cpp @@ -378,7 +378,7 @@ std::expected network::listen(socket_fd_t socket_fd, bool listen){ return std::make_expected(); } -std::expected network::client_bind(socket_fd_t socket_fd){ +std::expected network::client_bind(socket_fd_t socket_fd, network::ip::address address){ if(!scheduler::has_socket(socket_fd)){ return std::make_unexpected(std::ERROR_SOCKET_INVALID_FD); } @@ -389,9 +389,21 @@ std::expected network::client_bind(socket_fd_t socket_fd){ return std::make_unexpected(std::ERROR_SOCKET_INVALID_TYPE); } - socket.local_port = local_port++; + auto selected_port = local_port++; - logging::logf(logging::log_level::TRACE, "network: %u datagram socket %u was assigned port %u\n", scheduler::get_pid(), socket_fd, socket.local_port); + logging::logf(logging::log_level::TRACE, "network: %u datagram socket %u was assigned port %u\n", scheduler::get_pid(), socket_fd, selected_port); + + //TODO extract the underlying protocol (UDP) + //TODO Get the port from a function + if(socket.protocol == socket_protocol::DNS){ + auto connection = network::udp::client_bind(socket, select_interface(address), selected_port, 53, address); + + if(!connection){ + return std::make_unexpected(connection.error()); + } + } else { + return std::make_unexpected(std::ERROR_SOCKET_INVALID_TYPE_PROTOCOL); + } return std::make_expected(socket.local_port); } @@ -409,7 +421,7 @@ std::expected network::connect(socket_fd_t socket_fd, network::ip::addre auto selected_port = local_port++; - logging::logf(logging::log_level::TRACE, "network: %u stream socket %u was assigned port %u\n", scheduler::get_pid(), socket_fd, socket.local_port); + logging::logf(logging::log_level::TRACE, "network: %u stream socket %u was assigned port %u\n", scheduler::get_pid(), socket_fd, selected_port); if(socket.protocol == socket_protocol::TCP){ auto connection = network::tcp::connect(socket, select_interface(server), selected_port, port, server); diff --git a/kernel/src/net/udp_layer.cpp b/kernel/src/net/udp_layer.cpp index 1f00726a..51c195d7 100644 --- a/kernel/src/net/udp_layer.cpp +++ b/kernel/src/net/udp_layer.cpp @@ -108,3 +108,11 @@ std::expected network::udp::finalize_packet(network::interface_descriptor& // Give the packet to the IP layer for finalization 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_unbind(network::socket& socket){ + +} diff --git a/kernel/src/system_calls.cpp b/kernel/src/system_calls.cpp index 25be7ad1..e91d1c7f 100644 --- a/kernel/src/system_calls.cpp +++ b/kernel/src/system_calls.cpp @@ -419,8 +419,9 @@ void sc_listen(interrupt::syscall_regs* regs){ void sc_client_bind(interrupt::syscall_regs* regs){ auto socket_fd = regs->rbx; + auto server_ip = regs->rcx; - auto status = network::client_bind(socket_fd); + auto status = network::client_bind(socket_fd, server_ip); regs->rax = expected_to_i64(status); } diff --git a/tlib/include/tlib/net.hpp b/tlib/include/tlib/net.hpp index 6614fd09..18df1933 100644 --- a/tlib/include/tlib/net.hpp +++ b/tlib/include/tlib/net.hpp @@ -41,7 +41,7 @@ void socket_close(size_t socket_fd); std::expected prepare_packet(size_t socket_fd, void* desc); std::expected finalize_packet(size_t socket_fd, const packet& p); std::expected listen(size_t socket_fd, bool l); -std::expected client_bind(size_t socket_fd); +std::expected client_bind(size_t socket_fd, tlib::ip::address server); std::expected connect(size_t socket_fd, tlib::ip::address server, size_t port); std::expected disconnect(size_t socket_fd); std::expected wait_for_packet(size_t socket_fd); @@ -88,8 +88,9 @@ struct socket { /*! * \brief Bind the socket as a client + * \param server The IP address */ - void client_bind(); + void client_bind(tlib::ip::address server); void connect(tlib::ip::address server, size_t port); void disconnect(); diff --git a/tlib/src/dns.cpp b/tlib/src/dns.cpp index 2d5fea7e..e703e60a 100644 --- a/tlib/src/dns.cpp +++ b/tlib/src/dns.cpp @@ -90,7 +90,7 @@ std::expected tlib::dns::send_request(tlib::socket& sock, const std::strin std::expected tlib::dns::resolve(const std::string& domain, size_t timeout_ms, size_t retries){ tlib::socket sock(tlib::socket_domain::AF_INET, tlib::socket_type::DGRAM, tlib::socket_protocol::DNS); - sock.client_bind(); + sock.client_bind(gateway_address()); sock.listen(true); if (!sock) { diff --git a/tlib/src/net.cpp b/tlib/src/net.cpp index 95a4a01a..ad5d0182 100644 --- a/tlib/src/net.cpp +++ b/tlib/src/net.cpp @@ -109,11 +109,11 @@ std::expected tlib::listen(size_t socket_fd, bool l) { } } -std::expected tlib::client_bind(size_t socket_fd) { +std::expected tlib::client_bind(size_t socket_fd, tlib::ip::address server) { int64_t code; - asm volatile("mov rax, 0x3007; mov rbx, %[socket]; int 50; mov %[code], rax" + asm volatile("mov rax, 0x3007; mov rbx, %[socket]; mov rcx, %[ip]; int 50; mov %[code], rax" : [code] "=m"(code) - : [socket] "g"(socket_fd) + : [socket] "g"(socket_fd), [ip] "g" (size_t(server.raw_address)) : "rax", "rbx", "rcx"); if (code < 0) { @@ -251,12 +251,12 @@ void tlib::socket::listen(bool l) { } } -void tlib::socket::client_bind() { +void tlib::socket::client_bind(tlib::ip::address server) { if (!good() || !open()) { return; } - auto status = tlib::client_bind(fd); + auto status = tlib::client_bind(fd, server); if (!status) { error_code = status.error(); }