Program Listing for File header.hh¶
↰ Return to documentation for file (pcap/header.hh)
// SPDX-License-Identifier: LGPL-3.0-or-later
/* pcap/header.hh - libnokogiri pcap file header */
#if !defined(LIBNOKOGIRI_PCAP_HEADER_HH)
#define LIBNOKOGIRI_PCAP_HEADER_HH
#include <cstdint>
#include <array>
#include <string_view>
#include <libnokogiri/config.hh>
#include <libnokogiri/common.hh>
#include <libnokogiri/internal/defs.hh>
namespace libnokogiri::pcap {
using libnokogiri::internal::enum_pair_t;
enum struct pcap_variant_t : std::uint32_t {
Standard = 0xA1B2C3D4U,
Modified = 0xA1B2CD34U,
IXIAHW = 0x1C0001ACU,
IXIASW = 0x1C0001ABU,
Nanosecond = 0xA1B23C4DU,
/* Swapped versions of the magic, so it's easy to detect */
SwappedStandard = 0xD4C3B2A1U,
SwappedModified = 0x34CDB2A1U,
SwappedIXIAHW = 0xAC01001CU,
SwappedIXIASW = 0xAB01001CU,
SwappedNanosecond = 0x4D3CB2A1U,
};
const std::array<const enum_pair_t<pcap_variant_t>, 10> pcap_variant_s{{
{ pcap_variant_t::Standard, "Standard"sv },
{ pcap_variant_t::Modified, "Modified"sv },
{ pcap_variant_t::IXIAHW, "IXIAHW"sv },
{ pcap_variant_t::IXIASW, "IXIASW"sv },
{ pcap_variant_t::Nanosecond, "Nanosecond"sv },
{ pcap_variant_t::SwappedStandard, "Swapped Standard"sv },
{ pcap_variant_t::SwappedModified, "Swapped Modified"sv },
{ pcap_variant_t::SwappedIXIAHW, "SwappedIXIAHW"sv },
{ pcap_variant_t::SwappedIXIASW, "SwappedIXIASW"sv },
{ pcap_variant_t::SwappedNanosecond, "SwappedNanosecond"sv },
}};
struct file_header_t final {
private:
pcap_variant_t _variant;
version_t _version;
std::int32_t _tz_offset;
std::uint32_t _timestamp_figs;
std::uint32_t _pcklen_max;
alignas(alignof(std::uint32_t)) link_type_t _network;
public:
constexpr file_header_t() noexcept :
_variant{pcap_variant_t::Standard}, _version{1U, 0U}, _tz_offset{0},
_timestamp_figs{0U}, _pcklen_max{0U}, _network{link_type_t::User0}
{ /* NOP */ }
constexpr file_header_t(pcap_variant_t variant, version_t version, std::int32_t tz_offset,
std::uint32_t ts_figs, std::uint32_t pcklen, link_type_t network) noexcept :
_variant{variant}, _version{version}, _tz_offset{tz_offset},
_timestamp_figs{ts_figs}, _pcklen_max{pcklen}, _network{network}
{ /* NOP */ }
file_header_t(const file_header_t&) = delete;
file_header_t& operator=(const file_header_t&) = delete;
file_header_t(file_header_t&&) = default;
file_header_t& operator=(file_header_t&&) = default;
[[nodiscard]]
pcap_variant_t variant() const noexcept { return _variant; }
void variant(const pcap_variant_t variant) noexcept { _variant = variant; }
[[nodiscard]]
version_t version() const noexcept { return _version; }
void version(const version_t version) noexcept { _version = version; }
[[nodiscard]]
std::int32_t timezone_offset() const noexcept { return _tz_offset; }
void timezone_offset(const std::int32_t tz_offset) noexcept { _tz_offset = tz_offset; }
[[nodiscard]]
std::uint32_t timestamp_accuracy() const noexcept { return _timestamp_figs; }
void timestamp_accuracy(const std::uint32_t ts_accuracy) noexcept { _timestamp_figs = ts_accuracy; }
[[nodiscard]]
std::uint32_t max_packet_length() const noexcept { return _pcklen_max; }
void max_packet_length(const std::uint32_t length) noexcept { _pcklen_max = length; }
[[nodiscard]]
link_type_t link_type() const noexcept { return _network; }
void link_type(const link_type_t type) noexcept { _network = type; }
};
}
#endif /* LIBNOKOGIRI_PCAP_HEADER_HH */