1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 12:47:45 +00:00

Kernel: Bring up enough networking code that we can respond to ARP requests.

This is all pretty rickety but we can now respond to "arping" from the host
while running inside QEMU. Very cool. :^)
This commit is contained in:
Andreas Kling 2019-03-11 23:21:38 +01:00
parent 10dcd3a47f
commit 318b01e055
12 changed files with 229 additions and 40 deletions

View file

@ -1,14 +1,48 @@
#pragma once
#include <Kernel/MACAddress.h>
#include <Kernel/IPv4Address.h>
#include <Kernel/EtherType.h>
class [[gnu::packed]] ARPPacket {
public:
word hardware_type;
word protocol_type;
word hardware_address_length;
word protocol_address_length;
word operation;
uint8_t sender_hardware_address[6]; // Sender hardware address.
uint8_t sender_protocol_address[4]; // Sender protocol address.
uint8_t target_hardware_address[6]; // target hardware address.
uint8_t target_protocol_address[4]; // target protocol address.
word hardware_type() const { return ntohs(m_hardware_type); }
void set_hardware_type(word w) { m_hardware_type = htons(w); }
word protocol_type() const { return ntohs(m_protocol_type); }
void set_protocol_type(word w) { m_protocol_type = htons(w); }
byte hardware_address_length() const { return m_hardware_address_length; }
void set_hardware_address_length(byte b) { m_hardware_address_length = b; }
byte protocol_address_length() const { return m_protocol_address_length; }
void set_protocol_address_length(byte b) { m_protocol_address_length = b; }
word operation() const { return ntohs(m_operation); }
void set_operation(word w) { m_operation = htons(w); }
const MACAddress& sender_hardware_address() const { return m_sender_hardware_address; }
void set_sender_hardware_address(const MACAddress& address) { m_sender_hardware_address = address; }
const IPv4Address& sender_protocol_address() const { return m_sender_protocol_address; }
void set_sender_protocol_address(const IPv4Address& address) { m_sender_protocol_address = address; }
const MACAddress& target_hardware_address() const { return m_target_hardware_address; }
void set_target_hardware_address(const MACAddress& address) { m_target_hardware_address = address; }
const IPv4Address& target_protocol_address() const { return m_target_protocol_address; }
void set_target_protocol_address(const IPv4Address& address) { m_target_protocol_address = address; }
private:
word m_hardware_type { 0x0100 };
word m_protocol_type { 0x0008 };
byte m_hardware_address_length { sizeof(MACAddress) };
byte m_protocol_address_length { sizeof(IPv4Address) };
word m_operation { 0 };
MACAddress m_sender_hardware_address;
IPv4Address m_sender_protocol_address;
MACAddress m_target_hardware_address;
IPv4Address m_target_protocol_address;
};
static_assert(sizeof(ARPPacket) == 28);