From 1683dc3b3768ff3797e30ba75958d2b3d22db458 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Tue, 23 Aug 2016 22:24:24 +0200 Subject: [PATCH] Prepare socket support --- kernel/include/net/socket.hpp | 48 +++++++++++++++++++++++++++++++++++ kernel/include/process.hpp | 3 +++ kernel/include/scheduler.hpp | 5 ++++ kernel/src/scheduler.cpp | 20 +++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 kernel/include/net/socket.hpp diff --git a/kernel/include/net/socket.hpp b/kernel/include/net/socket.hpp new file mode 100644 index 00000000..1f92c0d5 --- /dev/null +++ b/kernel/include/net/socket.hpp @@ -0,0 +1,48 @@ +//======================================================================= +// Copyright Baptiste Wicht 2013-2016. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +//======================================================================= + +#ifndef NET_SOCKET_H +#define NET_SOCKET_H + +#include + +namespace network { + +enum class socket_domain { + AF_INET +}; + +enum class socket_type { + RAW +}; + +enum class socket_protocol { + ICMP +}; + +struct socket { + size_t id; + socket_domain domain; + socket_type type; + socket_protocol protocol; + + //socket(){} + //socket(size_t id, socket_domain domain, socket_type type, socket_protocol protocol) + //: id(id), domain(domain), type(type), protocol(protocol) {} + + void invalidate(){ + id = 0xFFFFFFFF; + } + + bool is_valid() const { + return id == 0xFFFFFFFF; + } +}; + +} // end of network namespace + +#endif diff --git a/kernel/include/process.hpp b/kernel/include/process.hpp index 7f587d53..21e064ac 100644 --- a/kernel/include/process.hpp +++ b/kernel/include/process.hpp @@ -16,6 +16,8 @@ #include "vfs/path.hpp" +#include "net/socket.hpp" + namespace scheduler { constexpr const size_t MAX_PRIORITY = 4; @@ -90,6 +92,7 @@ struct process_control_t { size_t rounds; size_t sleep_timeout; std::vector handles; + std::vector sockets; path working_directory; }; diff --git a/kernel/include/scheduler.hpp b/kernel/include/scheduler.hpp index d69a99ed..98241819 100644 --- a/kernel/include/scheduler.hpp +++ b/kernel/include/scheduler.hpp @@ -55,6 +55,11 @@ const path& get_handle(size_t fd); bool has_handle(size_t fd); void release_handle(size_t fd); +size_t register_new_socket(network::socket_domain domain, network::socket_type type, network::socket_protocol protocol); +const network::socket& get_socket(size_t fd); +bool has_socket(size_t fd); +void release_socket(size_t fd); + const path& get_working_directory(); void set_working_directory(const path& directory); diff --git a/kernel/src/scheduler.cpp b/kernel/src/scheduler.cpp index 76e7c566..0f4f33fe 100644 --- a/kernel/src/scheduler.cpp +++ b/kernel/src/scheduler.cpp @@ -918,6 +918,26 @@ const path& scheduler::get_handle(size_t fd){ return pcb[current_pid].handles[fd]; } +size_t scheduler::register_new_socket(network::socket_domain domain, network::socket_type type, network::socket_protocol protocol){ + auto id = pcb[current_pid].sockets.size(); + + pcb[current_pid].sockets.emplace_back(id, domain, type, protocol); + + return id; +} + +void scheduler::release_socket(size_t fd){ + pcb[current_pid].sockets[fd].invalidate(); +} + +bool scheduler::has_socket(size_t fd){ + return fd < pcb[current_pid].sockets.size() && pcb[current_pid].sockets[fd].is_valid(); +} + +const network::socket& scheduler::get_socket(size_t fd){ + return pcb[current_pid].sockets[fd]; +} + const path& scheduler::get_working_directory(){ return pcb[current_pid].working_directory; }