Kernel/LibC: Implement SYS_SENDTO
This commit is contained in:
@@ -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 {};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user