]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Include disptype and transport in dispatch hash key 11846/head
authorOndřej Surý <ondrej@isc.org>
Thu, 9 Apr 2026 15:35:09 +0000 (17:35 +0200)
committerOndřej Surý <ondrej@isc.org>
Wed, 6 May 2026 13:05:48 +0000 (15:05 +0200)
Move disptype and transport into dispatch_hash() and dispatch_match()
so that the match function is the single source of truth for whether
two TCP dispatches are interchangeable.  This replaces the post-loop
disptype filter in dispatch_gettcp() and makes the disptype field in
struct dispatch_key actually used.

(cherry picked from commit 46547966839926313abdb4f4de57a8e94a64f0c0)

lib/dns/dispatch.c

index a08a9f0b43a39ac9cd70c17d6b80d390808dd3eb..2755652a6c3afcd7ff1179b78dc0d1118ef15040 100644 (file)
@@ -1137,12 +1137,21 @@ struct dispatch_key {
 
 static uint32_t
 dispatch_hash(struct dispatch_key *key) {
-       uint32_t hashval = isc_sockaddr_hash(key->peer, false);
-       if (key->local) {
-               hashval ^= isc_sockaddr_hash(key->local, true);
+       isc_hash32_t hash;
+
+       isc_hash32_init(&hash);
+
+       isc_sockaddr_hash_ex(&hash, key->peer, false);
+       if (key->local != NULL) {
+               isc_sockaddr_hash_ex(&hash, key->local, true);
        }
+       if (key->transport != NULL) {
+               uintptr_t transport = (uintptr_t)key->transport;
+               isc_hash32_hash(&hash, &transport, sizeof(transport), true);
+       }
+       isc_hash32_hash(&hash, &key->disptype, sizeof(key->disptype), true);
 
-       return hashval;
+       return isc_hash32_finalize(&hash);
 }
 
 static int
@@ -1160,7 +1169,8 @@ dispatch_match(struct cds_lfht_node *node, const void *key0) {
                peer = disp->peer;
        }
 
-       return isc_sockaddr_equal(&peer, key->peer) &&
+       return disp->disptype == key->disptype &&
+              isc_sockaddr_equal(&peer, key->peer) &&
               disp->transport == key->transport &&
               (key->local == NULL || isc_sockaddr_equal(&local, key->local));
 }
@@ -1194,10 +1204,6 @@ dispatch_gettcp(dns_dispatchmgr_t *mgr, const isc_sockaddr_t *localaddr,
                INSIST(disp->tid == isc_tid());
                INSIST(disp->socktype == isc_socktype_tcp);
 
-               if (disp->disptype != disptype) {
-                       continue;
-               }
-
                switch (disp->state) {
                case DNS_DISPATCHSTATE_NONE:
                        /* A dispatch in indeterminate state, skip it */