diff --git a/CMakeLists.txt b/CMakeLists.txt index 3a2b175..fca7680 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ set(headers src/asyncudplistener.h src/espcrc32builder.h + src/espnetworkutils.h src/esprandom.h src/lockhelper.h src/lockingqueue.h diff --git a/src/asyncudplistener.cpp b/src/asyncudplistener.cpp index 81cb998..6c63ade 100644 --- a/src/asyncudplistener.cpp +++ b/src/asyncudplistener.cpp @@ -111,7 +111,7 @@ UdpPacketWrapper::UdpPacketWrapper(pbuf *pb, const ip_addr_t *raddr, uint16_t rp std::memcpy(&_localIp.u_addr.ip6.addr, (uint8_t *)ip6hdr->dest.addr, 16); std::memcpy(&_remoteIp.u_addr.ip6.addr, (uint8_t *)ip6hdr->src.addr, 16); } - std::memcpy(_remoteMac, eth->src.addr, 6); + _remoteMac = mac_t{eth->src.addr}; struct netif *netif{NULL}; void *nif{NULL}; diff --git a/src/asyncudplistener.h b/src/asyncudplistener.h index b0c93f4..64df94f 100644 --- a/src/asyncudplistener.h +++ b/src/asyncudplistener.h @@ -15,6 +15,7 @@ // local includes #include "cppmacros.h" #include "delayedconstruction.h" +#include "espnetworkutils.h" #include "wrappers/queue.h" namespace espcpputils { @@ -25,7 +26,7 @@ class UdpPacketWrapper public: UdpPacketWrapper(pbuf *pb, const ip_addr_t *addr, uint16_t port, struct netif * netif); - const uint8_t * data() const { return _data; } + const uint8_t *data() const { return _data; } size_t length() const { return _len; } bool isBroadcast() const { @@ -71,7 +72,7 @@ public: uint16_t remotePort() const { return _remotePort; } - void remoteMac(uint8_t * mac) const { std::memcpy(mac, _remoteMac, 6); } + mac_t remoteMac() const { return _remoteMac; } private: const pbuf *_pb; @@ -80,7 +81,7 @@ private: uint16_t _localPort; ip_addr_t _remoteIp; uint16_t _remotePort; - uint8_t _remoteMac[6]; + mac_t _remoteMac; const uint8_t *_data; size_t _len; size_t _index; diff --git a/src/espnetworkutils.h b/src/espnetworkutils.h new file mode 100644 index 0000000..c4b5eef --- /dev/null +++ b/src/espnetworkutils.h @@ -0,0 +1,25 @@ +#pragma once + +// system includes +#include +#include + +namespace espcpputils { +class mac_t : public std::array +{ +public: + using std::array::array; + + explicit mac_t(const uint8_t *ptr) + { + std::copy(ptr, ptr+6, std::begin(*this)); + } + + std::string toString() const + { + char macStr[18]{0}; + snprintf(macStr, 18, "%02X:%02X:%02X:%02X:%02X:%02X", at(0), at(1), at(2), at(3), at(4), at(5)); + return std::string{macStr}; + } +}; +} // namespace