Vanetza
 
Loading...
Searching...
No Matches
cam_ssp.cpp
1#include <vanetza/security/cam_ssp.hpp>
2#include <boost/format.hpp>
3
4namespace vanetza
5{
6namespace security
7{
8
9CamPermissions::CamPermissions() : m_bits(0)
10{
11}
12
13CamPermissions::CamPermissions(CamPermission cp) : m_bits(static_cast<value_type>(cp))
14{
15}
16
17CamPermissions::CamPermissions(const std::initializer_list<CamPermission>& cps) : m_bits(0)
18{
19 for (CamPermission cp : cps) {
20 add(cp);
21 }
22}
23
24bool CamPermissions::has(CamPermission cp) const
25{
26 const auto cp_raw = static_cast<value_type>(cp);
27 return (m_bits & cp_raw) == cp_raw;
28}
29
30bool CamPermissions::has(const std::initializer_list<CamPermission>& cps) const
31{
32 for (CamPermission cp : cps) {
33 if (!has(cp)) return false;
34 }
35 return true;
36}
37
38bool CamPermissions::has(const CamPermissions& required) const
39{
40 return (m_bits & required.m_bits) == required.m_bits;
41}
42
43bool CamPermissions::none() const
44{
45 return m_bits == 0;
46}
47
48std::set<CamPermission> CamPermissions::permissions() const
49{
50 std::set<CamPermission> perms;
51
52 std::underlying_type<CamPermission>::type bit = 1;
53 for (unsigned i = 1; i < sizeof(bit) * 8; ++i) {
54 CamPermission permission = static_cast<CamPermission>(bit);
55 if (has(permission)) {
56 perms.insert(permission);
57 }
58 bit <<= 1;
59 }
60
61 return perms;
62}
63
64CamPermissions& CamPermissions::add(CamPermission cp)
65{
66 m_bits |= static_cast<value_type>(cp);
67 return *this;
68}
69
70CamPermissions& CamPermissions::remove(CamPermission cp)
71{
72 m_bits &= ~static_cast<value_type>(cp);
73 return *this;
74}
75
76ByteBuffer CamPermissions::encode() const
77{
78 return ByteBuffer({1, static_cast<uint8_t>(m_bits), static_cast<uint8_t>(m_bits >> 8) });
79}
80
81CamPermissions CamPermissions::decode(const ByteBuffer& buffer)
82{
83 CamPermissions permissions;
84 if (buffer.size() == 3 && buffer[0] == 1) {
85 permissions.m_bits = buffer[2];
86 permissions.m_bits <<= 8;
87 permissions.m_bits |= buffer[1];
88 }
89 return permissions;
90}
91
92std::string stringify(CamPermission permission)
93{
94 std::string result;
95 switch (permission) {
96 case CamPermission::CEN_DSRC_Tolling_Zone:
97 result = "CEN DSRC Tolling Zone";
98 break;
99 case CamPermission::Public_Transport:
100 result = "Public Transport";
101 break;
102 case CamPermission::Special_Transport:
103 result = "Special Transport";
104 break;
105 case CamPermission::Dangerous_Goods:
106 result = "Dangerous Goods";
107 break;
108 case CamPermission::Roadwork:
109 result = "Roadwork";
110 break;
111 case CamPermission::Rescue:
112 result = "Rescue";
113 break;
114 case CamPermission::Emergency:
115 result = "Emergency";
116 break;
117 case CamPermission::Safety_Car:
118 // everybody should have an AMG GT S Safety Car ;-)
119 result = "Safety Car";
120 break;
121 case CamPermission::Closed_Lanes:
122 result = "Closed Lanes";
123 break;
124 case CamPermission::Request_For_Right_Of_Way:
125 result = "Request for Right of Way";
126 break;
127 case CamPermission::Request_For_Free_Crossing_At_Traffic_Light:
128 result = "Request for Free Crossing at Traffic Light";
129 break;
130 case CamPermission::No_Passing:
131 result = "No Passing";
132 break;
133 case CamPermission::No_Passing_For_Trucks:
134 result = "No Passing for Trucks";
135 break;
136 case CamPermission::Speed_Limit:
137 result = "Speed Limit";
138 break;
139 default:
140 static_assert(sizeof(CamPermission) == 2, "Expected CamPermission to be 2 bytes wide");
141 result = str(boost::format("Reserved (%0#6x)") % static_cast<uint16_t>(permission));
142 break;
143 }
144 return result;
145}
146
147} // namespace security
148} // namespace vanetza