STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
IpFromMac.cpp
Go to the documentation of this file.
1#include "util/IpFromMac.hpp"
2
3#include <sstream>
4#include <string>
5
6namespace fsw {
7namespace util {
8
9std::string calculate_ip_from_mac(const std::string& mac_address, const std::string& base_ip,
10 uint8_t ip_range_start, uint8_t ip_range_end) {
11 std::istringstream mac_stream(mac_address);
12 std::string byte_str;
13 uint32_t mac_hash = 0;
14 int byte_count = 0;
15
16 while (std::getline(mac_stream, byte_str, ':') && byte_count < 6) {
17 uint8_t byte_val = static_cast<uint8_t>(std::stoul(byte_str, nullptr, 16));
18 mac_hash = (mac_hash << 8) | byte_val;
19 byte_count++;
20 }
21
22 const uint32_t span =
23 static_cast<uint32_t>(ip_range_end) - static_cast<uint32_t>(ip_range_start) + 1u;
24 uint8_t ip_octet = static_cast<uint8_t>(ip_range_start + (span > 0 ? (mac_hash % span) : 0));
25
26 size_t last_dot = base_ip.rfind('.');
27 std::string base = last_dot != std::string::npos ? base_ip.substr(0, last_dot) : base_ip;
28
29 return base + "." + std::to_string(ip_octet);
30}
31
32} // namespace util
33} // namespace fsw
std::string calculate_ip_from_mac(const std::string &mac_address, const std::string &base_ip, uint8_t ip_range_start, uint8_t ip_range_end)
Deterministic last-octet from MAC string "aa:bb:cc:dd:ee:ff" into base_ip range.
Definition IpFromMac.cpp:9
Motorized ball valve position: raw ADC counts -> % open.