From: Aram Sargsyan Date: Mon, 19 Sep 2022 11:04:22 +0000 (+0000) Subject: Implement TLS transport support for dns_request and dns_dispatch X-Git-Tag: v9.19.6~50^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=90959f6166dbb1143c89ac4b919a243e2fecf1ed;p=thirdparty%2Fbind9.git Implement TLS transport support for dns_request and dns_dispatch This change prepares ground for sending DNS requests using DoT, which, in particular, will be used for forwarding dynamic updates to TLS-enabled primaries. --- diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c index 4f4a3494209..caac7f8489e 100644 --- a/bin/nsupdate/nsupdate.c +++ b/bin/nsupdate/nsupdate.c @@ -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:"); diff --git a/bin/tests/system/pipelined/pipequeries.c b/bin/tests/system/pipelined/pipequeries.c index 8003a390e80..623f9748c2d 100644 --- a/bin/tests/system/pipelined/pipequeries.c +++ b/bin/tests/system/pipelined/pipequeries.c @@ -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); diff --git a/bin/tests/system/tkey/keycreate.c b/bin/tests/system/tkey/keycreate.c index 26f2aa7b135..255c29125ef 100644 --- a/bin/tests/system/tkey/keycreate.c +++ b/bin/tests/system/tkey/keycreate.c @@ -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); } diff --git a/bin/tests/system/tkey/keydelete.c b/bin/tests/system/tkey/keydelete.c index a3083d755bb..4bfdd0feaea 100644 --- a/bin/tests/system/tkey/keydelete.c +++ b/bin/tests/system/tkey/keydelete.c @@ -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); } diff --git a/bin/tools/mdig.c b/bin/tools/mdig.c index af7269480e8..368730b0e96 100644 --- a/bin/tools/mdig.c +++ b/bin/tools/mdig.c @@ -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); diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index fcee9751c2e..15062f523c5 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,7 @@ #include #include #include +#include #include 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; diff --git a/lib/dns/include/dns/dispatch.h b/lib/dns/include/dns/dispatch.h index b82a46c5a99..fff052cdd06 100644 --- a/lib/dns/include/dns/dispatch.h +++ b/lib/dns/include/dns/dispatch.h @@ -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); diff --git a/lib/dns/include/dns/request.h b/lib/dns/include/dns/request.h index c454161a602..5f72aef76e4 100644 --- a/lib/dns/include/dns/request.h +++ b/lib/dns/include/dns/request.h @@ -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, diff --git a/lib/dns/request.c b/lib/dns/request.c index 9e78d5b9c78..0a53f2b6205 100644 --- a/lib/dns/request.c +++ b/lib/dns/request.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -33,6 +34,7 @@ #include #include #include +#include #include #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; } diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index a22a68b0971..88259482870 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -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) { diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 08e140ca097..73a12b4772f 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -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, ¬ify->dst, dscp, options, key, - timeout * 3, timeout, 2, notify->zone->task, - notify_done, notify, ¬ify->request); + result = dns_request_create( + notify->zone->view->requestmgr, message, &src, ¬ify->dst, + NULL, NULL, dscp, options, key, timeout * 3, timeout, 2, + notify->zone->task, notify_done, notify, ¬ify->request); if (result == ISC_R_SUCCESS) { if (isc_sockaddr_pf(¬ify->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), diff --git a/tests/dns/dispatch_test.c b/tests/dns/dispatch_test.c index 0b910e44384..ed2c00d948f 100644 --- a/tests/dns/dispatch_test.c +++ b/tests/dns/dispatch_test.c @@ -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);