libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
macaddress.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <cstdint>
14#include <cstring>
15#include <promeki/namespace.h>
16#include <promeki/string.h>
17#include <promeki/result.h>
18#include <promeki/array.h>
19#include <promeki/list.h>
20#include <promeki/datatype.h>
21
22PROMEKI_NAMESPACE_BEGIN
23
24class Ipv4Address;
25class Ipv6Address;
26class MacAddress;
27class TextStream;
28class DataStream;
29
53class MacAddress {
54 public:
55 PROMEKI_DATATYPE(MacAddress, DataTypeMacAddress, 1)
56
57
58 Error writeToStream(DataStream &s) const;
60 template <uint32_t V> static Result<MacAddress> readFromStream(DataStream &s);
61
63 using DataFormat = Array<uint8_t, 6>;
64
66 using List = ::promeki::List<MacAddress>;
67
79 static Result<MacAddress> fromString(const String &str);
80
82 static MacAddress broadcast();
83
95 static MacAddress fromIpv4Multicast(const Ipv4Address &addr);
96
107 static MacAddress fromIpv6Multicast(const Ipv6Address &addr);
108
110 MacAddress() : _addr{} {}
111
116 explicit MacAddress(const DataFormat &bytes) : _addr(bytes) {}
117
127 MacAddress(uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t e, uint8_t f)
128 : _addr{DataFormat{a, b, c, d, e, f}} {}
129
131 bool isNull() const { return _addr.isZero(); }
132
141 bool isBroadcast() const {
142 for (size_t i = 0; i < 6; ++i) {
143 if (_addr[i] != 0xFF) return false;
144 }
145 return true;
146 }
147
157 bool isMulticast() const { return (_addr[0] & 0x01) != 0; }
158
166 bool isGroupMulticast() const { return isMulticast() && !isBroadcast(); }
167
175 bool isIpv4Multicast() const {
176 return _addr[0] == 0x01 && _addr[1] == 0x00 && _addr[2] == 0x5E && (_addr[3] & 0x80) == 0;
177 }
178
185 bool isIpv6Multicast() const { return _addr[0] == 0x33 && _addr[1] == 0x33; }
186
192 bool isUnicast() const { return !isMulticast(); }
193
200 bool isLocallyAdministered() const { return (_addr[0] & 0x02) != 0; }
201
206 const DataFormat &data() const { return _addr; }
207
212 const uint8_t *raw() const { return _addr.data(); }
213
219 uint8_t octet(int index) const {
220 if (index < 0 || index > 5) return 0;
221 return _addr[index];
222 }
223
228 String toString() const;
229
235 String toString(char separator) const;
236
238 bool operator==(const MacAddress &other) const { return _addr == other._addr; }
240 bool operator!=(const MacAddress &other) const { return _addr != other._addr; }
242 bool operator<(const MacAddress &other) const {
243 return std::memcmp(_addr.data(), other._addr.data(), 6) < 0;
244 }
245
246 private:
247 DataFormat _addr;
248};
249
251TextStream &operator<<(TextStream &stream, const MacAddress &addr);
252
253PROMEKI_NAMESPACE_END
254
255PROMEKI_FORMAT_VIA_TOSTRING(promeki::MacAddress);
256
257#endif // PROMEKI_ENABLE_CORE