59 lines
1.3 KiB
C++
59 lines
1.3 KiB
C++
#pragma once
|
|
#include "net.h"
|
|
|
|
namespace Net::Icmp
|
|
{
|
|
enum class Type : uint8_t
|
|
{
|
|
EchoReply = 0,
|
|
EchoRequest = 8,
|
|
};
|
|
|
|
struct Header
|
|
{
|
|
Type type;
|
|
uint8_t code;
|
|
uint16_t checksum;
|
|
|
|
Header();
|
|
Header(Type type, uint8_t code);
|
|
|
|
constexpr static size_t SerializedLength()
|
|
{
|
|
return sizeof(type) + sizeof(code) + sizeof(checksum);
|
|
}
|
|
|
|
void UpdateChecksum(const uint8_t* data, const size_t dataSize);
|
|
size_t Serialize(
|
|
uint8_t* buffer,
|
|
const size_t bufferSize,
|
|
const uint8_t* data,
|
|
const size_t dataSize) const;
|
|
static size_t Deserialize(Header& out, const uint8_t* buffer, const size_t bufferSize);
|
|
};
|
|
|
|
struct EchoHeader
|
|
{
|
|
uint16_t identifier;
|
|
uint16_t sequenceNumber;
|
|
|
|
EchoHeader();
|
|
EchoHeader(uint16_t identifier, uint16_t sequenceNumber);
|
|
|
|
constexpr static size_t SerializedLength()
|
|
{
|
|
return sizeof(identifier) + sizeof(sequenceNumber);
|
|
}
|
|
|
|
size_t Serialize(uint8_t* buffer, const size_t bufferSize) const;
|
|
static size_t Deserialize(EchoHeader& out, const uint8_t* buffer, const size_t bufferSize);
|
|
};
|
|
|
|
void SendEchoRequest(const Utils::MacAddress mac, const uint32_t ip);
|
|
void HandlePacket(
|
|
Ethernet::Header ethernetHeader,
|
|
Ipv4::Header ipv4Header,
|
|
const uint8_t* buffer,
|
|
const size_t bufferSize);
|
|
} // namespace Net::Icmp
|