]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Smarter hashing of header and query
authorOtto Moerbeek <otto@drijf.net>
Fri, 6 May 2022 15:54:41 +0000 (17:54 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 1 Jun 2022 09:23:26 +0000 (11:23 +0200)
pdns/Makefile.am
pdns/packetcache.hh
pdns/test-packetcache_hh.cc

index 8eb5afde6487eec0776b590203b332397441ee90..2ef1f85b023170c98014d8ee6e7d27c8f1e0deaf 100644 (file)
@@ -196,10 +196,10 @@ pdns_server_SOURCES = \
        backends/gsql/ssql.hh \
        base32.cc base32.hh \
        base64.cc base64.hh \
-       burtle.hh \
        bind-dnssec.schema.sqlite3.sql.h \
        bindlexer.l \
        bindparser.cc \
+       burtle.hh \
        cachecleaner.hh \
        circular_buffer.hh \
        comment.hh \
index eba68221f64f0bde3f771cd8783026294505e65a..08c3546fb13612d0a543d9b987038c2ee08b8347 100644 (file)
@@ -105,27 +105,19 @@ public:
 
   static uint32_t hashHeaderAndQName(const std::string& packet, size_t& pos)
   {
-    uint32_t currentHash = 0;
     const size_t packetSize = packet.size();
     assert(packetSize >= sizeof(dnsheader));
-    currentHash = burtle(reinterpret_cast<const unsigned char*>(&packet.at(2)), sizeof(dnsheader) - 2, currentHash); // rest of dnsheader, skip id
-    pos = sizeof(dnsheader);
+    uint32_t currentHash = burtle(reinterpret_cast<const unsigned char*>(&packet.at(2)), sizeof(dnsheader) - 2, 0); // rest of dnsheader, skip id
 
-    for (; pos < packetSize; ) {
+    for (pos = sizeof(dnsheader); pos < packetSize; ) {
       const unsigned char labelLen = static_cast<unsigned char>(packet.at(pos));
-      currentHash = burtle(&labelLen, 1, currentHash);
       ++pos;
       if (labelLen == 0) {
         break;
       }
-
-      for (size_t idx = 0; idx < labelLen && pos < packetSize; ++idx, ++pos) {
-        const unsigned char l = dns_tolower(packet.at(pos));
-        currentHash = burtle(&l, 1, currentHash);
-      }
+      pos = std::min(pos + labelLen, packetSize);
     }
-
-    return currentHash;
+    return burtleCI(reinterpret_cast<const unsigned char*>(&packet.at(sizeof(dnsheader))), pos - sizeof(dnsheader), currentHash);
   }
 
   /* hash the packet from the beginning, including the qname. This skips:
index 1e361a7fa66e24e58e73c312145d428cad52dca3..e43627310cc5daa2b6196e4d89b0f7b3265018f3 100644 (file)
@@ -53,7 +53,7 @@ BOOST_AUTO_TEST_CASE(test_PacketCacheAuthCollision) {
     pw1.getHeader()->rd = true;
     pw1.getHeader()->qr = false;
     pw1.getHeader()->id = 0x42;
-    opt.source = Netmask("10.0.152.74/32");
+    opt.source = Netmask("10.0.59.220/32");
     ednsOptions.clear();
     ednsOptions.emplace_back(EDNSOptionCode::ECS, makeEDNSSubnetOptsString(opt));
     pw1.addOpt(512, 0, 0, ednsOptions);
@@ -67,7 +67,7 @@ BOOST_AUTO_TEST_CASE(test_PacketCacheAuthCollision) {
     pw2.getHeader()->rd = true;
     pw2.getHeader()->qr = false;
     pw2.getHeader()->id = 0x84;
-    opt.source = Netmask("10.2.70.250/32");
+    opt.source = Netmask("10.0.167.48/32");
     ednsOptions.clear();
     ednsOptions.emplace_back(EDNSOptionCode::ECS, makeEDNSSubnetOptsString(opt));
     pw2.addOpt(512, 0, 0, ednsOptions);
@@ -125,7 +125,7 @@ BOOST_AUTO_TEST_CASE(test_PacketCacheAuthCollision) {
     pw1.getHeader()->rd = true;
     pw1.getHeader()->qr = false;
     pw1.getHeader()->id = 0x42;
-    opt.source = Netmask("10.0.34.159/32");
+    opt.source = Netmask("10.0.41.6/32");
     ednsOptions.clear();
     ednsOptions.emplace_back(EDNSOptionCode::ECS, makeEDNSSubnetOptsString(opt));
     pw1.addOpt(512, 0, EDNSOpts::DNSSECOK, ednsOptions);
@@ -139,7 +139,7 @@ BOOST_AUTO_TEST_CASE(test_PacketCacheAuthCollision) {
     pw2.getHeader()->rd = true;
     pw2.getHeader()->qr = false;
     pw2.getHeader()->id = 0x84;
-    opt.source = Netmask("10.0.179.58/32");
+    opt.source = Netmask("10.0.119.79/32");
     ednsOptions.clear();
     ednsOptions.emplace_back(EDNSOptionCode::ECS, makeEDNSSubnetOptsString(opt));
     /* no EDNSOpts::DNSSECOK !! */