11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
24PROMEKI_NAMESPACE_BEGIN
57 PcapLinkType linkType;
66 uint32_t originalLength = 0;
71 bool snapTruncated =
false;
74 size_t capturedLength()
const {
return frame.size(); }
128 static constexpr size_t MaxRecordLength = 256u * 1024u * 1024u;
132 static constexpr uint32_t MagicMicros = 0xa1b2c3d4u;
136 static constexpr uint32_t MagicNanos = 0xa1b23c4du;
140 static constexpr uint32_t PngBlockShb = 0x0a0d0d0au;
141 static constexpr uint32_t PngByteOrderMagic = 0x1a2b3c4du;
142 static constexpr uint32_t PngBlockIdb = 0x00000001u;
143 static constexpr uint32_t PngBlockSpb = 0x00000003u;
144 static constexpr uint32_t PngBlockEpb = 0x00000006u;
147 PcapReader() =
default;
163 Error open(IODevice &device);
172 Error openFile(
const String &path);
183 Error openBuffer(
const Buffer &buf);
186 bool isOpen()
const {
return _format != PcapFileFormat::Unknown; }
189 PcapFileFormat format()
const {
return _format; }
192 PcapByteOrder byteOrder()
const {
return _byteOrder; }
203 PcapLinkType linkType()
const;
211 uint32_t snapLength()
const;
214 size_t interfaceCount()
const {
return _interfaces.size(); }
225 Result<PcapRecord> next();
234 PcapLinkType linkType = PcapLinkType::Ethernet;
235 uint32_t snapLength = 0;
239 uint8_t tsResolCode = 6;
243 Error parseClassicHeader();
244 Error parsePcapngFirstSection();
245 Result<PcapRecord> nextClassic();
246 Result<PcapRecord> nextPcapng();
247 Error consumePcapngIdb(
size_t bodyOff,
size_t bodyLen);
252 PcapFileFormat _format = PcapFileFormat::Unknown;
253 PcapByteOrder _byteOrder = PcapByteOrder::Unknown;
255 bool _nanoTs =
false;
256 uint32_t _snaplen = 0;
257 PcapLinkType _classicLink = PcapLinkType::Ethernet;
258 List<Interface> _interfaces;