11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
22PROMEKI_NAMESPACE_BEGIN
55 PROMEKI_DATATYPE(MacAddress, DataTypeMacAddress, 1)
58 Error writeToStream(DataStream &s) const;
60 template <uint32_t V> static Result<MacAddress> readFromStream(DataStream &s);
63 using DataFormat = Array<uint8_t, 6>;
66 using List = ::promeki::List<MacAddress>;
79 static Result<MacAddress> fromString(const String &str);
82 static MacAddress broadcast();
95 static MacAddress fromIpv4Multicast(const Ipv4Address &addr);
107 static MacAddress fromIpv6Multicast(const Ipv6Address &addr);
110 MacAddress() : _addr{} {}
116 explicit MacAddress(
const DataFormat &bytes) : _addr(bytes) {}
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}} {}
131 bool isNull()
const {
return _addr.isZero(); }
141 bool isBroadcast()
const {
142 for (
size_t i = 0; i < 6; ++i) {
143 if (_addr[i] != 0xFF)
return false;
157 bool isMulticast()
const {
return (_addr[0] & 0x01) != 0; }
166 bool isGroupMulticast()
const {
return isMulticast() && !isBroadcast(); }
175 bool isIpv4Multicast()
const {
176 return _addr[0] == 0x01 && _addr[1] == 0x00 && _addr[2] == 0x5E && (_addr[3] & 0x80) == 0;
185 bool isIpv6Multicast()
const {
return _addr[0] == 0x33 && _addr[1] == 0x33; }
192 bool isUnicast()
const {
return !isMulticast(); }
200 bool isLocallyAdministered()
const {
return (_addr[0] & 0x02) != 0; }
206 const DataFormat &data()
const {
return _addr; }
212 const uint8_t *raw()
const {
return _addr.data(); }
219 uint8_t octet(
int index)
const {
220 if (index < 0 || index > 5)
return 0;
228 String toString()
const;
235 String toString(
char separator)
const;
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;
251TextStream &operator<<(TextStream &stream,
const MacAddress &addr);
255PROMEKI_FORMAT_VIA_TOSTRING(promeki::MacAddress);