From: Otto Moerbeek Date: Fri, 6 May 2022 12:25:39 +0000 (+0200) Subject: burtle reorg: to separate file and inline X-Git-Tag: auth-4.8.0-alpha0~57^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=42c83cbca17d65723e8e9de64e993b5dde55eeb8;p=thirdparty%2Fpdns.git burtle reorg: to separate file and inline --- diff --git a/pdns/Makefile.am b/pdns/Makefile.am index 06be63a282..8eb5afde64 100644 --- a/pdns/Makefile.am +++ b/pdns/Makefile.am @@ -196,6 +196,7 @@ 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 \ diff --git a/pdns/burtle.hh b/pdns/burtle.hh new file mode 100644 index 0000000000..1b99741fc9 --- /dev/null +++ b/pdns/burtle.hh @@ -0,0 +1,138 @@ +/* + * This file is part of PowerDNS or dnsdist. + * Copyright -- PowerDNS.COM B.V. and its contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * In addition, for the avoidance of any doubt, permission is granted to + * link this program with OpenSSL and to (re)distribute the binaries + * produced as the result of such linking. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#pragma once + +#include + +#define burtlemix(a,b,c) \ +{ \ + a -= b; a -= c; a ^= (c>>13); \ + b -= c; b -= a; b ^= (a<<8); \ + c -= a; c -= b; c ^= (b>>13); \ + a -= b; a -= c; a ^= (c>>12); \ + b -= c; b -= a; b ^= (a<<16); \ + c -= a; c -= b; c ^= (b>>5); \ + a -= b; a -= c; a ^= (c>>3); \ + b -= c; b -= a; b ^= (a<<10); \ + c -= a; c -= b; c ^= (b>>15); \ +} + +inline uint32_t burtle(const unsigned char* k, uint32_t length, uint32_t initval) +{ + uint32_t a,b,c,len; + + /* Set up the internal state */ + len = length; + a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */ + c = initval; /* the previous hash value */ + + /*---------------------------------------- handle most of the key */ + while (len >= 12) { + a += (k[0] +((uint32_t)k[1]<<8) +((uint32_t)k[2]<<16) +((uint32_t)k[3]<<24)); + b += (k[4] +((uint32_t)k[5]<<8) +((uint32_t)k[6]<<16) +((uint32_t)k[7]<<24)); + c += (k[8] +((uint32_t)k[9]<<8) +((uint32_t)k[10]<<16)+((uint32_t)k[11]<<24)); + burtlemix(a,b,c); + k += 12; len -= 12; + } + + /*------------------------------------- handle the last 11 bytes */ + c += length; + switch(len) { /* all the case statements fall through */ + case 11: c+=((uint32_t)k[10]<<24); + /* fall-through */ + case 10: c+=((uint32_t)k[9]<<16); + /* fall-through */ + case 9 : c+=((uint32_t)k[8]<<8); + /* the first byte of c is reserved for the length */ + /* fall-through */ + case 8 : b+=((uint32_t)k[7]<<24); + /* fall-through */ + case 7 : b+=((uint32_t)k[6]<<16); + /* fall-through */ + case 6 : b+=((uint32_t)k[5]<<8); + /* fall-through */ + case 5 : b+=k[4]; + /* fall-through */ + case 4 : a+=((uint32_t)k[3]<<24); + /* fall-through */ + case 3 : a+=((uint32_t)k[2]<<16); + /* fall-through */ + case 2 : a+=((uint32_t)k[1]<<8); + /* fall-through */ + case 1 : a+=k[0]; + /* case 0: nothing left to add */ + } + burtlemix(a,b,c); + /*-------------------------------------------- report the result */ + return c; +} + +inline uint32_t burtleCI(const unsigned char* k, uint32_t length, uint32_t initval) +{ + uint32_t a,b,c,len; + + /* Set up the internal state */ + len = length; + a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */ + c = initval; /* the previous hash value */ + + /*---------------------------------------- handle most of the key */ + while (len >= 12) { + a += (dns_tolower(k[0]) +((uint32_t)dns_tolower(k[1])<<8) +((uint32_t)dns_tolower(k[2])<<16) +((uint32_t)dns_tolower(k[3])<<24)); + b += (dns_tolower(k[4]) +((uint32_t)dns_tolower(k[5])<<8) +((uint32_t)dns_tolower(k[6])<<16) +((uint32_t)dns_tolower(k[7])<<24)); + c += (dns_tolower(k[8]) +((uint32_t)dns_tolower(k[9])<<8) +((uint32_t)dns_tolower(k[10])<<16)+((uint32_t)dns_tolower(k[11])<<24)); + burtlemix(a,b,c); + k += 12; len -= 12; + } + + /*------------------------------------- handle the last 11 bytes */ + c += length; + switch(len) { /* all the case statements fall through */ + case 11: c+=((uint32_t)dns_tolower(k[10])<<24); + /* fall-through */ + case 10: c+=((uint32_t)dns_tolower(k[9])<<16); + /* fall-through */ + case 9 : c+=((uint32_t)dns_tolower(k[8])<<8); + /* the first byte of c is reserved for the length */ + /* fall-through */ + case 8 : b+=((uint32_t)dns_tolower(k[7])<<24); + /* fall-through */ + case 7 : b+=((uint32_t)dns_tolower(k[6])<<16); + /* fall-through */ + case 6 : b+=((uint32_t)dns_tolower(k[5])<<8); + /* fall-through */ + case 5 : b+=dns_tolower(k[4]); + /* fall-through */ + case 4 : a+=((uint32_t)dns_tolower(k[3])<<24); + /* fall-through */ + case 3 : a+=((uint32_t)dns_tolower(k[2])<<16); + /* fall-through */ + case 2 : a+=((uint32_t)dns_tolower(k[1])<<8); + /* fall-through */ + case 1 : a+=dns_tolower(k[0]); + /* case 0: nothing left to add */ + } + burtlemix(a,b,c); + /*-------------------------------------------- report the result */ + return c; +} diff --git a/pdns/dnsdistdist/Makefile.am b/pdns/dnsdistdist/Makefile.am index e6e04cc596..99abefede6 100644 --- a/pdns/dnsdistdist/Makefile.am +++ b/pdns/dnsdistdist/Makefile.am @@ -124,6 +124,7 @@ dnsdist-lua-ffi.$(OBJEXT): dnsdist-lua-ffi-interface.inc dnsdist_SOURCES = \ base64.hh \ + burtle.hh \ bpf-filter.cc bpf-filter.hh \ cachecleaner.hh \ capabilities.cc capabilities.hh \ diff --git a/pdns/dnsdistdist/burtle.hh b/pdns/dnsdistdist/burtle.hh new file mode 120000 index 0000000000..0a0033949f --- /dev/null +++ b/pdns/dnsdistdist/burtle.hh @@ -0,0 +1 @@ +../burtle.hh \ No newline at end of file diff --git a/pdns/dnsname.hh b/pdns/dnsname.hh index 566b3bf7ff..b0b52b6800 100644 --- a/pdns/dnsname.hh +++ b/pdns/dnsname.hh @@ -53,7 +53,7 @@ inline unsigned char dns_tolower(unsigned char c) return dns_tolower_table[c]; } -uint32_t burtleCI(const unsigned char* k, uint32_t length, uint32_t init); +#include "burtle.hh" // #include "dns.hh" // #include "logger.hh" diff --git a/pdns/misc.cc b/pdns/misc.cc index ebcd717447..4334074ec4 100644 --- a/pdns/misc.cc +++ b/pdns/misc.cc @@ -943,120 +943,6 @@ void setFilenumLimit(unsigned int lim) unixDie("Setting number of available file descriptors"); } -#define burtlemix(a,b,c) \ -{ \ - a -= b; a -= c; a ^= (c>>13); \ - b -= c; b -= a; b ^= (a<<8); \ - c -= a; c -= b; c ^= (b>>13); \ - a -= b; a -= c; a ^= (c>>12); \ - b -= c; b -= a; b ^= (a<<16); \ - c -= a; c -= b; c ^= (b>>5); \ - a -= b; a -= c; a ^= (c>>3); \ - b -= c; b -= a; b ^= (a<<10); \ - c -= a; c -= b; c ^= (b>>15); \ -} - -uint32_t burtle(const unsigned char* k, uint32_t length, uint32_t initval) -{ - uint32_t a,b,c,len; - - /* Set up the internal state */ - len = length; - a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */ - c = initval; /* the previous hash value */ - - /*---------------------------------------- handle most of the key */ - while (len >= 12) { - a += (k[0] +((uint32_t)k[1]<<8) +((uint32_t)k[2]<<16) +((uint32_t)k[3]<<24)); - b += (k[4] +((uint32_t)k[5]<<8) +((uint32_t)k[6]<<16) +((uint32_t)k[7]<<24)); - c += (k[8] +((uint32_t)k[9]<<8) +((uint32_t)k[10]<<16)+((uint32_t)k[11]<<24)); - burtlemix(a,b,c); - k += 12; len -= 12; - } - - /*------------------------------------- handle the last 11 bytes */ - c += length; - switch(len) { /* all the case statements fall through */ - case 11: c+=((uint32_t)k[10]<<24); - /* fall-through */ - case 10: c+=((uint32_t)k[9]<<16); - /* fall-through */ - case 9 : c+=((uint32_t)k[8]<<8); - /* the first byte of c is reserved for the length */ - /* fall-through */ - case 8 : b+=((uint32_t)k[7]<<24); - /* fall-through */ - case 7 : b+=((uint32_t)k[6]<<16); - /* fall-through */ - case 6 : b+=((uint32_t)k[5]<<8); - /* fall-through */ - case 5 : b+=k[4]; - /* fall-through */ - case 4 : a+=((uint32_t)k[3]<<24); - /* fall-through */ - case 3 : a+=((uint32_t)k[2]<<16); - /* fall-through */ - case 2 : a+=((uint32_t)k[1]<<8); - /* fall-through */ - case 1 : a+=k[0]; - /* case 0: nothing left to add */ - } - burtlemix(a,b,c); - /*-------------------------------------------- report the result */ - return c; -} - -uint32_t burtleCI(const unsigned char* k, uint32_t length, uint32_t initval) -{ - uint32_t a,b,c,len; - - /* Set up the internal state */ - len = length; - a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */ - c = initval; /* the previous hash value */ - - /*---------------------------------------- handle most of the key */ - while (len >= 12) { - a += (dns_tolower(k[0]) +((uint32_t)dns_tolower(k[1])<<8) +((uint32_t)dns_tolower(k[2])<<16) +((uint32_t)dns_tolower(k[3])<<24)); - b += (dns_tolower(k[4]) +((uint32_t)dns_tolower(k[5])<<8) +((uint32_t)dns_tolower(k[6])<<16) +((uint32_t)dns_tolower(k[7])<<24)); - c += (dns_tolower(k[8]) +((uint32_t)dns_tolower(k[9])<<8) +((uint32_t)dns_tolower(k[10])<<16)+((uint32_t)dns_tolower(k[11])<<24)); - burtlemix(a,b,c); - k += 12; len -= 12; - } - - /*------------------------------------- handle the last 11 bytes */ - c += length; - switch(len) { /* all the case statements fall through */ - case 11: c+=((uint32_t)dns_tolower(k[10])<<24); - /* fall-through */ - case 10: c+=((uint32_t)dns_tolower(k[9])<<16); - /* fall-through */ - case 9 : c+=((uint32_t)dns_tolower(k[8])<<8); - /* the first byte of c is reserved for the length */ - /* fall-through */ - case 8 : b+=((uint32_t)dns_tolower(k[7])<<24); - /* fall-through */ - case 7 : b+=((uint32_t)dns_tolower(k[6])<<16); - /* fall-through */ - case 6 : b+=((uint32_t)dns_tolower(k[5])<<8); - /* fall-through */ - case 5 : b+=dns_tolower(k[4]); - /* fall-through */ - case 4 : a+=((uint32_t)dns_tolower(k[3])<<24); - /* fall-through */ - case 3 : a+=((uint32_t)dns_tolower(k[2])<<16); - /* fall-through */ - case 2 : a+=((uint32_t)dns_tolower(k[1])<<8); - /* fall-through */ - case 1 : a+=dns_tolower(k[0]); - /* case 0: nothing left to add */ - } - burtlemix(a,b,c); - /*-------------------------------------------- report the result */ - return c; -} - - bool setSocketTimestamps(int fd) { #ifdef SO_TIMESTAMP diff --git a/pdns/misc.hh b/pdns/misc.hh index ac725fc001..bfadd206f5 100644 --- a/pdns/misc.hh +++ b/pdns/misc.hh @@ -42,7 +42,8 @@ #include #include "namespaces.hh" -#include "dnsname.hh" + +class DNSName; typedef enum { TSIG_MD5, TSIG_SHA1, TSIG_SHA224, TSIG_SHA256, TSIG_SHA384, TSIG_SHA512, TSIG_GSS } TSIGHashEnum; @@ -557,7 +558,6 @@ void addCMsgSrcAddr(struct msghdr* msgh, cmsgbuf_aligned* cbuf, const ComboAddre unsigned int getFilenumLimit(bool hardOrSoft=0); void setFilenumLimit(unsigned int lim); bool readFileIfThere(const char* fname, std::string* line); -uint32_t burtle(const unsigned char* k, uint32_t length, uint32_t init); bool setSocketTimestamps(int fd); //! Sets the socket into blocking mode. @@ -814,3 +814,4 @@ struct FDWrapper private: int d_fd{-1}; }; + diff --git a/pdns/recursordist/Makefile.am b/pdns/recursordist/Makefile.am index 743a17b991..9b6b652493 100644 --- a/pdns/recursordist/Makefile.am +++ b/pdns/recursordist/Makefile.am @@ -104,6 +104,7 @@ pdns_recursor_SOURCES = \ axfr-retriever.hh axfr-retriever.cc \ base32.cc base32.hh \ base64.cc base64.hh \ + burtle.hh \ cachecleaner.hh \ capabilities.cc capabilities.hh \ circular_buffer.hh \ diff --git a/pdns/recursordist/burtle.hh b/pdns/recursordist/burtle.hh new file mode 120000 index 0000000000..0a0033949f --- /dev/null +++ b/pdns/recursordist/burtle.hh @@ -0,0 +1 @@ +../burtle.hh \ No newline at end of file