Kernel/LibC: Implement SYS_SENDTO

This commit is contained in:
2024-02-02 03:16:01 +02:00
parent acd6c86f98
commit ec2f21bb9f
18 changed files with 222 additions and 20 deletions

View File

@@ -101,6 +101,7 @@ namespace Kernel
// Socket API
BAN::ErrorOr<void> bind(const sockaddr* address, socklen_t address_len);
BAN::ErrorOr<ssize_t> sendto(const sys_sendto_t*);
// General API
BAN::ErrorOr<size_t> read(off_t, BAN::ByteSpan buffer);
@@ -125,6 +126,7 @@ namespace Kernel
// Socket API
virtual BAN::ErrorOr<void> bind_impl(const sockaddr*, socklen_t) { return BAN::Error::from_errno(ENOTSUP); }
virtual BAN::ErrorOr<ssize_t> sendto_impl(const sys_sendto_t*) { return BAN::Error::from_errno(ENOTSUP); }
// General API
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) { return BAN::Error::from_errno(ENOTSUP); }

View File

@@ -0,0 +1,10 @@
#pragma once
#include <BAN/Vector.h>
namespace Kernel
{
BAN::ErrorOr<void> add_ipv4_header(BAN::Vector<uint8_t>&, uint32_t src_ipv4, uint32_t dst_ipv4, uint8_t protocol);
}

View File

@@ -20,14 +20,16 @@ namespace Kernel
virtual ~NetworkInterface() {}
virtual uint8_t* get_mac_address() = 0;
uint32_t get_ipv4_address() const { return m_ipv4_address; }
virtual bool link_up() = 0;
virtual int link_speed() = 0;
BAN::ErrorOr<void> add_interface_header(BAN::Vector<uint8_t>&, uint8_t destination_mac[6]);
virtual dev_t rdev() const override { return m_rdev; }
virtual BAN::StringView name() const override { return m_name; }
protected:
virtual BAN::ErrorOr<void> send_raw_bytes(BAN::ConstByteSpan) = 0;
private:

View File

@@ -9,20 +9,27 @@ namespace Kernel
class NetworkSocket : public TmpInode, public BAN::Weakable<NetworkSocket>
{
public:
static constexpr uint16_t PORT_NONE = 0;
public:
void bind_interface_and_port(NetworkInterface*, uint16_t port);
~NetworkSocket();
virtual BAN::ErrorOr<void> add_protocol_header(BAN::Vector<uint8_t>&, uint16_t src_port, uint16_t dst_port) = 0;
virtual uint8_t protocol() const = 0;
protected:
NetworkSocket(mode_t mode, uid_t uid, gid_t gid);
virtual void on_close_impl() override;
virtual BAN::ErrorOr<void> bind_impl(const sockaddr* address, socklen_t address_len) override;
virtual BAN::ErrorOr<ssize_t> sendto_impl(const sys_sendto_t*) override;
protected:
NetworkInterface* m_interface = nullptr;
uint16_t m_port = 0;
NetworkInterface* m_interface = nullptr;
uint16_t m_port = PORT_NONE;
};
}

View File

@@ -11,18 +11,13 @@ namespace Kernel
public:
static BAN::ErrorOr<BAN::RefPtr<UDPSocket>> create(mode_t, uid_t, gid_t);
void bind_interface(NetworkInterface*);
protected:
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override;
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override;
virtual BAN::ErrorOr<void> add_protocol_header(BAN::Vector<uint8_t>&, uint16_t src_port, uint16_t dst_port) override;
virtual uint8_t protocol() const override { return 0x11; }
private:
UDPSocket(mode_t, uid_t, gid_t);
private:
NetworkInterface* m_interface = nullptr;
friend class BAN::RefPtr<UDPSocket>;
};

View File

@@ -114,6 +114,7 @@ namespace Kernel
BAN::ErrorOr<long> sys_socket(int domain, int type, int protocol);
BAN::ErrorOr<long> sys_bind(int socket, const sockaddr* address, socklen_t address_len);
BAN::ErrorOr<long> sys_sendto(const sys_sendto_t*);
BAN::ErrorOr<long> sys_pipe(int fildes[2]);
BAN::ErrorOr<long> sys_dup(int fildes);