Vanetza
 
Loading...
Searching...
No Matches
packet_variant.cpp
1#include "packet_variant.hpp"
2#include <boost/variant.hpp>
3
4namespace vanetza
5{
6
7byte_view_range create_byte_view(const ChunkPacket& packet, OsiLayer layer)
8{
9 return create_byte_view(packet[layer]);
10}
11
12byte_view_range create_byte_view(const CohesivePacket& packet, OsiLayer layer)
13{
14 CohesivePacket::buffer_const_range range = packet[layer];
15 return byte_view_range { range.begin(), range.end() };
16}
17
18byte_view_range create_byte_view(const ChunkPacket& packet, OsiLayer from, OsiLayer to)
19{
20 ByteBuffer buffer_range;
21 for (auto layer : osi_layer_range(from, to)) {
22 ByteBuffer buffer_layer;
23 packet[layer].convert(buffer_layer); // convert clears passed buffer (does not append)
24 buffer_range.insert(buffer_range.end(), buffer_layer.begin(), buffer_layer.end());
25 }
26 return create_byte_view(std::move(buffer_range));
27}
28
29byte_view_range create_byte_view(const CohesivePacket& packet, OsiLayer from, OsiLayer to)
30{
31 ByteBuffer::const_iterator from_begin = packet[from].begin();
32 ByteBuffer::const_iterator to_end = packet[to].end();
33 return byte_view_range(from_begin, to_end);
34}
35
36
37void serialize(OutputArchive& oa, const ChunkPacket& packet)
38{
39 ByteBuffer buf;
40 for (auto layer : osi_layers) {
41 buf.clear();
42 packet[layer].convert(buf);
43 oa.save_binary(buf.data(), buf.size());
44 }
45}
46
47void serialize(OutputArchive& oa, const CohesivePacket& packet)
48{
49 oa.save_binary(packet.buffer().data(), packet.buffer().size());
50}
51
52} // namespace vanetza
53
54namespace boost
55{
56
57using namespace vanetza;
58
59std::size_t size(const PacketVariant& packet, OsiLayer layer)
60{
61 struct size_visitor : public boost::static_visitor<std::size_t>
62 {
63 size_visitor(OsiLayer layer) : m_layer(layer) {}
64
65 std::size_t operator()(const CohesivePacket& packet)
66 {
67 return size(packet, m_layer);
68 }
69
70 std::size_t operator()(const ChunkPacket& packet)
71 {
72 return size(packet, m_layer);
73 }
74
75 OsiLayer m_layer;
76 };
77
78 size_visitor visitor(layer);
79 return boost::apply_visitor(visitor, packet);
80}
81
82std::size_t size(const PacketVariant& packet, OsiLayer from, OsiLayer to)
83{
84 struct size_visitor : public boost::static_visitor<std::size_t>
85 {
86 size_visitor(OsiLayer from, OsiLayer to) : m_from(from), m_to(to) {}
87
88 std::size_t operator()(const CohesivePacket& packet)
89 {
90 return size(packet, m_from, m_to);
91 }
92
93 std::size_t operator()(const ChunkPacket& packet)
94 {
95 return size(packet, m_from, m_to);
96 }
97
98 OsiLayer m_from;
99 OsiLayer m_to;
100 };
101
102 size_visitor visitor(from, to);
103 return boost::apply_visitor(visitor, packet);
104}
105
106std::size_t size(const PacketVariant& packet)
107{
108 struct size_visitor : public boost::static_visitor<std::size_t>
109 {
110 std::size_t operator()(const CohesivePacket& packet)
111 {
112 return packet.size();
113 }
114
115 std::size_t operator()(const ChunkPacket& packet)
116 {
117 return packet.size();
118 }
119 };
120
121 size_visitor visitor;
122 return boost::apply_visitor(visitor, packet);
123}
124
125byte_view_range create_byte_view(const PacketVariant& packet, OsiLayer layer)
126{
127 struct payload_visitor : public boost::static_visitor<byte_view_range>
128 {
129 payload_visitor(OsiLayer layer) : m_layer(layer) {}
130
131 byte_view_range operator()(const CohesivePacket& packet)
132 {
133 return create_byte_view(packet, m_layer);
134 }
135
136 byte_view_range operator()(const ChunkPacket& packet)
137 {
138 return create_byte_view(packet, m_layer);
139 }
140
141 OsiLayer m_layer;
142 };
143
144 payload_visitor visitor(layer);
145 return boost::apply_visitor(visitor, packet);
146}
147
148byte_view_range create_byte_view(const PacketVariant& packet, OsiLayer from, OsiLayer to)
149{
150 struct payload_visitor : public boost::static_visitor<byte_view_range>
151 {
152 payload_visitor(OsiLayer from, OsiLayer to) : m_from(from), m_to(to) {}
153
154 byte_view_range operator()(const CohesivePacket& packet)
155 {
156 return create_byte_view(packet, m_from, m_to);
157 }
158
159 byte_view_range operator()(const ChunkPacket& packet)
160 {
161 return create_byte_view(packet, m_from, m_to);
162 }
163
164 OsiLayer m_from;
165 OsiLayer m_to;
166 };
167
168 payload_visitor visitor(from, to);
169 return boost::apply_visitor(visitor, packet);
170}
171
172void serialize(OutputArchive& ar, const PacketVariant& packet)
173{
174 struct serialize_visitor : public boost::static_visitor<>
175 {
176 serialize_visitor(OutputArchive& _oa) : oa(_oa) {}
177
178 void operator()(const ChunkPacket& packet)
179 {
180 serialize(oa, packet);
181 }
182
183 void operator()(const CohesivePacket& packet)
184 {
185 serialize(oa, packet);
186 }
187
188 OutputArchive& oa;
189 };
190
191 serialize_visitor visitor(ar);
192 boost::apply_visitor(visitor, packet);
193}
194
195} // namespace boost
ChunckPacket is a packet consisting of several memory chunks.
std::size_t size() const
std::size_t size() const