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
dns_dispatch_t *disp = caa_container_of(node, dns_dispatch_t, ht_node);
const struct dispatch_key *key = key0;
- return disp->transport == key->transport &&
+ return disp->disptype == key->disptype &&
+ disp->transport == key->transport &&
isc_sockaddr_equal(&disp->peer, key->peer) &&
(key->local == NULL ||
isc_sockaddr_equal(&disp->local, key->local));
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 */