From: Remi Gacogne Date: Tue, 27 Sep 2022 12:20:41 +0000 (+0200) Subject: dnsdist: Add a dnsdist::MacAddress type X-Git-Tag: rec-4.9.0-alpha0~9^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F12001%2Fhead;p=thirdparty%2Fpdns.git dnsdist: Add a dnsdist::MacAddress type --- diff --git a/pdns/dnsdist-lua-actions.cc b/pdns/dnsdist-lua-actions.cc index f94a42119f..b348e0ab6a 100644 --- a/pdns/dnsdist-lua-actions.cc +++ b/pdns/dnsdist-lua-actions.cc @@ -933,14 +933,14 @@ public: DNSAction::Action operator()(DNSQuestion* dq, std::string* ruleresult) const override { - char mac[6]; - int res = dnsdist::MacAddressesCache::get(*dq->remote, mac, sizeof(mac)); + dnsdist::MacAddress mac; + int res = dnsdist::MacAddressesCache::get(*dq->remote, mac.data(), mac.size()); if (res != 0) { return Action::None; } std::string optRData; - generateEDNSOption(d_code, mac, optRData); + generateEDNSOption(d_code, reinterpret_cast(mac.data()), optRData); if (dq->getHeader()->arcount) { bool ednsAdded = false; diff --git a/pdns/dnsdist-rings.hh b/pdns/dnsdist-rings.hh index c0b058f853..6bd93afb7d 100644 --- a/pdns/dnsdist-rings.hh +++ b/pdns/dnsdist-rings.hh @@ -46,7 +46,7 @@ struct Rings { // incoming protocol dnsdist::Protocol protocol; #if defined(DNSDIST_RINGS_WITH_MACADDRESS) - char macaddress[6]; + dnsdist::MacAddress macaddress; bool hasmac{false}; #endif }; @@ -104,9 +104,9 @@ struct Rings { void insertQuery(const struct timespec& when, const ComboAddress& requestor, const DNSName& name, uint16_t qtype, uint16_t size, const struct dnsheader& dh, dnsdist::Protocol protocol) { #if defined(DNSDIST_RINGS_WITH_MACADDRESS) - char macaddress[6]; + dnsdist::MacAddress macaddress; bool hasmac{false}; - if (dnsdist::MacAddressesCache::get(requestor, macaddress, sizeof(macaddress)) == 0) { + if (dnsdist::MacAddressesCache::get(requestor, macaddress.data(), macaddress.size()) == 0) { hasmac = true; } #endif @@ -115,7 +115,7 @@ struct Rings { auto lock = shard->queryRing.try_lock(); if (lock.owns_lock()) { #if defined(DNSDIST_RINGS_WITH_MACADDRESS) - insertQueryLocked(*lock, when, requestor, name, qtype, size, dh, protocol, macaddress, sizeof(macaddress), hasmac); + insertQueryLocked(*lock, when, requestor, name, qtype, size, dh, protocol, macaddress, hasmac); #else insertQueryLocked(*lock, when, requestor, name, qtype, size, dh, protocol); #endif @@ -133,7 +133,7 @@ struct Rings { auto& shard = getOneShard(); auto lock = shard->queryRing.lock(); #if defined(DNSDIST_RINGS_WITH_MACADDRESS) - insertQueryLocked(*lock, when, requestor, name, qtype, size, dh, protocol, macaddress, sizeof(macaddress), hasmac); + insertQueryLocked(*lock, when, requestor, name, qtype, size, dh, protocol, macaddress, hasmac); #else insertQueryLocked(*lock, when, requestor, name, qtype, size, dh, protocol); #endif @@ -217,7 +217,7 @@ private: } #if defined(DNSDIST_RINGS_WITH_MACADDRESS) - void insertQueryLocked(boost::circular_buffer& ring, const struct timespec& when, const ComboAddress& requestor, const DNSName& name, uint16_t qtype, uint16_t size, const struct dnsheader& dh, dnsdist::Protocol protocol, const char* macaddress, size_t maclen, const bool hasmac) + void insertQueryLocked(boost::circular_buffer& ring, const struct timespec& when, const ComboAddress& requestor, const DNSName& name, uint16_t qtype, uint16_t size, const struct dnsheader& dh, dnsdist::Protocol protocol, const dnsdist::MacAddress& macaddress, const bool hasmac) #else void insertQueryLocked(boost::circular_buffer& ring, const struct timespec& when, const ComboAddress& requestor, const DNSName& name, uint16_t qtype, uint16_t size, const struct dnsheader& dh, dnsdist::Protocol protocol) #endif @@ -226,9 +226,9 @@ private: d_nbQueryEntries++; } #if defined(DNSDIST_RINGS_WITH_MACADDRESS) - Rings::Query query{requestor, name, when, dh, size, qtype, protocol, "", hasmac}; + Rings::Query query{requestor, name, when, dh, size, qtype, protocol, dnsdist::MacAddress{""}, hasmac}; if (hasmac) { - memcpy(query.macaddress, macaddress, maclen); + memcpy(query.macaddress.data(), macaddress.data(), macaddress.size()); } ring.push_back(std::move(query)); #else diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi.cc b/pdns/dnsdistdist/dnsdist-lua-ffi.cc index 1b4c6ce479..6bdbc116d1 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi.cc +++ b/pdns/dnsdistdist/dnsdist-lua-ffi.cc @@ -64,7 +64,7 @@ size_t dnsdist_ffi_dnsquestion_get_mac_addr(const dnsdist_ffi_dnsquestion_t* dq, return 0; } - auto ret = dnsdist::MacAddressesCache::get(*dq->dq->remote, reinterpret_cast(buffer), bufferSize); + auto ret = dnsdist::MacAddressesCache::get(*dq->dq->remote, reinterpret_cast(buffer), bufferSize); if (ret != 0) { return 0; } diff --git a/pdns/dnsdistdist/dnsdist-mac-address.cc b/pdns/dnsdistdist/dnsdist-mac-address.cc index 6f87b6603f..20a7245a9f 100644 --- a/pdns/dnsdistdist/dnsdist-mac-address.cc +++ b/pdns/dnsdistdist/dnsdist-mac-address.cc @@ -27,7 +27,7 @@ namespace dnsdist { LockGuarded> MacAddressesCache::s_cache; -int MacAddressesCache::get(const ComboAddress& ca, char* dest, size_t destLen) +int MacAddressesCache::get(const ComboAddress& ca, unsigned char* dest, size_t destLen) { if (dest == nullptr || destLen < sizeof(Entry::mac)) { return EINVAL; @@ -44,13 +44,13 @@ int MacAddressesCache::get(const ComboAddress& ca, char* dest, size_t destLen) // negative entry return ENOENT; } - memcpy(dest, entry.mac, sizeof(entry.mac)); + memcpy(dest, entry.mac.data(), entry.mac.size()); return 0; } } } - auto res = getMACAddress(ca, dest, destLen); + auto res = getMACAddress(ca, reinterpret_cast(dest), destLen); { auto cache = s_cache.lock(); if (cache->capacity() == 0) { @@ -59,11 +59,11 @@ int MacAddressesCache::get(const ComboAddress& ca, char* dest, size_t destLen) Entry entry; entry.ca = ca; if (res == 0) { - memcpy(entry.mac, dest, sizeof(entry.mac)); + memcpy(entry.mac.data(), dest, entry.mac.size()); entry.found = true; } else { - memset(entry.mac, 0, sizeof(entry.mac)); + memset(entry.mac.data(), 0, entry.mac.size()); entry.found = false; } entry.ttd = now + MacAddressesCache::s_cacheValiditySeconds; diff --git a/pdns/dnsdistdist/dnsdist-mac-address.hh b/pdns/dnsdistdist/dnsdist-mac-address.hh index f155e196dc..fe2f1f0fe6 100644 --- a/pdns/dnsdistdist/dnsdist-mac-address.hh +++ b/pdns/dnsdistdist/dnsdist-mac-address.hh @@ -27,16 +27,18 @@ namespace dnsdist { +using MacAddress = std::array; + class MacAddressesCache { public: - static int get(const ComboAddress& ca, char* dest, size_t len); + static int get(const ComboAddress& ca, unsigned char* dest, size_t len); private: struct Entry { ComboAddress ca; - char mac[6]; + MacAddress mac; time_t ttd; bool found; };