From 3230c8e369313020ea48f995790624acec94dc8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Mon, 18 Sep 2023 09:59:10 +0200 Subject: [PATCH] Add isc_sockaddr_hash_ex that can be used in incremental hashing Add a sockaddr hashing function that can be used as part of incremental hashing. --- lib/isc/include/isc/sockaddr.h | 9 +++++++++ lib/isc/sockaddr.c | 21 ++++++++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/lib/isc/include/isc/sockaddr.h b/lib/isc/include/isc/sockaddr.h index b9dda2b0c2..e962a7a11c 100644 --- a/lib/isc/include/isc/sockaddr.h +++ b/lib/isc/include/isc/sockaddr.h @@ -85,6 +85,15 @@ isc_sockaddr_eqaddrprefix(const isc_sockaddr_t *a, const isc_sockaddr_t *b, * If 'b''s scope is zero then 'a''s scope will be ignored. */ +void +isc_sockaddr_hash_ex(isc_hash32_t *hash, const isc_sockaddr_t *sockaddr, + bool address_only); +/*%< + * Add the hash of the sockaddr into the hash for incremental hashing + * + * See isc_sockaddr_hash() for details. + */ + uint32_t isc_sockaddr_hash(const isc_sockaddr_t *sockaddr, bool address_only); /*%< diff --git a/lib/isc/sockaddr.c b/lib/isc/sockaddr.c index 020cc58ae9..263d652b38 100644 --- a/lib/isc/sockaddr.c +++ b/lib/isc/sockaddr.c @@ -187,17 +187,15 @@ isc_sockaddr_format(const isc_sockaddr_t *sa, char *array, unsigned int size) { } } -uint32_t -isc_sockaddr_hash(const isc_sockaddr_t *sockaddr, bool address_only) { +void +isc_sockaddr_hash_ex(isc_hash32_t *hash, const isc_sockaddr_t *sockaddr, + bool address_only) { REQUIRE(sockaddr != NULL); size_t len = 0; const uint8_t *s = NULL; unsigned int p = 0; const struct in6_addr *in6; - isc_hash32_t hash; - - isc_hash32_init(&hash); switch (sockaddr->type.sa.sa_family) { case AF_INET: @@ -224,10 +222,19 @@ isc_sockaddr_hash(const isc_sockaddr_t *sockaddr, bool address_only) { UNREACHABLE(); } - isc_hash32_hash(&hash, s, len, true); + isc_hash32_hash(hash, s, len, true); if (!address_only) { - isc_hash32_hash(&hash, &p, sizeof(p), true); + isc_hash32_hash(hash, &p, sizeof(p), true); } +} + +uint32_t +isc_sockaddr_hash(const isc_sockaddr_t *sockaddr, bool address_only) { + isc_hash32_t hash; + + isc_hash32_init(&hash); + + isc_sockaddr_hash_ex(&hash, sockaddr, address_only); return (isc_hash32_finalize(&hash)); }