roo_io
API Documentation for roo_io
Loading...
Searching...
No Matches
mac_address.cpp
Go to the documentation of this file.
2
3#include <cstring>
4
6
7namespace roo_io {
8
9#if (defined UINT8_MAX)
10MacAddress::MacAddress(unsigned char a0, unsigned char a1, unsigned char a2,
11 unsigned char a3, unsigned char a4, unsigned char a5) {
12 addr_[0] = (roo_io::byte)a0;
13 addr_[1] = (roo_io::byte)a1;
14 addr_[2] = (roo_io::byte)a2;
15 addr_[3] = (roo_io::byte)a3;
16 addr_[4] = (roo_io::byte)a4;
17 addr_[5] = (roo_io::byte)a5;
18}
19#endif
20
22 static MacAddress broadcast(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF);
23 return broadcast;
24}
25
26bool operator==(const MacAddress& a, const MacAddress& b) {
27 return memcmp(a.asBytes(), b.asBytes(), 6) == 0;
28}
29
30bool operator!=(const MacAddress& a, const MacAddress& b) {
31 return memcmp(a.asBytes(), b.asBytes(), 6) != 0;
32}
33
34bool operator<(const MacAddress& a, const MacAddress& b) {
35 return memcmp(a.asBytes(), b.asBytes(), 6) < 0;
36}
37
38bool operator>(const MacAddress& a, const MacAddress& b) {
39 return memcmp(a.asBytes(), b.asBytes(), 6) > 0;
40}
41
42bool operator<=(const MacAddress& a, const MacAddress& b) {
43 return memcmp(a.asBytes(), b.asBytes(), 6) <= 0;
44}
45
46bool operator>=(const MacAddress& a, const MacAddress& b) {
47 return memcmp(a.asBytes(), b.asBytes(), 6) >= 0;
48}
49
50roo_logging::Stream& operator<<(roo_logging::Stream& s,
51 const MacAddress& addr) {
52 const byte* data = addr.asBytes();
53 s.printf("%02X-%02X-%02X-%02X-%02X-%02X", (int)data[0], (int)data[1],
54 (int)data[2], (int)data[3], (int)data[4], (int)data[5]);
55 return s;
56}
57
58std::string MacAddress::asString() const {
59 return StringPrintf("%02X-%02X-%02X-%02X-%02X-%02X", (int)addr_[0],
60 (int)addr_[1], (int)addr_[2], (int)addr_[3],
61 (int)addr_[4], (int)addr_[5]);
62}
63
64void MacAddress::writeStringTo(char* buf) const {
65 sprintf(buf, "%02X-%02X-%02X-%02X-%02X-%02X", (int)addr_[0], (int)addr_[1],
66 (int)addr_[2], (int)addr_[3], (int)addr_[4], (int)addr_[5]);
67}
68
70 return (((uint64_t)addr_[0]) << 40) | (((uint64_t)addr_[1]) << 32) |
71 (((uint64_t)addr_[2]) << 24) | (((uint64_t)addr_[3]) << 16) |
72 (((uint64_t)addr_[4]) << 8) | (((uint64_t)addr_[5]) << 0);
73}
74
76 if ((addr & 0xFFFF000000000000LL) != 0) return false;
77 *this = MacAddress(addr >> 40, addr >> 32, addr >> 24, addr >> 16, addr >> 8,
78 addr >> 0);
79 return true;
80}
81
82namespace {
83
84bool parseHexDigit(char ch, uint8_t& result) {
85 if (ch >= '0' && ch <= '9') {
86 result = ch - '0';
87 return true;
88 }
89 if (ch >= 'A' && ch <= 'F') {
90 result = ch - 'A' + 10;
91 return true;
92 }
93 if (ch >= 'a' && ch <= 'f') {
94 result = ch - 'a' + 10;
95 return true;
96 }
97 return false;
98}
99
100} // namespace
101
102bool MacAddress::parseFrom(const char* rep) {
103 if (strlen(rep) < 17) return false;
104 roo_io::byte raw[6];
105 int pos = 0;
106 while (pos < 6) {
107 if (pos > 0) {
108 if (*rep++ != '-') return false;
109 }
110 uint8_t hi, lo;
111 if (!parseHexDigit(*rep++, hi)) return false;
112 if (!parseHexDigit(*rep++, lo)) return false;
113 raw[pos] = roo_io::byte{hi} << 4 | roo_io::byte{lo};
114 ++pos;
115 }
116 *this = MacAddress(raw);
117 return true;
118}
119
120void MacAddress::writeTo(byte* buf) const { memcpy(buf, addr_, 6); }
121
122} // namespace roo_io
bool parseFrom(const char *rep)
uint64_t asU64() const
void writeStringTo(char *buf) const
void writeTo(byte *buf) const
std::string asString() const
bool assignFromU64(uint64_t addr)
static const MacAddress & Broadcast()
Definition byte.h:6
roo::basic_string_view< CharT, Traits > basic_string_view
Definition string_view.h:8
roo_logging::Stream & operator<<(roo_logging::Stream &s, const MacAddress &addr)
bool operator>(const MacAddress &a, const MacAddress &b)
bool operator==(const MacAddress &a, const MacAddress &b)
bool operator!=(const MacAddress &a, const MacAddress &b)
bool operator<(const MacAddress &a, const MacAddress &b)
std::string StringPrintf(const char *format,...)
roo::byte byte
Definition byte.h:8
bool operator<=(const MacAddress &a, const MacAddress &b)
bool operator>=(const MacAddress &a, const MacAddress &b)