#pragma once #include #include #include #include #include #include "wireframe/byteio.hpp" namespace wireframe::net { inline constexpr std::size_t kEthernetHeaderLen = 14; inline constexpr std::uint16_t kEthertypeIPv4 = 0x0800; inline constexpr std::uint16_t kEthertypeIPv6 = 0x86DD; inline constexpr std::uint16_t kEthertypeArp = 0x0806; struct MacAddress { std::array bytes; }; struct EthernetHeader { MacAddress dst; MacAddress src; std::uint16_t ethertype; }; struct EthernetFrame { EthernetHeader header; std::span payload; }; inline std::optional parse_ethernet(std::span bytes) { if (bytes.size() < kEthernetHeaderLen) return std::nullopt; EthernetHeader header{}; std::copy_n(bytes.begin(), 6, header.dst.bytes.begin()); std::copy_n(bytes.begin() + 6, 6, header.src.bytes.begin()); header.ethertype = read_be16(bytes, 12); return EthernetFrame{header, bytes.subspan(kEthernetHeaderLen)}; } } // namespace wireframe::net