]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Implement TLS transport support for dns_request and dns_dispatch
authorAram Sargsyan <aram@isc.org>
Mon, 19 Sep 2022 11:04:22 +0000 (11:04 +0000)
committerAram Sargsyan <aram@isc.org>
Mon, 19 Sep 2022 16:36:28 +0000 (16:36 +0000)
This change prepares ground for sending DNS requests using DoT,
which, in particular, will be used for forwarding dynamic updates
to TLS-enabled primaries.

12 files changed:
bin/nsupdate/nsupdate.c
bin/tests/system/pipelined/pipequeries.c
bin/tests/system/tkey/keycreate.c
bin/tests/system/tkey/keydelete.c
bin/tools/mdig.c
lib/dns/dispatch.c
lib/dns/include/dns/dispatch.h
lib/dns/include/dns/request.h
lib/dns/request.c
lib/dns/resolver.c
lib/dns/zone.c
tests/dns/dispatch_test.c

index 4f4a349420950bfbc7bb8c1c9e2afc890d0013a8..caac7f8489e348870d3b336c3799a917fb329855 100644 (file)
@@ -2480,10 +2480,10 @@ send_update(dns_name_t *zone, isc_sockaddr_t *primary) {
                updatemsg->tsigname->attributes |= DNS_NAMEATTR_NOCOMPRESS;
        }
 
-       result = dns_request_create(requestmgr, updatemsg, srcaddr, primary, -1,
-                                   options, tsigkey, timeout, udp_timeout,
-                                   udp_retries, global_task, update_completed,
-                                   NULL, &request);
+       result = dns_request_create(requestmgr, updatemsg, srcaddr, primary,
+                                   NULL, NULL, -1, options, tsigkey, timeout,
+                                   udp_timeout, udp_retries, global_task,
+                                   update_completed, NULL, &request);
        check_result(result, "dns_request_create");
 
        if (debugging) {
@@ -2589,10 +2589,10 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
                        srcaddr = localaddr4;
                }
 
-               result = dns_request_create(requestmgr, soaquery, srcaddr, addr,
-                                           -1, 0, NULL, FIND_TIMEOUT * 20,
-                                           FIND_TIMEOUT, 3, global_task,
-                                           recvsoa, reqinfo, &request);
+               result = dns_request_create(
+                       requestmgr, soaquery, srcaddr, addr, NULL, NULL, -1, 0,
+                       NULL, FIND_TIMEOUT * 20, FIND_TIMEOUT, 3, global_task,
+                       recvsoa, reqinfo, &request);
                check_result(result, "dns_request_create");
                requests++;
                return;
@@ -2808,10 +2808,10 @@ sendrequest(isc_sockaddr_t *destaddr, dns_message_t *msg,
                srcaddr = localaddr4;
        }
 
-       result = dns_request_create(requestmgr, msg, srcaddr, destaddr, -1, 0,
-                                   default_servers ? NULL : tsigkey,
-                                   FIND_TIMEOUT * 20, FIND_TIMEOUT, 3,
-                                   global_task, recvsoa, reqinfo, request);
+       result = dns_request_create(
+               requestmgr, msg, srcaddr, destaddr, NULL, NULL, -1, 0,
+               default_servers ? NULL : tsigkey, FIND_TIMEOUT * 20,
+               FIND_TIMEOUT, 3, global_task, recvsoa, reqinfo, request);
        check_result(result, "dns_request_create");
        requests++;
 }
@@ -3010,10 +3010,10 @@ send_gssrequest(isc_sockaddr_t *destaddr, dns_message_t *msg,
                srcaddr = localaddr4;
        }
 
-       result = dns_request_create(requestmgr, msg, srcaddr, destaddr, -1,
-                                   options, tsigkey, FIND_TIMEOUT * 20,
-                                   FIND_TIMEOUT, 3, global_task, recvgss,
-                                   reqinfo, request);
+       result = dns_request_create(requestmgr, msg, srcaddr, destaddr, NULL,
+                                   NULL, -1, options, tsigkey,
+                                   FIND_TIMEOUT * 20, FIND_TIMEOUT, 3,
+                                   global_task, recvgss, reqinfo, request);
        check_result(result, "dns_request_create");
        if (debugging) {
                show_message(stdout, msg, "Outgoing update query:");
index 8003a390e8070fb9f48610470ff8449cac6949db..623f9748c2d01e779a8579a9f30434dafd97a8e6 100644 (file)
@@ -169,10 +169,10 @@ sendquery(isc_task_t *task) {
        ISC_LIST_APPEND(qname->list, qrdataset, link);
        dns_message_addname(message, qname, DNS_SECTION_QUESTION);
 
-       result = dns_request_create(requestmgr, message,
-                                   have_src ? &srcaddr : NULL, &dstaddr, -1,
-                                   DNS_REQUESTOPT_TCP, NULL, TIMEOUT, 0, 0,
-                                   task, recvresponse, message, &request);
+       result = dns_request_create(
+               requestmgr, message, have_src ? &srcaddr : NULL, &dstaddr, NULL,
+               NULL, -1, DNS_REQUESTOPT_TCP, NULL, TIMEOUT, 0, 0, task,
+               recvresponse, message, &request);
        CHECK("dns_request_create", result);
 
        return (ISC_R_SUCCESS);
index 26f2aa7b1359563680fab4c7cb28a0e662c7a0f4..255c29125ef0b7344f38e0cba9fd6e66d0c408fb 100644 (file)
@@ -178,9 +178,10 @@ sendquery(void *arg) {
                                       DNS_TSIG_HMACMD5_NAME, &nonce, 3600);
        CHECK("dns_tkey_builddhquery", result);
 
-       result = dns_request_create(requestmgr, query, NULL, &address, -1,
-                                   DNS_REQUESTOPT_TCP, initialkey, TIMEOUT, 0,
-                                   0, task, recvquery, query, &request);
+       result = dns_request_create(requestmgr, query, NULL, &address, NULL,
+                                   NULL, -1, DNS_REQUESTOPT_TCP, initialkey,
+                                   TIMEOUT, 0, 0, task, recvquery, query,
+                                   &request);
        CHECK("dns_request_create", result);
 }
 
index a3083d755bbe5e8ba1bb82cc0f6ebc484881e740..4bfdd0feaea65dda7523d39bc4b7683f33911040 100644 (file)
@@ -122,9 +122,10 @@ sendquery(void *arg) {
        result = dns_tkey_builddeletequery(query, tsigkey);
        CHECK("dns_tkey_builddeletequery", result);
 
-       result = dns_request_create(requestmgr, query, NULL, &address, -1,
-                                   DNS_REQUESTOPT_TCP, tsigkey, TIMEOUT, 0, 0,
-                                   task, recvquery, query, &request);
+       result = dns_request_create(requestmgr, query, NULL, &address, NULL,
+                                   NULL, -1, DNS_REQUESTOPT_TCP, tsigkey,
+                                   TIMEOUT, 0, 0, task, recvquery, query,
+                                   &request);
        CHECK("dns_request_create", result);
 }
 
index af7269480e8984b1b14401086ceaacd7f17af000..368730b0e96b9607a914e45ff76f309529e60e97 100644 (file)
@@ -756,8 +756,8 @@ sendquery(struct query *query) {
        }
 
        result = dns_request_create(
-               requestmgr, message, have_src ? &srcaddr : NULL, &dstaddr, dscp,
-               options, NULL, query->timeout, query->udptimeout,
+               requestmgr, message, have_src ? &srcaddr : NULL, &dstaddr, NULL,
+               NULL, dscp, options, NULL, query->timeout, query->udptimeout,
                query->udpretries, global_task, recvresponse, message,
                &request);
        CHECK("dns_request_create", result);
index fcee9751c2e8d1bee73ee4244c027c88b14dd073..15062f523c57be1482669c80ce131da046253949 100644 (file)
@@ -30,6 +30,7 @@
 #include <isc/stats.h>
 #include <isc/string.h>
 #include <isc/time.h>
+#include <isc/tls.h>
 #include <isc/util.h>
 
 #include <dns/acl.h>
@@ -37,6 +38,7 @@
 #include <dns/log.h>
 #include <dns/message.h>
 #include <dns/stats.h>
+#include <dns/transport.h>
 #include <dns/types.h>
 
 typedef ISC_LIST(dns_dispentry_t) dns_displist_t;
@@ -75,6 +77,8 @@ struct dns_dispentry {
        isc_refcount_t references;
        dns_dispatch_t *disp;
        isc_nmhandle_t *handle; /*%< netmgr handle for UDP connection */
+       dns_transport_t *transport;
+       isc_tlsctx_cache_t *tlsctx_cache;
        unsigned int bucket;
        unsigned int retries;
        unsigned int timeout;
@@ -407,6 +411,14 @@ dispentry_destroy(dns_dispentry_t *resp) {
                isc_nmhandle_detach(&resp->handle);
        }
 
+       if (resp->tlsctx_cache != NULL) {
+               isc_tlsctx_cache_detach(&resp->tlsctx_cache);
+       }
+
+       if (resp->transport != NULL) {
+               dns_transport_detach(&resp->transport);
+       }
+
        isc_refcount_destroy(&resp->references);
 
        isc_mem_put(disp->mgr->mctx, resp, sizeof(*resp));
@@ -1384,6 +1396,7 @@ dns_dispatch_detach(dns_dispatch_t **dispp) {
 isc_result_t
 dns_dispatch_add(dns_dispatch_t *disp, unsigned int options,
                 unsigned int timeout, const isc_sockaddr_t *dest,
+                dns_transport_t *transport, isc_tlsctx_cache_t *tlsctx_cache,
                 dispatch_cb_t connected, dispatch_cb_t sent,
                 dispatch_cb_t response, void *arg, dns_messageid_t *idp,
                 dns_dispentry_t **resp) {
@@ -1486,6 +1499,14 @@ dns_dispatch_add(dns_dispatch_t *disp, unsigned int options,
                return (ISC_R_NOMORE);
        }
 
+       if (transport != NULL) {
+               dns_transport_attach(transport, &res->transport);
+       }
+
+       if (tlsctx_cache != NULL) {
+               isc_tlsctx_cache_attach(tlsctx_cache, &res->tlsctx_cache);
+       }
+
        dns_dispatch_attach(disp, &res->disp);
 
        res->id = id;
@@ -1791,16 +1812,45 @@ isc_result_t
 dns_dispatch_connect(dns_dispentry_t *resp) {
        dns_dispatch_t *disp = NULL;
        uint_fast32_t tcpstate = DNS_DISPATCHSTATE_NONE;
+       dns_transport_type_t transport_type = DNS_TRANSPORT_NONE;
+       isc_tlsctx_t *tlsctx = NULL;
+       isc_tlsctx_client_session_cache_t *sess_cache = NULL;
 
        REQUIRE(VALID_RESPONSE(resp));
 
        disp = resp->disp;
 
+       if (disp->socktype == isc_socktype_tcp) {
+               transport_type = DNS_TRANSPORT_TCP;
+       } else if (disp->socktype == isc_socktype_udp) {
+               transport_type = DNS_TRANSPORT_UDP;
+       } else {
+               return (ISC_R_NOTIMPLEMENTED);
+       }
+
+       if (resp->transport != NULL) {
+               transport_type = dns_transport_get_type(resp->transport);
+       }
+
+       if (transport_type == DNS_TRANSPORT_TLS) {
+               isc_result_t result;
+
+               result = dns_transport_get_tlsctx(
+                       resp->transport, &resp->peer, resp->tlsctx_cache,
+                       resp->disp->mgr->mctx, &tlsctx, &sess_cache);
+
+               if (result != ISC_R_SUCCESS) {
+                       return (result);
+               }
+               INSIST(tlsctx != NULL);
+       }
+
        /* This will be detached once we've connected. */
        dispentry_attach(resp, &(dns_dispentry_t *){ NULL });
 
-       switch (disp->socktype) {
-       case isc_socktype_tcp:
+       switch (transport_type) {
+       case DNS_TRANSPORT_TCP:
+       case DNS_TRANSPORT_TLS:
                /*
                 * Check whether the dispatch is already connecting
                 * or connected.
@@ -1815,9 +1865,17 @@ dns_dispatch_connect(dns_dispentry_t *resp) {
                        ISC_LIST_APPEND(disp->pending, resp, plink);
                        UNLOCK(&disp->lock);
                        dns_dispatch_attach(disp, &(dns_dispatch_t *){ NULL });
-                       isc_nm_tcpdnsconnect(disp->mgr->nm, &disp->local,
-                                            &disp->peer, tcp_connected, disp,
-                                            resp->timeout);
+                       if (transport_type == DNS_TRANSPORT_TLS) {
+                               isc_nm_tlsdnsconnect(
+                                       disp->mgr->nm, &disp->local,
+                                       &disp->peer, tcp_connected, disp,
+                                       resp->timeout, tlsctx, sess_cache);
+                       } else {
+                               isc_nm_tcpdnsconnect(disp->mgr->nm,
+                                                    &disp->local, &disp->peer,
+                                                    tcp_connected, disp,
+                                                    resp->timeout);
+                       }
                        break;
 
                case DNS_DISPATCHSTATE_CONNECTING:
@@ -1841,7 +1899,7 @@ dns_dispatch_connect(dns_dispentry_t *resp) {
 
                break;
 
-       case isc_socktype_udp:
+       case DNS_TRANSPORT_UDP:
                isc_nm_udpconnect(disp->mgr->nm, &resp->local, &resp->peer,
                                  udp_connected, resp, resp->timeout);
                break;
index b82a46c5a99fc98490808754448ed602c2b60d03..fff052cdd06a842798a52e4c2a4bec4898009a6f 100644 (file)
@@ -266,6 +266,7 @@ typedef void (*dispatch_cb_t)(isc_result_t eresult, isc_region_t *region,
 isc_result_t
 dns_dispatch_add(dns_dispatch_t *disp, unsigned int options,
                 unsigned int timeout, const isc_sockaddr_t *dest,
+                dns_transport_t *transport, isc_tlsctx_cache_t *tlsctx_cache,
                 dispatch_cb_t connected, dispatch_cb_t sent,
                 dispatch_cb_t response, void *arg, dns_messageid_t *idp,
                 dns_dispentry_t **resp);
index c454161a602141b472e36295d00e11c834396af5..5f72aef76e49300172748c88165c60a0d4c2b090 100644 (file)
@@ -130,7 +130,8 @@ dns_requestmgr_detach(dns_requestmgr_t **requestmgrp);
 isc_result_t
 dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
                   const isc_sockaddr_t *srcaddr,
-                  const isc_sockaddr_t *destaddr, isc_dscp_t dscp,
+                  const isc_sockaddr_t *destaddr, dns_transport_t *transport,
+                  isc_tlsctx_cache_t *tlsctx_cache, isc_dscp_t dscp,
                   unsigned int options, dns_tsigkey_t *key,
                   unsigned int timeout, unsigned int udptimeout,
                   unsigned int udpretries, isc_task_t *task,
@@ -174,7 +175,9 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
 isc_result_t
 dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
                      const isc_sockaddr_t *srcaddr,
-                     const isc_sockaddr_t *destaddr, isc_dscp_t dscp,
+                     const isc_sockaddr_t *destaddr,
+                     dns_transport_t      *transport,
+                     isc_tlsctx_cache_t *tlsctx_cache, isc_dscp_t dscp,
                      unsigned int options, unsigned int timeout,
                      unsigned int udptimeout, unsigned int udpretries,
                      isc_task_t *task, isc_taskaction_t action, void *arg,
index 9e78d5b9c7846ecdf657f27b63d295f075cfbea5..0a53f2b6205d8723ef556f58b2113d62ab077bd4 100644 (file)
@@ -22,6 +22,7 @@
 #include <isc/result.h>
 #include <isc/task.h>
 #include <isc/thread.h>
+#include <isc/tls.h>
 #include <isc/util.h>
 
 #include <dns/acl.h>
@@ -33,6 +34,7 @@
 #include <dns/rdata.h>
 #include <dns/rdatastruct.h>
 #include <dns/request.h>
+#include <dns/transport.h>
 #include <dns/tsig.h>
 
 #define REQUESTMGR_MAGIC      ISC_MAGIC('R', 'q', 'u', 'M')
@@ -407,7 +409,9 @@ get_dispatch(bool tcp, bool newtcp, dns_requestmgr_t *requestmgr,
 isc_result_t
 dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
                      const isc_sockaddr_t *srcaddr,
-                     const isc_sockaddr_t *destaddr, isc_dscp_t dscp,
+                     const isc_sockaddr_t *destaddr,
+                     dns_transport_t *transport,
+                     isc_tlsctx_cache_t *tlsctx_cache, isc_dscp_t dscp,
                      unsigned int options, unsigned int timeout,
                      unsigned int udptimeout, unsigned int udpretries,
                      isc_task_t *task, isc_taskaction_t action, void *arg,
@@ -504,9 +508,9 @@ again:
        }
 
        result = dns_dispatch_add(request->dispatch, dispopt, request->timeout,
-                                 destaddr, req_connected, req_senddone,
-                                 req_response, request, &id,
-                                 &request->dispentry);
+                                 destaddr, transport, tlsctx_cache,
+                                 req_connected, req_senddone, req_response,
+                                 request, &id, &request->dispentry);
        if (result != ISC_R_SUCCESS) {
                if ((options & DNS_REQUESTOPT_FIXEDID) != 0 && !newtcp) {
                        newtcp = true;
@@ -572,7 +576,8 @@ cleanup:
 isc_result_t
 dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
                   const isc_sockaddr_t *srcaddr,
-                  const isc_sockaddr_t *destaddr, isc_dscp_t dscp,
+                  const isc_sockaddr_t *destaddr, dns_transport_t *transport,
+                  isc_tlsctx_cache_t *tlsctx_cache, isc_dscp_t dscp,
                   unsigned int options, dns_tsigkey_t *key,
                   unsigned int timeout, unsigned int udptimeout,
                   unsigned int udpretries, isc_task_t *task,
@@ -659,9 +664,10 @@ again:
                goto detach;
        }
 
-       result = dns_dispatch_add(
-               request->dispatch, 0, request->timeout, destaddr, req_connected,
-               req_senddone, req_response, request, &id, &request->dispentry);
+       result = dns_dispatch_add(request->dispatch, 0, request->timeout,
+                                 destaddr, transport, tlsctx_cache,
+                                 req_connected, req_senddone, req_response,
+                                 request, &id, &request->dispentry);
        if (result != ISC_R_SUCCESS) {
                goto detach;
        }
index a22a68b0971c6126c64a00bfe3c03530feaf8dc3..88259482870524c01e4936f15b18dd7d5f7bf3de 100644 (file)
@@ -2283,7 +2283,7 @@ fctx_query(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo,
        /* Set up the dispatch and set the query ID */
        result = dns_dispatch_add(
                query->dispatch, 0, isc_interval_ms(&fctx->interval),
-               &query->addrinfo->sockaddr, resquery_connected,
+               &query->addrinfo->sockaddr, NULL, NULL, resquery_connected,
                resquery_senddone, resquery_response, query, &query->id,
                &query->dispentry);
        if (result != ISC_R_SUCCESS) {
index 08e140ca0979a083bc795501571003fcb50ccc7a..73a12b4772f62f6e48df34684acf9d70ce5bbcfe 100644 (file)
@@ -12788,10 +12788,10 @@ notify_send_toaddr(isc_task_t *task, isc_event_t *event) {
        if (DNS_ZONE_FLAG(notify->zone, DNS_ZONEFLG_DIALNOTIFY)) {
                timeout = 30;
        }
-       result = dns_request_create(notify->zone->view->requestmgr, message,
-                                   &src, &notify->dst, dscp, options, key,
-                                   timeout * 3, timeout, 2, notify->zone->task,
-                                   notify_done, notify, &notify->request);
+       result = dns_request_create(
+               notify->zone->view->requestmgr, message, &src, &notify->dst,
+               NULL, NULL, dscp, options, key, timeout * 3, timeout, 2,
+               notify->zone->task, notify_done, notify, &notify->request);
        if (result == ISC_R_SUCCESS) {
                if (isc_sockaddr_pf(&notify->dst) == AF_INET) {
                        inc_stats(notify->zone,
@@ -13498,7 +13498,7 @@ stub_request_nameserver_address(struct stub_cb_args *args, bool ipv4,
 
        result = dns_request_create(
                zone->view->requestmgr, message, &zone->sourceaddr,
-               &zone->primaryaddr, args->dscp, DNS_REQUESTOPT_TCP,
+               &zone->primaryaddr, NULL, NULL, args->dscp, DNS_REQUESTOPT_TCP,
                args->tsig_key, args->timeout * 3, args->timeout, 2, zone->task,
                stub_glue_response_cb, request, &request->request);
 
@@ -14741,8 +14741,8 @@ again:
        }
        result = dns_request_create(
                zone->view->requestmgr, message, &zone->sourceaddr,
-               &zone->primaryaddr, dscp, options, key, timeout * 3, timeout, 2,
-               zone->task, refresh_callback, zone, &zone->request);
+               &zone->primaryaddr, NULL, NULL, dscp, options, key, timeout * 3,
+               timeout, 2, zone->task, refresh_callback, zone, &zone->request);
        if (result != ISC_R_SUCCESS) {
                zone_idetach(&dummy);
                zone_debuglog(zone, __func__, 1,
@@ -15024,10 +15024,11 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) {
        cb_args->timeout = timeout;
        cb_args->reqnsid = reqnsid;
 
-       result = dns_request_create(
-               zone->view->requestmgr, message, &zone->sourceaddr,
-               &zone->primaryaddr, dscp, DNS_REQUESTOPT_TCP, key, timeout * 3,
-               timeout, 2, zone->task, stub_callback, cb_args, &zone->request);
+       result = dns_request_create(zone->view->requestmgr, message,
+                                   &zone->sourceaddr, &zone->primaryaddr, NULL,
+                                   NULL, dscp, DNS_REQUESTOPT_TCP, key,
+                                   timeout * 3, timeout, 2, zone->task,
+                                   stub_callback, cb_args, &zone->request);
        if (result != ISC_R_SUCCESS) {
                zone_debuglog(zone, __func__, 1,
                              "dns_request_create() failed: %s",
@@ -18292,11 +18293,11 @@ sendtoprimary(dns_forward_t *forward) {
                result = ISC_R_NOTIMPLEMENTED;
                goto unlock;
        }
-       result = dns_request_createraw(forward->zone->view->requestmgr,
-                                      forward->msgbuf, &src, &forward->addr,
-                                      dscp, forward->options, 15 /* XXX */, 0,
-                                      0, forward->zone->task, forward_callback,
-                                      forward, &forward->request);
+       result = dns_request_createraw(
+               forward->zone->view->requestmgr, forward->msgbuf, &src,
+               &forward->addr, NULL, NULL, dscp, forward->options,
+               15 /* XXX */, 0, 0, forward->zone->task, forward_callback,
+               forward, &forward->request);
        if (result == ISC_R_SUCCESS) {
                if (!ISC_LINK_LINKED(forward, link)) {
                        ISC_LIST_APPEND(forward->zone->forwards, forward, link);
@@ -21217,7 +21218,7 @@ checkds_send_toaddr(isc_task_t *task, isc_event_t *event) {
        options |= DNS_REQUESTOPT_TCP;
        result = dns_request_create(
                checkds->zone->view->requestmgr, message, &src, &checkds->dst,
-               dscp, options, key, timeout * 3, timeout, 2,
+               NULL, NULL, dscp, options, key, timeout * 3, timeout, 2,
                checkds->zone->task, checkds_done, checkds, &checkds->request);
        if (result != ISC_R_SUCCESS) {
                dns_zone_log(checkds->zone, ISC_LOG_DEBUG(3),
index 0b910e4438412a470505498b69dcd27d3acd8968..ed2c00d948f46e1f27acb301c88a480d9d909cef 100644 (file)
@@ -409,10 +409,10 @@ ISC_LOOP_TEST_IMPL(dispatch_timeout_tcp_connect) {
        assert_int_equal(result, ISC_R_SUCCESS);
        dns_dispatchmgr_detach(&dispatchmgr);
 
-       result = dns_dispatch_add(dispatch, 0, T_CLIENT_CONNECT,
-                                 &tcp_server_addr, timeout_connected,
-                                 client_senddone, response_timeout,
-                                 &testdata.region, &id, &dispentry);
+       result = dns_dispatch_add(
+               dispatch, 0, T_CLIENT_CONNECT, &tcp_server_addr, NULL, NULL,
+               timeout_connected, client_senddone, response_timeout,
+               &testdata.region, &id, &dispentry);
        assert_int_equal(result, ISC_R_SUCCESS);
        dns_dispatch_detach(&dispatch);
 
@@ -454,9 +454,9 @@ ISC_LOOP_TEST_IMPL(dispatch_timeout_tcp_response) {
        dns_dispatchmgr_detach(&dispatchmgr);
 
        result = dns_dispatch_add(dispatch, 0, T_CLIENT_CONNECT,
-                                 &tcp_server_addr, connected, client_senddone,
-                                 response_timeout, &testdata.region, &id,
-                                 &dispentry);
+                                 &tcp_server_addr, NULL, NULL, connected,
+                                 client_senddone, response_timeout,
+                                 &testdata.region, &id, &dispentry);
        assert_int_equal(result, ISC_R_SUCCESS);
        dns_dispatch_detach(&dispatch);
 
@@ -488,8 +488,9 @@ ISC_LOOP_TEST_IMPL(dispatch_tcp_response) {
        dns_dispatchmgr_detach(&dispatchmgr);
 
        result = dns_dispatch_add(dispatch, 0, T_CLIENT_CONNECT,
-                                 &tcp_server_addr, connected, client_senddone,
-                                 response, &testdata.region, &id, &dispentry);
+                                 &tcp_server_addr, NULL, NULL, connected,
+                                 client_senddone, response, &testdata.region,
+                                 &id, &dispentry);
        assert_int_equal(result, ISC_R_SUCCESS);
        dns_dispatch_detach(&dispatch);
 
@@ -521,9 +522,9 @@ ISC_LOOP_TEST_IMPL(dispatch_timeout_udp_response) {
        dns_dispatchmgr_detach(&dispatchmgr);
 
        result = dns_dispatch_add(dispatch, 0, T_CLIENT_CONNECT,
-                                 &udp_server_addr, connected, client_senddone,
-                                 response_timeout, &testdata.region, &id,
-                                 &dispentry);
+                                 &udp_server_addr, NULL, NULL, connected,
+                                 client_senddone, response_timeout,
+                                 &testdata.region, &id, &dispentry);
        assert_int_equal(result, ISC_R_SUCCESS);
        dns_dispatch_detach(&dispatch);
 
@@ -555,9 +556,9 @@ ISC_LOOP_TEST_IMPL(dispatch_getnext) {
        dns_dispatchmgr_detach(&dispatchmgr);
 
        result = dns_dispatch_add(dispatch, 0, T_CLIENT_CONNECT,
-                                 &udp_server_addr, connected, client_senddone,
-                                 response_getnext, &testdata.region, &id,
-                                 &dispentry);
+                                 &udp_server_addr, NULL, NULL, connected,
+                                 client_senddone, response_getnext,
+                                 &testdata.region, &id, &dispentry);
        assert_int_equal(result, ISC_R_SUCCESS);
        dns_dispatch_detach(&dispatch);