39 class EMANE::UpstreamPacket::Implementation
44 pShared_{std::make_shared<Shared>()}{}
46 Implementation(
const PacketInfo & info,
const void * buf,
size_t len):
48 pShared_{std::make_shared<Shared>()}
50 const unsigned char * c =
static_cast<const unsigned char *
>(buf);
51 pShared_->info_ = info;
52 pShared_->packetSegment_.reserve(len);
53 pShared_->packetSegment_.insert(pShared_->packetSegment_.end(),&c[0],&c[len]);
56 Implementation(
const PacketInfo & info,
const Utils::VectorIO & vectorIO):
58 pShared_{std::make_shared<Shared>()}
60 pShared_->info_ = info;
62 for(
const auto & iov : vectorIO)
64 pShared_->packetSegment_.insert(pShared_->packetSegment_.end(),
65 &
static_cast<const std::uint8_t *
>(iov.iov_base)[0],
66 &static_cast<const std::uint8_t *>(iov.iov_base)[iov.iov_len]);
70 size_t strip(
size_t size)
72 if(head_ + size < pShared_->packetSegment_.size())
78 size = pShared_->packetSegment_.size() - head_;
88 std::uint16_t u16LengthPrefixFraming{};
90 if(head_ +
sizeof(uint16_t) < pShared_->packetSegment_.size())
92 u16LengthPrefixFraming =
93 NTOHS(*reinterpret_cast<const std::uint16_t *>(&pShared_->packetSegment_[head_]));
95 head_ +=
sizeof(uint16_t);
98 return u16LengthPrefixFraming;
102 const void *
get()
const 104 return(head_ < pShared_->packetSegment_.size()) ? &pShared_->packetSegment_[head_] : 0;
110 return pShared_->packetSegment_.size() - head_;
116 return pShared_->info_;
120 typedef std::vector<unsigned char> PacketSegment;
125 PacketSegment packetSegment_;
126 PacketInfo info_{0,0,0,{}};
129 PacketSegment::size_type head_;
130 std::shared_ptr<Shared> pShared_;
137 pImpl_{
new Implementation{info,buf,size}}{}
141 pImpl_{
new Implementation{info,vectorIO}}{}
144 pImpl_{
new Implementation{*pkt.pImpl_}}{}
147 pImpl_{std::move(pkt.pImpl_)}{}
153 pImpl_.reset(
new Implementation{*pkt.pImpl_});
159 pImpl_ = std::move(pkt.pImpl_);
166 return pImpl_->strip(size);
172 return pImpl_->stripLengthPrefixFraming();
178 return pImpl_->get();
184 return pImpl_->length();
190 return pImpl_->getPacketInfo();
A Packet class that allows upstream processing to strip layer headers as the packet travels up the st...
UpstreamPacket(const PacketInfo &info, const void *buf, size_t len)
std::uint16_t stripLengthPrefixFraming()
size_t strip(size_t size)
std::vector< iovec > VectorIO
Store source, destination, creation time and priority information for a packet.
const PacketInfo & getPacketInfo() const
constexpr std::uint16_t NTOHS(std::uint16_t x)
UpstreamPacket & operator=(const UpstreamPacket &pkt)