Kernel: Rewrite Sockets to not be TmpInodes
TmpInodes just caused issues because TmpFS kept them alive. There was really no reason for sockets to even be stored inside a TmpFS...
This commit is contained in:
@@ -1,20 +1,59 @@
|
||||
#pragma once
|
||||
|
||||
#include <kernel/FS/Inode.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
enum class SocketDomain
|
||||
class Socket : public Inode
|
||||
{
|
||||
INET,
|
||||
INET6,
|
||||
UNIX,
|
||||
};
|
||||
public:
|
||||
enum class Domain
|
||||
{
|
||||
INET,
|
||||
INET6,
|
||||
UNIX,
|
||||
};
|
||||
|
||||
enum class SocketType
|
||||
{
|
||||
STREAM,
|
||||
DGRAM,
|
||||
SEQPACKET,
|
||||
enum class Type
|
||||
{
|
||||
STREAM,
|
||||
DGRAM,
|
||||
SEQPACKET,
|
||||
};
|
||||
|
||||
struct Info
|
||||
{
|
||||
mode_t mode;
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
};
|
||||
|
||||
public:
|
||||
ino_t ino() const final override { ASSERT_NOT_REACHED(); }
|
||||
Mode mode() const final override { return Mode(m_info.mode); }
|
||||
nlink_t nlink() const final override { ASSERT_NOT_REACHED(); }
|
||||
uid_t uid() const final override { return m_info.uid; }
|
||||
gid_t gid() const final override { return m_info.gid; }
|
||||
off_t size() const final override { ASSERT_NOT_REACHED(); }
|
||||
timespec atime() const final override { ASSERT_NOT_REACHED(); }
|
||||
timespec mtime() const final override { ASSERT_NOT_REACHED(); }
|
||||
timespec ctime() const final override { ASSERT_NOT_REACHED(); }
|
||||
blksize_t blksize() const final override { ASSERT_NOT_REACHED(); }
|
||||
blkcnt_t blocks() const final override { ASSERT_NOT_REACHED(); }
|
||||
dev_t dev() const final override { ASSERT_NOT_REACHED(); }
|
||||
dev_t rdev() const final override { ASSERT_NOT_REACHED(); }
|
||||
|
||||
protected:
|
||||
Socket(const Info& info)
|
||||
: m_info(info)
|
||||
{}
|
||||
|
||||
BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan buffer) override { return recvfrom_impl(buffer, nullptr, nullptr); }
|
||||
BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan buffer) override { return sendto_impl(buffer, nullptr, 0); }
|
||||
|
||||
private:
|
||||
const Info m_info;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -44,14 +44,14 @@ namespace Kernel
|
||||
|
||||
void add_ipv4_packet(NetworkInterface&, BAN::ConstByteSpan);
|
||||
|
||||
virtual void unbind_socket(BAN::RefPtr<NetworkSocket>, uint16_t port) override;
|
||||
virtual void unbind_socket(uint16_t port) override;
|
||||
virtual BAN::ErrorOr<void> bind_socket_to_unused(BAN::RefPtr<NetworkSocket>, const sockaddr* send_address, socklen_t send_address_len) override;
|
||||
virtual BAN::ErrorOr<void> bind_socket_to_address(BAN::RefPtr<NetworkSocket>, const sockaddr* address, socklen_t address_len) override;
|
||||
virtual BAN::ErrorOr<void> get_socket_address(BAN::RefPtr<NetworkSocket>, sockaddr* address, socklen_t* address_len) override;
|
||||
|
||||
virtual BAN::ErrorOr<size_t> sendto(NetworkSocket&, BAN::ConstByteSpan, const sockaddr*, socklen_t) override;
|
||||
|
||||
virtual SocketDomain domain() const override { return SocketDomain::INET ;}
|
||||
virtual Socket::Domain domain() const override { return Socket::Domain::INET ;}
|
||||
virtual size_t header_size() const override { return sizeof(IPv4Header); }
|
||||
|
||||
private:
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <kernel/FS/Socket.h>
|
||||
#include <kernel/Networking/NetworkInterface.h>
|
||||
|
||||
namespace Kernel
|
||||
@@ -15,22 +16,20 @@ namespace Kernel
|
||||
static_assert(sizeof(PseudoHeader) == 12);
|
||||
|
||||
class NetworkSocket;
|
||||
enum class SocketDomain;
|
||||
enum class SocketType;
|
||||
|
||||
class NetworkLayer
|
||||
{
|
||||
public:
|
||||
virtual ~NetworkLayer() {}
|
||||
|
||||
virtual void unbind_socket(BAN::RefPtr<NetworkSocket>, uint16_t port) = 0;
|
||||
virtual void unbind_socket(uint16_t port) = 0;
|
||||
virtual BAN::ErrorOr<void> bind_socket_to_unused(BAN::RefPtr<NetworkSocket>, const sockaddr* send_address, socklen_t send_address_len) = 0;
|
||||
virtual BAN::ErrorOr<void> bind_socket_to_address(BAN::RefPtr<NetworkSocket>, const sockaddr* address, socklen_t address_len) = 0;
|
||||
virtual BAN::ErrorOr<void> get_socket_address(BAN::RefPtr<NetworkSocket>, sockaddr* address, socklen_t* address_len) = 0;
|
||||
|
||||
virtual BAN::ErrorOr<size_t> sendto(NetworkSocket&, BAN::ConstByteSpan, const sockaddr*, socklen_t) = 0;
|
||||
|
||||
virtual SocketDomain domain() const = 0;
|
||||
virtual Socket::Domain domain() const = 0;
|
||||
virtual size_t header_size() const = 0;
|
||||
|
||||
protected:
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <BAN/Vector.h>
|
||||
#include <kernel/FS/TmpFS/FileSystem.h>
|
||||
#include <kernel/FS/Socket.h>
|
||||
#include <kernel/Networking/IPv4Layer.h>
|
||||
#include <kernel/Networking/NetworkInterface.h>
|
||||
#include <kernel/Networking/NetworkSocket.h>
|
||||
#include <kernel/PCI.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
@@ -12,7 +11,7 @@
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
class NetworkManager : public TmpFileSystem
|
||||
class NetworkManager
|
||||
{
|
||||
BAN_NON_COPYABLE(NetworkManager);
|
||||
BAN_NON_MOVABLE(NetworkManager);
|
||||
@@ -25,16 +24,18 @@ namespace Kernel
|
||||
|
||||
BAN::Vector<BAN::RefPtr<NetworkInterface>> interfaces() { return m_interfaces; }
|
||||
|
||||
BAN::ErrorOr<BAN::RefPtr<TmpInode>> create_socket(SocketDomain, SocketType, mode_t, uid_t, gid_t);
|
||||
BAN::ErrorOr<BAN::RefPtr<Socket>> create_socket(Socket::Domain, Socket::Type, mode_t, uid_t, gid_t);
|
||||
|
||||
void on_receive(NetworkInterface&, BAN::ConstByteSpan);
|
||||
|
||||
private:
|
||||
NetworkManager();
|
||||
NetworkManager() {}
|
||||
|
||||
private:
|
||||
BAN::UniqPtr<IPv4Layer> m_ipv4_layer;
|
||||
BAN::Vector<BAN::RefPtr<NetworkInterface>> m_interfaces;
|
||||
|
||||
friend class BAN::UniqPtr<NetworkManager>;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
#include <BAN/WeakPtr.h>
|
||||
#include <kernel/FS/Socket.h>
|
||||
#include <kernel/FS/TmpFS/Inode.h>
|
||||
#include <kernel/Networking/NetworkInterface.h>
|
||||
#include <kernel/Networking/NetworkLayer.h>
|
||||
|
||||
@@ -16,7 +15,7 @@ namespace Kernel
|
||||
UDP = 0x11,
|
||||
};
|
||||
|
||||
class NetworkSocket : public TmpInode, public BAN::Weakable<NetworkSocket>
|
||||
class NetworkSocket : public Socket, public BAN::Weakable<NetworkSocket>
|
||||
{
|
||||
BAN_NON_COPYABLE(NetworkSocket);
|
||||
BAN_NON_MOVABLE(NetworkSocket);
|
||||
@@ -39,7 +38,7 @@ namespace Kernel
|
||||
bool is_bound() const { return m_interface != nullptr; }
|
||||
|
||||
protected:
|
||||
NetworkSocket(NetworkLayer&, ino_t, const TmpInodeInfo&);
|
||||
NetworkSocket(NetworkLayer&, const Socket::Info&);
|
||||
|
||||
virtual BAN::ErrorOr<long> ioctl_impl(int request, void* arg) override;
|
||||
virtual BAN::ErrorOr<void> getsockname_impl(sockaddr*, socklen_t*) override;
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace Kernel
|
||||
static constexpr size_t m_tcp_options_bytes = 4;
|
||||
|
||||
public:
|
||||
static BAN::ErrorOr<BAN::RefPtr<TCPSocket>> create(NetworkLayer&, ino_t, const TmpInodeInfo&);
|
||||
static BAN::ErrorOr<BAN::RefPtr<TCPSocket>> create(NetworkLayer&, const Info&);
|
||||
~TCPSocket();
|
||||
|
||||
virtual NetworkProtocol protocol() const override { return NetworkProtocol::TCP; }
|
||||
@@ -141,7 +141,7 @@ namespace Kernel
|
||||
};
|
||||
|
||||
private:
|
||||
TCPSocket(NetworkLayer&, ino_t, const TmpInodeInfo&);
|
||||
TCPSocket(NetworkLayer&, const Info&);
|
||||
void process_task();
|
||||
|
||||
void start_close_sequence();
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace Kernel
|
||||
class UDPSocket final : public NetworkSocket
|
||||
{
|
||||
public:
|
||||
static BAN::ErrorOr<BAN::RefPtr<UDPSocket>> create(NetworkLayer&, ino_t, const TmpInodeInfo&);
|
||||
static BAN::ErrorOr<BAN::RefPtr<UDPSocket>> create(NetworkLayer&, const Socket::Info&);
|
||||
|
||||
virtual NetworkProtocol protocol() const override { return NetworkProtocol::UDP; }
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace Kernel
|
||||
virtual bool has_error_impl() const override { return false; }
|
||||
|
||||
private:
|
||||
UDPSocket(NetworkLayer&, ino_t, const TmpInodeInfo&);
|
||||
UDPSocket(NetworkLayer&, const Socket::Info&);
|
||||
~UDPSocket();
|
||||
|
||||
struct PacketInfo
|
||||
|
||||
@@ -9,13 +9,13 @@
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
class UnixDomainSocket final : public TmpInode, public BAN::Weakable<UnixDomainSocket>
|
||||
class UnixDomainSocket final : public Socket, public BAN::Weakable<UnixDomainSocket>
|
||||
{
|
||||
BAN_NON_COPYABLE(UnixDomainSocket);
|
||||
BAN_NON_MOVABLE(UnixDomainSocket);
|
||||
|
||||
public:
|
||||
static BAN::ErrorOr<BAN::RefPtr<UnixDomainSocket>> create(SocketType, ino_t, const TmpInodeInfo&);
|
||||
static BAN::ErrorOr<BAN::RefPtr<UnixDomainSocket>> create(Socket::Type, const Socket::Info&);
|
||||
|
||||
protected:
|
||||
virtual BAN::ErrorOr<long> accept_impl(sockaddr*, socklen_t*) override;
|
||||
@@ -30,7 +30,7 @@ namespace Kernel
|
||||
virtual bool has_error_impl() const override { return false; }
|
||||
|
||||
private:
|
||||
UnixDomainSocket(SocketType, ino_t, const TmpInodeInfo&);
|
||||
UnixDomainSocket(Socket::Type, const Socket::Info&);
|
||||
~UnixDomainSocket();
|
||||
|
||||
BAN::ErrorOr<void> add_packet(BAN::ConstByteSpan);
|
||||
@@ -58,7 +58,7 @@ namespace Kernel
|
||||
};
|
||||
|
||||
private:
|
||||
const SocketType m_socket_type;
|
||||
const Socket::Type m_socket_type;
|
||||
BAN::String m_bound_path;
|
||||
|
||||
BAN::Variant<ConnectionInfo, ConnectionlessInfo> m_info;
|
||||
|
||||
Reference in New Issue
Block a user