1#include <vanetza/geonet/indication_context.hpp>
2#include <vanetza/geonet/pdu_conversion.hpp>
3#include <vanetza/geonet/secured_pdu.hpp>
12 m_packet(std::move(packet)), m_cohesive_packet(cohesive),
13 m_parser(cohesive[OsiLayer::Network])
19 auto bytes = m_parser.parse_basic(pdu().basic());
20 return bytes > 0 ? &pdu().basic() :
nullptr;
25 auto bytes = m_parser.parse_common(pdu().common());
26 return bytes > 0 ? &pdu().common() :
nullptr;
32 auto bytes = m_parser.parse_secured(tmp);
34 pdu().secured(std::move(tmp));
35 return pdu().secured();
43 auto bytes = m_parser.parse_extended(pdu().extended_variant(), ht);
44 return boost::optional<HeaderConstRefVariant>(bytes > 0, pdu().extended_variant());
49 m_cohesive_packet
.set_boundary(OsiLayer::Network, m_parser.parsed_bytes());
50 m_cohesive_packet
.trim(OsiLayer::Transport
, pdu().common().payload
);
51 return std::move(m_packet);
58 Pdu* casted_pdu = pdu_cast(chunk
.layer(OsiLayer::Network
));
62 throw std::runtime_error(
"Casting to Pdu failed");
68 return &pdu().basic();
73 return &pdu().common();
78 return pdu().secured();
83 return boost::optional<HeaderConstRefVariant> { pdu().extended_variant() };
89 return std::move(m_packet);
96 m_parser(payload[OsiLayer::Network])
102 auto bytes = m_parser.parse_common(pdu().common());
103 return bytes > 0 ? &pdu().common() :
nullptr;
108 auto bytes = m_parser.parse_extended(pdu().extended_variant(), ht);
109 return boost::optional<HeaderConstRefVariant>(bytes > 0, pdu().extended_variant());
114 m_packet
.set_boundary(OsiLayer::Network, m_parser.parsed_bytes());
115 auto packet = m_parent.finish();
116 (*packet) = m_packet;
123 m_packet(parent.finish())
127 pdu().common() = secured_pdu->common;
128 pdu().extended_variant() = secured_pdu->extended;
130 throw std::runtime_error(
"Casting to SecuredPdu failed");
133 struct parent_packet_visitor :
public boost::static_visitor<>
135 parent_packet_visitor(
ChunkPacket& _secured_payload) : secured_payload(_secured_payload) {}
139 packet
.merge(secured_payload
, OsiLayer::Transport
, max_osi_layer()
);
145 ByteBuffer buffer(secured_payload
.size());
146 for (
auto layer : osi_layer_range(OsiLayer::Transport, max_osi_layer())) {
147 ByteBuffer layer_buffer;
148 secured_payload.layer(layer).convert(layer_buffer);
149 buffer.insert(buffer.end(), layer_buffer.begin(), layer_buffer.end());
157 parent_packet_visitor visitor(packet);
158 boost::apply_visitor(visitor, *m_packet);
163 return &pdu().common();
168 return boost::optional<HeaderConstRefVariant> { pdu().extended_variant() };
173 return std::move(m_packet);
ChunckPacket is a packet consisting of several memory chunks.
ChunkPacket & merge(ChunkPacket &packet, OsiLayer from, OsiLayer to)
ByteBufferConvertible & layer(OsiLayer ol)
void set_boundary(OsiLayer, unsigned bytes)
void trim(OsiLayer from, unsigned bytes)
UpPacketPtr finish() override
UpPacketPtr finish() override
UpPacketPtr finish() override
UpPacketPtr finish() override