]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add a dnsdist::MacAddress type 12001/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 27 Sep 2022 12:20:41 +0000 (14:20 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 27 Sep 2022 12:20:41 +0000 (14:20 +0200)
pdns/dnsdist-lua-actions.cc
pdns/dnsdist-rings.hh
pdns/dnsdistdist/dnsdist-lua-ffi.cc
pdns/dnsdistdist/dnsdist-mac-address.cc
pdns/dnsdistdist/dnsdist-mac-address.hh

index f94a42119f9d6a961162d6fa96a0fdb863345317..b348e0ab6a5c400c20fb2211d5f9769eef44ce2b 100644 (file)
@@ -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<const char*>(mac.data()), optRData);
 
     if (dq->getHeader()->arcount) {
       bool ednsAdded = false;
index c0b058f8530a7b3288094b2f4b9f840613fb77e1..6bd93afb7ddda3315f750c5b852501c590568144 100644 (file)
@@ -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<Query>& 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<Query>& 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<Query>& 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
index 1b4c6ce4790b5be33e23547504c596e5c08ac567..6bdbc116d14ada95e860d3f85f2456df28a99a97 100644 (file)
@@ -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<char*>(buffer), bufferSize);
+  auto ret = dnsdist::MacAddressesCache::get(*dq->dq->remote, reinterpret_cast<unsigned char*>(buffer), bufferSize);
   if (ret != 0) {
     return 0;
   }
index 6f87b6603f29aa24a66f0782f4c50d0f14e2f7ba..20a7245a9fb33d8c2bca0b7d7469ec325345ef1e 100644 (file)
@@ -27,7 +27,7 @@ namespace dnsdist
 {
 LockGuarded<boost::circular_buffer<MacAddressesCache::Entry>> 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<char*>(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;
index f155e196dccbd71e1abd9fb6b253f57fa29e2d89..fe2f1f0fe697588ae73b31378b08ceb653ef2608 100644 (file)
 
 namespace dnsdist
 {
+using MacAddress = std::array<uint8_t, 6>;
+
 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;
   };