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) {
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;
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++;
}
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:");
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);
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);
}
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);
}
}
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);
#include <isc/stats.h>
#include <isc/string.h>
#include <isc/time.h>
+#include <isc/tls.h>
#include <isc/util.h>
#include <dns/acl.h>
#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;
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;
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));
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) {
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;
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.
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:
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;
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);
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,
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,
#include <isc/result.h>
#include <isc/task.h>
#include <isc/thread.h>
+#include <isc/tls.h>
#include <isc/util.h>
#include <dns/acl.h>
#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')
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,
}
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;
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,
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;
}
/* 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) {
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,
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);
}
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,
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",
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);
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),
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);
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);
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);
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);
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);