11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
23PROMEKI_NAMESPACE_BEGIN
49 uint8_t ipProtocol = 17;
51 bool reassembled =
false;
55enum class DemuxStatus {
66 DemuxStatus status = DemuxStatus::Malformed;
105 static constexpr size_t MaxInFlight = 64;
108 static constexpr size_t MaxDatagramSize = 65535;
111 static constexpr uint8_t ProtocolUdp = 17;
114 static constexpr uint16_t EtherTypeIpv4 = 0x0800;
115 static constexpr uint16_t EtherTypeIpv6 = 0x86dd;
116 static constexpr uint16_t EtherTypeVlan = 0x8100;
117 static constexpr uint16_t EtherTypeVlanS = 0x88a8;
119 PacketDemux() =
default;
130 DemuxResult demux(PcapLinkType linkType,
const BufferView &frame);
136 size_t pendingReassemblies()
const {
return _reasm.size(); }
154 uint8_t protocol = 0;
156 List<uint8_t> filled;
157 size_t totalLength = 0;
158 bool haveTotal =
false;
165 L3 resolveL3(PcapLinkType linkType,
const uint8_t *p,
size_t n,
size_t &l3off)
const;
167 DemuxResult demuxIpv4(
const BufferView &frame,
const uint8_t *p,
size_t n,
size_t l3off);
168 DemuxResult demuxIpv6(
const BufferView &frame,
const uint8_t *p,
size_t n,
size_t l3off);
175 DemuxResult finishUdp(
const BufferView &frame,
const uint8_t *l4,
size_t l4len,
176 const SocketAddress &srcNoPort,
const SocketAddress &dstNoPort,
177 const Buffer &ownerBuf,
size_t l4abs,
bool reassembled);
182 DemuxResult reassemble(
const BufferView &frame,
bool ipv6,
const SocketAddress &srcNoPort,
183 const SocketAddress &dstNoPort, uint32_t
id, uint8_t upperProtocol,
184 const uint8_t *fragData,
size_t fragLen,
size_t fragOffset,
bool moreFragments);