mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-03 13:59:27 -04:00
Merge branch '2401-use-netmgr-for-dispatch' into 'main'
Resolve "use netmgr for dispatch" Closes #2401 See merge request isc-projects/bind9!4601
This commit is contained in:
commit
d27d20e6d4
76 changed files with 3703 additions and 6410 deletions
8
CHANGES
8
CHANGES
|
|
@ -1,3 +1,11 @@
|
|||
5730. [func] The resolver and the request and dispatch managers
|
||||
have been substantially refactored, and are now
|
||||
based on the network manager instead of the old
|
||||
isc_socket API. All outgoing DNS queries and
|
||||
requests now use the new API; isc_socket is only
|
||||
used to monitor for network interface changes.
|
||||
[GL #2401]
|
||||
|
||||
5729. [func] Allow finer control over the TLS protocol by
|
||||
implementing more options within "tls" clauses, namely:
|
||||
- Diffie-Hellman parameters via
|
||||
|
|
|
|||
|
|
@ -1725,7 +1725,6 @@ main(int argc, char *argv[]) {
|
|||
isc_appctx_t *actx = NULL;
|
||||
isc_nm_t *netmgr = NULL;
|
||||
isc_taskmgr_t *taskmgr = NULL;
|
||||
isc_socketmgr_t *socketmgr = NULL;
|
||||
isc_timermgr_t *timermgr = NULL;
|
||||
dns_master_style_t *style = NULL;
|
||||
struct sigaction sa;
|
||||
|
|
@ -1744,8 +1743,8 @@ main(int argc, char *argv[]) {
|
|||
isc_mem_create(&mctx);
|
||||
|
||||
CHECK(isc_appctx_create(mctx, &actx));
|
||||
isc_managers_create(mctx, 1, 0, 0, &netmgr, &taskmgr, &timermgr,
|
||||
&socketmgr);
|
||||
|
||||
isc_managers_create(mctx, 1, 0, 0, &netmgr, &taskmgr, &timermgr, NULL);
|
||||
|
||||
parse_args(argc, argv);
|
||||
|
||||
|
|
@ -1763,7 +1762,7 @@ main(int argc, char *argv[]) {
|
|||
}
|
||||
|
||||
/* Create client */
|
||||
result = dns_client_create(mctx, actx, taskmgr, socketmgr, timermgr, 0,
|
||||
result = dns_client_create(mctx, actx, taskmgr, netmgr, timermgr, 0,
|
||||
&client, srcaddr4, srcaddr6);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
delv_log(ISC_LOG_ERROR, "dns_client_create: %s",
|
||||
|
|
@ -1846,7 +1845,9 @@ cleanup:
|
|||
if (client != NULL) {
|
||||
dns_client_detach(&client);
|
||||
}
|
||||
isc_managers_destroy(&netmgr, &taskmgr, &timermgr, &socketmgr);
|
||||
|
||||
isc_managers_destroy(&netmgr, &taskmgr, &timermgr, NULL);
|
||||
|
||||
if (actx != NULL) {
|
||||
isc_appctx_destroy(&actx);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1050,6 +1050,8 @@ update_listener(named_controls_t *cp, controllistener_t **listenerp,
|
|||
socktext, isc_result_totext(result));
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* XXX: no unix socket support yet */
|
||||
if (result == ISC_R_SUCCESS && type == isc_socktype_unix) {
|
||||
uint32_t perm, owner, group;
|
||||
perm = cfg_obj_asuint32(cfg_tuple_get(control, "perm"));
|
||||
|
|
@ -1073,6 +1075,7 @@ update_listener(named_controls_t *cp, controllistener_t **listenerp,
|
|||
socktext);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
*listenerp = listener;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -160,12 +160,8 @@
|
|||
|
||||
#ifdef TUNE_LARGE
|
||||
#define RESOLVER_NTASKS_PERCPU 32
|
||||
#define UDPBUFFERS 32768
|
||||
#define EXCLBUFFERS 32768
|
||||
#else
|
||||
#define RESOLVER_NTASKS_PERCPU 8
|
||||
#define UDPBUFFERS 1000
|
||||
#define EXCLBUFFERS 4096
|
||||
#endif /* TUNE_LARGE */
|
||||
|
||||
/* RFC7828 defines timeout as 16-bit value specified in units of 100
|
||||
|
|
@ -1260,11 +1256,9 @@ get_view_querysource_dispatch(const cfg_obj_t **maps, int af,
|
|||
dns_dispatch_t **dispatchp, isc_dscp_t *dscpp,
|
||||
bool is_firstview) {
|
||||
isc_result_t result = ISC_R_FAILURE;
|
||||
dns_dispatch_t *disp;
|
||||
dns_dispatch_t *disp = NULL;
|
||||
isc_sockaddr_t sa;
|
||||
unsigned int attrs;
|
||||
const cfg_obj_t *obj = NULL;
|
||||
unsigned int maxdispatchbuffers = UDPBUFFERS;
|
||||
isc_dscp_t dscp = -1;
|
||||
|
||||
switch (af) {
|
||||
|
|
@ -1310,20 +1304,7 @@ get_view_querysource_dispatch(const cfg_obj_t **maps, int af,
|
|||
/*
|
||||
* Try to find a dispatcher that we can share.
|
||||
*/
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_UDP;
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
break;
|
||||
case AF_INET6:
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
break;
|
||||
}
|
||||
if (isc_sockaddr_getport(&sa) == 0) {
|
||||
attrs |= DNS_DISPATCHATTR_EXCLUSIVE;
|
||||
maxdispatchbuffers = EXCLBUFFERS;
|
||||
} else {
|
||||
if (isc_sockaddr_getport(&sa) != 0) {
|
||||
INSIST(obj != NULL);
|
||||
if (is_firstview) {
|
||||
cfg_obj_log(obj, named_g_lctx, ISC_LOG_INFO,
|
||||
|
|
@ -1333,10 +1314,7 @@ get_view_querysource_dispatch(const cfg_obj_t **maps, int af,
|
|||
}
|
||||
}
|
||||
|
||||
disp = NULL;
|
||||
result = dns_dispatch_getudp(
|
||||
named_g_dispatchmgr, named_g_socketmgr, named_g_taskmgr, &sa,
|
||||
4096, maxdispatchbuffers, 32768, 16411, 16433, attrs, &disp);
|
||||
result = dns_dispatch_createudp(named_g_dispatchmgr, &sa, &disp);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_sockaddr_t any;
|
||||
char buf[ISC_SOCKADDR_FORMATSIZE];
|
||||
|
|
@ -4708,8 +4686,6 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, cfg_obj_t *config,
|
|||
|
||||
/*
|
||||
* Resolver.
|
||||
*
|
||||
* XXXRTH Hardwired number of tasks.
|
||||
*/
|
||||
CHECK(get_view_querysource_dispatch(
|
||||
maps, AF_INET, &dispatch4, &dscp4,
|
||||
|
|
@ -4719,7 +4695,7 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, cfg_obj_t *config,
|
|||
(ISC_LIST_PREV(view, link) == NULL)));
|
||||
if (dispatch4 == NULL && dispatch6 == NULL) {
|
||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||
"unable to obtain neither an IPv4 nor"
|
||||
"unable to obtain either an IPv4 or"
|
||||
" an IPv6 dispatch");
|
||||
result = ISC_R_UNEXPECTED;
|
||||
goto cleanup;
|
||||
|
|
@ -4738,7 +4714,7 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, cfg_obj_t *config,
|
|||
ndisp = 4 * ISC_MIN(named_g_udpdisp, MAX_UDP_DISPATCH);
|
||||
CHECK(dns_view_createresolver(
|
||||
view, named_g_taskmgr, RESOLVER_NTASKS_PERCPU * named_g_cpus,
|
||||
ndisp, named_g_socketmgr, named_g_timermgr, resopts,
|
||||
ndisp, named_g_netmgr, named_g_timermgr, resopts,
|
||||
named_g_dispatchmgr, dispatch4, dispatch6));
|
||||
|
||||
if (dscp4 == -1) {
|
||||
|
|
@ -9884,7 +9860,8 @@ run_server(isc_task_t *task, isc_event_t *event) {
|
|||
|
||||
isc_event_free(&event);
|
||||
|
||||
CHECKFATAL(dns_dispatchmgr_create(named_g_mctx, &named_g_dispatchmgr),
|
||||
CHECKFATAL(dns_dispatchmgr_create(named_g_mctx, named_g_netmgr,
|
||||
&named_g_dispatchmgr),
|
||||
"creating dispatch manager");
|
||||
|
||||
dns_dispatchmgr_setstats(named_g_dispatchmgr, server->resolverstats);
|
||||
|
|
@ -9898,8 +9875,8 @@ run_server(isc_task_t *task, isc_event_t *event) {
|
|||
CHECKFATAL(ns_interfacemgr_create(
|
||||
named_g_mctx, server->sctx, named_g_taskmgr,
|
||||
named_g_timermgr, named_g_socketmgr, named_g_netmgr,
|
||||
named_g_dispatchmgr, server->task, named_g_udpdisp,
|
||||
geoip, named_g_cpus, &server->interfacemgr),
|
||||
named_g_dispatchmgr, server->task, geoip,
|
||||
named_g_cpus, &server->interfacemgr),
|
||||
"creating interface manager");
|
||||
|
||||
CHECKFATAL(isc_timer_create(named_g_timermgr, isc_timertype_inactive,
|
||||
|
|
@ -10024,7 +10001,7 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
|
|||
|
||||
ns_interfacemgr_detach(&server->interfacemgr);
|
||||
|
||||
dns_dispatchmgr_destroy(&named_g_dispatchmgr);
|
||||
dns_dispatchmgr_detach(&named_g_dispatchmgr);
|
||||
|
||||
dns_zonemgr_shutdown(server->zonemgr);
|
||||
|
||||
|
|
@ -10166,8 +10143,8 @@ named_server_create(isc_mem_t *mctx, named_server_t **serverp) {
|
|||
server->heartbeat_interval = 0;
|
||||
|
||||
CHECKFATAL(dns_zonemgr_create(named_g_mctx, named_g_taskmgr,
|
||||
named_g_timermgr, named_g_socketmgr,
|
||||
named_g_netmgr, &server->zonemgr),
|
||||
named_g_timermgr, named_g_netmgr,
|
||||
&server->zonemgr),
|
||||
"dns_zonemgr_create");
|
||||
CHECKFATAL(dns_zonemgr_setsize(server->zonemgr, 1000), "dns_zonemgr_"
|
||||
"setsize");
|
||||
|
|
@ -10352,7 +10329,6 @@ named_add_reserved_dispatch(named_server_t *server,
|
|||
in_port_t port;
|
||||
char addrbuf[ISC_SOCKADDR_FORMATSIZE];
|
||||
isc_result_t result;
|
||||
unsigned int attrs;
|
||||
|
||||
REQUIRE(NAMED_SERVER_VALID(server));
|
||||
|
||||
|
|
@ -10379,24 +10355,8 @@ named_add_reserved_dispatch(named_server_t *server,
|
|||
dispatch->dispatchgen = server->dispatchgen;
|
||||
dispatch->dispatch = NULL;
|
||||
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_UDP;
|
||||
switch (isc_sockaddr_pf(addr)) {
|
||||
case AF_INET:
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
break;
|
||||
case AF_INET6:
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
break;
|
||||
default:
|
||||
result = ISC_R_NOTIMPLEMENTED;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
result = dns_dispatch_getudp(named_g_dispatchmgr, named_g_socketmgr,
|
||||
named_g_taskmgr, &dispatch->addr, 4096,
|
||||
UDPBUFFERS, 32768, 16411, 16433, attrs,
|
||||
&dispatch->dispatch);
|
||||
result = dns_dispatch_createudp(named_g_dispatchmgr, &dispatch->addr,
|
||||
&dispatch->dispatch);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include <isc/log.h>
|
||||
#include <isc/managers.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/netmgr.h>
|
||||
#include <isc/nonce.h>
|
||||
#include <isc/parseint.h>
|
||||
#include <isc/portset.h>
|
||||
|
|
@ -38,11 +39,9 @@
|
|||
#include <isc/random.h>
|
||||
#include <isc/region.h>
|
||||
#include <isc/sockaddr.h>
|
||||
#include <isc/socket.h>
|
||||
#include <isc/stdio.h>
|
||||
#include <isc/string.h>
|
||||
#include <isc/task.h>
|
||||
#include <isc/timer.h>
|
||||
#include <isc/types.h>
|
||||
#include <isc/util.h>
|
||||
|
||||
|
|
@ -97,7 +96,6 @@
|
|||
|
||||
#define MAXCMD (128 * 1024)
|
||||
#define MAXWIRE (64 * 1024)
|
||||
#define PACKETSIZE ((64 * 1024) - 1)
|
||||
#define INITTEXT (2 * 1024)
|
||||
#define MAXTEXT (128 * 1024)
|
||||
#define FIND_TIMEOUT 5
|
||||
|
|
@ -132,8 +130,6 @@ static isc_log_t *glctx = NULL;
|
|||
static isc_mem_t *gmctx = NULL;
|
||||
static dns_dispatchmgr_t *dispatchmgr = NULL;
|
||||
static dns_requestmgr_t *requestmgr = NULL;
|
||||
static isc_socketmgr_t *socketmgr = NULL;
|
||||
static isc_timermgr_t *timermgr = NULL;
|
||||
static dns_dispatch_t *dispatchv4 = NULL;
|
||||
static dns_dispatch_t *dispatchv6 = NULL;
|
||||
static dns_message_t *updatemsg = NULL;
|
||||
|
|
@ -739,14 +735,15 @@ doshutdown(void) {
|
|||
}
|
||||
|
||||
ddebug("Shutting down dispatch manager");
|
||||
dns_dispatchmgr_destroy(&dispatchmgr);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
}
|
||||
|
||||
static void
|
||||
maybeshutdown(void) {
|
||||
/* when called from getinput, doshutdown might be already finished */
|
||||
if (requestmgr == NULL)
|
||||
if (requestmgr == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
ddebug("Shutting down request manager");
|
||||
dns_requestmgr_shutdown(requestmgr);
|
||||
|
|
@ -802,7 +799,6 @@ static void
|
|||
setup_system(void) {
|
||||
isc_result_t result;
|
||||
isc_sockaddr_t bind_any, bind_any6;
|
||||
unsigned int attrs;
|
||||
isc_sockaddrlist_t *nslist;
|
||||
isc_logconfig_t *logconfig = NULL;
|
||||
irs_resconf_t *resconf = NULL;
|
||||
|
|
@ -919,11 +915,12 @@ setup_system(void) {
|
|||
|
||||
irs_resconf_destroy(&resconf);
|
||||
|
||||
result = dns_dispatchmgr_create(gmctx, &dispatchmgr);
|
||||
check_result(result, "dns_dispatchmgr_create");
|
||||
result = isc_managers_create(gmctx, 1, 0, 0, &netmgr, &taskmgr, NULL,
|
||||
NULL);
|
||||
check_result(result, "isc_managers_create");
|
||||
|
||||
isc_managers_create(gmctx, 1, 0, 0, &netmgr, &taskmgr, &timermgr,
|
||||
&socketmgr);
|
||||
result = dns_dispatchmgr_create(gmctx, netmgr, &dispatchmgr);
|
||||
check_result(result, "dns_dispatchmgr_create");
|
||||
|
||||
result = isc_task_create(taskmgr, 0, &global_task);
|
||||
check_result(result, "isc_task_create");
|
||||
|
|
@ -938,30 +935,21 @@ setup_system(void) {
|
|||
set_source_ports(dispatchmgr);
|
||||
|
||||
if (have_ipv6) {
|
||||
attrs = DNS_DISPATCHATTR_UDP;
|
||||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
isc_sockaddr_any6(&bind_any6);
|
||||
result = dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr,
|
||||
&bind_any6, PACKETSIZE, 4, 2, 3, 5,
|
||||
attrs, &dispatchv6);
|
||||
check_result(result, "dns_dispatch_getudp (v6)");
|
||||
result = dns_dispatch_createudp(dispatchmgr, &bind_any6,
|
||||
&dispatchv6);
|
||||
check_result(result, "dns_dispatch_createudp (v6)");
|
||||
}
|
||||
|
||||
if (have_ipv4) {
|
||||
attrs = DNS_DISPATCHATTR_UDP;
|
||||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
isc_sockaddr_any(&bind_any);
|
||||
result = dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr,
|
||||
&bind_any, PACKETSIZE, 4, 2, 3, 5,
|
||||
attrs, &dispatchv4);
|
||||
check_result(result, "dns_dispatch_getudp (v4)");
|
||||
result = dns_dispatch_createudp(dispatchmgr, &bind_any,
|
||||
&dispatchv4);
|
||||
check_result(result, "dns_dispatch_createudp (v4)");
|
||||
}
|
||||
|
||||
result = dns_requestmgr_create(gmctx, timermgr, socketmgr, taskmgr,
|
||||
dispatchmgr, dispatchv4, dispatchv6,
|
||||
&requestmgr);
|
||||
result = dns_requestmgr_create(gmctx, taskmgr, dispatchmgr, dispatchv4,
|
||||
dispatchv6, &requestmgr);
|
||||
check_result(result, "dns_requestmgr_create");
|
||||
|
||||
if (keystr != NULL) {
|
||||
|
|
@ -3332,7 +3320,7 @@ cleanup(void) {
|
|||
}
|
||||
|
||||
ddebug("Shutting down managers");
|
||||
isc_managers_destroy(&netmgr, &taskmgr, &timermgr, &socketmgr);
|
||||
isc_managers_destroy(&netmgr, &taskmgr, NULL, NULL);
|
||||
|
||||
ddebug("Destroying event");
|
||||
isc_event_free(&global_event);
|
||||
|
|
|
|||
19
bin/tests/system/hooks/prereq.sh
Normal file
19
bin/tests/system/hooks/prereq.sh
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
|
||||
#
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, you can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
#
|
||||
# See the COPYRIGHT file distributed with this work for additional
|
||||
# information regarding copyright ownership.
|
||||
|
||||
. ../conf.sh
|
||||
|
||||
$FEATURETEST --tsan && {
|
||||
echo_i "TSAN - skipping hooks test"
|
||||
exit 255
|
||||
}
|
||||
|
||||
exit 0
|
||||
|
|
@ -23,12 +23,11 @@
|
|||
#include <isc/managers.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/net.h>
|
||||
#include <isc/netmgr.h>
|
||||
#include <isc/parseint.h>
|
||||
#include <isc/print.h>
|
||||
#include <isc/sockaddr.h>
|
||||
#include <isc/socket.h>
|
||||
#include <isc/task.h>
|
||||
#include <isc/timer.h>
|
||||
#include <isc/util.h>
|
||||
|
||||
#include <dns/dispatch.h>
|
||||
|
|
@ -59,8 +58,8 @@
|
|||
#define PORT 5300
|
||||
#define TIMEOUT 30
|
||||
|
||||
static isc_mem_t *mctx;
|
||||
static dns_requestmgr_t *requestmgr;
|
||||
static isc_mem_t *mctx = NULL;
|
||||
static dns_requestmgr_t *requestmgr = NULL;
|
||||
static bool have_src = false;
|
||||
static isc_sockaddr_t srcaddr;
|
||||
static isc_sockaddr_t dstaddr;
|
||||
|
|
@ -70,7 +69,8 @@ static void
|
|||
recvresponse(isc_task_t *task, isc_event_t *event) {
|
||||
dns_requestevent_t *reqev = (dns_requestevent_t *)event;
|
||||
isc_result_t result;
|
||||
dns_message_t *query, *response;
|
||||
dns_message_t *query = NULL;
|
||||
dns_message_t *response = NULL;
|
||||
isc_buffer_t outbuf;
|
||||
char output[1024];
|
||||
|
||||
|
|
@ -86,7 +86,6 @@ recvresponse(isc_task_t *task, isc_event_t *event) {
|
|||
|
||||
query = reqev->ev_arg;
|
||||
|
||||
response = NULL;
|
||||
dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &response);
|
||||
|
||||
result = dns_request_getresponse(reqev->request, response,
|
||||
|
|
@ -126,10 +125,10 @@ recvresponse(isc_task_t *task, isc_event_t *event) {
|
|||
|
||||
static isc_result_t
|
||||
sendquery(isc_task_t *task) {
|
||||
dns_request_t *request;
|
||||
dns_message_t *message;
|
||||
dns_name_t *qname;
|
||||
dns_rdataset_t *qrdataset;
|
||||
dns_request_t *request = NULL;
|
||||
dns_message_t *message = NULL;
|
||||
dns_name_t *qname = NULL;
|
||||
dns_rdataset_t *qrdataset = NULL;
|
||||
isc_result_t result;
|
||||
dns_fixedname_t queryname;
|
||||
isc_buffer_t buf;
|
||||
|
|
@ -150,7 +149,6 @@ sendquery(isc_task_t *task) {
|
|||
dns_rootname, 0, NULL);
|
||||
CHECK("dns_name_fromtext", result);
|
||||
|
||||
message = NULL;
|
||||
dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, &message);
|
||||
|
||||
message->opcode = dns_opcode_query;
|
||||
|
|
@ -158,11 +156,9 @@ sendquery(isc_task_t *task) {
|
|||
message->rdclass = dns_rdataclass_in;
|
||||
message->id = (unsigned short)(random() & 0xFFFF);
|
||||
|
||||
qname = NULL;
|
||||
result = dns_message_gettempname(message, &qname);
|
||||
CHECK("dns_message_gettempname", result);
|
||||
|
||||
qrdataset = NULL;
|
||||
result = dns_message_gettemprdataset(message, &qrdataset);
|
||||
CHECK("dns_message_gettemprdataset", result);
|
||||
|
||||
|
|
@ -172,11 +168,10 @@ sendquery(isc_task_t *task) {
|
|||
ISC_LIST_APPEND(qname->list, qrdataset, link);
|
||||
dns_message_addname(message, qname, DNS_SECTION_QUESTION);
|
||||
|
||||
request = NULL;
|
||||
result = dns_request_createvia(
|
||||
requestmgr, message, have_src ? &srcaddr : NULL, &dstaddr, -1,
|
||||
DNS_REQUESTOPT_TCP | DNS_REQUESTOPT_SHARE, NULL, TIMEOUT, 0, 0,
|
||||
task, recvresponse, message, &request);
|
||||
result = dns_request_createvia(requestmgr, message,
|
||||
have_src ? &srcaddr : NULL, &dstaddr, -1,
|
||||
DNS_REQUESTOPT_TCP, NULL, TIMEOUT, 0, 0,
|
||||
task, recvresponse, message, &request);
|
||||
CHECK("dns_request_create", result);
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
|
|
@ -203,17 +198,14 @@ main(int argc, char *argv[]) {
|
|||
isc_sockaddr_t bind_any;
|
||||
struct in_addr inaddr;
|
||||
isc_result_t result;
|
||||
isc_log_t *lctx;
|
||||
isc_logconfig_t *lcfg;
|
||||
isc_log_t *lctx = NULL;
|
||||
isc_logconfig_t *lcfg = NULL;
|
||||
isc_nm_t *netmgr = NULL;
|
||||
isc_taskmgr_t *taskmgr = NULL;
|
||||
isc_task_t *task = NULL;
|
||||
isc_timermgr_t *timermgr = NULL;
|
||||
isc_socketmgr_t *socketmgr = NULL;
|
||||
dns_dispatchmgr_t *dispatchmgr = NULL;
|
||||
unsigned int attrs;
|
||||
dns_dispatch_t *dispatchv4;
|
||||
dns_view_t *view;
|
||||
dns_dispatch_t *dispatchv4 = NULL;
|
||||
dns_view_t *view = NULL;
|
||||
uint16_t port = PORT;
|
||||
int c;
|
||||
|
||||
|
|
@ -267,35 +259,22 @@ main(int argc, char *argv[]) {
|
|||
}
|
||||
isc_sockaddr_fromin(&dstaddr, &inaddr, port);
|
||||
|
||||
mctx = NULL;
|
||||
isc_mem_create(&mctx);
|
||||
|
||||
lctx = NULL;
|
||||
lcfg = NULL;
|
||||
isc_log_create(mctx, &lctx, &lcfg);
|
||||
|
||||
RUNCHECK(dst_lib_init(mctx, NULL));
|
||||
|
||||
isc_managers_create(mctx, 1, 0, 0, &netmgr, &taskmgr, &timermgr,
|
||||
&socketmgr);
|
||||
|
||||
isc_managers_create(mctx, 1, 0, 0, &netmgr, &taskmgr, NULL, NULL);
|
||||
RUNCHECK(isc_task_create(taskmgr, 0, &task));
|
||||
RUNCHECK(dns_dispatchmgr_create(mctx, &dispatchmgr));
|
||||
RUNCHECK(dns_dispatchmgr_create(mctx, netmgr, &dispatchmgr));
|
||||
|
||||
attrs = DNS_DISPATCHATTR_UDP | DNS_DISPATCHATTR_MAKEQUERY |
|
||||
DNS_DISPATCHATTR_IPV4;
|
||||
dispatchv4 = NULL;
|
||||
RUNCHECK(dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr,
|
||||
have_src ? &srcaddr : &bind_any, 4096, 4,
|
||||
2, 3, 5, attrs, &dispatchv4));
|
||||
requestmgr = NULL;
|
||||
RUNCHECK(dns_requestmgr_create(mctx, timermgr, socketmgr, taskmgr,
|
||||
dispatchmgr, dispatchv4, NULL,
|
||||
&requestmgr));
|
||||
RUNCHECK(dns_dispatch_createudp(
|
||||
dispatchmgr, have_src ? &srcaddr : &bind_any, &dispatchv4));
|
||||
RUNCHECK(dns_requestmgr_create(mctx, taskmgr, dispatchmgr, dispatchv4,
|
||||
NULL, &requestmgr));
|
||||
|
||||
view = NULL;
|
||||
RUNCHECK(dns_view_create(mctx, 0, "_test", &view));
|
||||
|
||||
RUNCHECK(isc_app_onrun(mctx, task, sendqueries, NULL));
|
||||
|
||||
(void)isc_app_run();
|
||||
|
|
@ -306,12 +285,12 @@ main(int argc, char *argv[]) {
|
|||
dns_requestmgr_detach(&requestmgr);
|
||||
|
||||
dns_dispatch_detach(&dispatchv4);
|
||||
dns_dispatchmgr_destroy(&dispatchmgr);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
|
||||
isc_task_shutdown(task);
|
||||
isc_task_detach(&task);
|
||||
|
||||
isc_managers_destroy(&netmgr, &taskmgr, &timermgr, &socketmgr);
|
||||
isc_managers_destroy(&netmgr, &taskmgr, NULL, NULL);
|
||||
|
||||
dst_lib_destroy();
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ options {
|
|||
recursion yes;
|
||||
qname-minimization disabled;
|
||||
querylog yes;
|
||||
resolver-query-timeout 30;
|
||||
resolver-query-timeout 30000; # 30 seconds
|
||||
dnssec-validation no;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ options {
|
|||
recursion yes;
|
||||
qname-minimization strict;
|
||||
querylog yes;
|
||||
resolver-query-timeout 30;
|
||||
resolver-query-timeout 30000; # 30 seconds
|
||||
dnssec-validation no;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ options {
|
|||
recursion yes;
|
||||
qname-minimization relaxed;
|
||||
querylog yes;
|
||||
resolver-query-timeout 30;
|
||||
resolver-query-timeout 30000; # 30 seconds
|
||||
dnssec-validation no;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -27,9 +27,9 @@
|
|||
#include <isc/commandline.h>
|
||||
#include <isc/managers.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/netmgr.h>
|
||||
#include <isc/print.h>
|
||||
#include <isc/sockaddr.h>
|
||||
#include <isc/socket.h>
|
||||
#include <isc/task.h>
|
||||
#include <isc/timer.h>
|
||||
#include <isc/util.h>
|
||||
|
|
@ -58,13 +58,11 @@ isc_mem_t *ctxs_mctx = NULL;
|
|||
isc_appctx_t *ctxs_actx = NULL;
|
||||
isc_nm_t *ctxs_netmgr = NULL;
|
||||
isc_taskmgr_t *ctxs_taskmgr = NULL;
|
||||
isc_socketmgr_t *ctxs_socketmgr = NULL;
|
||||
isc_timermgr_t *ctxs_timermgr = NULL;
|
||||
|
||||
static void
|
||||
ctxs_destroy(void) {
|
||||
isc_managers_destroy(&ctxs_netmgr, &ctxs_taskmgr, &ctxs_timermgr,
|
||||
&ctxs_socketmgr);
|
||||
isc_managers_destroy(&ctxs_netmgr, &ctxs_taskmgr, &ctxs_timermgr, NULL);
|
||||
|
||||
if (ctxs_actx != NULL) {
|
||||
isc_appctx_destroy(&ctxs_actx);
|
||||
|
|
@ -87,7 +85,7 @@ ctxs_init(void) {
|
|||
}
|
||||
|
||||
isc_managers_create(ctxs_mctx, 1, 0, 0, &ctxs_netmgr, &ctxs_taskmgr,
|
||||
&ctxs_timermgr, &ctxs_socketmgr);
|
||||
&ctxs_timermgr, NULL);
|
||||
|
||||
result = isc_app_ctxstart(ctxs_actx);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
|
|
@ -102,7 +100,7 @@ fail:
|
|||
return (result);
|
||||
}
|
||||
|
||||
static char *algname;
|
||||
static char *algname = NULL;
|
||||
|
||||
static isc_result_t
|
||||
printdata(dns_rdataset_t *rdataset, dns_name_t *owner) {
|
||||
|
|
@ -281,9 +279,9 @@ main(int argc, char *argv[]) {
|
|||
isc_buffer_t b;
|
||||
dns_fixedname_t qname0;
|
||||
unsigned int namelen;
|
||||
dns_name_t *qname, *name;
|
||||
dns_name_t *qname = NULL, *name = NULL;
|
||||
dns_rdatatype_t type = dns_rdatatype_a;
|
||||
dns_rdataset_t *rdataset;
|
||||
dns_rdataset_t *rdataset = NULL;
|
||||
dns_namelist_t namelist;
|
||||
unsigned int clientopt, resopt = 0;
|
||||
bool is_sep = false;
|
||||
|
|
@ -406,7 +404,7 @@ main(int argc, char *argv[]) {
|
|||
|
||||
clientopt = 0;
|
||||
result = dns_client_create(ctxs_mctx, ctxs_actx, ctxs_taskmgr,
|
||||
ctxs_socketmgr, ctxs_timermgr, clientopt,
|
||||
ctxs_netmgr, ctxs_timermgr, clientopt,
|
||||
&client, addr4, addr6);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
fprintf(stderr, "dns_client_create failed: %u, %s\n", result,
|
||||
|
|
|
|||
|
|
@ -453,6 +453,9 @@ make_proto_nodata() {
|
|||
return 0
|
||||
}
|
||||
|
||||
# ensure that the fast-expire zone is populated before we begin testing
|
||||
$RNDCCMD $ns3 retransfer fast-expire
|
||||
|
||||
for mode in native dnsrps; do
|
||||
status=0
|
||||
case ${mode} in
|
||||
|
|
|
|||
|
|
@ -37,9 +37,9 @@ options {
|
|||
stale-cache-enable yes;
|
||||
stale-answer-ttl 3;
|
||||
stale-refresh-time 0;
|
||||
stale-answer-client-timeout 1800;
|
||||
stale-answer-client-timeout 1800; # 1.8 seconds
|
||||
max-stale-ttl 3600;
|
||||
resolver-query-timeout 10;
|
||||
resolver-query-timeout 30000; # 30 seconds
|
||||
};
|
||||
|
||||
zone "." {
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ options {
|
|||
stale-answer-ttl 3;
|
||||
stale-refresh-time 0;
|
||||
max-stale-ttl 3600;
|
||||
resolver-query-timeout 10;
|
||||
resolver-query-timeout 10000; # 10 seconds
|
||||
};
|
||||
|
||||
zone "." {
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ options {
|
|||
stale-answer-ttl 3;
|
||||
stale-answer-client-timeout 0;
|
||||
stale-refresh-time 0;
|
||||
resolver-query-timeout 10;
|
||||
resolver-query-timeout 10000; # 10 seconds
|
||||
max-stale-ttl 3600;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ options {
|
|||
stale-answer-ttl 3;
|
||||
stale-answer-client-timeout 0;
|
||||
stale-refresh-time 4;
|
||||
resolver-query-timeout 10;
|
||||
resolver-query-timeout 10000; # 10 seconds
|
||||
max-stale-ttl 3600;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ options {
|
|||
stale-cache-enable yes;
|
||||
stale-answer-ttl 3;
|
||||
stale-refresh-time 4;
|
||||
resolver-query-timeout 10;
|
||||
resolver-query-timeout 10000; # 10 seconds
|
||||
fetches-per-zone 1 fail;
|
||||
fetches-per-server 1 fail;
|
||||
max-stale-ttl 3600;
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ options {
|
|||
stale-cache-enable yes;
|
||||
stale-answer-ttl 3;
|
||||
stale-refresh-time 4;
|
||||
resolver-query-timeout 10;
|
||||
resolver-query-timeout 10000; # 10 seconds
|
||||
fetches-per-zone 1 fail;
|
||||
fetches-per-server 1 fail;
|
||||
max-stale-ttl 3600;
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
|
|||
$DIG -p ${PORT} @10.53.0.1 longttl.example TXT > dig.out.test$((n+2)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+3)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+4)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+5))
|
||||
$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+5)) &
|
||||
|
||||
wait
|
||||
|
||||
|
|
@ -282,7 +282,7 @@ echo_i "sending queries for tests $((n+1))-$((n+4))..."
|
|||
$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
|
||||
$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4)) &
|
||||
|
||||
wait
|
||||
|
||||
|
|
@ -336,7 +336,7 @@ echo_i "sending queries for tests $((n+1))-$((n+4))..."
|
|||
$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
|
||||
$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4)) &
|
||||
|
||||
wait
|
||||
|
||||
|
|
@ -402,7 +402,7 @@ echo_i "sending queries for tests $((n+1))-$((n+4))..."
|
|||
$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
|
||||
$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4)) &
|
||||
|
||||
wait
|
||||
|
||||
|
|
@ -594,7 +594,7 @@ echo_i "sending queries for tests $((n+1))-$((n+4))..."
|
|||
$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
|
||||
$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4)) &
|
||||
|
||||
wait
|
||||
|
||||
|
|
@ -672,7 +672,7 @@ echo_i "sending queries for tests $((n+1))-$((n+4))..."
|
|||
$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
|
||||
$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
|
||||
$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4)) &
|
||||
|
||||
wait
|
||||
|
||||
|
|
@ -1006,7 +1006,7 @@ echo_i "sending queries for tests $((n+1))-$((n+4))..."
|
|||
$DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
|
||||
$DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) &
|
||||
$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) &
|
||||
$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4))
|
||||
$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4)) &
|
||||
|
||||
wait
|
||||
|
||||
|
|
@ -1094,7 +1094,7 @@ $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
|
|||
$DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) &
|
||||
$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) &
|
||||
$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4)) &
|
||||
$DIG -p ${PORT} @10.53.0.3 notfound.example TXT > dig.out.test$((n+5))
|
||||
$DIG -p ${PORT} @10.53.0.3 notfound.example TXT > dig.out.test$((n+5)) &
|
||||
|
||||
wait
|
||||
|
||||
|
|
@ -1247,7 +1247,7 @@ echo_i "sending queries for tests $((n+1))-$((n+4))..."
|
|||
$DIG -p ${PORT} @10.53.0.4 data.example TXT > dig.out.test$((n+1)) &
|
||||
$DIG -p ${PORT} @10.53.0.4 othertype.example CAA > dig.out.test$((n+2)) &
|
||||
$DIG -p ${PORT} @10.53.0.4 nodata.example TXT > dig.out.test$((n+3)) &
|
||||
$DIG -p ${PORT} @10.53.0.4 nxdomain.example TXT > dig.out.test$((n+4))
|
||||
$DIG -p ${PORT} @10.53.0.4 nxdomain.example TXT > dig.out.test$((n+4)) &
|
||||
|
||||
wait
|
||||
|
||||
|
|
@ -1453,7 +1453,7 @@ echo_i "sending queries for tests $((n+1))-$((n+4))..."
|
|||
$DIG -p ${PORT} @10.53.0.5 data.example TXT > dig.out.test$((n+1)) &
|
||||
$DIG -p ${PORT} @10.53.0.5 othertype.example CAA > dig.out.test$((n+2)) &
|
||||
$DIG -p ${PORT} @10.53.0.5 nodata.example TXT > dig.out.test$((n+3)) &
|
||||
$DIG -p ${PORT} @10.53.0.5 nxdomain.example TXT > dig.out.test$((n+4))
|
||||
$DIG -p ${PORT} @10.53.0.5 nxdomain.example TXT > dig.out.test$((n+4)) &
|
||||
|
||||
wait
|
||||
|
||||
|
|
@ -1651,8 +1651,8 @@ nextpart ns3/named.run > /dev/null
|
|||
|
||||
echo_i "sending queries for tests $((n+1))-$((n+2))..."
|
||||
t1=`$PERL -e 'print time()'`
|
||||
$DIG -p ${PORT} +tries=1 +timeout=10 @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
|
||||
$DIG -p ${PORT} +tries=1 +timeout=10 @10.53.0.3 nodata.example TXT > dig.out.test$((n+2))
|
||||
$DIG -p ${PORT} +tries=1 +timeout=11 @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
|
||||
$DIG -p ${PORT} +tries=1 +timeout=11 @10.53.0.3 nodata.example TXT > dig.out.test$((n+2)) &
|
||||
wait
|
||||
t2=`$PERL -e 'print time()'`
|
||||
|
||||
|
|
@ -1687,14 +1687,14 @@ status=$((status+ret))
|
|||
nextpart ns3/named.run > /dev/null
|
||||
|
||||
echo_i "sending queries for tests $((n+2))-$((n+3))..."
|
||||
$DIG -p ${PORT} +tries=1 +timeout=3 @10.53.0.3 longttl.example TXT > dig.out.test$((n+2)) &
|
||||
# first dig runs in background for 3 seconds, second in foreground for 3
|
||||
$DIG -p ${PORT} +tries=1 +timeout=10 @10.53.0.3 longttl.example TXT > dig.out.test$((n+3)) &
|
||||
$DIG -p ${PORT} +tries=1 +timeout=3 @10.53.0.3 longttl.example TXT > dig.out.test$((n+2))
|
||||
|
||||
# Enable the authoritative name server after stale-answer-client-timeout.
|
||||
n=$((n+1))
|
||||
echo_i "enable responses from authoritative server ($n)"
|
||||
ret=0
|
||||
sleep 4
|
||||
$DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
|
||||
grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
|
||||
grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
|
||||
|
|
@ -1705,25 +1705,17 @@ n=$((n+1))
|
|||
echo_i "check not in cache longttl.example times out (stale-answer-client-timeout 1.8) ($n)"
|
||||
ret=0
|
||||
wait_for_log 4 "longttl.example client timeout, stale answer unavailable" ns3/named.run || ret=1
|
||||
check_results() {
|
||||
[ -s "$1" ] || return 1
|
||||
grep "connection timed out" "$1" > /dev/null || return 1
|
||||
return 0
|
||||
}
|
||||
retry_quiet 4 check_results dig.out.test$n || ret=1
|
||||
grep "connection timed out" dig.out.test$n > /dev/null || ret=1
|
||||
if [ $ret != 0 ]; then echo_i "failed"; fi
|
||||
status=$((status+ret))
|
||||
|
||||
wait
|
||||
|
||||
n=$((n+1))
|
||||
echo_i "check not in cache longttl.example comes from authoritative (stale-answer-client-timeout 1.8) ($n)"
|
||||
ret=0
|
||||
check_results() {
|
||||
[ -s "$1" ] || return 1
|
||||
grep "status: NOERROR" "$1" > /dev/null || return 1
|
||||
grep "ANSWER: 1," "$1" > /dev/null || return 1
|
||||
return 0
|
||||
}
|
||||
retry_quiet 8 check_results dig.out.test$n || ret=1
|
||||
grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
|
||||
grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
|
||||
if [ $ret != 0 ]; then echo_i "failed"; fi
|
||||
status=$((status+ret))
|
||||
|
||||
|
|
@ -2214,7 +2206,7 @@ echo_i "sending queries for tests $((n+1))-$((n+4))..."
|
|||
$DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
|
||||
$DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) &
|
||||
$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) &
|
||||
$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4))
|
||||
$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4)) &
|
||||
|
||||
wait
|
||||
|
||||
|
|
|
|||
|
|
@ -11,8 +11,7 @@
|
|||
|
||||
. ../conf.sh
|
||||
|
||||
DIGOPTS="+tcp +noadd +nosea +nostat +noquest +nocomm +nocmd"
|
||||
DIGCMD="$DIG $DIGOPTS -p ${PORT}"
|
||||
DIGCMD="$DIG +tcp -p ${PORT}"
|
||||
RNDCCMD="$RNDC -p ${CONTROLPORT} -c ../common/rndc.conf"
|
||||
|
||||
status=0
|
||||
|
|
@ -163,8 +162,8 @@ n=`expr $n + 1`
|
|||
ret=0
|
||||
echo_i "checking bind9.xsl vs xml ($n)"
|
||||
if $FEATURETEST --have-libxml2 && [ -x "${CURL}" ] && [ -x "${XSLTPROC}" ] ; then
|
||||
$DIGCMD +notcp +recurse @10.53.0.3 soa . > /dev/null 2>&1
|
||||
$DIGCMD +notcp +recurse @10.53.0.3 soa example > /dev/null 2>&1
|
||||
$DIGCMD +notcp +recurse @10.53.0.3 soa . > dig.out.test$n.1 2>&1
|
||||
$DIGCMD +notcp +recurse @10.53.0.3 soa example > dig.out.test$n.2 2>&1
|
||||
${CURL} http://10.53.0.3:${EXTRAPORT1}/xml/v3 > curl.out.${n}.xml 2>/dev/null || ret=1
|
||||
${CURL} http://10.53.0.3:${EXTRAPORT1}/bind9.xsl > curl.out.${n}.xsl 2>/dev/null || ret=1
|
||||
${XSLTPROC} curl.out.${n}.xsl - < curl.out.${n}.xml > xsltproc.out.${n} 2>/dev/null || ret=1
|
||||
|
|
@ -181,7 +180,7 @@ if $FEATURETEST --have-libxml2 && [ -x "${CURL}" ] && [ -x "${XSLTPROC}" ] ; th
|
|||
grep "<h3>View " xsltproc.out.${n} >/dev/null || ret=1
|
||||
grep "<h2>Server Statistics</h2>" xsltproc.out.${n} >/dev/null || ret=1
|
||||
grep "<h2>Zone Maintenance Statistics</h2>" xsltproc.out.${n} >/dev/null || ret=1
|
||||
grep "<h2>Resolver Statistics (Common)</h2>" xsltproc.out.${n} >/dev/null || ret=1
|
||||
# grep "<h2>Resolver Statistics (Common)</h2>" xsltproc.out.${n} >/dev/null || ret=1
|
||||
grep "<h3>Resolver Statistics for View " xsltproc.out.${n} >/dev/null || ret=1
|
||||
grep "<h3>ADB Statistics for View " xsltproc.out.${n} >/dev/null || ret=1
|
||||
grep "<h3>Cache Statistics for View " xsltproc.out.${n} >/dev/null || ret=1
|
||||
|
|
@ -223,7 +222,7 @@ if $FEATURETEST --have-libxml2 && [ -x "${CURL}" ] && [ -x "${XSLTPROC}" ] ; th
|
|||
grep "<counter name=\"TCP4ConnFail\">0</counter>" stats.xml.out >/dev/null || ret=1
|
||||
grep "<counter name=\"TCP4OpenFail\">0</counter>" stats.xml.out >/dev/null || ret=1
|
||||
grep "<counter name=\"TCP4RecvErr\">0</counter>" stats.xml.out >/dev/null || ret=1
|
||||
grep "<counter name=\"TCP4SendErr\">0</counter>" stats.xml.out >/dev/null || ret=1
|
||||
# grep "<counter name=\"TCP4SendErr\">0</counter>" stats.xml.out >/dev/null || ret=1
|
||||
|
||||
grep "<counter name=\"TCP6AcceptFail\">0</counter>" stats.xml.out >/dev/null || ret=1
|
||||
grep "<counter name=\"TCP6BindFail\">0</counter>" stats.xml.out >/dev/null || ret=1
|
||||
|
|
|
|||
|
|
@ -18,13 +18,12 @@
|
|||
#include <isc/log.h>
|
||||
#include <isc/managers.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/netmgr.h>
|
||||
#include <isc/nonce.h>
|
||||
#include <isc/print.h>
|
||||
#include <isc/random.h>
|
||||
#include <isc/sockaddr.h>
|
||||
#include <isc/socket.h>
|
||||
#include <isc/task.h>
|
||||
#include <isc/timer.h>
|
||||
#include <isc/util.h>
|
||||
|
||||
#include <dns/dispatch.h>
|
||||
|
|
@ -56,20 +55,20 @@
|
|||
static char *ip_address = NULL;
|
||||
static int port = 0;
|
||||
|
||||
static dst_key_t *ourkey;
|
||||
static isc_mem_t *mctx;
|
||||
static dns_tsigkey_t *tsigkey, *initialkey;
|
||||
static dns_tsig_keyring_t *ring;
|
||||
static dst_key_t *ourkey = NULL;
|
||||
static isc_mem_t *mctx = NULL;
|
||||
static dns_tsigkey_t *tsigkey = NULL, *initialkey = NULL;
|
||||
static dns_tsig_keyring_t *ring = NULL;
|
||||
static unsigned char noncedata[16];
|
||||
static isc_buffer_t nonce;
|
||||
static dns_requestmgr_t *requestmgr;
|
||||
static dns_requestmgr_t *requestmgr = NULL;
|
||||
static const char *ownername_str = ".";
|
||||
|
||||
static void
|
||||
recvquery(isc_task_t *task, isc_event_t *event) {
|
||||
dns_requestevent_t *reqev = (dns_requestevent_t *)event;
|
||||
isc_result_t result;
|
||||
dns_message_t *query, *response;
|
||||
dns_message_t *query = NULL, *response = NULL;
|
||||
char keyname[256];
|
||||
isc_buffer_t keynamebuf;
|
||||
int type;
|
||||
|
|
@ -86,7 +85,6 @@ recvquery(isc_task_t *task, isc_event_t *event) {
|
|||
|
||||
query = reqev->ev_arg;
|
||||
|
||||
response = NULL;
|
||||
dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &response);
|
||||
|
||||
result = dns_request_getresponse(reqev->request, response,
|
||||
|
|
@ -134,8 +132,8 @@ sendquery(isc_task_t *task, isc_event_t *event) {
|
|||
dns_fixedname_t ownername;
|
||||
isc_buffer_t namestr, keybuf;
|
||||
unsigned char keydata[9];
|
||||
dns_message_t *query;
|
||||
dns_request_t *request;
|
||||
dns_message_t *query = NULL;
|
||||
dns_request_t *request = NULL;
|
||||
static char keystr[] = "0123456789ab";
|
||||
|
||||
isc_event_free(&event);
|
||||
|
|
@ -166,14 +164,12 @@ sendquery(isc_task_t *task, isc_event_t *event) {
|
|||
|
||||
isc_buffer_usedregion(&keybuf, &r);
|
||||
|
||||
initialkey = NULL;
|
||||
result = dns_tsigkey_create(
|
||||
dns_fixedname_name(&keyname), DNS_TSIG_HMACMD5_NAME,
|
||||
isc_buffer_base(&keybuf), isc_buffer_usedlength(&keybuf), false,
|
||||
NULL, 0, 0, mctx, ring, &initialkey);
|
||||
CHECK("dns_tsigkey_create", result);
|
||||
|
||||
query = NULL;
|
||||
dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, &query);
|
||||
|
||||
result = dns_tkey_builddhquery(query, ourkey,
|
||||
|
|
@ -181,7 +177,6 @@ sendquery(isc_task_t *task, isc_event_t *event) {
|
|||
DNS_TSIG_HMACMD5_NAME, &nonce, 3600);
|
||||
CHECK("dns_tkey_builddhquery", result);
|
||||
|
||||
request = NULL;
|
||||
result = dns_request_create(requestmgr, query, &address,
|
||||
DNS_REQUESTOPT_TCP, initialkey, TIMEOUT,
|
||||
task, recvquery, query, &request);
|
||||
|
|
@ -193,10 +188,6 @@ main(int argc, char *argv[]) {
|
|||
char *ourkeyname = NULL;
|
||||
isc_nm_t *netmgr = NULL;
|
||||
isc_taskmgr_t *taskmgr = NULL;
|
||||
isc_timermgr_t *timermgr = NULL;
|
||||
isc_socketmgr_t *socketmgr = NULL;
|
||||
isc_socket_t *sock = NULL;
|
||||
unsigned int attrs;
|
||||
isc_sockaddr_t bind_any;
|
||||
dns_dispatchmgr_t *dispatchmgr = NULL;
|
||||
dns_dispatch_t *dispatchv4 = NULL;
|
||||
|
|
@ -224,50 +215,32 @@ main(int argc, char *argv[]) {
|
|||
|
||||
dns_result_register();
|
||||
|
||||
mctx = NULL;
|
||||
isc_mem_debugging = ISC_MEM_DEBUGRECORD;
|
||||
isc_mem_create(&mctx);
|
||||
|
||||
log = NULL;
|
||||
logconfig = NULL;
|
||||
isc_log_create(mctx, &log, &logconfig);
|
||||
|
||||
RUNCHECK(dst_lib_init(mctx, NULL));
|
||||
|
||||
isc_managers_create(mctx, 1, 0, 0, &netmgr, &taskmgr, &timermgr,
|
||||
&socketmgr);
|
||||
isc_managers_create(mctx, 1, 0, 0, &netmgr, &taskmgr, NULL, NULL);
|
||||
|
||||
RUNCHECK(isc_task_create(taskmgr, 0, &task));
|
||||
RUNCHECK(dns_dispatchmgr_create(mctx, &dispatchmgr));
|
||||
RUNCHECK(dns_dispatchmgr_create(mctx, netmgr, &dispatchmgr));
|
||||
|
||||
isc_sockaddr_any(&bind_any);
|
||||
attrs = DNS_DISPATCHATTR_UDP | DNS_DISPATCHATTR_MAKEQUERY |
|
||||
DNS_DISPATCHATTR_IPV4;
|
||||
dispatchv4 = NULL;
|
||||
RUNCHECK(dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr, &bind_any,
|
||||
4096, 4, 2, 3, 5, attrs, &dispatchv4));
|
||||
requestmgr = NULL;
|
||||
RUNCHECK(dns_requestmgr_create(mctx, timermgr, socketmgr, taskmgr,
|
||||
dispatchmgr, dispatchv4, NULL,
|
||||
&requestmgr));
|
||||
RUNCHECK(dns_dispatch_createudp(dispatchmgr, &bind_any, &dispatchv4));
|
||||
RUNCHECK(dns_requestmgr_create(mctx, taskmgr, dispatchmgr, dispatchv4,
|
||||
NULL, &requestmgr));
|
||||
|
||||
ring = NULL;
|
||||
RUNCHECK(dns_tsigkeyring_create(mctx, &ring));
|
||||
tctx = NULL;
|
||||
RUNCHECK(dns_tkeyctx_create(mctx, &tctx));
|
||||
|
||||
view = NULL;
|
||||
RUNCHECK(dns_view_create(mctx, 0, "_test", &view));
|
||||
dns_view_setkeyring(view, ring);
|
||||
dns_tsigkeyring_detach(&ring);
|
||||
|
||||
sock = NULL;
|
||||
RUNCHECK(isc_socket_create(socketmgr, PF_INET, isc_sockettype_udp,
|
||||
&sock));
|
||||
|
||||
RUNCHECK(isc_app_onrun(mctx, task, sendquery, NULL));
|
||||
|
||||
ourkey = NULL;
|
||||
type = DST_TYPE_PUBLIC | DST_TYPE_PRIVATE | DST_TYPE_KEY;
|
||||
result = dst_key_fromnamedfile(ourkeyname, NULL, type, mctx, &ourkey);
|
||||
CHECK("dst_key_fromnamedfile", result);
|
||||
|
|
@ -281,11 +254,10 @@ main(int argc, char *argv[]) {
|
|||
dns_requestmgr_shutdown(requestmgr);
|
||||
dns_requestmgr_detach(&requestmgr);
|
||||
dns_dispatch_detach(&dispatchv4);
|
||||
dns_dispatchmgr_destroy(&dispatchmgr);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
isc_task_shutdown(task);
|
||||
isc_task_detach(&task);
|
||||
isc_socket_detach(&sock);
|
||||
isc_managers_destroy(&netmgr, &taskmgr, &timermgr, &socketmgr);
|
||||
isc_managers_destroy(&netmgr, &taskmgr, NULL, NULL);
|
||||
|
||||
dst_key_free(&ourkey);
|
||||
dns_tsigkey_detach(&initialkey);
|
||||
|
|
|
|||
|
|
@ -22,9 +22,7 @@
|
|||
#include <isc/print.h>
|
||||
#include <isc/random.h>
|
||||
#include <isc/sockaddr.h>
|
||||
#include <isc/socket.h>
|
||||
#include <isc/task.h>
|
||||
#include <isc/timer.h>
|
||||
#include <isc/util.h>
|
||||
|
||||
#include <dns/dispatch.h>
|
||||
|
|
@ -53,18 +51,18 @@
|
|||
|
||||
#define TIMEOUT 30
|
||||
|
||||
static char *ip_address;
|
||||
static char *ip_address = NULL;
|
||||
static int port;
|
||||
static isc_mem_t *mctx;
|
||||
static dns_tsigkey_t *tsigkey;
|
||||
static dns_tsig_keyring_t *ring;
|
||||
static dns_requestmgr_t *requestmgr;
|
||||
static isc_mem_t *mctx = NULL;
|
||||
static dns_tsigkey_t *tsigkey = NULL;
|
||||
static dns_tsig_keyring_t *ring = NULL;
|
||||
static dns_requestmgr_t *requestmgr = NULL;
|
||||
|
||||
static void
|
||||
recvquery(isc_task_t *task, isc_event_t *event) {
|
||||
dns_requestevent_t *reqev = (dns_requestevent_t *)event;
|
||||
isc_result_t result;
|
||||
dns_message_t *query, *response;
|
||||
dns_message_t *query = NULL, *response = NULL;
|
||||
|
||||
UNUSED(task);
|
||||
|
||||
|
|
@ -78,7 +76,6 @@ recvquery(isc_task_t *task, isc_event_t *event) {
|
|||
|
||||
query = reqev->ev_arg;
|
||||
|
||||
response = NULL;
|
||||
dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &response);
|
||||
|
||||
result = dns_request_getresponse(reqev->request, response,
|
||||
|
|
@ -108,8 +105,8 @@ sendquery(isc_task_t *task, isc_event_t *event) {
|
|||
struct in_addr inaddr;
|
||||
isc_sockaddr_t address;
|
||||
isc_result_t result;
|
||||
dns_message_t *query;
|
||||
dns_request_t *request;
|
||||
dns_message_t *query = NULL;
|
||||
dns_request_t *request = NULL;
|
||||
|
||||
isc_event_free(&event);
|
||||
|
||||
|
|
@ -119,13 +116,11 @@ sendquery(isc_task_t *task, isc_event_t *event) {
|
|||
}
|
||||
isc_sockaddr_fromin(&address, &inaddr, port);
|
||||
|
||||
query = NULL;
|
||||
dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, &query);
|
||||
|
||||
result = dns_tkey_builddeletequery(query, tsigkey);
|
||||
CHECK("dns_tkey_builddeletequery", result);
|
||||
|
||||
request = NULL;
|
||||
result = dns_request_create(requestmgr, query, &address,
|
||||
DNS_REQUESTOPT_TCP, tsigkey, TIMEOUT, task,
|
||||
recvquery, query, &request);
|
||||
|
|
@ -137,10 +132,6 @@ main(int argc, char **argv) {
|
|||
char *keyname = NULL;
|
||||
isc_nm_t *netmgr = NULL;
|
||||
isc_taskmgr_t *taskmgr = NULL;
|
||||
isc_timermgr_t *timermgr = NULL;
|
||||
isc_socketmgr_t *socketmgr = NULL;
|
||||
isc_socket_t *sock = NULL;
|
||||
unsigned int attrs;
|
||||
isc_sockaddr_t bind_any;
|
||||
dns_dispatchmgr_t *dispatchmgr = NULL;
|
||||
dns_dispatch_t *dispatchv4 = NULL;
|
||||
|
|
@ -169,47 +160,29 @@ main(int argc, char **argv) {
|
|||
|
||||
dns_result_register();
|
||||
|
||||
mctx = NULL;
|
||||
isc_mem_create(&mctx);
|
||||
|
||||
log = NULL;
|
||||
logconfig = NULL;
|
||||
isc_log_create(mctx, &log, &logconfig);
|
||||
|
||||
RUNCHECK(dst_lib_init(mctx, NULL));
|
||||
|
||||
isc_managers_create(mctx, 1, 0, 0, &netmgr, &taskmgr, &timermgr,
|
||||
&socketmgr);
|
||||
isc_managers_create(mctx, 1, 0, 0, &netmgr, &taskmgr, NULL, NULL);
|
||||
|
||||
RUNCHECK(isc_task_create(taskmgr, 0, &task));
|
||||
RUNCHECK(dns_dispatchmgr_create(mctx, &dispatchmgr));
|
||||
RUNCHECK(dns_dispatchmgr_create(mctx, netmgr, &dispatchmgr));
|
||||
isc_sockaddr_any(&bind_any);
|
||||
attrs = DNS_DISPATCHATTR_UDP | DNS_DISPATCHATTR_MAKEQUERY |
|
||||
DNS_DISPATCHATTR_IPV4;
|
||||
dispatchv4 = NULL;
|
||||
RUNCHECK(dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr, &bind_any,
|
||||
4096, 4, 2, 3, 5, attrs, &dispatchv4));
|
||||
requestmgr = NULL;
|
||||
RUNCHECK(dns_requestmgr_create(mctx, timermgr, socketmgr, taskmgr,
|
||||
dispatchmgr, dispatchv4, NULL,
|
||||
&requestmgr));
|
||||
RUNCHECK(dns_dispatch_createudp(dispatchmgr, &bind_any, &dispatchv4));
|
||||
RUNCHECK(dns_requestmgr_create(mctx, taskmgr, dispatchmgr, dispatchv4,
|
||||
NULL, &requestmgr));
|
||||
|
||||
ring = NULL;
|
||||
RUNCHECK(dns_tsigkeyring_create(mctx, &ring));
|
||||
tctx = NULL;
|
||||
RUNCHECK(dns_tkeyctx_create(mctx, &tctx));
|
||||
|
||||
view = NULL;
|
||||
RUNCHECK(dns_view_create(mctx, 0, "_test", &view));
|
||||
dns_view_setkeyring(view, ring);
|
||||
|
||||
sock = NULL;
|
||||
RUNCHECK(isc_socket_create(socketmgr, PF_INET, isc_sockettype_udp,
|
||||
&sock));
|
||||
|
||||
RUNCHECK(isc_app_onrun(mctx, task, sendquery, NULL));
|
||||
|
||||
dstkey = NULL;
|
||||
type = DST_TYPE_PUBLIC | DST_TYPE_PRIVATE | DST_TYPE_KEY;
|
||||
result = dst_key_fromnamedfile(keyname, NULL, type, mctx, &dstkey);
|
||||
CHECK("dst_key_fromnamedfile", result);
|
||||
|
|
@ -224,11 +197,10 @@ main(int argc, char **argv) {
|
|||
dns_requestmgr_shutdown(requestmgr);
|
||||
dns_requestmgr_detach(&requestmgr);
|
||||
dns_dispatch_detach(&dispatchv4);
|
||||
dns_dispatchmgr_destroy(&dispatchmgr);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
isc_task_shutdown(task);
|
||||
isc_task_detach(&task);
|
||||
isc_socket_detach(&sock);
|
||||
isc_managers_destroy(&netmgr, &taskmgr, &timermgr, &socketmgr);
|
||||
isc_managers_destroy(&netmgr, &taskmgr, NULL, NULL);
|
||||
|
||||
dns_tsigkeyring_detach(&ring);
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ options {
|
|||
listen-on-v6 { none; };
|
||||
recursion yes;
|
||||
dnssec-validation yes;
|
||||
servfail-ttl 0;
|
||||
};
|
||||
|
||||
zone "." {
|
||||
|
|
|
|||
|
|
@ -24,15 +24,14 @@
|
|||
#include <isc/managers.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/net.h>
|
||||
#include <isc/netmgr.h>
|
||||
#include <isc/nonce.h>
|
||||
#include <isc/parseint.h>
|
||||
#include <isc/print.h>
|
||||
#include <isc/random.h>
|
||||
#include <isc/sockaddr.h>
|
||||
#include <isc/socket.h>
|
||||
#include <isc/string.h>
|
||||
#include <isc/task.h>
|
||||
#include <isc/timer.h>
|
||||
#include <isc/util.h>
|
||||
|
||||
#include <dns/byaddr.h>
|
||||
|
|
@ -752,14 +751,14 @@ sendquery(struct query *query, isc_task_t *task) {
|
|||
|
||||
options = 0;
|
||||
if (tcp_mode) {
|
||||
options |= DNS_REQUESTOPT_TCP | DNS_REQUESTOPT_SHARE;
|
||||
options |= DNS_REQUESTOPT_TCP;
|
||||
}
|
||||
request = NULL;
|
||||
result = dns_request_createvia(
|
||||
requestmgr, message, have_src ? &srcaddr : NULL, &dstaddr, dscp,
|
||||
options, NULL, query->timeout, query->udptimeout,
|
||||
query->udpretries, task, recvresponse, message, &request);
|
||||
CHECK("dns_request_createvia4", result);
|
||||
CHECK("dns_request_createvia", result);
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
|
@ -2068,14 +2067,11 @@ main(int argc, char *argv[]) {
|
|||
isc_nm_t *netmgr = NULL;
|
||||
isc_taskmgr_t *taskmgr = NULL;
|
||||
isc_task_t *task = NULL;
|
||||
isc_timermgr_t *timermgr = NULL;
|
||||
isc_socketmgr_t *socketmgr = NULL;
|
||||
dns_dispatchmgr_t *dispatchmgr = NULL;
|
||||
unsigned int attrs;
|
||||
dns_dispatch_t *dispatchvx = NULL;
|
||||
dns_view_t *view = NULL;
|
||||
int ns;
|
||||
unsigned int i;
|
||||
int ns;
|
||||
|
||||
RUNCHECK(isc_app_start());
|
||||
|
||||
|
|
@ -2094,7 +2090,6 @@ main(int argc, char *argv[]) {
|
|||
preparse_args(argc, argv);
|
||||
|
||||
isc_mem_create(&mctx);
|
||||
|
||||
isc_log_create(mctx, &lctx, &lcfg);
|
||||
|
||||
RUNCHECK(dst_lib_init(mctx, NULL));
|
||||
|
|
@ -2124,29 +2119,21 @@ main(int argc, char *argv[]) {
|
|||
fatal("can't choose between IPv4 and IPv6");
|
||||
}
|
||||
|
||||
isc_managers_create(mctx, 1, 0, 0, &netmgr, &taskmgr, &timermgr,
|
||||
&socketmgr);
|
||||
|
||||
isc_managers_create(mctx, 1, 0, 0, &netmgr, &taskmgr, NULL, NULL);
|
||||
RUNCHECK(isc_task_create(taskmgr, 0, &task));
|
||||
RUNCHECK(dns_dispatchmgr_create(mctx, netmgr, &dispatchmgr));
|
||||
|
||||
RUNCHECK(dns_dispatchmgr_create(mctx, &dispatchmgr));
|
||||
|
||||
attrs = DNS_DISPATCHATTR_UDP | DNS_DISPATCHATTR_MAKEQUERY;
|
||||
if (have_ipv4) {
|
||||
isc_sockaddr_any(&bind_any);
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
} else {
|
||||
isc_sockaddr_any6(&bind_any);
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
}
|
||||
dispatchvx = NULL;
|
||||
RUNCHECK(dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr,
|
||||
have_src ? &srcaddr : &bind_any, 4096, 100,
|
||||
100, 17, 19, attrs, &dispatchvx));
|
||||
RUNCHECK(dns_dispatch_createudp(
|
||||
dispatchmgr, have_src ? &srcaddr : &bind_any, &dispatchvx));
|
||||
|
||||
RUNCHECK(dns_requestmgr_create(
|
||||
mctx, timermgr, socketmgr, taskmgr, dispatchmgr,
|
||||
have_ipv4 ? dispatchvx : NULL, have_ipv6 ? dispatchvx : NULL,
|
||||
&requestmgr));
|
||||
mctx, taskmgr, dispatchmgr, have_ipv4 ? dispatchvx : NULL,
|
||||
have_ipv6 ? dispatchvx : NULL, &requestmgr));
|
||||
|
||||
RUNCHECK(dns_view_create(mctx, 0, "_test", &view));
|
||||
|
||||
|
|
@ -2187,12 +2174,12 @@ main(int argc, char *argv[]) {
|
|||
dns_requestmgr_detach(&requestmgr);
|
||||
|
||||
dns_dispatch_detach(&dispatchvx);
|
||||
dns_dispatchmgr_destroy(&dispatchmgr);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
|
||||
isc_task_shutdown(task);
|
||||
isc_task_detach(&task);
|
||||
|
||||
isc_managers_destroy(&netmgr, &taskmgr, &timermgr, &socketmgr);
|
||||
isc_managers_destroy(&netmgr, &taskmgr, NULL, NULL);
|
||||
|
||||
dst_lib_destroy();
|
||||
|
||||
|
|
|
|||
|
|
@ -66,6 +66,10 @@ Feature Changes
|
|||
9.16.0 but no error was reported, although sending UDP messages
|
||||
(such as notifies) would fail. :gl:`#2888`
|
||||
|
||||
- The network manager API is now used by ``named`` and related tools,
|
||||
including ``nsupdate``, ``delv``, ``mdig``, to send all outgoing DNS
|
||||
queries and requests. :gl:`#2401`
|
||||
|
||||
Bug Fixes
|
||||
~~~~~~~~~
|
||||
|
||||
|
|
|
|||
|
|
@ -126,7 +126,6 @@ libdns_la_HEADERS = \
|
|||
include/dns/soa.h \
|
||||
include/dns/ssu.h \
|
||||
include/dns/stats.h \
|
||||
include/dns/tcpmsg.h \
|
||||
include/dns/time.h \
|
||||
include/dns/timer.h \
|
||||
include/dns/transport.h \
|
||||
|
|
@ -232,7 +231,6 @@ libdns_la_SOURCES = \
|
|||
ssu.c \
|
||||
ssu_external.c \
|
||||
stats.c \
|
||||
tcpmsg.c \
|
||||
time.c \
|
||||
timer.c \
|
||||
transport.c \
|
||||
|
|
|
|||
|
|
@ -2237,11 +2237,9 @@ copy_namehook_lists(dns_adb_t *adb, dns_adbfind_t *find,
|
|||
find->options |= DNS_ADBFIND_LAMEPRUNED;
|
||||
goto nextv4;
|
||||
}
|
||||
|
||||
addrinfo = new_adbaddrinfo(adb, entry, find->port);
|
||||
if (addrinfo == NULL) {
|
||||
find->partial_result |= DNS_ADBFIND_INET;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Found a valid entry. Add it to the find's list.
|
||||
*/
|
||||
|
|
@ -2275,10 +2273,7 @@ copy_namehook_lists(dns_adb_t *adb, dns_adbfind_t *find,
|
|||
goto nextv6;
|
||||
}
|
||||
addrinfo = new_adbaddrinfo(adb, entry, find->port);
|
||||
if (addrinfo == NULL) {
|
||||
find->partial_result |= DNS_ADBFIND_INET6;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Found a valid entry. Add it to the find's list.
|
||||
*/
|
||||
|
|
@ -2292,7 +2287,6 @@ copy_namehook_lists(dns_adb_t *adb, dns_adbfind_t *find,
|
|||
}
|
||||
}
|
||||
|
||||
out:
|
||||
if (bucket != DNS_ADB_INVALIDBUCKET) {
|
||||
UNLOCK(&adb->entrylocks[bucket]);
|
||||
}
|
||||
|
|
@ -3962,8 +3956,7 @@ fetch_callback(isc_task_t *task, isc_event_t *ev) {
|
|||
dev->rdataset->ttl = ttlclamp(dev->rdataset->ttl);
|
||||
clean_target(adb, &name->target);
|
||||
name->expire_target = INT_MAX;
|
||||
result = set_target(adb, &name->name,
|
||||
dns_fixedname_name(&dev->foundname),
|
||||
result = set_target(adb, &name->name, dev->foundname,
|
||||
dev->rdataset, &name->target);
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
DP(NCACHE_LEVEL,
|
||||
|
|
@ -4533,12 +4526,8 @@ dns_adb_findaddrinfo(dns_adb_t *adb, const isc_sockaddr_t *sa,
|
|||
|
||||
port = isc_sockaddr_getport(sa);
|
||||
addr = new_adbaddrinfo(adb, entry, port);
|
||||
if (addr == NULL) {
|
||||
result = ISC_R_NOMEMORY;
|
||||
} else {
|
||||
inc_entry_refcnt(adb, entry, false);
|
||||
*addrp = addr;
|
||||
}
|
||||
inc_entry_refcnt(adb, entry, false);
|
||||
*addrp = addr;
|
||||
|
||||
unlock:
|
||||
UNLOCK(&adb->entrylocks[bucket]);
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ struct dns_client {
|
|||
isc_appctx_t *actx;
|
||||
isc_taskmgr_t *taskmgr;
|
||||
isc_task_t *task;
|
||||
isc_socketmgr_t *socketmgr;
|
||||
isc_nm_t *nm;
|
||||
isc_timermgr_t *timermgr;
|
||||
dns_dispatchmgr_t *dispatchmgr;
|
||||
dns_dispatch_t *dispatchv4;
|
||||
|
|
@ -202,44 +202,17 @@ cleanup:
|
|||
|
||||
static isc_result_t
|
||||
getudpdispatch(int family, dns_dispatchmgr_t *dispatchmgr,
|
||||
isc_socketmgr_t *socketmgr, isc_taskmgr_t *taskmgr,
|
||||
bool is_shared, dns_dispatch_t **dispp,
|
||||
const isc_sockaddr_t *localaddr) {
|
||||
unsigned int attrs;
|
||||
dns_dispatch_t *disp;
|
||||
unsigned buffersize, maxbuffers, maxrequests, buckets, increment;
|
||||
dns_dispatch_t **dispp, const isc_sockaddr_t *localaddr) {
|
||||
dns_dispatch_t *disp = NULL;
|
||||
isc_result_t result;
|
||||
isc_sockaddr_t anyaddr;
|
||||
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_UDP;
|
||||
switch (family) {
|
||||
case AF_INET:
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
break;
|
||||
case AF_INET6:
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
break;
|
||||
default:
|
||||
INSIST(0);
|
||||
ISC_UNREACHABLE();
|
||||
}
|
||||
|
||||
if (localaddr == NULL) {
|
||||
isc_sockaddr_anyofpf(&anyaddr, family);
|
||||
localaddr = &anyaddr;
|
||||
}
|
||||
|
||||
buffersize = 4096;
|
||||
maxbuffers = is_shared ? 1000 : 8;
|
||||
maxrequests = 32768;
|
||||
buckets = is_shared ? 16411 : 3;
|
||||
increment = is_shared ? 16433 : 5;
|
||||
|
||||
disp = NULL;
|
||||
result = dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr, localaddr,
|
||||
buffersize, maxbuffers, maxrequests,
|
||||
buckets, increment, attrs, &disp);
|
||||
result = dns_dispatch_createudp(dispatchmgr, localaddr, &disp);
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
*dispp = disp;
|
||||
}
|
||||
|
|
@ -249,10 +222,9 @@ getudpdispatch(int family, dns_dispatchmgr_t *dispatchmgr,
|
|||
|
||||
static isc_result_t
|
||||
createview(isc_mem_t *mctx, dns_rdataclass_t rdclass, isc_taskmgr_t *taskmgr,
|
||||
unsigned int ntasks, isc_socketmgr_t *socketmgr,
|
||||
isc_timermgr_t *timermgr, dns_dispatchmgr_t *dispatchmgr,
|
||||
dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6,
|
||||
dns_view_t **viewp) {
|
||||
unsigned int ntasks, isc_nm_t *nm, isc_timermgr_t *timermgr,
|
||||
dns_dispatchmgr_t *dispatchmgr, dns_dispatch_t *dispatchv4,
|
||||
dns_dispatch_t *dispatchv6, dns_view_t **viewp) {
|
||||
isc_result_t result;
|
||||
dns_view_t *view = NULL;
|
||||
|
||||
|
|
@ -268,8 +240,8 @@ createview(isc_mem_t *mctx, dns_rdataclass_t rdclass, isc_taskmgr_t *taskmgr,
|
|||
return (result);
|
||||
}
|
||||
|
||||
result = dns_view_createresolver(view, taskmgr, ntasks, 1, socketmgr,
|
||||
timermgr, 0, dispatchmgr, dispatchv4,
|
||||
result = dns_view_createresolver(view, taskmgr, ntasks, 1, nm, timermgr,
|
||||
0, dispatchmgr, dispatchv4,
|
||||
dispatchv6);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
dns_view_detach(&view);
|
||||
|
|
@ -289,13 +261,11 @@ createview(isc_mem_t *mctx, dns_rdataclass_t rdclass, isc_taskmgr_t *taskmgr,
|
|||
|
||||
isc_result_t
|
||||
dns_client_create(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
|
||||
isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr,
|
||||
unsigned int options, dns_client_t **clientp,
|
||||
const isc_sockaddr_t *localaddr4,
|
||||
isc_nm_t *nm, isc_timermgr_t *timermgr, unsigned int options,
|
||||
dns_client_t **clientp, const isc_sockaddr_t *localaddr4,
|
||||
const isc_sockaddr_t *localaddr6) {
|
||||
isc_result_t result;
|
||||
dns_client_t *client = NULL;
|
||||
dns_dispatchmgr_t *dispatchmgr = NULL;
|
||||
dns_dispatch_t *dispatchv4 = NULL;
|
||||
dns_dispatch_t *dispatchv6 = NULL;
|
||||
dns_view_t *view = NULL;
|
||||
|
|
@ -303,32 +273,28 @@ dns_client_create(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
|
|||
REQUIRE(mctx != NULL);
|
||||
REQUIRE(taskmgr != NULL);
|
||||
REQUIRE(timermgr != NULL);
|
||||
REQUIRE(socketmgr != NULL);
|
||||
REQUIRE(nm != NULL);
|
||||
REQUIRE(clientp != NULL && *clientp == NULL);
|
||||
|
||||
UNUSED(options);
|
||||
|
||||
client = isc_mem_get(mctx, sizeof(*client));
|
||||
*client = (dns_client_t){
|
||||
.actx = actx, .taskmgr = taskmgr, .timermgr = timermgr, .nm = nm
|
||||
};
|
||||
|
||||
isc_mutex_init(&client->lock);
|
||||
|
||||
client->actx = actx;
|
||||
client->taskmgr = taskmgr;
|
||||
client->socketmgr = socketmgr;
|
||||
client->timermgr = timermgr;
|
||||
|
||||
client->task = NULL;
|
||||
result = isc_task_create(client->taskmgr, 0, &client->task);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
goto cleanup_lock;
|
||||
}
|
||||
|
||||
result = dns_dispatchmgr_create(mctx, &dispatchmgr);
|
||||
result = dns_dispatchmgr_create(mctx, nm, &client->dispatchmgr);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
goto cleanup_task;
|
||||
}
|
||||
client->dispatchmgr = dispatchmgr;
|
||||
(void)setsourceports(mctx, dispatchmgr);
|
||||
(void)setsourceports(mctx, client->dispatchmgr);
|
||||
|
||||
/*
|
||||
* If only one address family is specified, use it.
|
||||
|
|
@ -336,8 +302,8 @@ dns_client_create(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
|
|||
*/
|
||||
client->dispatchv4 = NULL;
|
||||
if (localaddr4 != NULL || localaddr6 == NULL) {
|
||||
result = getudpdispatch(AF_INET, dispatchmgr, socketmgr,
|
||||
taskmgr, true, &dispatchv4, localaddr4);
|
||||
result = getudpdispatch(AF_INET, client->dispatchmgr,
|
||||
&dispatchv4, localaddr4);
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
client->dispatchv4 = dispatchv4;
|
||||
}
|
||||
|
|
@ -345,8 +311,8 @@ dns_client_create(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
|
|||
|
||||
client->dispatchv6 = NULL;
|
||||
if (localaddr6 != NULL || localaddr4 == NULL) {
|
||||
result = getudpdispatch(AF_INET6, dispatchmgr, socketmgr,
|
||||
taskmgr, true, &dispatchv6, localaddr6);
|
||||
result = getudpdispatch(AF_INET6, client->dispatchmgr,
|
||||
&dispatchv6, localaddr6);
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
client->dispatchv6 = dispatchv6;
|
||||
}
|
||||
|
|
@ -362,7 +328,7 @@ dns_client_create(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
|
|||
|
||||
/* Create the default view for class IN */
|
||||
result = createview(mctx, dns_rdataclass_in, taskmgr, RESOLVER_NTASKS,
|
||||
socketmgr, timermgr, dispatchmgr, dispatchv4,
|
||||
nm, timermgr, client->dispatchmgr, dispatchv4,
|
||||
dispatchv6, &view);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
goto cleanup_references;
|
||||
|
|
@ -375,12 +341,10 @@ dns_client_create(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
|
|||
|
||||
ISC_LIST_INIT(client->resctxs);
|
||||
|
||||
client->mctx = NULL;
|
||||
isc_mem_attach(mctx, &client->mctx);
|
||||
|
||||
client->find_timeout = DEF_FIND_TIMEOUT;
|
||||
client->find_udpretries = DEF_FIND_UDPRETRIES;
|
||||
client->attributes = 0;
|
||||
|
||||
client->magic = DNS_CLIENT_MAGIC;
|
||||
|
||||
|
|
@ -398,7 +362,7 @@ cleanup_dispatchmgr:
|
|||
if (dispatchv6 != NULL) {
|
||||
dns_dispatch_detach(&dispatchv6);
|
||||
}
|
||||
dns_dispatchmgr_destroy(&dispatchmgr);
|
||||
dns_dispatchmgr_detach(&client->dispatchmgr);
|
||||
cleanup_task:
|
||||
isc_task_detach(&client->task);
|
||||
cleanup_lock:
|
||||
|
|
@ -426,7 +390,7 @@ destroyclient(dns_client_t *client) {
|
|||
dns_dispatch_detach(&client->dispatchv6);
|
||||
}
|
||||
|
||||
dns_dispatchmgr_destroy(&client->dispatchmgr);
|
||||
dns_dispatchmgr_detach(&client->dispatchmgr);
|
||||
|
||||
isc_task_detach(&client->task);
|
||||
|
||||
|
|
@ -611,9 +575,9 @@ client_resfind(resctx_t *rctx, dns_fetchevent_t *event) {
|
|||
isc_result_t vresult = ISC_R_SUCCESS;
|
||||
bool want_restart;
|
||||
bool send_event = false;
|
||||
dns_name_t *name, *prefix;
|
||||
dns_name_t *name = NULL, *prefix = NULL;
|
||||
dns_fixedname_t foundname, fixed;
|
||||
dns_rdataset_t *trdataset;
|
||||
dns_rdataset_t *trdataset = NULL;
|
||||
dns_rdata_t rdata = DNS_RDATA_INIT;
|
||||
unsigned int nlabels;
|
||||
int order;
|
||||
|
|
@ -675,7 +639,7 @@ client_resfind(resctx_t *rctx, dns_fetchevent_t *event) {
|
|||
node = event->node;
|
||||
result = event->result;
|
||||
vresult = event->vresult;
|
||||
fname = dns_fixedname_name(&event->foundname);
|
||||
fname = event->foundname;
|
||||
INSIST(event->rdataset == rctx->rdataset);
|
||||
INSIST(event->sigrdataset == rctx->sigrdataset);
|
||||
}
|
||||
|
|
|
|||
3493
lib/dns/dispatch.c
3493
lib/dns/dispatch.c
File diff suppressed because it is too large
Load diff
|
|
@ -89,9 +89,8 @@ typedef struct dns_clientresevent {
|
|||
|
||||
isc_result_t
|
||||
dns_client_create(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
|
||||
isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr,
|
||||
unsigned int options, dns_client_t **clientp,
|
||||
const isc_sockaddr_t *localaddr4,
|
||||
isc_nm_t *nm, isc_timermgr_t *timermgr, unsigned int options,
|
||||
dns_client_t **clientp, const isc_sockaddr_t *localaddr4,
|
||||
const isc_sockaddr_t *localaddr6);
|
||||
/*%<
|
||||
* Create a DNS client object with minimal internal resources, such as
|
||||
|
|
@ -113,7 +112,7 @@ dns_client_create(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
|
|||
*
|
||||
*\li 'taskmgr' is a valid task manager.
|
||||
*
|
||||
*\li 'socketmgr' is a valid socket manager.
|
||||
*\li 'nm' is a valid network manager.
|
||||
*
|
||||
*\li 'timermgr' is a valid timer manager.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -9,8 +9,9 @@
|
|||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
#ifndef DNS_DISPATCH_H
|
||||
#define DNS_DISPATCH_H 1
|
||||
#pragma once
|
||||
|
||||
#include <isc/netmgr.h>
|
||||
|
||||
/*****
|
||||
***** Module Info
|
||||
|
|
@ -19,12 +20,12 @@
|
|||
/*! \file dns/dispatch.h
|
||||
* \brief
|
||||
* DNS Dispatch Management
|
||||
* Shared UDP and single-use TCP dispatches for queries and responses.
|
||||
* Shared UDP and single-use TCP dispatches for queries and responses.
|
||||
*
|
||||
* MP:
|
||||
*
|
||||
*\li All locking is performed internally to each dispatch.
|
||||
* Restrictions apply to dns_dispatch_removeresponse().
|
||||
*\li All locking is performed internally to each dispatch.
|
||||
* Restrictions apply to dns_dispatch_removeresponse().
|
||||
*
|
||||
* Reliability:
|
||||
*
|
||||
|
|
@ -50,6 +51,7 @@
|
|||
#include <isc/buffer.h>
|
||||
#include <isc/lang.h>
|
||||
#include <isc/mutex.h>
|
||||
#include <isc/netmgr.h>
|
||||
#include <isc/socket.h>
|
||||
#include <isc/types.h>
|
||||
|
||||
|
|
@ -57,33 +59,6 @@
|
|||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
/*%
|
||||
* This event is sent to a task when a response comes in.
|
||||
* No part of this structure should ever be modified by the caller,
|
||||
* other than parts of the buffer. The holy parts of the buffer are
|
||||
* the base and size of the buffer. All other parts of the buffer may
|
||||
* be used. On event delivery the used region contains the packet.
|
||||
*
|
||||
* "id" is the received message id,
|
||||
*
|
||||
* "addr" is the host that sent it to us,
|
||||
*
|
||||
* "buffer" holds state on the received data.
|
||||
*
|
||||
* The "free" routine for this event will clean up itself as well as
|
||||
* any buffer space allocated from common pools.
|
||||
*/
|
||||
|
||||
struct dns_dispatchevent {
|
||||
ISC_EVENT_COMMON(dns_dispatchevent_t); /*%< standard event common */
|
||||
isc_result_t result; /*%< result code */
|
||||
int32_t id; /*%< message id */
|
||||
isc_sockaddr_t addr; /*%< address recv'd from */
|
||||
struct in6_pktinfo pktinfo; /*%< reply info for v6 */
|
||||
isc_buffer_t buffer; /*%< data buffer */
|
||||
uint32_t attributes; /*%< mirrored from socket.h */
|
||||
};
|
||||
|
||||
/*%
|
||||
* This is a set of one or more dispatches which can be retrieved
|
||||
* round-robin fashion.
|
||||
|
|
@ -96,65 +71,21 @@ struct dns_dispatchset {
|
|||
isc_mutex_t lock;
|
||||
};
|
||||
|
||||
/*@{*/
|
||||
/*%
|
||||
* Attributes for added dispatchers.
|
||||
*
|
||||
* Values with the mask 0xffff0000 are application defined.
|
||||
* Values with the mask 0x0000ffff are library defined.
|
||||
*
|
||||
* Insane values (like setting both TCP and UDP) are not caught. Don't
|
||||
* do that.
|
||||
*
|
||||
* _PRIVATE
|
||||
* The dispatcher cannot be shared.
|
||||
*
|
||||
* _TCP, _UDP
|
||||
* The dispatcher is a TCP or UDP socket.
|
||||
*
|
||||
* _IPV4, _IPV6
|
||||
* The dispatcher uses an IPv4 or IPv6 socket.
|
||||
*
|
||||
* _NOLISTEN
|
||||
* The dispatcher should not listen on the socket.
|
||||
*
|
||||
* _MAKEQUERY
|
||||
* The dispatcher can be used to issue queries to other servers, and
|
||||
* accept replies from them.
|
||||
*
|
||||
* _RANDOMPORT
|
||||
* Previously used to indicate that the port of a dispatch UDP must be
|
||||
* chosen randomly. This behavior now always applies and the attribute
|
||||
* is obsoleted.
|
||||
*
|
||||
* _EXCLUSIVE
|
||||
* A separate socket will be used on-demand for each transaction.
|
||||
*/
|
||||
#define DNS_DISPATCHATTR_PRIVATE 0x00000001U
|
||||
#define DNS_DISPATCHATTR_TCP 0x00000002U
|
||||
#define DNS_DISPATCHATTR_UDP 0x00000004U
|
||||
#define DNS_DISPATCHATTR_IPV4 0x00000008U
|
||||
#define DNS_DISPATCHATTR_IPV6 0x00000010U
|
||||
#define DNS_DISPATCHATTR_NOLISTEN 0x00000020U
|
||||
#define DNS_DISPATCHATTR_MAKEQUERY 0x00000040U
|
||||
#define DNS_DISPATCHATTR_CONNECTED 0x00000080U
|
||||
#define DNS_DISPATCHATTR_FIXEDID 0x00000100U
|
||||
#define DNS_DISPATCHATTR_EXCLUSIVE 0x00000200U
|
||||
#define DNS_DISPATCHATTR_CANREUSE 0x00000400U
|
||||
/*@}*/
|
||||
|
||||
/*
|
||||
*/
|
||||
#define DNS_DISPATCHOPT_FIXEDID 0x00000001U
|
||||
|
||||
isc_result_t
|
||||
dns_dispatchmgr_create(isc_mem_t *mctx, dns_dispatchmgr_t **mgrp);
|
||||
dns_dispatchmgr_create(isc_mem_t *mctx, isc_nm_t *nm, dns_dispatchmgr_t **mgrp);
|
||||
/*%<
|
||||
* Creates a new dispatchmgr object.
|
||||
* Creates a new dispatchmgr object, and sets the available ports
|
||||
* to the default range (1024-65535).
|
||||
*
|
||||
* Requires:
|
||||
*\li "mctx" be a valid memory context.
|
||||
*\li 'mctx' be a valid memory context.
|
||||
*
|
||||
*\li 'nm' is a valid network manager.
|
||||
|
||||
*\li mgrp != NULL && *mgrp == NULL
|
||||
*
|
||||
* Returns:
|
||||
|
|
@ -164,10 +95,21 @@ dns_dispatchmgr_create(isc_mem_t *mctx, dns_dispatchmgr_t **mgrp);
|
|||
*/
|
||||
|
||||
void
|
||||
dns_dispatchmgr_destroy(dns_dispatchmgr_t **mgrp);
|
||||
dns_dispatchmgr_attach(dns_dispatchmgr_t *mgr, dns_dispatchmgr_t **mgrp);
|
||||
/*%<
|
||||
* Destroys the dispatchmgr when it becomes empty. This could be
|
||||
* immediately.
|
||||
* Attach to a dispatch manger.
|
||||
*
|
||||
* Requires:
|
||||
*\li is valid.
|
||||
*
|
||||
*\li mgrp != NULL && *mgrp == NULL
|
||||
*/
|
||||
|
||||
void
|
||||
dns_dispatchmgr_detach(dns_dispatchmgr_t **mgrp);
|
||||
/*%<
|
||||
* Detach from the dispatch manager, and destroy it if no references
|
||||
* remain.
|
||||
*
|
||||
* Requires:
|
||||
*\li mgrp != NULL && *mgrp is a valid dispatchmgr.
|
||||
|
|
@ -191,7 +133,7 @@ dns_dispatchmgr_getblackhole(dns_dispatchmgr_t *mgr);
|
|||
* without incrementing its reference count.
|
||||
*
|
||||
* Requires:
|
||||
*\li mgr is a valid dispatchmgr
|
||||
*\li mgr is a valid dispatchmgr
|
||||
* Returns:
|
||||
*\li A pointer to the current blackhole list, or NULL.
|
||||
*/
|
||||
|
|
@ -224,31 +166,16 @@ dns_dispatchmgr_setstats(dns_dispatchmgr_t *mgr, isc_stats_t *stats);
|
|||
*/
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_getudp(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr,
|
||||
isc_taskmgr_t *taskmgr, const isc_sockaddr_t *localaddr,
|
||||
unsigned int buffersize, unsigned int maxbuffers,
|
||||
unsigned int maxrequests, unsigned int buckets,
|
||||
unsigned int increment, unsigned int attributes,
|
||||
dns_dispatch_t **dispp);
|
||||
dns_dispatch_createudp(dns_dispatchmgr_t *mgr, const isc_sockaddr_t *localaddr,
|
||||
dns_dispatch_t **dispp);
|
||||
/*%<
|
||||
* Attach to existing dns_dispatch_t if one is found with dns_dispatchmgr_find,
|
||||
* otherwise create a new UDP dispatch.
|
||||
* Create a new UDP dispatch.
|
||||
*
|
||||
* Requires:
|
||||
*\li All pointer parameters be valid for their respective types.
|
||||
*
|
||||
*\li dispp != NULL && *disp == NULL
|
||||
*
|
||||
*\li 512 <= buffersize <= 64k
|
||||
*
|
||||
*\li maxbuffers > 0
|
||||
*
|
||||
*\li buckets < 2097169
|
||||
*
|
||||
*\li increment > buckets
|
||||
*
|
||||
*\li (attributes & DNS_DISPATCHATTR_TCP) == 0
|
||||
*
|
||||
* Returns:
|
||||
*\li ISC_R_SUCCESS -- success.
|
||||
*
|
||||
|
|
@ -256,48 +183,18 @@ dns_dispatch_getudp(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr,
|
|||
*/
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_createtcp(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
|
||||
isc_taskmgr_t *taskmgr, const isc_sockaddr_t *localaddr,
|
||||
const isc_sockaddr_t *destaddr, unsigned int buffersize,
|
||||
unsigned int maxbuffers, unsigned int maxrequests,
|
||||
unsigned int buckets, unsigned int increment,
|
||||
unsigned int attributes, dns_dispatch_t **dispp);
|
||||
dns_dispatch_createtcp(dns_dispatchmgr_t *mgr, const isc_sockaddr_t *localaddr,
|
||||
const isc_sockaddr_t *destaddr, isc_dscp_t dscp,
|
||||
dns_dispatch_t **dispp);
|
||||
/*%<
|
||||
* Create a new dns_dispatch and attach it to the provided isc_socket_t.
|
||||
*
|
||||
* For all dispatches, "buffersize" is the maximum packet size we will
|
||||
* accept.
|
||||
*
|
||||
* "maxbuffers" and "maxrequests" control the number of buffers in the
|
||||
* overall system and the number of buffers which can be allocated to
|
||||
* requests.
|
||||
*
|
||||
* "buckets" is the number of buckets to use, and should be prime.
|
||||
*
|
||||
* "increment" is used in a collision avoidance function, and needs to be
|
||||
* a prime > buckets, and not 2.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
*\li mgr is a valid dispatch manager.
|
||||
*
|
||||
*\li sock is a valid.
|
||||
*
|
||||
*\li task is a valid task that can be used internally to this dispatcher.
|
||||
*
|
||||
* \li 512 <= buffersize <= 64k
|
||||
*
|
||||
*\li maxbuffers > 0.
|
||||
*
|
||||
*\li maxrequests <= maxbuffers.
|
||||
*
|
||||
*\li buckets < 2097169 (the next prime after 65536 * 32)
|
||||
*
|
||||
*\li increment > buckets (and prime).
|
||||
*
|
||||
*\li attributes includes #DNS_DISPATCHATTR_TCP and does not include
|
||||
* #DNS_DISPATCHATTR_UDP.
|
||||
*
|
||||
* Returns:
|
||||
*\li ISC_R_SUCCESS -- success.
|
||||
*
|
||||
|
|
@ -324,13 +221,44 @@ dns_dispatch_detach(dns_dispatch_t **dispp);
|
|||
*\li dispp != NULL and *dispp be a valid dispatch.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_dispatch_starttcp(dns_dispatch_t *disp);
|
||||
isc_result_t
|
||||
dns_dispatch_connect(dns_dispentry_t *resp);
|
||||
/*%<
|
||||
* Start processing of a TCP dispatch once the socket connects.
|
||||
* Connect to the remote server configured in 'resp' and run the
|
||||
* connect callback that was set up via dns_dispatch_addresponse().
|
||||
*
|
||||
* Requires:
|
||||
*\li 'disp' is valid.
|
||||
*\li 'resp' is valid.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_dispatch_cancel(dns_dispentry_t *resp);
|
||||
/*%<
|
||||
* Cancel pending connects in 'resp', by setting a flag so that
|
||||
* a read is not started when the connect handler runs.
|
||||
*
|
||||
* Requires:
|
||||
*\li 'resp' is valid.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_dispatch_send(dns_dispentry_t *resp, isc_region_t *r, isc_dscp_t dscp);
|
||||
/*%<
|
||||
* Send region 'r' using the socket in 'resp', then run the specified
|
||||
* callback.
|
||||
*
|
||||
* Requires:
|
||||
*\li 'resp' is valid.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_dispatch_resume(dns_dispentry_t *resp, uint16_t timeout);
|
||||
/*%<
|
||||
* Reset the read timeout in the socket associated with 'resp' and
|
||||
* continue reading.
|
||||
*
|
||||
* Requires:
|
||||
*\li 'resp' is valid.
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
|
|
@ -342,34 +270,38 @@ dns_dispatch_gettcp(dns_dispatchmgr_t *mgr, const isc_sockaddr_t *destaddr,
|
|||
* if connected == NULL).
|
||||
*/
|
||||
|
||||
typedef void (*dispatch_cb_t)(isc_result_t eresult, isc_region_t *region,
|
||||
void *cbarg);
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_addresponse(dns_dispatch_t *disp, unsigned int options,
|
||||
const isc_sockaddr_t *dest, isc_task_t *task,
|
||||
isc_taskaction_t action, void *arg, uint16_t *idp,
|
||||
dns_dispentry_t **resp, isc_socketmgr_t *sockmgr);
|
||||
unsigned int timeout, const isc_sockaddr_t *dest,
|
||||
dispatch_cb_t connected, dispatch_cb_t sent,
|
||||
dispatch_cb_t response, void *arg,
|
||||
dns_messageid_t *idp, dns_dispentry_t **resp);
|
||||
/*%<
|
||||
* Add a response entry for this dispatch.
|
||||
*
|
||||
* "*idp" is filled in with the assigned message ID, and *resp is filled in
|
||||
* to contain the magic token used to request event flow stop.
|
||||
* with the dispatch entry object.
|
||||
*
|
||||
* Arranges for the given task to get a callback for response packets. When
|
||||
* the event is delivered, it must be returned using dns_dispatch_freeevent()
|
||||
* or through dns_dispatch_removeresponse() for another to be delivered.
|
||||
* The 'connected' and 'sent' callbacks are run to inform the caller when
|
||||
* the connect and send functions are complete. The 'timedout' callback
|
||||
* is run to inform the caller that a read has timed out; it may optionally
|
||||
* reset the read timer. The 'response' callback is run for recv results
|
||||
* (response packets, timeouts, or cancellations).
|
||||
*
|
||||
* All the callback functions are sent 'arg' as a parameter.
|
||||
*
|
||||
* Requires:
|
||||
*\li "idp" be non-NULL.
|
||||
*
|
||||
*\li "task" "action" and "arg" be set as appropriate.
|
||||
*\li "response" and "arg" be set as appropriate.
|
||||
*
|
||||
*\li "dest" be non-NULL and valid.
|
||||
*
|
||||
*\li "resp" be non-NULL and *resp be NULL
|
||||
*
|
||||
*\li "sockmgr" be NULL or a valid socket manager. If 'disp' has
|
||||
* the DNS_DISPATCHATTR_EXCLUSIVE attribute, this must not be NULL,
|
||||
* which also means dns_dispatch_addresponse() cannot be used.
|
||||
*
|
||||
* Ensures:
|
||||
*
|
||||
*\li <id, dest> is a unique tuple. That means incoming messages
|
||||
|
|
@ -384,34 +316,13 @@ dns_dispatch_addresponse(dns_dispatch_t *disp, unsigned int options,
|
|||
*/
|
||||
|
||||
void
|
||||
dns_dispatch_removeresponse(dns_dispentry_t ** resp,
|
||||
dns_dispatchevent_t **sockevent);
|
||||
dns_dispatch_removeresponse(dns_dispentry_t **resp);
|
||||
/*%<
|
||||
* Stops the flow of responses for the provided id and destination.
|
||||
* If "sockevent" is non-NULL, the dispatch event and associated buffer is
|
||||
* also returned to the system.
|
||||
*
|
||||
* Requires:
|
||||
*\li "resp" != NULL and "*resp" contain a value previously allocated
|
||||
* by dns_dispatch_addresponse();
|
||||
*
|
||||
*\li May only be called from within the task given as the 'task'
|
||||
* argument to dns_dispatch_addresponse() when allocating '*resp'.
|
||||
*/
|
||||
|
||||
isc_socket_t *
|
||||
dns_dispatch_getentrysocket(dns_dispentry_t *resp);
|
||||
|
||||
isc_socket_t *
|
||||
dns_dispatch_getsocket(dns_dispatch_t *disp);
|
||||
/*%<
|
||||
* Return the socket associated with this dispatcher.
|
||||
*
|
||||
* Requires:
|
||||
*\li disp is valid.
|
||||
*
|
||||
* Returns:
|
||||
*\li The socket the dispatcher is using.
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
|
|
@ -422,70 +333,25 @@ dns_dispatch_getlocaladdress(dns_dispatch_t *disp, isc_sockaddr_t *addrp);
|
|||
*
|
||||
* Requires:
|
||||
*\li disp is valid.
|
||||
*\li addrp to be non null.
|
||||
*\li addrp to be non NULL.
|
||||
*
|
||||
* Returns:
|
||||
*\li ISC_R_SUCCESS
|
||||
*\li ISC_R_NOTIMPLEMENTED
|
||||
*/
|
||||
|
||||
void
|
||||
dns_dispatch_cancel(dns_dispatch_t *disp);
|
||||
isc_result_t
|
||||
dns_dispentry_getlocaladdress(dns_dispentry_t *resp, isc_sockaddr_t *addrp);
|
||||
/*%<
|
||||
* cancel outstanding clients
|
||||
* Return the local address for this dispatch entry.
|
||||
*
|
||||
* Requires:
|
||||
*\li disp is valid.
|
||||
*/
|
||||
|
||||
unsigned int
|
||||
dns_dispatch_getattributes(dns_dispatch_t *disp);
|
||||
/*%<
|
||||
* Return the attributes (DNS_DISPATCHATTR_xxx) of this dispatch. Only the
|
||||
* non-changeable attributes are expected to be referenced by the caller.
|
||||
*\li resp is valid.
|
||||
*\li addrp to be non NULL.
|
||||
*
|
||||
* Requires:
|
||||
*\li disp is valid.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_dispatch_changeattributes(dns_dispatch_t *disp, unsigned int attributes,
|
||||
unsigned int mask);
|
||||
/*%<
|
||||
* Set the bits described by "mask" to the corresponding values in
|
||||
* "attributes".
|
||||
*
|
||||
* That is:
|
||||
*
|
||||
* \code
|
||||
* new = (old & ~mask) | (attributes & mask)
|
||||
* \endcode
|
||||
*
|
||||
* This function has a side effect when #DNS_DISPATCHATTR_NOLISTEN changes.
|
||||
* When the flag becomes off, the dispatch will start receiving on the
|
||||
* corresponding socket. When the flag becomes on, receive events on the
|
||||
* corresponding socket will be canceled.
|
||||
*
|
||||
* Requires:
|
||||
*\li disp is valid.
|
||||
*
|
||||
*\li attributes are reasonable for the dispatch. That is, setting the UDP
|
||||
* attribute on a TCP socket isn't reasonable.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_dispatch_importrecv(dns_dispatch_t *disp, isc_event_t *event);
|
||||
/*%<
|
||||
* Inform the dispatcher of a socket receive. This is used for sockets
|
||||
* shared between dispatchers and clients. If the dispatcher fails to copy
|
||||
* or send the event, nothing happens.
|
||||
*
|
||||
* If the attribute DNS_DISPATCHATTR_NOLISTEN is not set, then
|
||||
* the dispatch is already handling a recv; return immediately.
|
||||
*
|
||||
* Requires:
|
||||
*\li disp is valid, and the attribute DNS_DISPATCHATTR_NOLISTEN is set.
|
||||
* event != NULL
|
||||
* Returns:
|
||||
*\li ISC_R_SUCCESS
|
||||
*\li ISC_R_NOTIMPLEMENTED
|
||||
*/
|
||||
|
||||
dns_dispatch_t *
|
||||
|
|
@ -495,12 +361,11 @@ dns_dispatchset_get(dns_dispatchset_t *dset);
|
|||
* the round-robin counter.
|
||||
*
|
||||
* Requires:
|
||||
*\li dset != NULL
|
||||
*\li dset != NULL
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
dns_dispatchset_create(isc_mem_t *mctx, isc_socketmgr_t *sockmgr,
|
||||
isc_taskmgr_t *taskmgr, dns_dispatch_t *source,
|
||||
dns_dispatchset_create(isc_mem_t *mctx, dns_dispatch_t *source,
|
||||
dns_dispatchset_t **dsetp, int n);
|
||||
/*%<
|
||||
* Given a valid dispatch 'source', create a dispatch set containing
|
||||
|
|
@ -508,14 +373,8 @@ dns_dispatchset_create(isc_mem_t *mctx, isc_socketmgr_t *sockmgr,
|
|||
* source.
|
||||
*
|
||||
* Requires:
|
||||
*\li source is a valid UDP dispatcher
|
||||
*\li dsetp != NULL, *dsetp == NULL
|
||||
*/
|
||||
|
||||
void
|
||||
dns_dispatchset_cancelall(dns_dispatchset_t *dset, isc_task_t *task);
|
||||
/*%<
|
||||
* Cancel socket operations for the dispatches in 'dset'.
|
||||
*\li source is a valid UDP dispatcher
|
||||
*\li dsetp != NULL, *dsetp == NULL
|
||||
*/
|
||||
|
||||
void
|
||||
|
|
@ -525,32 +384,16 @@ dns_dispatchset_destroy(dns_dispatchset_t **dsetp);
|
|||
* memory, and set *dsetp to NULL.
|
||||
*
|
||||
* Requires:
|
||||
*\li dset is valid
|
||||
*/
|
||||
|
||||
void
|
||||
dns_dispatch_setdscp(dns_dispatch_t *disp, isc_dscp_t dscp);
|
||||
isc_dscp_t
|
||||
dns_dispatch_getdscp(dns_dispatch_t *disp);
|
||||
/*%<
|
||||
* Set/get the DSCP value to be used when sending responses to clients,
|
||||
* as defined in the "listen-on" or "listen-on-v6" statements.
|
||||
*
|
||||
* Requires:
|
||||
*\li disp is valid.
|
||||
*\li dset is valid
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_getnext(dns_dispentry_t *resp, dns_dispatchevent_t **sockevent);
|
||||
dns_dispatch_getnext(dns_dispentry_t *resp);
|
||||
/*%<
|
||||
* Free the sockevent and trigger the sending of the next item off the
|
||||
* dispatch queue if present.
|
||||
* Trigger the sending of the next item off the dispatch queue if present.
|
||||
*
|
||||
* Requires:
|
||||
*\li resp is valid
|
||||
*\li *sockevent to be valid
|
||||
*/
|
||||
|
||||
ISC_LANG_ENDDECLS
|
||||
|
||||
#endif /* DNS_DISPATCH_H */
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@
|
|||
#define DNS_EVENT_DISPATCHCONTROL (ISC_EVENTCLASS_DNS + 32)
|
||||
#define DNS_EVENT_REQUESTCONTROL (ISC_EVENTCLASS_DNS + 33)
|
||||
#define DNS_EVENT_DUMPQUANTUM (ISC_EVENTCLASS_DNS + 34)
|
||||
#define DNS_EVENT_IMPORTRECVDONE (ISC_EVENTCLASS_DNS + 35)
|
||||
/* #define DNS_EVENT_IMPORTRECVDONE (ISC_EVENTCLASS_DNS + 35) */
|
||||
#define DNS_EVENT_FREESTORAGE (ISC_EVENTCLASS_DNS + 36)
|
||||
#define DNS_EVENT_VIEWACACHESHUTDOWN (ISC_EVENTCLASS_DNS + 37)
|
||||
#define DNS_EVENT_ACACHECONTROL (ISC_EVENTCLASS_DNS + 38)
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@
|
|||
#define DNS_REQUESTOPT_TCP 0x00000001U
|
||||
#define DNS_REQUESTOPT_CASE 0x00000002U
|
||||
#define DNS_REQUESTOPT_FIXEDID 0x00000004U
|
||||
#define DNS_REQUESTOPT_SHARE 0x00000008U
|
||||
|
||||
typedef struct dns_requestevent {
|
||||
ISC_EVENT_COMMON(struct dns_requestevent);
|
||||
|
|
@ -54,8 +53,7 @@ typedef struct dns_requestevent {
|
|||
ISC_LANG_BEGINDECLS
|
||||
|
||||
isc_result_t
|
||||
dns_requestmgr_create(isc_mem_t *mctx, isc_timermgr_t *timermgr,
|
||||
isc_socketmgr_t *socketmgr, isc_taskmgr_t *taskmgr,
|
||||
dns_requestmgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
|
||||
dns_dispatchmgr_t *dispatchmgr,
|
||||
dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6,
|
||||
dns_requestmgr_t **requestmgrp);
|
||||
|
|
@ -66,8 +64,6 @@ dns_requestmgr_create(isc_mem_t *mctx, isc_timermgr_t *timermgr,
|
|||
*
|
||||
*\li 'mctx' is a valid memory context.
|
||||
*
|
||||
*\li 'timermgr' is a valid timer manager.
|
||||
*
|
||||
*\li 'socketmgr' is a valid socket manager.
|
||||
*
|
||||
*\li 'taskmgr' is a valid task manager.
|
||||
|
|
|
|||
|
|
@ -74,7 +74,8 @@ typedef struct dns_fetchevent {
|
|||
dns_dbnode_t * node;
|
||||
dns_rdataset_t * rdataset;
|
||||
dns_rdataset_t * sigrdataset;
|
||||
dns_fixedname_t foundname;
|
||||
dns_fixedname_t fname;
|
||||
dns_name_t * foundname;
|
||||
const isc_sockaddr_t *client;
|
||||
dns_messageid_t id;
|
||||
isc_result_t vresult;
|
||||
|
|
@ -163,11 +164,10 @@ typedef enum { dns_quotatype_zone = 0, dns_quotatype_server } dns_quotatype_t;
|
|||
|
||||
isc_result_t
|
||||
dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr,
|
||||
unsigned int ntasks, unsigned int ndisp,
|
||||
isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr,
|
||||
unsigned int options, dns_dispatchmgr_t *dispatchmgr,
|
||||
dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6,
|
||||
dns_resolver_t **resp);
|
||||
unsigned int ntasks, unsigned int ndisp, isc_nm_t *nm,
|
||||
isc_timermgr_t *timermgr, unsigned int options,
|
||||
dns_dispatchmgr_t *dispatchmgr, dns_dispatch_t *dispatchv4,
|
||||
dns_dispatch_t *dispatchv6, dns_resolver_t **resp);
|
||||
|
||||
/*%<
|
||||
* Create a resolver.
|
||||
|
|
@ -185,7 +185,7 @@ dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr,
|
|||
*
|
||||
*\li 'ntasks' > 0.
|
||||
*
|
||||
*\li 'socketmgr' is a valid socket manager.
|
||||
*\li 'nm' is a valid network manager.
|
||||
*
|
||||
*\li 'timermgr' is a valid timer manager.
|
||||
*
|
||||
|
|
@ -413,9 +413,6 @@ dns_resolver_dispatchv4(dns_resolver_t *resolver);
|
|||
dns_dispatch_t *
|
||||
dns_resolver_dispatchv6(dns_resolver_t *resolver);
|
||||
|
||||
isc_socketmgr_t *
|
||||
dns_resolver_socketmgr(dns_resolver_t *resolver);
|
||||
|
||||
isc_taskmgr_t *
|
||||
dns_resolver_taskmgr(dns_resolver_t *resolver);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,141 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
#ifndef DNS_TCPMSG_H
|
||||
#define DNS_TCPMSG_H 1
|
||||
|
||||
/*! \file dns/tcpmsg.h */
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include <isc/buffer.h>
|
||||
#include <isc/lang.h>
|
||||
#include <isc/socket.h>
|
||||
|
||||
typedef struct dns_tcpmsg {
|
||||
/* private (don't touch!) */
|
||||
unsigned int magic;
|
||||
uint16_t size;
|
||||
isc_buffer_t buffer;
|
||||
unsigned int maxsize;
|
||||
isc_mem_t * mctx;
|
||||
isc_socket_t * sock;
|
||||
isc_task_t * task;
|
||||
isc_taskaction_t action;
|
||||
void * arg;
|
||||
isc_event_t event;
|
||||
/* public (read-only) */
|
||||
isc_result_t result;
|
||||
isc_sockaddr_t address;
|
||||
} dns_tcpmsg_t;
|
||||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
void
|
||||
dns_tcpmsg_init(isc_mem_t *mctx, isc_socket_t *sock, dns_tcpmsg_t *tcpmsg);
|
||||
/*%<
|
||||
* Associate a tcp message state with a given memory context and
|
||||
* TCP socket.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
*\li "mctx" and "sock" be non-NULL and valid types.
|
||||
*
|
||||
*\li "sock" be a read/write TCP socket.
|
||||
*
|
||||
*\li "tcpmsg" be non-NULL and an uninitialized or invalidated structure.
|
||||
*
|
||||
* Ensures:
|
||||
*
|
||||
*\li "tcpmsg" is a valid structure.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_tcpmsg_setmaxsize(dns_tcpmsg_t *tcpmsg, unsigned int maxsize);
|
||||
/*%<
|
||||
* Set the maximum packet size to "maxsize"
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
*\li "tcpmsg" be valid.
|
||||
*
|
||||
*\li 512 <= "maxsize" <= 65536
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
dns_tcpmsg_readmessage(dns_tcpmsg_t *tcpmsg, isc_task_t *task,
|
||||
isc_taskaction_t action, void *arg);
|
||||
/*%<
|
||||
* Schedule an event to be delivered when a DNS message is readable, or
|
||||
* when an error occurs on the socket.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
*\li "tcpmsg" be valid.
|
||||
*
|
||||
*\li "task", "taskaction", and "arg" be valid.
|
||||
*
|
||||
* Returns:
|
||||
*
|
||||
*\li ISC_R_SUCCESS -- no error
|
||||
*\li Anything that the isc_socket_recv() call can return. XXXMLG
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
*\li The event delivered is a fully generic event. It will contain no
|
||||
* actual data. The sender will be a pointer to the dns_tcpmsg_t.
|
||||
* The result code inside that structure should be checked to see
|
||||
* what the final result was.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_tcpmsg_cancelread(dns_tcpmsg_t *tcpmsg);
|
||||
/*%<
|
||||
* Cancel a readmessage() call. The event will still be posted with a
|
||||
* CANCELED result code.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
*\li "tcpmsg" be valid.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_tcpmsg_keepbuffer(dns_tcpmsg_t *tcpmsg, isc_buffer_t *buffer);
|
||||
/*%<
|
||||
* If a dns buffer is to be kept between calls, this function marks the
|
||||
* internal state-machine buffer as invalid, and copies all the contents
|
||||
* of the state into "buffer".
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
*\li "tcpmsg" be valid.
|
||||
*
|
||||
*\li "buffer" be non-NULL.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_tcpmsg_invalidate(dns_tcpmsg_t *tcpmsg);
|
||||
/*%<
|
||||
* Clean up all allocated state, and invalidate the structure.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
*\li "tcpmsg" be valid.
|
||||
*
|
||||
* Ensures:
|
||||
*
|
||||
*\li "tcpmsg" is invalidated and disassociated with all memory contexts,
|
||||
* sockets, etc.
|
||||
*/
|
||||
|
||||
ISC_LANG_ENDDECLS
|
||||
|
||||
#endif /* DNS_TCPMSG_H */
|
||||
|
|
@ -65,7 +65,6 @@ typedef struct dns_dyndbctx dns_dyndbctx_t;
|
|||
typedef struct dns_sdlzimplementation dns_sdlzimplementation_t;
|
||||
typedef struct dns_decompress dns_decompress_t;
|
||||
typedef struct dns_dispatch dns_dispatch_t;
|
||||
typedef struct dns_dispatchevent dns_dispatchevent_t;
|
||||
typedef struct dns_dispatchlist dns_dispatchlist_t;
|
||||
typedef struct dns_dispatchset dns_dispatchset_t;
|
||||
typedef struct dns_dispatchmgr dns_dispatchmgr_t;
|
||||
|
|
|
|||
|
|
@ -393,9 +393,9 @@ dns_view_createzonetable(dns_view_t *view);
|
|||
|
||||
isc_result_t
|
||||
dns_view_createresolver(dns_view_t *view, isc_taskmgr_t *taskmgr,
|
||||
unsigned int ntasks, unsigned int ndisp,
|
||||
isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr,
|
||||
unsigned int options, dns_dispatchmgr_t *dispatchmgr,
|
||||
unsigned int ntasks, unsigned int ndisp, isc_nm_t *nm,
|
||||
isc_timermgr_t *timermgr, unsigned int options,
|
||||
dns_dispatchmgr_t *dispatchmgr,
|
||||
dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6);
|
||||
/*%<
|
||||
* Create a resolver and address database for the view.
|
||||
|
|
@ -407,7 +407,7 @@ dns_view_createresolver(dns_view_t *view, isc_taskmgr_t *taskmgr,
|
|||
*\li 'view' does not have a resolver already.
|
||||
*
|
||||
*\li The requirements of dns_resolver_create() apply to 'taskmgr',
|
||||
* 'ntasks', 'socketmgr', 'timermgr', 'options', 'dispatchv4', and
|
||||
* 'ntasks', 'nm', 'timermgr', 'options', 'dispatchv4', and
|
||||
* 'dispatchv6'.
|
||||
*
|
||||
* Returns:
|
||||
|
|
|
|||
|
|
@ -1780,8 +1780,8 @@ dns_zone_getdnsseckeys(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
|
|||
|
||||
isc_result_t
|
||||
dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
|
||||
isc_timermgr_t *timermgr, isc_socketmgr_t *socketmgr,
|
||||
isc_nm_t *netmgr, dns_zonemgr_t **zmgrp);
|
||||
isc_timermgr_t *timermgr, isc_nm_t *netmgr,
|
||||
dns_zonemgr_t **zmgrp);
|
||||
/*%<
|
||||
* Create a zone manager. Note: the zone manager will not be able to
|
||||
* manage any zones until dns_zonemgr_setsize() has been run.
|
||||
|
|
|
|||
|
|
@ -140,10 +140,10 @@ view_find(dns_lookup_t *lookup, dns_name_t *foundname) {
|
|||
|
||||
static void
|
||||
lookup_find(dns_lookup_t *lookup, dns_fetchevent_t *event) {
|
||||
isc_result_t result;
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
bool want_restart;
|
||||
bool send_event;
|
||||
dns_name_t *name, *fname, *prefix;
|
||||
dns_name_t *name = NULL, *fname = NULL, *prefix = NULL;
|
||||
dns_fixedname_t foundname, fixed;
|
||||
dns_rdata_t rdata = DNS_RDATA_INIT;
|
||||
unsigned int nlabels;
|
||||
|
|
@ -156,7 +156,6 @@ lookup_find(dns_lookup_t *lookup, dns_fetchevent_t *event) {
|
|||
|
||||
LOCK(&lookup->lock);
|
||||
|
||||
result = ISC_R_SUCCESS;
|
||||
name = dns_fixedname_name(&lookup->name);
|
||||
|
||||
do {
|
||||
|
|
@ -202,12 +201,10 @@ lookup_find(dns_lookup_t *lookup, dns_fetchevent_t *event) {
|
|||
}
|
||||
} else if (event != NULL) {
|
||||
result = event->result;
|
||||
fname = dns_fixedname_name(&event->foundname);
|
||||
fname = event->foundname;
|
||||
dns_resolver_destroyfetch(&lookup->fetch);
|
||||
INSIST(event->rdataset == &lookup->rdataset);
|
||||
INSIST(event->sigrdataset == &lookup->sigrdataset);
|
||||
} else {
|
||||
fname = NULL; /* Silence compiler warning. */
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
2872
lib/dns/resolver.c
2872
lib/dns/resolver.c
File diff suppressed because it is too large
Load diff
234
lib/dns/tcpmsg.c
234
lib/dns/tcpmsg.c
|
|
@ -1,234 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include <isc/mem.h>
|
||||
#include <isc/print.h>
|
||||
#include <isc/task.h>
|
||||
#include <isc/util.h>
|
||||
|
||||
#include <dns/events.h>
|
||||
#include <dns/result.h>
|
||||
#include <dns/tcpmsg.h>
|
||||
|
||||
#ifdef TCPMSG_DEBUG
|
||||
#include <stdio.h> /* Required for printf. */
|
||||
#define XDEBUG(x) printf x
|
||||
#else /* ifdef TCPMSG_DEBUG */
|
||||
#define XDEBUG(x)
|
||||
#endif /* ifdef TCPMSG_DEBUG */
|
||||
|
||||
#define TCPMSG_MAGIC ISC_MAGIC('T', 'C', 'P', 'm')
|
||||
#define VALID_TCPMSG(foo) ISC_MAGIC_VALID(foo, TCPMSG_MAGIC)
|
||||
|
||||
static void
|
||||
recv_length(isc_task_t *, isc_event_t *);
|
||||
static void
|
||||
recv_message(isc_task_t *, isc_event_t *);
|
||||
|
||||
static void
|
||||
recv_length(isc_task_t *task, isc_event_t *ev_in) {
|
||||
isc_socketevent_t *ev = (isc_socketevent_t *)ev_in;
|
||||
isc_event_t *dev;
|
||||
dns_tcpmsg_t *tcpmsg = ev_in->ev_arg;
|
||||
isc_region_t region;
|
||||
isc_result_t result;
|
||||
|
||||
INSIST(VALID_TCPMSG(tcpmsg));
|
||||
|
||||
dev = &tcpmsg->event;
|
||||
tcpmsg->address = ev->address;
|
||||
|
||||
if (ev->result != ISC_R_SUCCESS) {
|
||||
tcpmsg->result = ev->result;
|
||||
goto send_and_free;
|
||||
}
|
||||
|
||||
/*
|
||||
* Success.
|
||||
*/
|
||||
tcpmsg->size = ntohs(tcpmsg->size);
|
||||
if (tcpmsg->size == 0) {
|
||||
tcpmsg->result = ISC_R_UNEXPECTEDEND;
|
||||
goto send_and_free;
|
||||
}
|
||||
if (tcpmsg->size > tcpmsg->maxsize) {
|
||||
tcpmsg->result = ISC_R_RANGE;
|
||||
goto send_and_free;
|
||||
}
|
||||
|
||||
region.base = isc_mem_get(tcpmsg->mctx, tcpmsg->size);
|
||||
region.length = tcpmsg->size;
|
||||
if (region.base == NULL) {
|
||||
tcpmsg->result = ISC_R_NOMEMORY;
|
||||
goto send_and_free;
|
||||
}
|
||||
XDEBUG(("Allocated %d bytes\n", tcpmsg->size));
|
||||
|
||||
isc_buffer_init(&tcpmsg->buffer, region.base, region.length);
|
||||
result = isc_socket_recv(tcpmsg->sock, ®ion, 0, task, recv_message,
|
||||
tcpmsg);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
tcpmsg->result = result;
|
||||
goto send_and_free;
|
||||
}
|
||||
|
||||
isc_event_free(&ev_in);
|
||||
return;
|
||||
|
||||
send_and_free:
|
||||
isc_task_send(tcpmsg->task, &dev);
|
||||
tcpmsg->task = NULL;
|
||||
isc_event_free(&ev_in);
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
recv_message(isc_task_t *task, isc_event_t *ev_in) {
|
||||
isc_socketevent_t *ev = (isc_socketevent_t *)ev_in;
|
||||
isc_event_t *dev;
|
||||
dns_tcpmsg_t *tcpmsg = ev_in->ev_arg;
|
||||
|
||||
(void)task;
|
||||
|
||||
INSIST(VALID_TCPMSG(tcpmsg));
|
||||
|
||||
dev = &tcpmsg->event;
|
||||
tcpmsg->address = ev->address;
|
||||
|
||||
if (ev->result != ISC_R_SUCCESS) {
|
||||
tcpmsg->result = ev->result;
|
||||
goto send_and_free;
|
||||
}
|
||||
|
||||
tcpmsg->result = ISC_R_SUCCESS;
|
||||
isc_buffer_add(&tcpmsg->buffer, ev->n);
|
||||
|
||||
XDEBUG(("Received %u bytes (of %d)\n", ev->n, tcpmsg->size));
|
||||
|
||||
send_and_free:
|
||||
isc_task_send(tcpmsg->task, &dev);
|
||||
tcpmsg->task = NULL;
|
||||
isc_event_free(&ev_in);
|
||||
}
|
||||
|
||||
void
|
||||
dns_tcpmsg_init(isc_mem_t *mctx, isc_socket_t *sock, dns_tcpmsg_t *tcpmsg) {
|
||||
REQUIRE(mctx != NULL);
|
||||
REQUIRE(sock != NULL);
|
||||
REQUIRE(tcpmsg != NULL);
|
||||
|
||||
tcpmsg->magic = TCPMSG_MAGIC;
|
||||
tcpmsg->size = 0;
|
||||
tcpmsg->buffer.base = NULL;
|
||||
tcpmsg->buffer.length = 0;
|
||||
tcpmsg->maxsize = 65535; /* Largest message possible. */
|
||||
tcpmsg->mctx = mctx;
|
||||
tcpmsg->sock = sock;
|
||||
tcpmsg->task = NULL; /* None yet. */
|
||||
tcpmsg->result = ISC_R_UNEXPECTED; /* None yet. */
|
||||
|
||||
/* Should probably initialize the event here, but it can wait. */
|
||||
}
|
||||
|
||||
void
|
||||
dns_tcpmsg_setmaxsize(dns_tcpmsg_t *tcpmsg, unsigned int maxsize) {
|
||||
REQUIRE(VALID_TCPMSG(tcpmsg));
|
||||
REQUIRE(maxsize < 65536);
|
||||
|
||||
tcpmsg->maxsize = maxsize;
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
dns_tcpmsg_readmessage(dns_tcpmsg_t *tcpmsg, isc_task_t *task,
|
||||
isc_taskaction_t action, void *arg) {
|
||||
isc_result_t result;
|
||||
isc_region_t region;
|
||||
|
||||
REQUIRE(VALID_TCPMSG(tcpmsg));
|
||||
REQUIRE(task != NULL);
|
||||
REQUIRE(tcpmsg->task == NULL); /* not currently in use */
|
||||
|
||||
if (tcpmsg->buffer.base != NULL) {
|
||||
isc_mem_put(tcpmsg->mctx, tcpmsg->buffer.base,
|
||||
tcpmsg->buffer.length);
|
||||
tcpmsg->buffer.base = NULL;
|
||||
tcpmsg->buffer.length = 0;
|
||||
}
|
||||
|
||||
tcpmsg->task = task;
|
||||
tcpmsg->action = action;
|
||||
tcpmsg->arg = arg;
|
||||
tcpmsg->result = ISC_R_UNEXPECTED; /* unknown right now */
|
||||
|
||||
ISC_EVENT_INIT(&tcpmsg->event, sizeof(isc_event_t), 0, 0,
|
||||
DNS_EVENT_TCPMSG, action, arg, tcpmsg, NULL, NULL);
|
||||
|
||||
region.base = (unsigned char *)&tcpmsg->size;
|
||||
region.length = 2; /* uint16_t */
|
||||
result = isc_socket_recv(tcpmsg->sock, ®ion, 0, tcpmsg->task,
|
||||
recv_length, tcpmsg);
|
||||
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
tcpmsg->task = NULL;
|
||||
}
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
void
|
||||
dns_tcpmsg_cancelread(dns_tcpmsg_t *tcpmsg) {
|
||||
REQUIRE(VALID_TCPMSG(tcpmsg));
|
||||
|
||||
isc_socket_cancel(tcpmsg->sock, NULL, ISC_SOCKCANCEL_RECV);
|
||||
}
|
||||
|
||||
void
|
||||
dns_tcpmsg_keepbuffer(dns_tcpmsg_t *tcpmsg, isc_buffer_t *buffer) {
|
||||
REQUIRE(VALID_TCPMSG(tcpmsg));
|
||||
REQUIRE(buffer != NULL);
|
||||
|
||||
*buffer = tcpmsg->buffer;
|
||||
tcpmsg->buffer.base = NULL;
|
||||
tcpmsg->buffer.length = 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
void
|
||||
dns_tcpmsg_freebuffer(dns_tcpmsg_t *tcpmsg) {
|
||||
REQUIRE(VALID_TCPMSG(tcpmsg));
|
||||
|
||||
if (tcpmsg->buffer.base == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
isc_mem_put(tcpmsg->mctx, tcpmsg->buffer.base, tcpmsg->buffer.length);
|
||||
tcpmsg->buffer.base = NULL;
|
||||
tcpmsg->buffer.length = 0;
|
||||
}
|
||||
#endif /* if 0 */
|
||||
|
||||
void
|
||||
dns_tcpmsg_invalidate(dns_tcpmsg_t *tcpmsg) {
|
||||
REQUIRE(VALID_TCPMSG(tcpmsg));
|
||||
|
||||
tcpmsg->magic = 0;
|
||||
|
||||
if (tcpmsg->buffer.base != NULL) {
|
||||
isc_mem_put(tcpmsg->mctx, tcpmsg->buffer.base,
|
||||
tcpmsg->buffer.length);
|
||||
tcpmsg->buffer.base = NULL;
|
||||
tcpmsg->buffer.length = 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@ include $(top_srcdir)/Makefile.top
|
|||
AM_CPPFLAGS += \
|
||||
$(LIBISC_CFLAGS) \
|
||||
$(LIBDNS_CFLAGS) \
|
||||
$(LIBUV_CFLAGS) \
|
||||
$(KRB5_CFLAGS) \
|
||||
-DSRCDIR=\"$(abs_srcdir)\" \
|
||||
-DBUILDDIR=\"$(abs_builddir)\"
|
||||
|
|
@ -10,6 +11,7 @@ AM_CPPFLAGS += \
|
|||
LDADD += \
|
||||
libdnstest.la \
|
||||
$(LIBISC_LIBS) \
|
||||
$(LIBUV_LIBS) \
|
||||
$(LIBDNS_LIBS)
|
||||
|
||||
check_LTLIBRARIES = libdnstest.la
|
||||
|
|
|
|||
|
|
@ -20,16 +20,16 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <uv.h>
|
||||
|
||||
#define UNIT_TESTING
|
||||
#include <cmocka.h>
|
||||
|
||||
#include <isc/app.h>
|
||||
#include <isc/buffer.h>
|
||||
#include <isc/managers.h>
|
||||
#include <isc/refcount.h>
|
||||
#include <isc/socket.h>
|
||||
#include <isc/task.h>
|
||||
#include <isc/timer.h>
|
||||
#include <isc/util.h>
|
||||
|
||||
#include <dns/dispatch.h>
|
||||
|
|
@ -38,18 +38,129 @@
|
|||
|
||||
#include "dnstest.h"
|
||||
|
||||
uv_sem_t sem;
|
||||
|
||||
/* Timeouts in miliseconds */
|
||||
#define T_SERVER_INIT 5000
|
||||
#define T_SERVER_IDLE 5000
|
||||
#define T_SERVER_KEEPALIVE 5000
|
||||
#define T_SERVER_ADVERTISED 5000
|
||||
|
||||
#define T_CLIENT_INIT 2000
|
||||
#define T_CLIENT_IDLE 2000
|
||||
#define T_CLIENT_KEEPALIVE 2000
|
||||
#define T_CLIENT_ADVERTISED 2000
|
||||
|
||||
#define T_CLIENT_CONNECT 1000
|
||||
|
||||
dns_dispatchmgr_t *dispatchmgr = NULL;
|
||||
dns_dispatchset_t *dset = NULL;
|
||||
isc_nm_t *connect_nm = NULL;
|
||||
static isc_sockaddr_t udp_server_addr;
|
||||
static isc_sockaddr_t udp_connect_addr;
|
||||
static isc_sockaddr_t tcp_server_addr;
|
||||
static isc_sockaddr_t tcp_connect_addr;
|
||||
|
||||
const struct in6_addr in6addr_blackhole = { { { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 1 } } };
|
||||
|
||||
static int
|
||||
setup_ephemeral_port(isc_sockaddr_t *addr, sa_family_t family) {
|
||||
socklen_t addrlen = sizeof(*addr);
|
||||
uv_os_sock_t fd;
|
||||
int r;
|
||||
|
||||
isc_sockaddr_fromin6(addr, &in6addr_loopback, 0);
|
||||
|
||||
fd = socket(AF_INET6, family, 0);
|
||||
if (fd < 0) {
|
||||
perror("setup_ephemeral_port: socket()");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
r = bind(fd, (const struct sockaddr *)&addr->type.sa,
|
||||
sizeof(addr->type.sin6));
|
||||
if (r != 0) {
|
||||
perror("setup_ephemeral_port: bind()");
|
||||
close(fd);
|
||||
return (r);
|
||||
}
|
||||
|
||||
r = getsockname(fd, (struct sockaddr *)&addr->type.sa, &addrlen);
|
||||
if (r != 0) {
|
||||
perror("setup_ephemeral_port: getsockname()");
|
||||
close(fd);
|
||||
return (r);
|
||||
}
|
||||
|
||||
#if IPV6_RECVERR
|
||||
#define setsockopt_on(socket, level, name) \
|
||||
setsockopt(socket, level, name, &(int){ 1 }, sizeof(int))
|
||||
|
||||
r = setsockopt_on(fd, IPPROTO_IPV6, IPV6_RECVERR);
|
||||
if (r != 0) {
|
||||
perror("setup_ephemeral_port");
|
||||
close(fd);
|
||||
return (r);
|
||||
}
|
||||
#endif
|
||||
|
||||
return (fd);
|
||||
}
|
||||
|
||||
static void
|
||||
reset_testdata(void);
|
||||
|
||||
static int
|
||||
_setup(void **state) {
|
||||
isc_result_t result;
|
||||
uv_os_sock_t sock = -1;
|
||||
int r;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
result = dns_test_begin(NULL, true);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
udp_connect_addr = (isc_sockaddr_t){ .length = 0 };
|
||||
isc_sockaddr_fromin6(&udp_connect_addr, &in6addr_loopback, 0);
|
||||
|
||||
tcp_connect_addr = (isc_sockaddr_t){ .length = 0 };
|
||||
isc_sockaddr_fromin6(&tcp_connect_addr, &in6addr_loopback, 0);
|
||||
|
||||
udp_server_addr = (isc_sockaddr_t){ .length = 0 };
|
||||
sock = setup_ephemeral_port(&udp_server_addr, SOCK_DGRAM);
|
||||
if (sock < 0) {
|
||||
return (-1);
|
||||
}
|
||||
close(sock);
|
||||
|
||||
tcp_server_addr = (isc_sockaddr_t){ .length = 0 };
|
||||
sock = setup_ephemeral_port(&tcp_server_addr, SOCK_STREAM);
|
||||
if (sock < 0) {
|
||||
return (-1);
|
||||
}
|
||||
close(sock);
|
||||
|
||||
/* Create a secondary network manager */
|
||||
isc_managers_create(dt_mctx, ncpus, 0, 0, &connect_nm, NULL, NULL,
|
||||
NULL);
|
||||
|
||||
isc_nm_settimeouts(netmgr, T_SERVER_INIT, T_SERVER_IDLE,
|
||||
T_SERVER_KEEPALIVE, T_SERVER_ADVERTISED);
|
||||
|
||||
/*
|
||||
* Use shorter client-side timeouts, to ensure that clients
|
||||
* time out before the server.
|
||||
*/
|
||||
isc_nm_settimeouts(connect_nm, T_CLIENT_INIT, T_CLIENT_IDLE,
|
||||
T_CLIENT_KEEPALIVE, T_CLIENT_ADVERTISED);
|
||||
|
||||
r = uv_sem_init(&sem, 0);
|
||||
assert_int_equal(r, 0);
|
||||
|
||||
reset_testdata();
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -57,6 +168,11 @@ static int
|
|||
_teardown(void **state) {
|
||||
UNUSED(state);
|
||||
|
||||
uv_sem_destroy(&sem);
|
||||
|
||||
isc_managers_destroy(&connect_nm, NULL, NULL, NULL);
|
||||
assert_null(connect_nm);
|
||||
|
||||
dns_test_end();
|
||||
|
||||
return (0);
|
||||
|
|
@ -66,24 +182,20 @@ static isc_result_t
|
|||
make_dispatchset(unsigned int ndisps) {
|
||||
isc_result_t result;
|
||||
isc_sockaddr_t any;
|
||||
unsigned int attrs;
|
||||
dns_dispatch_t *disp = NULL;
|
||||
|
||||
result = dns_dispatchmgr_create(dt_mctx, &dispatchmgr);
|
||||
result = dns_dispatchmgr_create(dt_mctx, netmgr, &dispatchmgr);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
return (result);
|
||||
}
|
||||
|
||||
isc_sockaddr_any(&any);
|
||||
attrs = DNS_DISPATCHATTR_IPV4 | DNS_DISPATCHATTR_UDP;
|
||||
result = dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr, &any, 512,
|
||||
6, 1024, 17, 19, attrs, &disp);
|
||||
result = dns_dispatch_createudp(dispatchmgr, &any, &disp);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
return (result);
|
||||
}
|
||||
|
||||
result = dns_dispatchset_create(dt_mctx, socketmgr, taskmgr, disp,
|
||||
&dset, ndisps);
|
||||
result = dns_dispatchset_create(dt_mctx, disp, &dset, ndisps);
|
||||
dns_dispatch_detach(&disp);
|
||||
|
||||
return (result);
|
||||
|
|
@ -95,7 +207,7 @@ reset(void) {
|
|||
dns_dispatchset_destroy(&dset);
|
||||
}
|
||||
if (dispatchmgr != NULL) {
|
||||
dns_dispatchmgr_destroy(&dispatchmgr);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -157,149 +269,197 @@ dispatchset_get(void **state) {
|
|||
reset();
|
||||
}
|
||||
|
||||
struct {
|
||||
atomic_uint_fast32_t responses;
|
||||
atomic_uint_fast32_t result;
|
||||
} testdata;
|
||||
|
||||
static dns_dispatch_t *dispatch = NULL;
|
||||
static dns_dispentry_t *dispentry = NULL;
|
||||
static atomic_bool first = ATOMIC_VAR_INIT(true);
|
||||
|
||||
static void
|
||||
senddone(isc_task_t *task, isc_event_t *event) {
|
||||
isc_socket_t *sock = event->ev_arg;
|
||||
|
||||
UNUSED(task);
|
||||
|
||||
isc_socket_detach(&sock);
|
||||
isc_event_free(&event);
|
||||
reset_testdata(void) {
|
||||
atomic_init(&testdata.responses, 0);
|
||||
atomic_init(&testdata.result, ISC_R_UNSET);
|
||||
}
|
||||
|
||||
static void
|
||||
nameserver(isc_task_t *task, isc_event_t *event) {
|
||||
isc_result_t result;
|
||||
isc_region_t region;
|
||||
isc_socket_t *dummy;
|
||||
isc_socket_t *sock = event->ev_arg;
|
||||
isc_socketevent_t *ev = (isc_socketevent_t *)event;
|
||||
server_senddone(isc_nmhandle_t *handle, isc_result_t eresult, void *cbarg) {
|
||||
UNUSED(handle);
|
||||
UNUSED(eresult);
|
||||
UNUSED(cbarg);
|
||||
|
||||
fprintf(stderr, "%s(..., %s, ...)\n", __func__,
|
||||
isc_result_totext(eresult));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
nameserver(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region,
|
||||
void *cbarg) {
|
||||
isc_region_t response;
|
||||
static unsigned char buf1[16];
|
||||
static unsigned char buf2[16];
|
||||
|
||||
memmove(buf1, ev->region.base, 12);
|
||||
UNUSED(eresult);
|
||||
UNUSED(cbarg);
|
||||
|
||||
memmove(buf1, region->base, 12);
|
||||
memset(buf1 + 12, 0, 4);
|
||||
buf1[2] |= 0x80; /* qr=1 */
|
||||
|
||||
memmove(buf2, ev->region.base, 12);
|
||||
memmove(buf2, region->base, 12);
|
||||
memset(buf2 + 12, 1, 4);
|
||||
buf2[2] |= 0x80; /* qr=1 */
|
||||
|
||||
/*
|
||||
* send message to be discarded.
|
||||
*/
|
||||
region.base = buf1;
|
||||
region.length = sizeof(buf1);
|
||||
dummy = NULL;
|
||||
isc_socket_attach(sock, &dummy);
|
||||
result = isc_socket_sendto(sock, ®ion, task, senddone, sock,
|
||||
&ev->address, NULL);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_socket_detach(&dummy);
|
||||
}
|
||||
response.base = buf1;
|
||||
response.length = sizeof(buf1);
|
||||
isc_nm_send(handle, &response, server_senddone, NULL);
|
||||
|
||||
/*
|
||||
* send nextitem message.
|
||||
*/
|
||||
region.base = buf2;
|
||||
region.length = sizeof(buf2);
|
||||
dummy = NULL;
|
||||
isc_socket_attach(sock, &dummy);
|
||||
result = isc_socket_sendto(sock, ®ion, task, senddone, sock,
|
||||
&ev->address, NULL);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_socket_detach(&dummy);
|
||||
}
|
||||
isc_event_free(&event);
|
||||
response.base = buf2;
|
||||
response.length = sizeof(buf2);
|
||||
isc_nm_send(handle, &response, server_senddone, NULL);
|
||||
}
|
||||
|
||||
static dns_dispatch_t *dispatch = NULL;
|
||||
static dns_dispentry_t *dispentry = NULL;
|
||||
static atomic_bool first = ATOMIC_VAR_INIT(true);
|
||||
static isc_sockaddr_t local;
|
||||
static atomic_uint_fast32_t responses;
|
||||
static isc_result_t
|
||||
accept_cb(isc_nmhandle_t *handle, isc_result_t eresult, void *cbarg) {
|
||||
UNUSED(handle);
|
||||
UNUSED(cbarg);
|
||||
|
||||
return (eresult);
|
||||
}
|
||||
|
||||
static void
|
||||
response(isc_task_t *task, isc_event_t *event) {
|
||||
dns_dispatchevent_t *devent = (dns_dispatchevent_t *)event;
|
||||
bool exp_true = true;
|
||||
noop_nameserver(isc_nmhandle_t *handle, isc_result_t eresult,
|
||||
isc_region_t *region, void *cbarg) {
|
||||
UNUSED(handle);
|
||||
UNUSED(eresult);
|
||||
UNUSED(region);
|
||||
UNUSED(cbarg);
|
||||
}
|
||||
|
||||
UNUSED(task);
|
||||
static void
|
||||
response_getnext(isc_result_t result, isc_region_t *region, void *arg) {
|
||||
UNUSED(region);
|
||||
UNUSED(arg);
|
||||
|
||||
atomic_fetch_add_relaxed(&responses, 1);
|
||||
if (atomic_compare_exchange_strong(&first, &exp_true, false)) {
|
||||
isc_result_t result = dns_dispatch_getnext(dispentry, &devent);
|
||||
atomic_fetch_add_relaxed(&testdata.responses, 1);
|
||||
|
||||
if (atomic_compare_exchange_strong(&first, &(bool){ true }, false)) {
|
||||
result = dns_dispatch_getnext(dispentry);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
} else {
|
||||
dns_dispatch_removeresponse(&dispentry, &devent);
|
||||
isc_app_shutdown();
|
||||
uv_sem_post(&sem);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
startit(isc_task_t *task, isc_event_t *event) {
|
||||
isc_result_t result;
|
||||
isc_socket_t *sock = NULL;
|
||||
response(isc_result_t eresult, isc_region_t *region, void *arg) {
|
||||
UNUSED(region);
|
||||
UNUSED(arg);
|
||||
|
||||
isc_socket_attach(dns_dispatch_getsocket(dispatch), &sock);
|
||||
result = isc_socket_sendto(sock, event->ev_arg, task, senddone, sock,
|
||||
&local, NULL);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
isc_event_free(&event);
|
||||
fprintf(stderr, "%s(..., %s, ...)\n", __func__,
|
||||
isc_result_totext(eresult));
|
||||
|
||||
switch (eresult) {
|
||||
case ISC_R_EOF:
|
||||
case ISC_R_CANCELED:
|
||||
case ISC_R_SHUTTINGDOWN:
|
||||
break;
|
||||
default:
|
||||
atomic_fetch_add_relaxed(&testdata.responses, 1);
|
||||
atomic_store_relaxed(&testdata.result, eresult);
|
||||
}
|
||||
|
||||
uv_sem_post(&sem);
|
||||
}
|
||||
|
||||
/* test dispatch getnext */
|
||||
static void
|
||||
dispatch_getnext(void **state) {
|
||||
isc_region_t region;
|
||||
response_timeout(isc_result_t eresult, isc_region_t *region, void *arg) {
|
||||
UNUSED(region);
|
||||
UNUSED(arg);
|
||||
|
||||
fprintf(stderr, "%s(..., %s, ...)\n", __func__,
|
||||
isc_result_totext(eresult));
|
||||
|
||||
atomic_store_relaxed(&testdata.result, eresult);
|
||||
|
||||
uv_sem_post(&sem);
|
||||
}
|
||||
|
||||
static void
|
||||
connected(isc_result_t eresult, isc_region_t *region, void *cbarg) {
|
||||
isc_region_t *r = (isc_region_t *)cbarg;
|
||||
|
||||
UNUSED(eresult);
|
||||
UNUSED(region);
|
||||
|
||||
fprintf(stderr, "%s(..., %s, ...)\n", __func__,
|
||||
isc_result_totext(eresult));
|
||||
|
||||
dns_dispatch_send(dispentry, r, -1);
|
||||
}
|
||||
|
||||
static void
|
||||
client_senddone(isc_result_t eresult, isc_region_t *region, void *cbarg) {
|
||||
UNUSED(eresult);
|
||||
UNUSED(region);
|
||||
UNUSED(cbarg);
|
||||
|
||||
fprintf(stderr, "%s(..., %s, ...)\n", __func__,
|
||||
isc_result_totext(eresult));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
timeout_connected(isc_result_t eresult, isc_region_t *region, void *cbarg) {
|
||||
UNUSED(region);
|
||||
UNUSED(cbarg);
|
||||
|
||||
fprintf(stderr, "%s(..., %s, ...)\n", __func__,
|
||||
isc_result_totext(eresult));
|
||||
|
||||
atomic_store_relaxed(&testdata.result, eresult);
|
||||
|
||||
uv_sem_post(&sem);
|
||||
}
|
||||
|
||||
static void
|
||||
dispatch_timeout_tcp_connect(void **state) {
|
||||
isc_result_t result;
|
||||
isc_socket_t *sock = NULL;
|
||||
isc_task_t *task = NULL;
|
||||
isc_region_t region;
|
||||
unsigned char rbuf[12] = { 0 };
|
||||
unsigned char message[12] = { 0 };
|
||||
uint16_t id;
|
||||
struct in_addr ina;
|
||||
unsigned char message[12];
|
||||
unsigned int attrs;
|
||||
unsigned char rbuf[12];
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
atomic_init(&responses, 0);
|
||||
tcp_connect_addr = (isc_sockaddr_t){ .length = 0 };
|
||||
isc_sockaddr_fromin6(&tcp_connect_addr, &in6addr_blackhole, 0);
|
||||
|
||||
result = isc_task_create(taskmgr, 0, &task);
|
||||
result = dns_dispatchmgr_create(dt_mctx, connect_nm, &dispatchmgr);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = dns_dispatchmgr_create(dt_mctx, &dispatchmgr);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
ina.s_addr = htonl(INADDR_LOOPBACK);
|
||||
isc_sockaddr_fromin(&local, &ina, 0);
|
||||
attrs = DNS_DISPATCHATTR_IPV4 | DNS_DISPATCHATTR_UDP;
|
||||
result = dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr, &local,
|
||||
512, 6, 1024, 17, 19, attrs, &dispatch);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
/*
|
||||
* Create a local udp nameserver on the loopback.
|
||||
*/
|
||||
result = isc_socket_create(socketmgr, AF_INET, isc_sockettype_udp,
|
||||
&sock);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
ina.s_addr = htonl(INADDR_LOOPBACK);
|
||||
isc_sockaddr_fromin(&local, &ina, 0);
|
||||
result = isc_socket_bind(sock, &local, 0);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = isc_socket_getsockname(sock, &local);
|
||||
result = dns_dispatch_createtcp(dispatchmgr, &tcp_connect_addr,
|
||||
&tcp_server_addr, -1, &dispatch);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
region.base = rbuf;
|
||||
region.length = sizeof(rbuf);
|
||||
result = isc_socket_recv(sock, ®ion, 1, task, nameserver, sock);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = dns_dispatch_addresponse(dispatch, 0, &local, task, response,
|
||||
NULL, &id, &dispentry, NULL);
|
||||
result = dns_dispatch_addresponse(dispatch, 0, T_CLIENT_CONNECT,
|
||||
&tcp_server_addr, timeout_connected,
|
||||
client_senddone, response, ®ion,
|
||||
&id, &dispentry);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
memset(message, 0, sizeof(message));
|
||||
|
|
@ -308,31 +468,265 @@ dispatch_getnext(void **state) {
|
|||
|
||||
region.base = message;
|
||||
region.length = sizeof(message);
|
||||
result = isc_app_onrun(dt_mctx, task, startit, ®ion);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = isc_app_run();
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
dns_dispatch_connect(dispentry);
|
||||
|
||||
assert_int_equal(atomic_load_acquire(&responses), 2);
|
||||
uv_sem_wait(&sem);
|
||||
|
||||
/*
|
||||
* Shutdown nameserver.
|
||||
*/
|
||||
isc_socket_cancel(sock, task, ISC_SOCKCANCEL_RECV);
|
||||
isc_socket_detach(&sock);
|
||||
isc_task_detach(&task);
|
||||
dns_dispatch_removeresponse(&dispentry);
|
||||
|
||||
/*
|
||||
* Shutdown the dispatch.
|
||||
*/
|
||||
dns_dispatch_detach(&dispatch);
|
||||
dns_dispatchmgr_destroy(&dispatchmgr);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
|
||||
/* Skip if the IPv6 is not available or not blackholed */
|
||||
|
||||
result = atomic_load_acquire(&testdata.result);
|
||||
if (result == ISC_R_ADDRNOTAVAIL || result == ISC_R_CONNREFUSED) {
|
||||
skip();
|
||||
return;
|
||||
}
|
||||
|
||||
assert_int_equal(result, ISC_R_TIMEDOUT);
|
||||
}
|
||||
|
||||
static void
|
||||
dispatch_timeout_tcp_response(void **state __attribute__((unused))) {
|
||||
isc_result_t result;
|
||||
isc_region_t region;
|
||||
unsigned char rbuf[12] = { 0 };
|
||||
unsigned char message[12] = { 0 };
|
||||
uint16_t id;
|
||||
isc_nmsocket_t *sock = NULL;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
tcp_connect_addr = (isc_sockaddr_t){ .length = 0 };
|
||||
isc_sockaddr_fromin6(&tcp_connect_addr, &in6addr_loopback, 0);
|
||||
|
||||
result = dns_dispatchmgr_create(dt_mctx, connect_nm, &dispatchmgr);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = dns_dispatch_createtcp(dispatchmgr, &tcp_connect_addr,
|
||||
&tcp_server_addr, -1, &dispatch);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = isc_nm_listentcpdns(netmgr, &tcp_server_addr, noop_nameserver,
|
||||
NULL, accept_cb, NULL, 0, 0, NULL, &sock);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
region.base = rbuf;
|
||||
region.length = sizeof(rbuf);
|
||||
|
||||
result = dns_dispatch_addresponse(
|
||||
dispatch, 0, T_CLIENT_CONNECT, &tcp_server_addr, connected,
|
||||
client_senddone, response_timeout, ®ion, &id, &dispentry);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
memset(message, 0, sizeof(message));
|
||||
message[0] = (id >> 8) & 0xff;
|
||||
message[1] = id & 0xff;
|
||||
|
||||
region.base = message;
|
||||
region.length = sizeof(message);
|
||||
|
||||
dns_dispatch_connect(dispentry);
|
||||
|
||||
uv_sem_wait(&sem);
|
||||
|
||||
assert_int_equal(atomic_load_acquire(&testdata.result), ISC_R_TIMEDOUT);
|
||||
|
||||
isc_nm_stoplistening(sock);
|
||||
isc_nmsocket_close(&sock);
|
||||
assert_null(sock);
|
||||
|
||||
dns_dispatch_removeresponse(&dispentry);
|
||||
|
||||
dns_dispatch_detach(&dispatch);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
}
|
||||
|
||||
static void
|
||||
dispatch_tcp_response(void **state __attribute__((unused))) {
|
||||
isc_result_t result;
|
||||
isc_region_t region;
|
||||
unsigned char rbuf[12] = { 0 };
|
||||
unsigned char message[12] = { 0 };
|
||||
uint16_t id;
|
||||
isc_nmsocket_t *sock = NULL;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
tcp_connect_addr = (isc_sockaddr_t){ .length = 0 };
|
||||
isc_sockaddr_fromin6(&tcp_connect_addr, &in6addr_loopback, 0);
|
||||
|
||||
result = dns_dispatchmgr_create(dt_mctx, connect_nm, &dispatchmgr);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = dns_dispatch_createtcp(dispatchmgr, &tcp_connect_addr,
|
||||
&tcp_server_addr, -1, &dispatch);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = isc_nm_listentcpdns(netmgr, &tcp_server_addr, nameserver, NULL,
|
||||
accept_cb, NULL, 0, 0, NULL, &sock);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
region.base = rbuf;
|
||||
region.length = sizeof(rbuf);
|
||||
|
||||
result = dns_dispatch_addresponse(
|
||||
dispatch, 0, T_CLIENT_CONNECT, &tcp_server_addr, connected,
|
||||
client_senddone, response, ®ion, &id, &dispentry);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
memset(message, 0, sizeof(message));
|
||||
message[0] = (id >> 8) & 0xff;
|
||||
message[1] = id & 0xff;
|
||||
|
||||
region.base = message;
|
||||
region.length = sizeof(message);
|
||||
|
||||
dns_dispatch_connect(dispentry);
|
||||
|
||||
uv_sem_wait(&sem);
|
||||
|
||||
assert_in_range(atomic_load_acquire(&testdata.responses), 1, 2);
|
||||
assert_int_equal(atomic_load_acquire(&testdata.result), ISC_R_SUCCESS);
|
||||
|
||||
/* Cleanup */
|
||||
|
||||
isc_nm_stoplistening(sock);
|
||||
isc_nmsocket_close(&sock);
|
||||
assert_null(sock);
|
||||
|
||||
dns_dispatch_removeresponse(&dispentry);
|
||||
|
||||
dns_dispatch_detach(&dispatch);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
}
|
||||
|
||||
static void
|
||||
dispatch_timeout_udp_response(void **state __attribute__((unused))) {
|
||||
isc_result_t result;
|
||||
isc_region_t region;
|
||||
unsigned char rbuf[12] = { 0 };
|
||||
unsigned char message[12] = { 0 };
|
||||
uint16_t id;
|
||||
isc_nmsocket_t *sock = NULL;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
udp_connect_addr = (isc_sockaddr_t){ .length = 0 };
|
||||
isc_sockaddr_fromin6(&udp_connect_addr, &in6addr_loopback, 0);
|
||||
|
||||
result = dns_dispatchmgr_create(dt_mctx, connect_nm, &dispatchmgr);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = dns_dispatch_createudp(dispatchmgr, &tcp_connect_addr,
|
||||
&dispatch);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = isc_nm_listenudp(netmgr, &udp_server_addr, noop_nameserver,
|
||||
NULL, 0, &sock);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
region.base = rbuf;
|
||||
region.length = sizeof(rbuf);
|
||||
|
||||
result = dns_dispatch_addresponse(
|
||||
dispatch, 0, T_CLIENT_CONNECT, &udp_server_addr, connected,
|
||||
client_senddone, response_timeout, ®ion, &id, &dispentry);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
memset(message, 0, sizeof(message));
|
||||
message[0] = (id >> 8) & 0xff;
|
||||
message[1] = id & 0xff;
|
||||
|
||||
region.base = message;
|
||||
region.length = sizeof(message);
|
||||
|
||||
dns_dispatch_connect(dispentry);
|
||||
|
||||
uv_sem_wait(&sem);
|
||||
|
||||
assert_int_equal(atomic_load_acquire(&testdata.result), ISC_R_TIMEDOUT);
|
||||
|
||||
isc_nm_stoplistening(sock);
|
||||
isc_nmsocket_close(&sock);
|
||||
assert_null(sock);
|
||||
|
||||
dns_dispatch_removeresponse(&dispentry);
|
||||
|
||||
dns_dispatch_detach(&dispatch);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
}
|
||||
|
||||
/* test dispatch getnext */
|
||||
static void
|
||||
dispatch_getnext(void **state) {
|
||||
isc_result_t result;
|
||||
isc_region_t region;
|
||||
isc_nmsocket_t *sock = NULL;
|
||||
unsigned char message[12] = { 0 };
|
||||
unsigned char rbuf[12] = { 0 };
|
||||
uint16_t id;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
result = dns_dispatchmgr_create(dt_mctx, connect_nm, &dispatchmgr);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = dns_dispatch_createudp(dispatchmgr, &udp_connect_addr,
|
||||
&dispatch);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
/*
|
||||
* Create a local udp nameserver on the loopback.
|
||||
*/
|
||||
result = isc_nm_listenudp(netmgr, &udp_server_addr, nameserver, NULL, 0,
|
||||
&sock);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
region.base = rbuf;
|
||||
region.length = sizeof(rbuf);
|
||||
result = dns_dispatch_addresponse(
|
||||
dispatch, 0, T_CLIENT_CONNECT, &udp_server_addr, connected,
|
||||
client_senddone, response_getnext, ®ion, &id, &dispentry);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
memset(message, 0, sizeof(message));
|
||||
message[0] = (id >> 8) & 0xff;
|
||||
message[1] = id & 0xff;
|
||||
|
||||
region.base = message;
|
||||
region.length = sizeof(message);
|
||||
|
||||
dns_dispatch_connect(dispentry);
|
||||
|
||||
uv_sem_wait(&sem);
|
||||
|
||||
assert_int_equal(atomic_load_acquire(&testdata.responses), 2);
|
||||
|
||||
/* Cleanup */
|
||||
isc_nm_stoplistening(sock);
|
||||
isc_nmsocket_close(&sock);
|
||||
assert_null(sock);
|
||||
|
||||
dns_dispatch_removeresponse(&dispentry);
|
||||
dns_dispatch_detach(&dispatch);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
}
|
||||
|
||||
int
|
||||
main(void) {
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test_setup_teardown(dispatch_timeout_tcp_connect,
|
||||
_setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(dispatch_timeout_tcp_response,
|
||||
_setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(dispatch_tcp_response, _setup,
|
||||
_teardown),
|
||||
cmocka_unit_test_setup_teardown(dispatch_timeout_udp_response,
|
||||
_setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(dispatchset_create, _setup,
|
||||
_teardown),
|
||||
cmocka_unit_test_setup_teardown(dispatchset_get, _setup,
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#include <isc/lex.h>
|
||||
#include <isc/managers.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/netmgr.h>
|
||||
#include <isc/os.h>
|
||||
#include <isc/print.h>
|
||||
#include <isc/socket.h>
|
||||
|
|
@ -68,7 +69,6 @@ isc_nm_t *netmgr = NULL;
|
|||
isc_taskmgr_t *taskmgr = NULL;
|
||||
isc_task_t *maintask = NULL;
|
||||
isc_timermgr_t *timermgr = NULL;
|
||||
isc_socketmgr_t *socketmgr = NULL;
|
||||
dns_zonemgr_t *zonemgr = NULL;
|
||||
bool app_running = false;
|
||||
int ncpus;
|
||||
|
|
@ -96,10 +96,11 @@ cleanup_managers(void) {
|
|||
isc_task_shutdown(maintask);
|
||||
isc_task_destroy(&maintask);
|
||||
}
|
||||
|
||||
isc_managers_destroy(netmgr == NULL ? NULL : &netmgr,
|
||||
taskmgr == NULL ? NULL : &taskmgr,
|
||||
timermgr == NULL ? NULL : &timermgr,
|
||||
socketmgr == NULL ? NULL : &socketmgr);
|
||||
timermgr == NULL ? NULL : &timermgr, NULL);
|
||||
|
||||
if (app_running) {
|
||||
isc_app_finish();
|
||||
}
|
||||
|
|
@ -111,7 +112,7 @@ create_managers(void) {
|
|||
ncpus = isc_os_ncpus();
|
||||
|
||||
isc_managers_create(dt_mctx, ncpus, 0, 0, &netmgr, &taskmgr, &timermgr,
|
||||
&socketmgr);
|
||||
NULL);
|
||||
CHECK(isc_task_create(taskmgr, 0, &maintask));
|
||||
return (ISC_R_SUCCESS);
|
||||
|
||||
|
|
@ -293,8 +294,7 @@ dns_test_setupzonemgr(void) {
|
|||
isc_result_t result;
|
||||
REQUIRE(zonemgr == NULL);
|
||||
|
||||
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, socketmgr, NULL,
|
||||
&zonemgr);
|
||||
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, NULL, &zonemgr);
|
||||
return (result);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ extern isc_log_t *lctx;
|
|||
extern isc_taskmgr_t *taskmgr;
|
||||
extern isc_task_t *maintask;
|
||||
extern isc_timermgr_t *timermgr;
|
||||
extern isc_socketmgr_t *socketmgr;
|
||||
extern isc_nm_t *netmgr;
|
||||
extern dns_zonemgr_t *zonemgr;
|
||||
extern bool app_running;
|
||||
extern int ncpus;
|
||||
|
|
|
|||
|
|
@ -50,15 +50,14 @@ _setup(void **state) {
|
|||
result = dns_test_begin(NULL, true);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = dns_dispatchmgr_create(dt_mctx, &dispatchmgr);
|
||||
result = dns_dispatchmgr_create(dt_mctx, netmgr, &dispatchmgr);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = dns_test_makeview("view", &view);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
isc_sockaddr_any(&local);
|
||||
result = dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr, &local,
|
||||
4096, 100, 100, 100, 500, 0, &dispatch);
|
||||
result = dns_dispatch_createudp(dispatchmgr, &local, &dispatch);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
return (0);
|
||||
|
|
@ -70,7 +69,7 @@ _teardown(void **state) {
|
|||
|
||||
dns_dispatch_detach(&dispatch);
|
||||
dns_view_detach(&view);
|
||||
dns_dispatchmgr_destroy(&dispatchmgr);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
dns_test_end();
|
||||
|
||||
return (0);
|
||||
|
|
@ -80,8 +79,8 @@ static void
|
|||
mkres(dns_resolver_t **resolverp) {
|
||||
isc_result_t result;
|
||||
|
||||
result = dns_resolver_create(view, taskmgr, 1, 1, socketmgr, timermgr,
|
||||
0, dispatchmgr, dispatch, NULL, resolverp);
|
||||
result = dns_resolver_create(view, taskmgr, 1, 1, netmgr, timermgr, 0,
|
||||
dispatchmgr, dispatch, NULL, resolverp);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ zonemgr_create(void **state) {
|
|||
|
||||
UNUSED(state);
|
||||
|
||||
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, socketmgr, NULL,
|
||||
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, NULL,
|
||||
&myzonemgr);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
|
|
@ -80,7 +80,7 @@ zonemgr_managezone(void **state) {
|
|||
|
||||
UNUSED(state);
|
||||
|
||||
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, socketmgr, NULL,
|
||||
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, NULL,
|
||||
&myzonemgr);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
|
|
@ -121,7 +121,7 @@ zonemgr_createzone(void **state) {
|
|||
|
||||
UNUSED(state);
|
||||
|
||||
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, socketmgr, NULL,
|
||||
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, NULL,
|
||||
&myzonemgr);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
|
|
@ -160,7 +160,7 @@ zonemgr_unreachable(void **state) {
|
|||
|
||||
TIME_NOW(&now);
|
||||
|
||||
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, socketmgr, NULL,
|
||||
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, NULL,
|
||||
&myzonemgr);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
|
|
|
|||
|
|
@ -576,8 +576,8 @@ fetch_callback_ds(isc_task_t *task, isc_event_t *event) {
|
|||
} else if (eresult == DNS_R_SERVFAIL) {
|
||||
goto unexpected;
|
||||
} else if (eresult != DNS_R_CNAME &&
|
||||
isdelegation(dns_fixedname_name(&devent->foundname),
|
||||
&val->frdataset, eresult))
|
||||
isdelegation(devent->foundname, &val->frdataset,
|
||||
eresult))
|
||||
{
|
||||
/*
|
||||
* Failed to find a DS while trying to prove
|
||||
|
|
|
|||
|
|
@ -634,6 +634,7 @@ view_flushanddetach(dns_view_t **viewp, bool flush) {
|
|||
dns_zone_t *mkzone = NULL, *rdzone = NULL;
|
||||
|
||||
isc_refcount_destroy(&view->references);
|
||||
|
||||
if (!RESSHUTDOWN(view)) {
|
||||
dns_resolver_shutdown(view->resolver);
|
||||
}
|
||||
|
|
@ -643,14 +644,14 @@ view_flushanddetach(dns_view_t **viewp, bool flush) {
|
|||
if (!REQSHUTDOWN(view)) {
|
||||
dns_requestmgr_shutdown(view->requestmgr);
|
||||
}
|
||||
LOCK(&view->lock);
|
||||
if (view->zonetable != NULL) {
|
||||
if (view->flush) {
|
||||
dns_zt_flushanddetach(&view->zonetable);
|
||||
} else {
|
||||
dns_zt_detach(&view->zonetable);
|
||||
}
|
||||
|
||||
if (view->zonetable != NULL && view->flush) {
|
||||
dns_zt_flushanddetach(&view->zonetable);
|
||||
} else if (view->zonetable != NULL) {
|
||||
dns_zt_detach(&view->zonetable);
|
||||
}
|
||||
|
||||
LOCK(&view->lock);
|
||||
if (view->managed_keys != NULL) {
|
||||
mkzone = view->managed_keys;
|
||||
view->managed_keys = NULL;
|
||||
|
|
@ -796,9 +797,9 @@ dns_view_createzonetable(dns_view_t *view) {
|
|||
|
||||
isc_result_t
|
||||
dns_view_createresolver(dns_view_t *view, isc_taskmgr_t *taskmgr,
|
||||
unsigned int ntasks, unsigned int ndisp,
|
||||
isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr,
|
||||
unsigned int options, dns_dispatchmgr_t *dispatchmgr,
|
||||
unsigned int ntasks, unsigned int ndisp, isc_nm_t *nm,
|
||||
isc_timermgr_t *timermgr, unsigned int options,
|
||||
dns_dispatchmgr_t *dispatchmgr,
|
||||
dns_dispatch_t *dispatchv4,
|
||||
dns_dispatch_t *dispatchv6) {
|
||||
isc_result_t result;
|
||||
|
|
@ -815,8 +816,8 @@ dns_view_createresolver(dns_view_t *view, isc_taskmgr_t *taskmgr,
|
|||
}
|
||||
isc_task_setname(view->task, "view", view);
|
||||
|
||||
result = dns_resolver_create(view, taskmgr, ntasks, ndisp, socketmgr,
|
||||
timermgr, options, dispatchmgr, dispatchv4,
|
||||
result = dns_resolver_create(view, taskmgr, ntasks, ndisp, nm, timermgr,
|
||||
options, dispatchmgr, dispatchv4,
|
||||
dispatchv6, &view->resolver);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_task_detach(&view->task);
|
||||
|
|
@ -841,11 +842,10 @@ dns_view_createresolver(dns_view_t *view, isc_taskmgr_t *taskmgr,
|
|||
atomic_fetch_and(&view->attributes, ~DNS_VIEWATTR_ADBSHUTDOWN);
|
||||
isc_refcount_increment(&view->weakrefs);
|
||||
|
||||
result = dns_requestmgr_create(view->mctx, timermgr, socketmgr,
|
||||
dns_resolver_taskmgr(view->resolver),
|
||||
dns_resolver_dispatchmgr(view->resolver),
|
||||
dispatchv4, dispatchv6,
|
||||
&view->requestmgr);
|
||||
result = dns_requestmgr_create(
|
||||
view->mctx, dns_resolver_taskmgr(view->resolver),
|
||||
dns_resolver_dispatchmgr(view->resolver), dispatchv4,
|
||||
dispatchv6, &view->requestmgr);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
dns_adb_shutdown(view->adb);
|
||||
dns_resolver_shutdown(view->resolver);
|
||||
|
|
@ -2502,12 +2502,12 @@ dns_view_setviewcommit(dns_view_t *view) {
|
|||
if (view->managed_keys != NULL) {
|
||||
dns_zone_attach(view->managed_keys, &managed_keys);
|
||||
}
|
||||
if (view->zonetable != NULL) {
|
||||
dns_zt_setviewcommit(view->zonetable);
|
||||
}
|
||||
|
||||
UNLOCK(&view->lock);
|
||||
|
||||
if (view->zonetable != NULL) {
|
||||
dns_zt_setviewcommit(view->zonetable);
|
||||
}
|
||||
if (redirect != NULL) {
|
||||
dns_zone_setviewcommit(redirect);
|
||||
dns_zone_detach(&redirect);
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@
|
|||
#include <dns/rdataset.h>
|
||||
#include <dns/result.h>
|
||||
#include <dns/soa.h>
|
||||
#include <dns/tcpmsg.h>
|
||||
#include <dns/transport.h>
|
||||
#include <dns/tsig.h>
|
||||
#include <dns/view.h>
|
||||
|
|
@ -957,7 +956,6 @@ xfrin_start(dns_xfrin_ctx_t *xfr) {
|
|||
ISC_UNREACHABLE();
|
||||
}
|
||||
|
||||
/* TODO isc_socket_dscp(xfr->socket, xfr->dscp); */
|
||||
return (ISC_R_SUCCESS);
|
||||
|
||||
failure:
|
||||
|
|
@ -1036,6 +1034,7 @@ xfrin_connect_done(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
|
|||
xfr->handle = handle;
|
||||
sockaddr = isc_nmhandle_peeraddr(handle);
|
||||
isc_sockaddr_format(&sockaddr, sourcetext, sizeof(sourcetext));
|
||||
/* TODO set DSCP */
|
||||
|
||||
if (xfr->tsigkey != NULL && xfr->tsigkey->key != NULL) {
|
||||
dns_name_format(dst_key_name(xfr->tsigkey->key), signerbuf,
|
||||
|
|
|
|||
|
|
@ -590,7 +590,6 @@ struct dns_zonemgr {
|
|||
isc_refcount_t refs;
|
||||
isc_taskmgr_t *taskmgr;
|
||||
isc_timermgr_t *timermgr;
|
||||
isc_socketmgr_t *socketmgr;
|
||||
isc_nm_t *netmgr;
|
||||
isc_taskpool_t *zonetasks;
|
||||
isc_taskpool_t *loadtasks;
|
||||
|
|
@ -14011,8 +14010,8 @@ refresh_callback(isc_task_t *task, isc_event_t *event) {
|
|||
result = dns_request_getresponse(revent->request, msg, 0);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
dns_zone_log(zone, ISC_LOG_INFO,
|
||||
"refresh: failure trying master "
|
||||
"%s (source %s): %s",
|
||||
"refresh: unable to get response, master "
|
||||
"%s, source %s: %s",
|
||||
master, source, dns_result_totext(result));
|
||||
goto next_master;
|
||||
}
|
||||
|
|
@ -14603,8 +14602,7 @@ again:
|
|||
zone->task, refresh_callback, zone, &zone->request);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
zone_idetach(&dummy);
|
||||
zone_debuglog(zone, me, 1,
|
||||
"dns_request_createvia4() failed: %s",
|
||||
zone_debuglog(zone, me, 1, "dns_request_createvia() failed: %s",
|
||||
dns_result_totext(result));
|
||||
goto skip_master;
|
||||
} else {
|
||||
|
|
@ -18736,8 +18734,8 @@ zonemgr_keymgmt_find(dns_zonemgr_t *zmgr, dns_zone_t *zone,
|
|||
|
||||
isc_result_t
|
||||
dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
|
||||
isc_timermgr_t *timermgr, isc_socketmgr_t *socketmgr,
|
||||
isc_nm_t *netmgr, dns_zonemgr_t **zmgrp) {
|
||||
isc_timermgr_t *timermgr, isc_nm_t *netmgr,
|
||||
dns_zonemgr_t **zmgrp) {
|
||||
dns_zonemgr_t *zmgr;
|
||||
isc_result_t result;
|
||||
|
||||
|
|
@ -18747,7 +18745,6 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
|
|||
isc_mem_attach(mctx, &zmgr->mctx);
|
||||
zmgr->taskmgr = taskmgr;
|
||||
zmgr->timermgr = timermgr;
|
||||
zmgr->socketmgr = socketmgr;
|
||||
zmgr->netmgr = netmgr;
|
||||
zmgr->zonetasks = NULL;
|
||||
zmgr->loadtasks = NULL;
|
||||
|
|
|
|||
|
|
@ -483,6 +483,7 @@ dns_zt_setviewcommit(dns_zt_t *zt) {
|
|||
|
||||
REQUIRE(VALID_ZT(zt));
|
||||
|
||||
RWLOCK(&zt->rwlock, isc_rwlocktype_read);
|
||||
dns_rbtnodechain_init(&chain);
|
||||
|
||||
result = dns_rbtnodechain_first(&chain, zt->table, NULL, NULL);
|
||||
|
|
@ -496,6 +497,7 @@ dns_zt_setviewcommit(dns_zt_t *zt) {
|
|||
}
|
||||
|
||||
dns_rbtnodechain_invalidate(&chain);
|
||||
RWUNLOCK(&zt->rwlock, isc_rwlocktype_read);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -160,6 +160,12 @@ isc_nmhandle_cleartimeout(isc_nmhandle_t *handle);
|
|||
* a TCPDNS socket wrapping a TCP connection), the timer is set for
|
||||
* both socket layers.
|
||||
*/
|
||||
bool
|
||||
isc_nmhandle_timer_running(isc_nmhandle_t *handle);
|
||||
/*%<
|
||||
* Return true if the timer for the socket connected to 'handle'
|
||||
* is running.
|
||||
*/
|
||||
|
||||
void
|
||||
isc_nmhandle_keepalive(isc_nmhandle_t *handle, bool value);
|
||||
|
|
@ -450,6 +456,16 @@ isc_nm_setstats(isc_nm_t *mgr, isc_stats_t *stats);
|
|||
* full range of socket-related stats counter numbers.
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
isc_nm_checkaddr(const isc_sockaddr_t *addr, isc_socktype_t type);
|
||||
/*%<
|
||||
* Check whether the specified address is available on the local system
|
||||
* by opening a socket and immediately closing it.
|
||||
*
|
||||
* Requires:
|
||||
*\li 'addr' is not NULL.
|
||||
*/
|
||||
|
||||
void
|
||||
isc_nm_tcpdnsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
|
||||
isc_nm_cb_t cb, void *cbarg, unsigned int timeout,
|
||||
|
|
|
|||
|
|
@ -225,12 +225,6 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
|
|||
*\li #ISC_R_UNEXPECTED
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
isc_socket_dup(isc_socket_t *sock0, isc_socket_t **socketp);
|
||||
/*%<
|
||||
* Duplicate an existing socket, reusing its file descriptor.
|
||||
*/
|
||||
|
||||
void
|
||||
isc_socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how);
|
||||
/*%<
|
||||
|
|
|
|||
|
|
@ -71,6 +71,16 @@ isc_interval_iszero(const isc_interval_t *i);
|
|||
*\li 'i' is a valid pointer.
|
||||
*/
|
||||
|
||||
unsigned int
|
||||
isc_interval_ms(const isc_interval_t *i);
|
||||
/*%<
|
||||
* Returns interval 'i' expressed as a number of milliseconds.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
*\li 'i' is a valid pointer.
|
||||
*/
|
||||
|
||||
/***
|
||||
*** Absolute Times
|
||||
***/
|
||||
|
|
|
|||
|
|
@ -98,7 +98,6 @@ typedef struct isc_nm_http_endpoints isc_nm_http_endpoints_t;
|
|||
#endif /* HAVE_LIBNGHTTP2 */
|
||||
|
||||
typedef void (*isc_taskaction_t)(isc_task_t *, isc_event_t *);
|
||||
typedef int (*isc_sockfdwatch_t)(isc_task_t *, isc_socket_t *, void *, int);
|
||||
|
||||
/* The following cannot be listed alphabetically due to forward reference */
|
||||
typedef isc_result_t(isc_httpdaction_t)(
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ isc_managers_destroy(isc_nm_t **netmgrp, isc_taskmgr_t **taskmgrp,
|
|||
/*
|
||||
* If we have a taskmgr to clean up, then we must also have a netmgr.
|
||||
*/
|
||||
REQUIRE(taskmgrp != NULL || netmgrp == NULL);
|
||||
REQUIRE(taskmgrp == NULL || netmgrp != NULL);
|
||||
|
||||
/*
|
||||
* The sequence of operations here is important:
|
||||
|
|
|
|||
|
|
@ -222,13 +222,6 @@ http_session_active(isc_nm_http_session_t *session) {
|
|||
return (!session->closed && !session->closing);
|
||||
}
|
||||
|
||||
static bool
|
||||
inactive(isc_nmsocket_t *sock) {
|
||||
return (!isc__nmsocket_active(sock) || atomic_load(&sock->closing) ||
|
||||
atomic_load(&sock->mgr->closing) ||
|
||||
(sock->server != NULL && !isc__nmsocket_active(sock->server)));
|
||||
}
|
||||
|
||||
static void *
|
||||
http_malloc(size_t sz, isc_mem_t *mctx) {
|
||||
return (isc_mem_allocate(mctx, sz));
|
||||
|
|
@ -1461,7 +1454,7 @@ isc_nm_httpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
|
|||
}
|
||||
|
||||
isc__nmsocket_clearcb(sock);
|
||||
isc__nm_connectcb(sock, req, ISC_R_CANCELED, true);
|
||||
isc__nm_connectcb(sock, req, ISC_R_SHUTTINGDOWN, true);
|
||||
isc__nmsocket_prep_destroy(sock);
|
||||
isc__nmsocket_detach(&sock);
|
||||
return;
|
||||
|
|
@ -2154,7 +2147,8 @@ server_httpsend(isc_nmhandle_t *handle, isc_nmsocket_t *sock,
|
|||
isc_result_t result = ISC_R_SUCCESS;
|
||||
isc_nm_cb_t cb = req->cb.send;
|
||||
void *cbarg = req->cbarg;
|
||||
if (inactive(sock) || !http_session_active(handle->httpsession)) {
|
||||
if (isc__nmsocket_closing(sock) ||
|
||||
!http_session_active(handle->httpsession)) {
|
||||
failed_send_cb(sock, req, ISC_R_CANCELED);
|
||||
return;
|
||||
}
|
||||
|
|
@ -2381,7 +2375,7 @@ httplisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
|
|||
* function gets invoked, so we need to do extra sanity checks to
|
||||
* detect this case.
|
||||
*/
|
||||
if (inactive(handle->sock) || httpserver == NULL) {
|
||||
if (isc__nmsocket_closing(handle->sock) || httpserver == NULL) {
|
||||
return (ISC_R_CANCELED);
|
||||
}
|
||||
|
||||
|
|
@ -2393,8 +2387,9 @@ httplisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
|
|||
REQUIRE(VALID_NMSOCK(httplistensock));
|
||||
INSIST(httplistensock == httpserver);
|
||||
|
||||
if (inactive(httplistensock) ||
|
||||
!atomic_load(&httplistensock->listening)) {
|
||||
if (isc__nmsocket_closing(httplistensock) ||
|
||||
!atomic_load(&httplistensock->listening))
|
||||
{
|
||||
return (ISC_R_CANCELED);
|
||||
}
|
||||
|
||||
|
|
@ -3041,7 +3036,7 @@ isc__nm_http_cleartimeout(isc_nmhandle_t *handle) {
|
|||
REQUIRE(handle->sock->type == isc_nm_httpsocket);
|
||||
|
||||
sock = handle->sock;
|
||||
if (sock->h2.session != NULL && sock->h2.session->handle) {
|
||||
if (sock->h2.session != NULL && sock->h2.session->handle != NULL) {
|
||||
INSIST(VALID_HTTP2_SESSION(sock->h2.session));
|
||||
INSIST(VALID_NMHANDLE(sock->h2.session->handle));
|
||||
isc_nmhandle_cleartimeout(sock->h2.session->handle);
|
||||
|
|
@ -3057,7 +3052,7 @@ isc__nm_http_settimeout(isc_nmhandle_t *handle, uint32_t timeout) {
|
|||
REQUIRE(handle->sock->type == isc_nm_httpsocket);
|
||||
|
||||
sock = handle->sock;
|
||||
if (sock->h2.session != NULL && sock->h2.session->handle) {
|
||||
if (sock->h2.session != NULL && sock->h2.session->handle != NULL) {
|
||||
INSIST(VALID_HTTP2_SESSION(sock->h2.session));
|
||||
INSIST(VALID_NMHANDLE(sock->h2.session->handle));
|
||||
isc_nmhandle_settimeout(sock->h2.session->handle, timeout);
|
||||
|
|
|
|||
|
|
@ -976,8 +976,8 @@ struct isc_nmsocket {
|
|||
atomic_bool listening;
|
||||
atomic_bool connecting;
|
||||
atomic_bool connected;
|
||||
bool accepting;
|
||||
bool reading;
|
||||
atomic_bool accepting;
|
||||
atomic_bool reading;
|
||||
isc_refcount_t references;
|
||||
|
||||
/*%
|
||||
|
|
|
|||
|
|
@ -1915,7 +1915,7 @@ isc__nm_failed_send_cb(isc_nmsocket_t *sock, isc__nm_uvreq_t *req,
|
|||
|
||||
void
|
||||
isc__nm_failed_accept_cb(isc_nmsocket_t *sock, isc_result_t eresult) {
|
||||
REQUIRE(sock->accepting);
|
||||
REQUIRE(atomic_load(&sock->accepting));
|
||||
REQUIRE(sock->server);
|
||||
|
||||
/*
|
||||
|
|
@ -1929,7 +1929,7 @@ isc__nm_failed_accept_cb(isc_nmsocket_t *sock, isc_result_t eresult) {
|
|||
|
||||
isc__nmsocket_detach(&sock->server);
|
||||
|
||||
sock->accepting = false;
|
||||
atomic_store(&sock->accepting, false);
|
||||
|
||||
switch (eresult) {
|
||||
case ISC_R_NOTCONNECTED:
|
||||
|
|
@ -2024,11 +2024,13 @@ isc__nmsocket_readtimeout_cb(uv_timer_t *timer) {
|
|||
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
REQUIRE(sock->reading);
|
||||
REQUIRE(atomic_load(&sock->reading));
|
||||
|
||||
if (atomic_load(&sock->client)) {
|
||||
uv_timer_stop(timer);
|
||||
|
||||
sock->recv_read = false;
|
||||
|
||||
if (sock->recv_cb != NULL) {
|
||||
isc__nm_uvreq_t *req = isc__nm_get_read_req(sock, NULL);
|
||||
isc__nm_readcb(sock, req, ISC_R_TIMEDOUT);
|
||||
|
|
@ -2172,7 +2174,7 @@ void
|
|||
isc__nm_start_reading(isc_nmsocket_t *sock) {
|
||||
int r;
|
||||
|
||||
if (sock->reading) {
|
||||
if (atomic_load(&sock->reading)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -2198,14 +2200,14 @@ isc__nm_start_reading(isc_nmsocket_t *sock) {
|
|||
ISC_UNREACHABLE();
|
||||
}
|
||||
RUNTIME_CHECK(r == 0);
|
||||
sock->reading = true;
|
||||
atomic_store(&sock->reading, true);
|
||||
}
|
||||
|
||||
void
|
||||
isc__nm_stop_reading(isc_nmsocket_t *sock) {
|
||||
int r;
|
||||
|
||||
if (!sock->reading) {
|
||||
if (!atomic_load(&sock->reading)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -2223,7 +2225,7 @@ isc__nm_stop_reading(isc_nmsocket_t *sock) {
|
|||
ISC_UNREACHABLE();
|
||||
}
|
||||
RUNTIME_CHECK(r == 0);
|
||||
sock->reading = false;
|
||||
atomic_store(&sock->reading, false);
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
@ -2234,7 +2236,7 @@ isc__nm_closing(isc_nmsocket_t *sock) {
|
|||
bool
|
||||
isc__nmsocket_closing(isc_nmsocket_t *sock) {
|
||||
return (!isc__nmsocket_active(sock) || atomic_load(&sock->closing) ||
|
||||
atomic_load(&sock->mgr->closing) ||
|
||||
isc__nm_closing(sock) ||
|
||||
(sock->server != NULL && !isc__nmsocket_active(sock->server)));
|
||||
}
|
||||
|
||||
|
|
@ -2260,8 +2262,8 @@ processbuffer(isc_nmsocket_t *sock) {
|
|||
* Stop reading if this is a client socket, or if the server socket
|
||||
* has been set to sequential mode, or the number of queries we are
|
||||
* processing simultaneously has reached the clients-per-connection
|
||||
* limit. In this case we'll be called again by resume_processing()
|
||||
* later.
|
||||
* limit. In this case we'll be called again later by
|
||||
* isc__nm_resume_processing().
|
||||
*/
|
||||
void
|
||||
isc__nm_process_sock_buffer(isc_nmsocket_t *sock) {
|
||||
|
|
@ -2402,6 +2404,14 @@ isc_nmhandle_keepalive(isc_nmhandle_t *handle, bool value) {
|
|||
}
|
||||
}
|
||||
|
||||
bool
|
||||
isc_nmhandle_timer_running(isc_nmhandle_t *handle) {
|
||||
REQUIRE(VALID_NMHANDLE(handle));
|
||||
REQUIRE(VALID_NMSOCK(handle->sock));
|
||||
|
||||
return (isc__nmsocket_timer_running(handle->sock));
|
||||
}
|
||||
|
||||
void *
|
||||
isc_nmhandle_getextra(isc_nmhandle_t *handle) {
|
||||
REQUIRE(VALID_NMHANDLE(handle));
|
||||
|
|
@ -2527,13 +2537,6 @@ void
|
|||
isc_nm_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
|
||||
REQUIRE(VALID_NMHANDLE(handle));
|
||||
|
||||
/*
|
||||
* This is always called via callback (from accept or connect), and
|
||||
* caller must attach to the handle, so the references always need to be
|
||||
* at least 2.
|
||||
*/
|
||||
REQUIRE(isc_refcount_current(&handle->references) >= 2);
|
||||
|
||||
switch (handle->sock->type) {
|
||||
case isc_nm_udpsocket:
|
||||
isc__nm_udp_read(handle, cb, cbarg);
|
||||
|
|
@ -3130,6 +3133,45 @@ isc__nm_socket_disable_pmtud(uv_os_sock_t fd, sa_family_t sa_family) {
|
|||
return (ISC_R_NOTIMPLEMENTED);
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
isc_nm_checkaddr(const isc_sockaddr_t *addr, isc_socktype_t type) {
|
||||
int proto, pf, addrlen, fd, r;
|
||||
|
||||
REQUIRE(addr != NULL);
|
||||
|
||||
switch (type) {
|
||||
case isc_socktype_tcp:
|
||||
proto = SOCK_STREAM;
|
||||
break;
|
||||
case isc_socktype_udp:
|
||||
proto = SOCK_DGRAM;
|
||||
break;
|
||||
default:
|
||||
return (ISC_R_NOTIMPLEMENTED);
|
||||
}
|
||||
|
||||
pf = isc_sockaddr_pf(addr);
|
||||
if (pf == AF_INET) {
|
||||
addrlen = sizeof(struct sockaddr_in);
|
||||
} else {
|
||||
addrlen = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
|
||||
fd = socket(pf, proto, 0);
|
||||
if (fd < 0) {
|
||||
return (isc_errno_toresult(errno));
|
||||
}
|
||||
|
||||
r = bind(fd, (const struct sockaddr *)&addr->type.sa, addrlen);
|
||||
if (r < 0) {
|
||||
close(fd);
|
||||
return (isc_errno_toresult(errno));
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
#if defined(TCP_CONNECTIONTIMEOUT)
|
||||
#define TIMEOUT_TYPE int
|
||||
#define TIMEOUT_DIV 1000
|
||||
|
|
@ -3311,11 +3353,10 @@ isc_nm_sequential(isc_nmhandle_t *handle) {
|
|||
* We don't want pipelining on this connection. That means
|
||||
* that we need to pause after reading each request, and
|
||||
* resume only after the request has been processed. This
|
||||
* is done in resume_processing(), which is the socket's
|
||||
* closehandle_cb callback, called whenever a handle
|
||||
* is done in isc__nm_resume_processing(), which is the
|
||||
* socket's closehandle_cb callback, called whenever a handle
|
||||
* is released.
|
||||
*/
|
||||
|
||||
isc__nmsocket_timer_stop(sock);
|
||||
isc__nm_stop_reading(sock);
|
||||
atomic_store(&sock->sequential, true);
|
||||
|
|
@ -3421,7 +3462,7 @@ nmsocket_dump(isc_nmsocket_t *sock) {
|
|||
atomic_load(&sock->closing) ? " closing" : "",
|
||||
atomic_load(&sock->destroying) ? " destroying" : "",
|
||||
atomic_load(&sock->connecting) ? " connecting" : "",
|
||||
sock->accepting ? " accepting" : "");
|
||||
atomic_load(&sock->accepting) ? " accepting" : "");
|
||||
fprintf(stderr, "Created by:\n");
|
||||
isc_backtrace_symbols_fd(sock->backtrace, sock->backtrace_size,
|
||||
STDERR_FILENO);
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ stop_tcp_child(isc_nmsocket_t *sock);
|
|||
|
||||
static void
|
||||
failed_accept_cb(isc_nmsocket_t *sock, isc_result_t eresult) {
|
||||
REQUIRE(sock->accepting);
|
||||
REQUIRE(atomic_load(&sock->accepting));
|
||||
REQUIRE(sock->server);
|
||||
|
||||
/*
|
||||
|
|
@ -100,7 +100,7 @@ failed_accept_cb(isc_nmsocket_t *sock, isc_result_t eresult) {
|
|||
|
||||
isc__nmsocket_detach(&sock->server);
|
||||
|
||||
sock->accepting = false;
|
||||
atomic_store(&sock->accepting, false);
|
||||
|
||||
switch (eresult) {
|
||||
case ISC_R_NOTCONNECTED:
|
||||
|
|
@ -250,7 +250,11 @@ tcp_connect_cb(uv_connect_t *uvreq, int status) {
|
|||
isc__nm_uvreq_put(&req, sock);
|
||||
return;
|
||||
} else if (isc__nmsocket_closing(sock)) {
|
||||
/* Socket was closed midflight by isc__nm_tcp_shutdown() */
|
||||
/* Network manager shutting down */
|
||||
result = ISC_R_SHUTTINGDOWN;
|
||||
goto error;
|
||||
} else if (isc__nmsocket_closing(sock)) {
|
||||
/* Connection canceled */
|
||||
result = ISC_R_CANCELED;
|
||||
goto error;
|
||||
} else if (status == UV_ETIMEDOUT) {
|
||||
|
|
@ -732,8 +736,6 @@ isc__nm_tcp_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
|
|||
|
||||
REQUIRE(sock->type == isc_nm_tcpsocket);
|
||||
REQUIRE(sock->statichandle == handle);
|
||||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
REQUIRE(!sock->recv_read);
|
||||
|
||||
sock->recv_cb = cb;
|
||||
sock->recv_cbarg = cbarg;
|
||||
|
|
@ -770,7 +772,7 @@ isc__nm_async_tcpstartread(isc__networker_t *worker, isc__netievent_t *ev0) {
|
|||
UNUSED(worker);
|
||||
|
||||
if (isc__nmsocket_closing(sock)) {
|
||||
sock->reading = true;
|
||||
atomic_store(&sock->reading, true);
|
||||
isc__nm_tcp_failed_read_cb(sock, ISC_R_CANCELED);
|
||||
return;
|
||||
}
|
||||
|
|
@ -833,7 +835,7 @@ isc__nm_tcp_resumeread(isc_nmhandle_t *handle) {
|
|||
}
|
||||
|
||||
if (!isc__nmsocket_active(sock)) {
|
||||
sock->reading = true;
|
||||
atomic_store(&sock->reading, true);
|
||||
isc__nm_tcp_failed_read_cb(sock, ISC_R_CANCELED);
|
||||
return;
|
||||
}
|
||||
|
|
@ -856,7 +858,7 @@ isc__nm_tcp_read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) {
|
|||
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
REQUIRE(sock->reading);
|
||||
REQUIRE(atomic_load(&sock->reading));
|
||||
REQUIRE(buf != NULL);
|
||||
|
||||
if (isc__nmsocket_closing(sock)) {
|
||||
|
|
@ -895,7 +897,7 @@ isc__nm_tcp_read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) {
|
|||
isc__nm_readcb(sock, req, ISC_R_SUCCESS);
|
||||
|
||||
/* The readcb could have paused the reading */
|
||||
if (sock->reading) {
|
||||
if (atomic_load(&sock->reading)) {
|
||||
/* The timer will be updated */
|
||||
isc__nmsocket_timer_restart(sock);
|
||||
}
|
||||
|
|
@ -973,7 +975,7 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
|
|||
csock->recv_cb = ssock->recv_cb;
|
||||
csock->recv_cbarg = ssock->recv_cbarg;
|
||||
csock->quota = quota;
|
||||
csock->accepting = true;
|
||||
atomic_init(&csock->accepting, true);
|
||||
|
||||
worker = &csock->mgr->workers[isc_nm_tid()];
|
||||
|
||||
|
|
@ -1024,7 +1026,7 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
|
|||
goto failure;
|
||||
}
|
||||
|
||||
csock->accepting = false;
|
||||
atomic_store(&csock->accepting, false);
|
||||
|
||||
isc__nm_incstats(csock->mgr, csock->statsindex[STATID_ACCEPT]);
|
||||
|
||||
|
|
@ -1354,7 +1356,7 @@ isc__nm_tcp_shutdown(isc_nmsocket_t *sock) {
|
|||
return;
|
||||
}
|
||||
|
||||
if (sock->accepting) {
|
||||
if (atomic_load(&sock->accepting)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1366,7 +1368,11 @@ isc__nm_tcp_shutdown(isc_nmsocket_t *sock) {
|
|||
}
|
||||
|
||||
if (sock->statichandle != NULL) {
|
||||
isc__nm_tcp_failed_read_cb(sock, ISC_R_CANCELED);
|
||||
if (isc__nm_closing(sock)) {
|
||||
isc__nm_failed_read_cb(sock, ISC_R_SHUTTINGDOWN, false);
|
||||
} else {
|
||||
isc__nm_failed_read_cb(sock, ISC_R_CANCELED, false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ tcpdns_connect_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) {
|
|||
RUNTIME_CHECK(r == 0);
|
||||
|
||||
if (isc__nm_closing(sock)) {
|
||||
result = ISC_R_CANCELED;
|
||||
result = ISC_R_SHUTTINGDOWN;
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
|
@ -217,7 +217,11 @@ tcpdns_connect_cb(uv_connect_t *uvreq, int status) {
|
|||
REQUIRE(VALID_NMHANDLE(req->handle));
|
||||
|
||||
if (isc__nmsocket_closing(sock)) {
|
||||
/* Socket was closed midflight by isc__nm_tcpdns_shutdown() */
|
||||
/* Network manager shutting down */
|
||||
result = ISC_R_SHUTTINGDOWN;
|
||||
goto error;
|
||||
} else if (isc__nmsocket_closing(sock)) {
|
||||
/* Connection canceled */
|
||||
result = ISC_R_CANCELED;
|
||||
goto error;
|
||||
} else if (status == UV_ETIMEDOUT) {
|
||||
|
|
@ -690,8 +694,6 @@ isc__nm_tcpdns_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
|
|||
|
||||
REQUIRE(sock->type == isc_nm_tcpdnssocket);
|
||||
REQUIRE(sock->statichandle == handle);
|
||||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
REQUIRE(!sock->recv_read);
|
||||
|
||||
sock->recv_cb = cb;
|
||||
sock->recv_cbarg = cbarg;
|
||||
|
|
@ -729,7 +731,7 @@ isc__nm_async_tcpdnsread(isc__networker_t *worker, isc__netievent_t *ev0) {
|
|||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
|
||||
if (isc__nmsocket_closing(sock)) {
|
||||
sock->reading = true;
|
||||
atomic_store(&sock->reading, true);
|
||||
isc__nm_failed_read_cb(sock, ISC_R_CANCELED, false);
|
||||
return;
|
||||
}
|
||||
|
|
@ -780,8 +782,8 @@ isc__nm_tcpdns_processbuffer(isc_nmsocket_t *sock) {
|
|||
REQUIRE(VALID_UVREQ(req));
|
||||
|
||||
/*
|
||||
* We need to launch the resume_processing after the buffer has
|
||||
* been consumed, thus we need to delay the detaching the handle.
|
||||
* We need to launch isc__nm_resume_processing() after the buffer
|
||||
* has been consumed, thus we must delay detaching the handle.
|
||||
*/
|
||||
isc_nmhandle_attach(req->handle, &handle);
|
||||
|
||||
|
|
@ -800,9 +802,10 @@ isc__nm_tcpdns_processbuffer(isc_nmsocket_t *sock) {
|
|||
sock->recv_read = false;
|
||||
|
||||
/*
|
||||
* The assertion failure here means that there's a errnoneous extra
|
||||
* nmhandle detach happening in the callback and resume_processing gets
|
||||
* called while we are still processing the buffer.
|
||||
* An assertion failure here means that there's an erroneous
|
||||
* extra nmhandle detach happening in the callback and
|
||||
* isc__nm_resume_processing() is called while we're
|
||||
* processing the buffer.
|
||||
*/
|
||||
REQUIRE(sock->processing == false);
|
||||
sock->processing = true;
|
||||
|
|
@ -829,7 +832,7 @@ isc__nm_tcpdns_read_cb(uv_stream_t *stream, ssize_t nread,
|
|||
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
REQUIRE(sock->reading);
|
||||
REQUIRE(atomic_load(&sock->reading));
|
||||
REQUIRE(buf != NULL);
|
||||
|
||||
if (isc__nmsocket_closing(sock)) {
|
||||
|
|
@ -949,7 +952,7 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
|
|||
csock->recv_cb = ssock->recv_cb;
|
||||
csock->recv_cbarg = ssock->recv_cbarg;
|
||||
csock->quota = quota;
|
||||
csock->accepting = true;
|
||||
atomic_init(&csock->accepting, true);
|
||||
|
||||
worker = &csock->mgr->workers[csock->tid];
|
||||
|
||||
|
|
@ -1007,7 +1010,7 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
|
|||
goto failure;
|
||||
}
|
||||
|
||||
csock->accepting = false;
|
||||
atomic_store(&csock->accepting, false);
|
||||
|
||||
isc__nm_incstats(csock->mgr, csock->statsindex[STATID_ACCEPT]);
|
||||
|
||||
|
|
@ -1056,13 +1059,15 @@ failure:
|
|||
void
|
||||
isc__nm_tcpdns_send(isc_nmhandle_t *handle, isc_region_t *region,
|
||||
isc_nm_cb_t cb, void *cbarg) {
|
||||
REQUIRE(VALID_NMHANDLE(handle));
|
||||
REQUIRE(VALID_NMSOCK(handle->sock));
|
||||
|
||||
isc_nmsocket_t *sock = handle->sock;
|
||||
isc__netievent_tcpdnssend_t *ievent = NULL;
|
||||
isc__nm_uvreq_t *uvreq = NULL;
|
||||
isc_nmsocket_t *sock = NULL;
|
||||
|
||||
REQUIRE(VALID_NMHANDLE(handle));
|
||||
|
||||
sock = handle->sock;
|
||||
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->type == isc_nm_tcpdnssocket);
|
||||
|
||||
uvreq = isc__nm_uvreq_get(sock->mgr, sock);
|
||||
|
|
@ -1107,24 +1112,26 @@ tcpdns_send_cb(uv_write_t *req, int status) {
|
|||
*/
|
||||
void
|
||||
isc__nm_async_tcpdnssend(isc__networker_t *worker, isc__netievent_t *ev0) {
|
||||
isc_result_t result;
|
||||
isc__netievent_tcpdnssend_t *ievent =
|
||||
(isc__netievent_tcpdnssend_t *)ev0;
|
||||
isc_nmsocket_t *sock = NULL;
|
||||
isc__nm_uvreq_t *uvreq = NULL;
|
||||
int r, nbufs = 2;
|
||||
|
||||
UNUSED(worker);
|
||||
|
||||
REQUIRE(VALID_UVREQ(ievent->req));
|
||||
REQUIRE(VALID_NMSOCK(ievent->sock));
|
||||
REQUIRE(ievent->sock->type == isc_nm_tcpdnssocket);
|
||||
REQUIRE(ievent->sock->tid == isc_nm_tid());
|
||||
|
||||
isc_result_t result;
|
||||
isc_nmsocket_t *sock = ievent->sock;
|
||||
isc__nm_uvreq_t *uvreq = ievent->req;
|
||||
sock = ievent->sock;
|
||||
uvreq = ievent->req;
|
||||
|
||||
uv_buf_t bufs[2] = { { .base = uvreq->tcplen, .len = 2 },
|
||||
{ .base = uvreq->uvbuf.base,
|
||||
.len = uvreq->uvbuf.len } };
|
||||
int nbufs = 2;
|
||||
int r;
|
||||
|
||||
UNUSED(worker);
|
||||
|
||||
if (isc__nmsocket_closing(sock)) {
|
||||
result = ISC_R_CANCELED;
|
||||
|
|
@ -1380,7 +1387,7 @@ isc__nm_tcpdns_shutdown(isc_nmsocket_t *sock) {
|
|||
return;
|
||||
}
|
||||
|
||||
if (sock->accepting) {
|
||||
if (atomic_load(&sock->accepting)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1392,7 +1399,11 @@ isc__nm_tcpdns_shutdown(isc_nmsocket_t *sock) {
|
|||
}
|
||||
|
||||
if (sock->statichandle != NULL) {
|
||||
isc__nm_failed_read_cb(sock, ISC_R_CANCELED, false);
|
||||
if (isc__nm_closing(sock)) {
|
||||
isc__nm_failed_read_cb(sock, ISC_R_SHUTTINGDOWN, false);
|
||||
} else {
|
||||
isc__nm_failed_read_cb(sock, ISC_R_CANCELED, false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ tlsdns_connect_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) {
|
|||
uv_handle_set_data((uv_handle_t *)&sock->timer, sock);
|
||||
|
||||
if (isc__nm_closing(sock)) {
|
||||
result = ISC_R_CANCELED;
|
||||
result = ISC_R_SHUTTINGDOWN;
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
|
@ -233,7 +233,11 @@ tlsdns_connect_cb(uv_connect_t *uvreq, int status) {
|
|||
REQUIRE(VALID_NMHANDLE(req->handle));
|
||||
|
||||
if (isc__nmsocket_closing(sock)) {
|
||||
/* Socket was closed midflight by isc__nm_tlsdns_shutdown() */
|
||||
/* Network manager shutting down */
|
||||
result = ISC_R_SHUTTINGDOWN;
|
||||
goto error;
|
||||
} else if (isc__nmsocket_closing(sock)) {
|
||||
/* Connection canceled */
|
||||
result = ISC_R_CANCELED;
|
||||
goto error;
|
||||
} else if (status == UV_ETIMEDOUT) {
|
||||
|
|
@ -344,6 +348,7 @@ isc_nm_tlsdnsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
|
|||
}
|
||||
|
||||
if (isc__nm_closing(sock)) {
|
||||
result = ISC_R_SHUTTINGDOWN;
|
||||
goto failure;
|
||||
}
|
||||
|
||||
|
|
@ -373,6 +378,7 @@ isc_nm_tlsdnsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
|
|||
BROADCAST(&sock->scond);
|
||||
UNLOCK(&sock->lock);
|
||||
return;
|
||||
|
||||
failure:
|
||||
if (isc__nm_in_netthread()) {
|
||||
sock->tid = isc_nm_tid();
|
||||
|
|
@ -843,8 +849,6 @@ isc__nm_tlsdns_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
|
|||
|
||||
REQUIRE(sock->type == isc_nm_tlsdnssocket);
|
||||
REQUIRE(sock->statichandle == handle);
|
||||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
REQUIRE(!sock->recv_read);
|
||||
|
||||
sock->recv_cb = cb;
|
||||
sock->recv_cbarg = cbarg;
|
||||
|
|
@ -884,7 +888,7 @@ isc__nm_async_tlsdnsread(isc__networker_t *worker, isc__netievent_t *ev0) {
|
|||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
|
||||
if (isc__nmsocket_closing(sock)) {
|
||||
sock->reading = true;
|
||||
atomic_store(&sock->reading, true);
|
||||
isc__nm_failed_read_cb(sock, ISC_R_CANCELED, false);
|
||||
return;
|
||||
}
|
||||
|
|
@ -938,9 +942,8 @@ isc__nm_tlsdns_processbuffer(isc_nmsocket_t *sock) {
|
|||
REQUIRE(VALID_UVREQ(req));
|
||||
|
||||
/*
|
||||
* We need to launch the resume_processing after the buffer has
|
||||
* been consumed, thus we need to delay the detaching the
|
||||
* handle.
|
||||
* We need to launch isc__nm_resume_processing() after the buffer
|
||||
* has been consumed, thus we must delay detaching the handle.
|
||||
*/
|
||||
isc_nmhandle_attach(req->handle, &handle);
|
||||
|
||||
|
|
@ -959,10 +962,10 @@ isc__nm_tlsdns_processbuffer(isc_nmsocket_t *sock) {
|
|||
sock->recv_read = false;
|
||||
|
||||
/*
|
||||
* The assertion failure here means that there's a errnoneous
|
||||
* An assertion failure here means that there's an erroneous
|
||||
* extra nmhandle detach happening in the callback and
|
||||
* resume_processing gets called while we are still processing
|
||||
* the buffer.
|
||||
* isc__nm_resume_processing() is called while we're
|
||||
* processing the buffer.
|
||||
*/
|
||||
REQUIRE(sock->processing == false);
|
||||
sock->processing = true;
|
||||
|
|
@ -1278,6 +1281,8 @@ done:
|
|||
|
||||
static void
|
||||
async_tlsdns_cycle(isc_nmsocket_t *sock) {
|
||||
isc__netievent_tlsdnscycle_t *ievent = NULL;
|
||||
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
|
||||
/* Socket was closed midflight by isc__nm_tlsdns_shutdown() */
|
||||
|
|
@ -1285,8 +1290,7 @@ async_tlsdns_cycle(isc_nmsocket_t *sock) {
|
|||
return;
|
||||
}
|
||||
|
||||
isc__netievent_tlsdnscycle_t *ievent =
|
||||
isc__nm_get_netievent_tlsdnscycle(sock->mgr, sock);
|
||||
ievent = isc__nm_get_netievent_tlsdnscycle(sock->mgr, sock);
|
||||
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
|
||||
(isc__netievent_t *)ievent);
|
||||
}
|
||||
|
|
@ -1321,7 +1325,7 @@ isc__nm_tlsdns_read_cb(uv_stream_t *stream, ssize_t nread,
|
|||
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
REQUIRE(sock->reading);
|
||||
REQUIRE(atomic_load(&sock->reading));
|
||||
REQUIRE(buf != NULL);
|
||||
|
||||
if (isc__nmsocket_closing(sock)) {
|
||||
|
|
@ -1441,7 +1445,7 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
|
|||
csock->recv_cb = ssock->recv_cb;
|
||||
csock->recv_cbarg = ssock->recv_cbarg;
|
||||
csock->quota = quota;
|
||||
csock->accepting = true;
|
||||
atomic_init(&csock->accepting, true);
|
||||
|
||||
worker = &csock->mgr->workers[csock->tid];
|
||||
|
||||
|
|
@ -1530,7 +1534,7 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
|
|||
|
||||
/* FIXME: Set SSL_MODE_RELEASE_BUFFERS */
|
||||
|
||||
csock->accepting = false;
|
||||
atomic_store(&csock->accepting, false);
|
||||
|
||||
isc__nm_incstats(csock->mgr, csock->statsindex[STATID_ACCEPT]);
|
||||
|
||||
|
|
@ -1579,13 +1583,15 @@ failure:
|
|||
void
|
||||
isc__nm_tlsdns_send(isc_nmhandle_t *handle, isc_region_t *region,
|
||||
isc_nm_cb_t cb, void *cbarg) {
|
||||
REQUIRE(VALID_NMHANDLE(handle));
|
||||
REQUIRE(VALID_NMSOCK(handle->sock));
|
||||
|
||||
isc_nmsocket_t *sock = handle->sock;
|
||||
isc__netievent_tlsdnssend_t *ievent = NULL;
|
||||
isc__nm_uvreq_t *uvreq = NULL;
|
||||
isc_nmsocket_t *sock = NULL;
|
||||
|
||||
REQUIRE(VALID_NMHANDLE(handle));
|
||||
|
||||
sock = handle->sock;
|
||||
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->type == isc_nm_tlsdnssocket);
|
||||
|
||||
uvreq = isc__nm_uvreq_get(sock->mgr, sock);
|
||||
|
|
@ -1936,12 +1942,14 @@ isc__nm_tlsdns_shutdown(isc_nmsocket_t *sock) {
|
|||
(void)SSL_shutdown(sock->tls.tls);
|
||||
}
|
||||
|
||||
if (sock->accepting) {
|
||||
if (atomic_load(&sock->accepting)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* TLS handshake hasn't been completed yet */
|
||||
if (atomic_load(&sock->connecting)) {
|
||||
isc_nmsocket_t *tsock = NULL;
|
||||
|
||||
/*
|
||||
* TCP connection has been established, now waiting on
|
||||
* TLS handshake to complete
|
||||
|
|
@ -1956,14 +1964,17 @@ isc__nm_tlsdns_shutdown(isc_nmsocket_t *sock) {
|
|||
}
|
||||
|
||||
/* The TCP connection hasn't been established yet */
|
||||
isc_nmsocket_t *tsock = NULL;
|
||||
isc__nmsocket_attach(sock, &tsock);
|
||||
uv_close(&sock->uv_handle.handle, tlsdns_close_connect_cb);
|
||||
return;
|
||||
}
|
||||
|
||||
if (sock->statichandle != NULL) {
|
||||
isc__nm_failed_read_cb(sock, ISC_R_CANCELED, false);
|
||||
if (isc__nm_closing(sock)) {
|
||||
isc__nm_failed_read_cb(sock, ISC_R_SHUTTINGDOWN, false);
|
||||
} else {
|
||||
isc__nm_failed_read_cb(sock, ISC_R_CANCELED, false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ inactive(isc_nmsocket_t *sock) {
|
|||
atomic_load(&sock->outerhandle->sock->closing) ||
|
||||
(sock->listener != NULL &&
|
||||
!isc__nmsocket_active(sock->listener)) ||
|
||||
atomic_load(&sock->mgr->closing));
|
||||
isc__nm_closing(sock));
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -913,7 +913,7 @@ tcp_connected(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
|
|||
tlssock->iface = handle->sock->iface;
|
||||
tlssock->peer = handle->sock->peer;
|
||||
if (isc__nm_closing(tlssock)) {
|
||||
result = ISC_R_CANCELED;
|
||||
result = ISC_R_SHUTTINGDOWN;
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ start_udp_child(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nmsocket_t *sock,
|
|||
isc__nmsocket_init(csock, mgr, isc_nm_udpsocket, iface);
|
||||
csock->parent = sock;
|
||||
csock->iface = sock->iface;
|
||||
csock->reading = true;
|
||||
atomic_init(&csock->reading, true);
|
||||
csock->recv_cb = sock->recv_cb;
|
||||
csock->recv_cbarg = sock->recv_cbarg;
|
||||
csock->extrahandlesize = sock->extrahandlesize;
|
||||
|
|
@ -344,7 +344,7 @@ udp_recv_cb(uv_udp_t *handle, ssize_t nrecv, const uv_buf_t *buf,
|
|||
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
REQUIRE(sock->reading);
|
||||
REQUIRE(atomic_load(&sock->reading));
|
||||
|
||||
#ifdef UV_UDP_MMSG_FREE
|
||||
free_buf = ((flags & UV_UDP_MMSG_FREE) == UV_UDP_MMSG_FREE);
|
||||
|
|
@ -356,7 +356,7 @@ udp_recv_cb(uv_udp_t *handle, ssize_t nrecv, const uv_buf_t *buf,
|
|||
#endif
|
||||
|
||||
/*
|
||||
* Three possible reasons to return now without processing:
|
||||
* Four possible reasons to return now without processing:
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
@ -373,6 +373,15 @@ udp_recv_cb(uv_udp_t *handle, ssize_t nrecv, const uv_buf_t *buf,
|
|||
goto free;
|
||||
}
|
||||
|
||||
/*
|
||||
* - If there was a networking error.
|
||||
*/
|
||||
if (nrecv < 0) {
|
||||
isc__nm_failed_read_cb(sock, isc__nm_uverr2result(nrecv),
|
||||
false);
|
||||
goto free;
|
||||
}
|
||||
|
||||
/*
|
||||
* - If addr == NULL, in which case it's the end of stream;
|
||||
* we can free the buffer and bail.
|
||||
|
|
@ -390,12 +399,6 @@ udp_recv_cb(uv_udp_t *handle, ssize_t nrecv, const uv_buf_t *buf,
|
|||
goto free;
|
||||
}
|
||||
|
||||
if (nrecv < 0) {
|
||||
isc__nm_failed_read_cb(sock, isc__nm_uverr2result(nrecv),
|
||||
false);
|
||||
goto free;
|
||||
}
|
||||
|
||||
result = isc_sockaddr_fromsockaddr(&sockaddr, addr);
|
||||
RUNTIME_CHECK(result == ISC_R_SUCCESS);
|
||||
|
||||
|
|
@ -612,6 +615,11 @@ udp_connect_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) {
|
|||
RUNTIME_CHECK(r == 0);
|
||||
uv_handle_set_data((uv_handle_t *)&sock->timer, sock);
|
||||
|
||||
if (isc__nm_closing(sock)) {
|
||||
result = ISC_R_SHUTTINGDOWN;
|
||||
goto error;
|
||||
}
|
||||
|
||||
r = uv_udp_open(&sock->uv_handle.udp, sock->fd);
|
||||
if (r != 0) {
|
||||
isc__nm_incstats(sock->mgr, sock->statsindex[STATID_OPENFAIL]);
|
||||
|
|
@ -653,6 +661,7 @@ udp_connect_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) {
|
|||
|
||||
done:
|
||||
result = isc__nm_uverr2result(r);
|
||||
error:
|
||||
|
||||
LOCK(&sock->lock);
|
||||
sock->result = result;
|
||||
|
|
@ -800,6 +809,7 @@ isc__nm_udp_read_cb(uv_udp_t *handle, ssize_t nrecv, const uv_buf_t *buf,
|
|||
* does not.
|
||||
*/
|
||||
if (!sock->parent) {
|
||||
isc__nmsocket_timer_stop(sock);
|
||||
isc__nm_stop_reading(sock);
|
||||
}
|
||||
}
|
||||
|
|
@ -856,15 +866,22 @@ void
|
|||
isc__nm_async_udpread(isc__networker_t *worker, isc__netievent_t *ev0) {
|
||||
isc__netievent_udpread_t *ievent = (isc__netievent_udpread_t *)ev0;
|
||||
isc_nmsocket_t *sock = ievent->sock;
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
|
||||
UNUSED(worker);
|
||||
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
|
||||
if (isc__nmsocket_closing(sock)) {
|
||||
sock->reading = true;
|
||||
isc__nm_failed_read_cb(sock, ISC_R_CANCELED, false);
|
||||
if (isc__nm_closing(sock)) {
|
||||
result = ISC_R_SHUTTINGDOWN;
|
||||
} else if (isc__nmsocket_closing(sock)) {
|
||||
result = ISC_R_CANCELED;
|
||||
}
|
||||
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
atomic_store(&sock->reading, true);
|
||||
isc__nm_failed_read_cb(sock, result, false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -881,14 +898,13 @@ isc__nm_udp_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
|
|||
|
||||
REQUIRE(sock->type == isc_nm_udpsocket);
|
||||
REQUIRE(sock->statichandle == handle);
|
||||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
REQUIRE(!sock->recv_read);
|
||||
|
||||
sock->recv_cb = cb;
|
||||
sock->recv_cbarg = cbarg;
|
||||
sock->recv_read = true;
|
||||
|
||||
if (!sock->reading && sock->tid == isc_nm_tid()) {
|
||||
if (!atomic_load(&sock->reading) && sock->tid == isc_nm_tid()) {
|
||||
isc__netievent_udpread_t ievent = { .sock = sock };
|
||||
isc__nm_async_udpread(NULL, (isc__netievent_t *)&ievent);
|
||||
} else {
|
||||
|
|
@ -1079,7 +1095,11 @@ isc__nm_udp_shutdown(isc_nmsocket_t *sock) {
|
|||
* interested in the callback.
|
||||
*/
|
||||
if (sock->statichandle != NULL) {
|
||||
isc__nm_failed_read_cb(sock, ISC_R_CANCELED, false);
|
||||
if (isc__nm_closing(sock)) {
|
||||
isc__nm_failed_read_cb(sock, ISC_R_SHUTTINGDOWN, false);
|
||||
} else {
|
||||
isc__nm_failed_read_cb(sock, ISC_R_CANCELED, false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
142
lib/isc/socket.c
142
lib/isc/socket.c
|
|
@ -350,8 +350,8 @@ struct isc_socket {
|
|||
unsigned int listener : 1, /* listener socket */
|
||||
connected : 1, connecting : 1, /* connect pending
|
||||
* */
|
||||
bound : 1, /* bound to local addr */
|
||||
dupped : 1, active : 1, /* currently active */
|
||||
bound : 1, /* bound to local addr */
|
||||
active : 1, /* currently active */
|
||||
pktdscp : 1; /* per packet dscp */
|
||||
|
||||
#ifdef ISC_PLATFORM_RECVOVERFLOW
|
||||
|
|
@ -434,7 +434,7 @@ struct isc__socketthread {
|
|||
|
||||
static isc_result_t
|
||||
socket_create(isc_socketmgr_t *manager0, int pf, isc_sockettype_t type,
|
||||
isc_socket_t **socketp, isc_socket_t *dup_socket);
|
||||
isc_socket_t **socketp);
|
||||
static void
|
||||
send_recvdone_event(isc_socket_t *, isc_socketevent_t **);
|
||||
static void
|
||||
|
|
@ -1881,7 +1881,6 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
|
|||
sock->fd = -1;
|
||||
sock->threadid = -1;
|
||||
sock->dscp = 0; /* TOS/TCLASS is zero until set. */
|
||||
sock->dupped = 0;
|
||||
sock->statsindex = NULL;
|
||||
sock->active = 0;
|
||||
|
||||
|
|
@ -2123,8 +2122,7 @@ set_ip_disable_pmtud(isc_socket_t *sock) {
|
|||
}
|
||||
|
||||
static isc_result_t
|
||||
opensocket(isc_socketmgr_t *manager, isc_socket_t *sock,
|
||||
isc_socket_t *dup_socket) {
|
||||
opensocket(isc_socketmgr_t *manager, isc_socket_t *sock) {
|
||||
isc_result_t result;
|
||||
char strbuf[ISC_STRERRORSIZE];
|
||||
const char *err = "socket";
|
||||
|
|
@ -2138,60 +2136,52 @@ opensocket(isc_socketmgr_t *manager, isc_socket_t *sock,
|
|||
#endif
|
||||
|
||||
again:
|
||||
if (dup_socket == NULL) {
|
||||
switch (sock->type) {
|
||||
case isc_sockettype_udp:
|
||||
sock->fd = socket(sock->pf, SOCK_DGRAM, IPPROTO_UDP);
|
||||
break;
|
||||
case isc_sockettype_tcp:
|
||||
sock->fd = socket(sock->pf, SOCK_STREAM, IPPROTO_TCP);
|
||||
break;
|
||||
case isc_sockettype_unix:
|
||||
sock->fd = socket(sock->pf, SOCK_STREAM, 0);
|
||||
break;
|
||||
case isc_sockettype_raw:
|
||||
errno = EPFNOSUPPORT;
|
||||
/*
|
||||
* PF_ROUTE is a alias for PF_NETLINK on linux.
|
||||
*/
|
||||
switch (sock->type) {
|
||||
case isc_sockettype_udp:
|
||||
sock->fd = socket(sock->pf, SOCK_DGRAM, IPPROTO_UDP);
|
||||
break;
|
||||
case isc_sockettype_tcp:
|
||||
sock->fd = socket(sock->pf, SOCK_STREAM, IPPROTO_TCP);
|
||||
break;
|
||||
case isc_sockettype_unix:
|
||||
sock->fd = socket(sock->pf, SOCK_STREAM, 0);
|
||||
break;
|
||||
case isc_sockettype_raw:
|
||||
errno = EPFNOSUPPORT;
|
||||
/*
|
||||
* PF_ROUTE is a alias for PF_NETLINK on linux.
|
||||
*/
|
||||
#if defined(PF_ROUTE)
|
||||
if (sock->fd == -1 && sock->pf == PF_ROUTE) {
|
||||
if (sock->fd == -1 && sock->pf == PF_ROUTE) {
|
||||
#ifdef NETLINK_ROUTE
|
||||
sock->fd = socket(sock->pf, SOCK_RAW,
|
||||
NETLINK_ROUTE);
|
||||
sock->fd = socket(sock->pf, SOCK_RAW, NETLINK_ROUTE);
|
||||
#else /* ifdef NETLINK_ROUTE */
|
||||
sock->fd = socket(sock->pf, SOCK_RAW, 0);
|
||||
sock->fd = socket(sock->pf, SOCK_RAW, 0);
|
||||
#endif /* ifdef NETLINK_ROUTE */
|
||||
if (sock->fd != -1) {
|
||||
if (sock->fd != -1) {
|
||||
#ifdef NETLINK_ROUTE
|
||||
struct sockaddr_nl sa;
|
||||
int n;
|
||||
struct sockaddr_nl sa;
|
||||
int n;
|
||||
|
||||
/*
|
||||
* Do an implicit bind.
|
||||
*/
|
||||
memset(&sa, 0, sizeof(sa));
|
||||
sa.nl_family = AF_NETLINK;
|
||||
sa.nl_groups = RTMGRP_IPV4_IFADDR |
|
||||
RTMGRP_IPV6_IFADDR;
|
||||
n = bind(sock->fd,
|
||||
(struct sockaddr *)&sa,
|
||||
sizeof(sa));
|
||||
if (n < 0) {
|
||||
close(sock->fd);
|
||||
sock->fd = -1;
|
||||
}
|
||||
#endif /* ifdef NETLINK_ROUTE */
|
||||
sock->bound = 1;
|
||||
/*
|
||||
* Do an implicit bind.
|
||||
*/
|
||||
memset(&sa, 0, sizeof(sa));
|
||||
sa.nl_family = AF_NETLINK;
|
||||
sa.nl_groups = RTMGRP_IPV4_IFADDR |
|
||||
RTMGRP_IPV6_IFADDR;
|
||||
n = bind(sock->fd, (struct sockaddr *)&sa,
|
||||
sizeof(sa));
|
||||
if (n < 0) {
|
||||
close(sock->fd);
|
||||
sock->fd = -1;
|
||||
}
|
||||
#endif /* ifdef NETLINK_ROUTE */
|
||||
sock->bound = 1;
|
||||
}
|
||||
#endif /* if defined(PF_ROUTE) */
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
sock->fd = dup(dup_socket->fd);
|
||||
sock->dupped = 1;
|
||||
sock->bound = dup_socket->bound;
|
||||
#endif /* if defined(PF_ROUTE) */
|
||||
break;
|
||||
}
|
||||
if (sock->fd == -1 && errno == EINTR && tries++ < 42) {
|
||||
goto again;
|
||||
|
|
@ -2268,10 +2258,6 @@ again:
|
|||
}
|
||||
}
|
||||
|
||||
if (dup_socket != NULL) {
|
||||
goto setup_done;
|
||||
}
|
||||
|
||||
result = make_nonblock(sock->fd);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
(void)close(sock->fd);
|
||||
|
|
@ -2410,7 +2396,6 @@ again:
|
|||
|
||||
set_ip_disable_pmtud(sock);
|
||||
|
||||
setup_done:
|
||||
inc_stats(manager->stats, sock->statsindex[STATID_OPEN]);
|
||||
if (sock->active == 0) {
|
||||
inc_stats(manager->stats, sock->statsindex[STATID_ACTIVE]);
|
||||
|
|
@ -2421,14 +2406,13 @@ setup_done:
|
|||
}
|
||||
|
||||
/*
|
||||
* Create a 'type' socket or duplicate an existing socket, managed
|
||||
* by 'manager'. Events will be posted to 'task' and when dispatched
|
||||
* 'action' will be called with 'arg' as the arg value. The new
|
||||
* socket is returned in 'socketp'.
|
||||
* Create a 'type' socket, managed by 'manager'. Events will be posted to
|
||||
* 'task' and when dispatched 'action' will be called with 'arg' as the arg
|
||||
* value. The new socket is returned in 'socketp'.
|
||||
*/
|
||||
static isc_result_t
|
||||
socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
|
||||
isc_socket_t **socketp, isc_socket_t *dup_socket) {
|
||||
isc_socket_t **socketp) {
|
||||
isc_socket_t *sock = NULL;
|
||||
isc__socketthread_t *thread;
|
||||
isc_result_t result;
|
||||
|
|
@ -2466,7 +2450,7 @@ socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
|
|||
|
||||
sock->pf = pf;
|
||||
|
||||
result = opensocket(manager, sock, dup_socket);
|
||||
result = opensocket(manager, sock);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
free_socket(&sock);
|
||||
return (result);
|
||||
|
|
@ -2507,8 +2491,7 @@ socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
|
|||
#endif /* ifdef USE_SELECT */
|
||||
UNLOCK(&manager->lock);
|
||||
|
||||
socket_log(sock, NULL, CREATION,
|
||||
dup_socket != NULL ? "dupped" : "created");
|
||||
socket_log(sock, NULL, CREATION, "created");
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
|
@ -2520,22 +2503,9 @@ socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
|
|||
* in 'socketp'.
|
||||
*/
|
||||
isc_result_t
|
||||
isc_socket_create(isc_socketmgr_t *manager0, int pf, isc_sockettype_t type,
|
||||
isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
|
||||
isc_socket_t **socketp) {
|
||||
return (socket_create(manager0, pf, type, socketp, NULL));
|
||||
}
|
||||
|
||||
/*%
|
||||
* Duplicate an existing socket. The new socket is returned
|
||||
* in 'socketp'.
|
||||
*/
|
||||
isc_result_t
|
||||
isc_socket_dup(isc_socket_t *sock, isc_socket_t **socketp) {
|
||||
REQUIRE(VALID_SOCKET(sock));
|
||||
REQUIRE(socketp != NULL && *socketp == NULL);
|
||||
|
||||
return (socket_create(sock->manager, sock->pf, sock->type, socketp,
|
||||
sock));
|
||||
return (socket_create(manager, pf, type, socketp));
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
|
|
@ -2551,7 +2521,7 @@ isc_socket_open(isc_socket_t *sock) {
|
|||
REQUIRE(sock->fd == -1);
|
||||
REQUIRE(sock->threadid == -1);
|
||||
|
||||
result = opensocket(sock->manager, sock, NULL);
|
||||
result = opensocket(sock->manager, sock);
|
||||
|
||||
UNLOCK(&sock->lock);
|
||||
|
||||
|
|
@ -2623,7 +2593,7 @@ isc_socket_close(isc_socket_t *sock) {
|
|||
int fd;
|
||||
isc_socketmgr_t *manager;
|
||||
isc__socketthread_t *thread;
|
||||
fflush(stdout);
|
||||
|
||||
REQUIRE(VALID_SOCKET(sock));
|
||||
|
||||
LOCK(&sock->lock);
|
||||
|
|
@ -2642,7 +2612,6 @@ isc_socket_close(isc_socket_t *sock) {
|
|||
sock->fd = -1;
|
||||
sock->threadid = -1;
|
||||
|
||||
sock->dupped = 0;
|
||||
memset(sock->name, 0, sizeof(sock->name));
|
||||
sock->tag = NULL;
|
||||
sock->listener = 0;
|
||||
|
|
@ -4334,7 +4303,6 @@ isc_socket_bind(isc_socket_t *sock, const isc_sockaddr_t *sockaddr,
|
|||
LOCK(&sock->lock);
|
||||
|
||||
INSIST(!sock->bound);
|
||||
INSIST(!sock->dupped);
|
||||
|
||||
if (sock->pf != sockaddr->type.sa.sa_family) {
|
||||
UNLOCK(&sock->lock);
|
||||
|
|
@ -5078,7 +5046,6 @@ isc_socket_ipv6only(isc_socket_t *sock, bool yes) {
|
|||
#endif /* if defined(IPV6_V6ONLY) */
|
||||
|
||||
REQUIRE(VALID_SOCKET(sock));
|
||||
INSIST(!sock->dupped);
|
||||
|
||||
#ifdef IPV6_V6ONLY
|
||||
if (sock->pf == AF_INET6) {
|
||||
|
|
@ -5151,10 +5118,6 @@ isc_socket_dscp(isc_socket_t *sock, isc_dscp_t dscp) {
|
|||
}
|
||||
#endif /* if !defined(IP_TOS) && !defined(IPV6_TCLASS) */
|
||||
|
||||
#ifdef notyet
|
||||
REQUIRE(!sock->dupped);
|
||||
#endif /* ifdef notyet */
|
||||
|
||||
setdscp(sock, dscp);
|
||||
}
|
||||
|
||||
|
|
@ -5200,8 +5163,7 @@ static void
|
|||
init_hasreuseport(void) {
|
||||
/*
|
||||
* SO_REUSEPORT works very differently on *BSD and on Linux (because why not).
|
||||
* We only want to use it on Linux, if it's available. On BSD we want to dup()
|
||||
* sockets instead of re-binding them.
|
||||
* We only want to use it on Linux, if it's available.
|
||||
*/
|
||||
#if (defined(SO_REUSEPORT) && defined(__linux__)) || \
|
||||
(defined(SO_REUSEPORT_LB) && defined(__FreeBSD_kernel__))
|
||||
|
|
|
|||
|
|
@ -218,89 +218,6 @@ udp_sendto_test(void **state) {
|
|||
assert_string_equal(recvbuf, "Hello");
|
||||
}
|
||||
|
||||
/* Test UDP sendto/recv with duplicated socket */
|
||||
static void
|
||||
udp_dup_test(void **state) {
|
||||
isc_result_t result;
|
||||
isc_sockaddr_t addr1, addr2;
|
||||
struct in_addr in;
|
||||
char sendbuf[BUFSIZ], recvbuf[BUFSIZ];
|
||||
completion_t completion;
|
||||
isc_region_t r;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
in.s_addr = inet_addr("127.0.0.1");
|
||||
isc_sockaddr_fromin(&addr1, &in, 0);
|
||||
isc_sockaddr_fromin(&addr2, &in, 0);
|
||||
|
||||
result = isc_socket_create(socketmgr, PF_INET, isc_sockettype_udp, &s1);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
result = isc_socket_bind(s1, &addr1, 0);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
result = isc_socket_getsockname(s1, &addr1);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
assert_true(isc_sockaddr_getport(&addr1) != 0);
|
||||
|
||||
result = isc_socket_create(socketmgr, PF_INET, isc_sockettype_udp, &s2);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
result = isc_socket_bind(s2, &addr2, 0);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
result = isc_socket_getsockname(s2, &addr2);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
assert_true(isc_sockaddr_getport(&addr2) != 0);
|
||||
|
||||
result = isc_socket_dup(s2, &s3);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
result = isc_task_create(taskmgr, 0, &test_task);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf), "Hello");
|
||||
r.base = (void *)sendbuf;
|
||||
r.length = strlen(sendbuf) + 1;
|
||||
|
||||
completion_init(&completion);
|
||||
result = isc_socket_sendto(s1, &r, test_task, event_done, &completion,
|
||||
&addr2, NULL);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
waitfor(&completion);
|
||||
assert_true(atomic_load(&completion.done));
|
||||
assert_int_equal(completion.result, ISC_R_SUCCESS);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf), "World");
|
||||
r.base = (void *)sendbuf;
|
||||
r.length = strlen(sendbuf) + 1;
|
||||
|
||||
completion_init(&completion);
|
||||
result = isc_socket_sendto(s1, &r, test_task, event_done, &completion,
|
||||
&addr2, NULL);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
waitfor(&completion);
|
||||
assert_true(atomic_load(&completion.done));
|
||||
assert_int_equal(completion.result, ISC_R_SUCCESS);
|
||||
|
||||
r.base = (void *)recvbuf;
|
||||
r.length = BUFSIZ;
|
||||
completion_init(&completion);
|
||||
result = isc_socket_recv(s2, &r, 1, test_task, event_done, &completion);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
waitfor(&completion);
|
||||
assert_true(atomic_load(&completion.done));
|
||||
assert_int_equal(completion.result, ISC_R_SUCCESS);
|
||||
assert_string_equal(recvbuf, "Hello");
|
||||
|
||||
r.base = (void *)recvbuf;
|
||||
r.length = BUFSIZ;
|
||||
completion_init(&completion);
|
||||
result = isc_socket_recv(s3, &r, 1, test_task, event_done, &completion);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
waitfor(&completion);
|
||||
assert_true(atomic_load(&completion.done));
|
||||
assert_int_equal(completion.result, ISC_R_SUCCESS);
|
||||
assert_string_equal(recvbuf, "World");
|
||||
}
|
||||
|
||||
/* Test UDP sendto/recv (IPv4) */
|
||||
static void
|
||||
udp_dscp_v4_test(void **state) {
|
||||
|
|
@ -787,8 +704,6 @@ main(void) {
|
|||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test_setup_teardown(udp_sendto_test, _setup,
|
||||
_teardown),
|
||||
cmocka_unit_test_setup_teardown(udp_dup_test, _setup,
|
||||
_teardown),
|
||||
cmocka_unit_test_setup_teardown(tcp_dscp_v4_test, _setup,
|
||||
_teardown),
|
||||
cmocka_unit_test_setup_teardown(tcp_dscp_v6_test, _setup,
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#define NS_PER_S 1000000000 /*%< Nanoseconds per second. */
|
||||
#define NS_PER_US 1000 /*%< Nanoseconds per microsecond. */
|
||||
#define NS_PER_MS 1000000 /*%< Nanoseconds per millisecond. */
|
||||
#define MS_PER_S 1000 /*%< Milliseonds per second. */
|
||||
|
||||
#if defined(CLOCK_REALTIME)
|
||||
#define CLOCKSOURCE_HIRES CLOCK_REALTIME
|
||||
|
|
@ -77,6 +78,14 @@ isc_interval_iszero(const isc_interval_t *i) {
|
|||
return (false);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
isc_interval_ms(const isc_interval_t *i) {
|
||||
REQUIRE(i != NULL);
|
||||
INSIST(i->nanoseconds < NS_PER_S);
|
||||
|
||||
return ((i->seconds * MS_PER_S) + (i->nanoseconds / NS_PER_MS));
|
||||
}
|
||||
|
||||
/***
|
||||
*** Absolute Times
|
||||
***/
|
||||
|
|
|
|||
|
|
@ -2413,6 +2413,7 @@ ns_clientmgr_create(ns_server_t *sctx, isc_taskmgr_t *taskmgr,
|
|||
result = isc_task_create_bound(manager->taskmgr, 20, &manager->task,
|
||||
manager->tid);
|
||||
RUNTIME_CHECK(result == ISC_R_SUCCESS);
|
||||
isc_task_setname(manager->task, "clientmgr", NULL);
|
||||
|
||||
isc_refcount_init(&manager->references, 1);
|
||||
manager->sctx = NULL;
|
||||
|
|
|
|||
|
|
@ -70,7 +70,6 @@
|
|||
#include <dns/name.h>
|
||||
#include <dns/rdataclass.h>
|
||||
#include <dns/rdatatype.h>
|
||||
#include <dns/tcpmsg.h>
|
||||
#include <dns/types.h>
|
||||
|
||||
#include <ns/query.h>
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@
|
|||
#include <isc/mem.h>
|
||||
#include <isc/netmgr.h>
|
||||
#include <isc/refcount.h>
|
||||
#include <isc/socket.h>
|
||||
|
||||
#include <dns/geoip.h>
|
||||
#include <dns/result.h>
|
||||
|
|
@ -74,23 +73,20 @@ struct ns_interface {
|
|||
isc_sockaddr_t addr; /*%< Address and port. */
|
||||
unsigned int flags; /*%< Interface flags */
|
||||
char name[32]; /*%< Null terminated. */
|
||||
dns_dispatch_t * udpdispatch[MAX_UDP_DISPATCH];
|
||||
/*%< UDP dispatchers. */
|
||||
isc_socket_t * tcpsocket; /*%< TCP socket. */
|
||||
isc_nmsocket_t *udplistensocket;
|
||||
isc_nmsocket_t *tcplistensocket;
|
||||
isc_nmsocket_t *http_listensocket;
|
||||
isc_nmsocket_t *http_secure_listensocket;
|
||||
isc_dscp_t dscp; /*%< "listen-on" DSCP value */
|
||||
isc_refcount_t ntcpaccepting; /*%< Number of clients
|
||||
* ready to accept new
|
||||
* TCP connections on this
|
||||
* interface */
|
||||
isc_refcount_t ntcpactive; /*%< Number of clients
|
||||
* servicing TCP queries
|
||||
* (whether accepting or
|
||||
* connected) */
|
||||
int nudpdispatch; /*%< Number of UDP dispatches */
|
||||
isc_nmsocket_t * udplistensocket;
|
||||
isc_nmsocket_t * tcplistensocket;
|
||||
isc_nmsocket_t * http_listensocket;
|
||||
isc_nmsocket_t * http_secure_listensocket;
|
||||
isc_dscp_t dscp; /*%< "listen-on" DSCP value */
|
||||
isc_refcount_t ntcpaccepting; /*%< Number of clients
|
||||
* ready to accept new
|
||||
* TCP connections on this
|
||||
* interface */
|
||||
isc_refcount_t ntcpactive; /*%< Number of clients
|
||||
* servicing TCP queries
|
||||
* (whether accepting or
|
||||
* connected) */
|
||||
ns_clientmgr_t *clientmgr; /*%< Client manager. */
|
||||
ISC_LINK(ns_interface_t) link;
|
||||
};
|
||||
|
||||
|
|
@ -103,8 +99,8 @@ ns_interfacemgr_create(isc_mem_t *mctx, ns_server_t *sctx,
|
|||
isc_taskmgr_t *taskmgr, isc_timermgr_t *timermgr,
|
||||
isc_socketmgr_t *socketmgr, isc_nm_t *nm,
|
||||
dns_dispatchmgr_t *dispatchmgr, isc_task_t *task,
|
||||
unsigned int udpdisp, dns_geoip_databases_t *geoip,
|
||||
int ncpus, ns_interfacemgr_t **mgrp);
|
||||
dns_geoip_databases_t *geoip, int ncpus,
|
||||
ns_interfacemgr_t **mgrp);
|
||||
/*%<
|
||||
* Create a new interface manager.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -86,7 +86,6 @@ struct ns_interfacemgr {
|
|||
ISC_LIST(ns_interface_t) interfaces; /*%< List of interfaces */
|
||||
ISC_LIST(isc_sockaddr_t) listenon;
|
||||
int backlog; /*%< Listen queue size */
|
||||
unsigned int udpdisp; /*%< UDP dispatch count */
|
||||
atomic_bool shuttingdown; /*%< Interfacemgr shutting down */
|
||||
ns_clientmgr_t **clientmgrs; /*%< Client managers */
|
||||
#ifdef USE_ROUTE_SOCKET
|
||||
|
|
@ -183,8 +182,8 @@ ns_interfacemgr_create(isc_mem_t *mctx, ns_server_t *sctx,
|
|||
isc_taskmgr_t *taskmgr, isc_timermgr_t *timermgr,
|
||||
isc_socketmgr_t *socketmgr, isc_nm_t *nm,
|
||||
dns_dispatchmgr_t *dispatchmgr, isc_task_t *task,
|
||||
unsigned int udpdisp, dns_geoip_databases_t *geoip,
|
||||
int ncpus, ns_interfacemgr_t **mgrp) {
|
||||
dns_geoip_databases_t *geoip, int ncpus,
|
||||
ns_interfacemgr_t **mgrp) {
|
||||
isc_result_t result;
|
||||
ns_interfacemgr_t *mgr;
|
||||
|
||||
|
|
@ -220,7 +219,6 @@ ns_interfacemgr_create(isc_mem_t *mctx, ns_server_t *sctx,
|
|||
mgr->generation = 1;
|
||||
mgr->listenon4 = NULL;
|
||||
mgr->listenon6 = NULL;
|
||||
mgr->udpdisp = udpdisp;
|
||||
mgr->ncpus = ncpus;
|
||||
atomic_init(&mgr->shuttingdown, false);
|
||||
|
||||
|
|
@ -404,8 +402,7 @@ ns_interfacemgr_shutdown(ns_interfacemgr_t *mgr) {
|
|||
static isc_result_t
|
||||
ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
|
||||
const char *name, ns_interface_t **ifpret) {
|
||||
ns_interface_t *ifp;
|
||||
int disp;
|
||||
ns_interface_t *ifp = NULL;
|
||||
|
||||
REQUIRE(NS_INTERFACEMGR_VALID(mgr));
|
||||
|
||||
|
|
@ -418,10 +415,6 @@ ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
|
|||
|
||||
isc_mutex_init(&ifp->lock);
|
||||
|
||||
for (disp = 0; disp < MAX_UDP_DISPATCH; disp++) {
|
||||
ifp->udpdispatch[disp] = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a single TCP client object. It will replace itself
|
||||
* with a new one as soon as it gets a connection, so the actual
|
||||
|
|
@ -489,7 +482,7 @@ ns_interface_listentcp(ns_interface_t *ifp) {
|
|||
|
||||
#if 0
|
||||
#ifndef ISC_ALLOW_MAPPED
|
||||
isc_socket_ipv6only(ifp->tcpsocket,true);
|
||||
isc_socket_ipv6only(ifp->tcpsocket, true);
|
||||
#endif /* ifndef ISC_ALLOW_MAPPED */
|
||||
|
||||
if (ifp->dscp != -1) {
|
||||
|
|
@ -705,19 +698,6 @@ ns_interface_destroy(ns_interface_t *ifp) {
|
|||
|
||||
ns_interface_shutdown(ifp);
|
||||
|
||||
for (int disp = 0; disp < ifp->nudpdispatch; disp++) {
|
||||
if (ifp->udpdispatch[disp] != NULL) {
|
||||
dns_dispatch_changeattributes(
|
||||
ifp->udpdispatch[disp], 0,
|
||||
DNS_DISPATCHATTR_NOLISTEN);
|
||||
dns_dispatch_detach(&(ifp->udpdispatch[disp]));
|
||||
}
|
||||
}
|
||||
|
||||
if (ifp->tcpsocket != NULL) {
|
||||
isc_socket_detach(&ifp->tcpsocket);
|
||||
}
|
||||
|
||||
isc_mutex_destroy(&ifp->lock);
|
||||
|
||||
ns_interfacemgr_detach(&ifp->mgr);
|
||||
|
|
|
|||
|
|
@ -6652,7 +6652,7 @@ query_resume(query_ctx_t *qctx) {
|
|||
} else if (REDIRECT(qctx->client)) {
|
||||
tname = qctx->client->query.redirect.fname;
|
||||
} else {
|
||||
tname = dns_fixedname_name(&qctx->event->foundname);
|
||||
tname = qctx->event->foundname;
|
||||
}
|
||||
|
||||
dns_name_copy(tname, qctx->fname);
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ shutdown_managers(isc_task_t *task, isc_event_t *event) {
|
|||
}
|
||||
|
||||
if (dispatchmgr != NULL) {
|
||||
dns_dispatchmgr_destroy(&dispatchmgr);
|
||||
dns_dispatchmgr_detach(&dispatchmgr);
|
||||
}
|
||||
|
||||
atomic_store(&shutdown_done, true);
|
||||
|
|
@ -233,11 +233,11 @@ create_managers(void) {
|
|||
|
||||
CHECK(ns_server_create(mctx, matchview, &sctx));
|
||||
|
||||
CHECK(dns_dispatchmgr_create(mctx, &dispatchmgr));
|
||||
CHECK(dns_dispatchmgr_create(mctx, netmgr, &dispatchmgr));
|
||||
|
||||
CHECK(ns_interfacemgr_create(mctx, sctx, taskmgr, timermgr, socketmgr,
|
||||
netmgr, dispatchmgr, maintask, ncpus, NULL,
|
||||
ncpus, &interfacemgr));
|
||||
netmgr, dispatchmgr, maintask, NULL, ncpus,
|
||||
&interfacemgr));
|
||||
|
||||
CHECK(ns_listenlist_default(mctx, port, -1, true, &listenon));
|
||||
ns_interfacemgr_setlistenon4(interfacemgr, listenon);
|
||||
|
|
@ -442,8 +442,7 @@ ns_test_setupzonemgr(void) {
|
|||
isc_result_t result;
|
||||
REQUIRE(zonemgr == NULL);
|
||||
|
||||
result = dns_zonemgr_create(mctx, taskmgr, timermgr, socketmgr, NULL,
|
||||
&zonemgr);
|
||||
result = dns_zonemgr_create(mctx, taskmgr, timermgr, NULL, &zonemgr);
|
||||
return (result);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -399,6 +399,7 @@
|
|||
./bin/tests/system/glue/tests.sh SH 2000,2001,2003,2004,2007,2012,2013,2016,2017,2018,2019,2020,2021
|
||||
./bin/tests/system/hooks/clean.sh SH 2020,2021
|
||||
./bin/tests/system/hooks/driver/test-async.c C 2020,2021
|
||||
./bin/tests/system/hooks/prereq.sh SH 2021
|
||||
./bin/tests/system/hooks/setup.sh SH 2020,2021
|
||||
./bin/tests/system/hooks/tests.sh SH 2020,2021
|
||||
./bin/tests/system/idna/clean.sh SH 2018,2019,2020,2021
|
||||
|
|
@ -1231,7 +1232,6 @@
|
|||
./lib/dns/include/dns/soa.h C 2000,2001,2004,2005,2006,2007,2009,2016,2018,2019,2020,2021
|
||||
./lib/dns/include/dns/ssu.h C 2000,2001,2003,2004,2005,2006,2007,2008,2010,2011,2016,2017,2018,2019,2020,2021
|
||||
./lib/dns/include/dns/stats.h C 2000,2001,2004,2005,2006,2007,2008,2009,2012,2014,2015,2016,2017,2018,2019,2020,2021
|
||||
./lib/dns/include/dns/tcpmsg.h C 1999,2000,2001,2004,2005,2006,2007,2015,2016,2018,2019,2020,2021
|
||||
./lib/dns/include/dns/time.h C 1999,2000,2001,2004,2005,2006,2007,2012,2016,2018,2019,2020,2021
|
||||
./lib/dns/include/dns/timer.h C 2000,2001,2004,2005,2006,2007,2016,2018,2019,2020,2021
|
||||
./lib/dns/include/dns/tkey.h C 1999,2000,2001,2004,2005,2006,2007,2009,2010,2011,2016,2018,2019,2020,2021
|
||||
|
|
@ -1471,7 +1471,6 @@
|
|||
./lib/dns/ssu.c C 2000,2001,2003,2004,2005,2006,2007,2008,2010,2011,2013,2014,2016,2017,2018,2019,2020,2021
|
||||
./lib/dns/ssu_external.c C 2011,2012,2013,2016,2017,2018,2019,2020,2021
|
||||
./lib/dns/stats.c C 2000,2001,2004,2005,2007,2008,2009,2012,2016,2018,2019,2020,2021
|
||||
./lib/dns/tcpmsg.c C 1999,2000,2001,2004,2005,2006,2007,2015,2016,2018,2019,2020,2021
|
||||
./lib/dns/tests/Kdh.+002+18602.key X 2014,2018,2019,2020,2021
|
||||
./lib/dns/tests/Krsa.+005+29235.key X 2016,2018,2019,2020,2021
|
||||
./lib/dns/tests/acl_test.c C 2016,2018,2019,2020,2021
|
||||
|
|
|
|||
Loading…
Reference in a new issue