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

@@ -1,3 +1,4 @@
#include <BAN/Endianness.h>
#include <kernel/FS/DevFS/FileSystem.h>
#include <kernel/Networking/NetworkInterface.h>
@@ -7,6 +8,14 @@
namespace Kernel
{
struct EthernetHeader
{
uint8_t dst_mac[6];
uint8_t src_mac[6];
BAN::NetworkEndian<uint16_t> ether_type;
};
static_assert(sizeof(EthernetHeader) == 14);
static dev_t get_network_rdev_major()
{
static dev_t major = DevFileSystem::get().get_next_dev();
@@ -31,4 +40,19 @@ namespace Kernel
m_name[3] = minor(m_rdev) + '0';
}
BAN::ErrorOr<void> NetworkInterface::add_interface_header(BAN::Vector<uint8_t>& packet, uint8_t destination_mac[6])
{
ASSERT(m_type == Type::Ethernet);
TRY(packet.resize(packet.size() + sizeof(EthernetHeader)));
memmove(packet.data() + sizeof(EthernetHeader), packet.data(), packet.size() - sizeof(EthernetHeader));
auto* header = reinterpret_cast<EthernetHeader*>(packet.data());
memcpy(header->dst_mac, destination_mac, 6);
memcpy(header->src_mac, get_mac_address(), 6);
header->ether_type = 0x0800; // ipv4
return {};
}
}