Vanetza
 
Loading...
Searching...
No Matches
basic_header.cpp
1#include <vanetza/geonet/basic_header.hpp>
2#include <vanetza/geonet/data_request.hpp>
3#include <vanetza/geonet/serialization.hpp>
4
5namespace vanetza
6{
7namespace geonet
8{
9
10constexpr std::size_t BasicHeader::length_bytes;
11
12BasicHeader::BasicHeader() :
13 version(0),
14 next_header(NextHeaderBasic::Any),
15 reserved(0),
16 hop_limit(0)
17{
18}
19
20BasicHeader::BasicHeader(const MIB& mib) :
21 version(mib.itsGnProtocolVersion),
22 next_header(NextHeaderBasic::Any),
23 reserved(0),
24 lifetime(mib.itsGnDefaultPacketLifetime),
25 hop_limit(mib.itsGnDefaultHopLimit)
26{
27}
28
29BasicHeader::BasicHeader(const DataRequest& request, const MIB& mib) :
30 BasicHeader(mib)
31{
32 if (mib.itsGnSecurity) {
33 next_header = NextHeaderBasic::Secured;
34 } else {
35 next_header = NextHeaderBasic::Common;
36 }
37
38 lifetime = request.maximum_lifetime;
39 hop_limit = request.max_hop_limit;
40}
41
42BasicHeader::BasicHeader(const ShbDataRequest& request, const MIB& mib) :
43 BasicHeader(static_cast<const DataRequest&>(request), mib)
44{
45 hop_limit = 1;
46}
47
48void serialize(const BasicHeader& hdr, OutputArchive& ar)
49{
50 uint8_t versionAndNextHeader = hdr.version.raw();
51 versionAndNextHeader <<= 4;
52 versionAndNextHeader |= static_cast<uint8_t>(hdr.next_header) & 0x0f;
53 serialize(host_cast(versionAndNextHeader), ar);
54 serialize(host_cast(hdr.reserved), ar);
55 serialize(hdr.lifetime, ar);
56 serialize(host_cast(hdr.hop_limit), ar);
57}
58
59void deserialize(BasicHeader& hdr, InputArchive& ar)
60{
61 uint8_t versionAndNextHeader;
62 deserialize(versionAndNextHeader, ar);
63 hdr.version = versionAndNextHeader >> 4;
64 hdr.next_header = static_cast<NextHeaderBasic>(versionAndNextHeader & 0x0f);
65 deserialize(hdr.reserved, ar);
66 deserialize(hdr.lifetime, ar);
67 deserialize(hdr.hop_limit, ar);
68}
69
70} // namespace geonet
71} // namespace vanetza