Communication Library for Autonomous Systems v1.0
Reliable and secure communication library for autonomous vehicle systems
Loading...
Searching...
No Matches
leaderKeyStorage.h
Go to the documentation of this file.
1#ifndef LEADER_KEY_STORAGE_H
2#define LEADER_KEY_STORAGE_H
3
4#include <mutex>
5#include <array>
6#include <atomic>
7#include <chrono>
8#include <cstdint>
9#include <cstdio>
11#include "api/util/debug.h"
12#include "api/traits.h"
13
14// Define MAC key type
15using MacKeyType = std::array<uint8_t, 16>;
16
26public:
30 void setGroupMacKey(const MacKeyType& key);
32 std::chrono::steady_clock::time_point getLastUpdateTime() const;
33
34private:
36 ~LeaderKeyStorage() = default;
37 LeaderKeyStorage(const LeaderKeyStorage&) = delete;
38 LeaderKeyStorage& operator=(const LeaderKeyStorage&) = delete;
39
40 mutable std::mutex _mutex;
41 Ethernet::Address _current_leader_id;
42 MacKeyType _current_group_mac_key;
43 std::atomic<std::chrono::steady_clock::time_point> _last_update_time;
44};
45
46// Implementation
47
55 static LeaderKeyStorage instance;
56 return instance;
57}
58
66 std::lock_guard<std::mutex> lock(_mutex);
67 if (_current_leader_id != leader_id) {
68 db<LeaderKeyStorage>(INF) << "LeaderKeyStorage: Leader changed from "
69 << Ethernet::mac_to_string(_current_leader_id) << " to "
71 _current_leader_id = leader_id;
72 _last_update_time.store(std::chrono::steady_clock::now(), std::memory_order_release);
73 }
74}
75
83 std::lock_guard<std::mutex> lock(_mutex);
84 return _current_leader_id;
85}
86
94 std::lock_guard<std::mutex> lock(_mutex);
95 if (_current_group_mac_key != key) {
96 // Debug logging: Show old and new keys
97 std::string old_key_hex = "";
98 for (size_t i = 0; i < 16; ++i) {
99 char hex_byte[4];
100 snprintf(hex_byte, sizeof(hex_byte), "%02X ", _current_group_mac_key[i]);
102 }
103 std::string new_key_hex = "";
104 for (size_t i = 0; i < 16; ++i) {
105 char hex_byte[4];
106 snprintf(hex_byte, sizeof(hex_byte), "%02X ", key[i]);
108 }
109
110 db<LeaderKeyStorage>(INF) << "LeaderKeyStorage: Group MAC key updated\n";
111 db<LeaderKeyStorage>(INF) << "LeaderKeyStorage: Old key: " << old_key_hex << "\n";
112 db<LeaderKeyStorage>(INF) << "LeaderKeyStorage: New key: " << new_key_hex << "\n";
113 _current_group_mac_key = key;
114 _last_update_time.store(std::chrono::steady_clock::now(), std::memory_order_release);
115 }
116}
117
125 std::lock_guard<std::mutex> lock(_mutex);
126
127 // Debug logging: Show the key being retrieved
128 std::string key_hex = "";
129 for (size_t i = 0; i < 16; ++i) {
130 char hex_byte[4];
131 snprintf(hex_byte, sizeof(hex_byte), "%02X ", _current_group_mac_key[i]);
132 key_hex += hex_byte;
133 }
134 db<LeaderKeyStorage>(TRC) << "LeaderKeyStorage: Retrieved key: " << key_hex << "\n";
135
136 return _current_group_mac_key;
137}
138
145inline std::chrono::steady_clock::time_point LeaderKeyStorage::getLastUpdateTime() const {
146 return _last_update_time.load(std::memory_order_acquire);
147}
148
149inline LeaderKeyStorage::LeaderKeyStorage() :
150 _current_leader_id(Ethernet::NULL_ADDRESS),
151 _last_update_time(std::chrono::steady_clock::now()) {
152 _current_group_mac_key.fill(0);
153 db<LeaderKeyStorage>(INF) << "LeaderKeyStorage: Initialized\n";
154}
155
156#endif // LEADER_KEY_STORAGE_H
Definition ethernet.h:9
static std::string mac_to_string(Address addr)
Definition ethernet.h:36
Thread-safe singleton for leader key storage.
Definition leaderKeyStorage.h:25
MacKeyType getGroupMacKey() const
Get the current group MAC key.
Definition leaderKeyStorage.h:124
void setLeaderId(const Ethernet::Address &leader_id)
Set the current leader ID.
Definition leaderKeyStorage.h:65
std::chrono::steady_clock::time_point getLastUpdateTime() const
Get the last update time.
Definition leaderKeyStorage.h:145
static LeaderKeyStorage & getInstance()
Get the singleton instance.
Definition leaderKeyStorage.h:54
Ethernet::Address getLeaderId() const
Get the current leader ID.
Definition leaderKeyStorage.h:82
void setGroupMacKey(const MacKeyType &key)
Set the current group MAC key.
Definition leaderKeyStorage.h:93
@ INF
Definition debug.h:208
Select_Debug<(Traits< T >::debugged &&Traits< Debug >::error)> db(Debug_Error l)
Definition debug.h:166
@ TRC
Definition debug.h:231
std::array< uint8_t, 16 > MacKeyType
Definition leaderKeyStorage.h:15
Definition ethernet.h:16