ndisp = 4 * ISC_MIN(named_g_udpdisp, MAX_UDP_DISPATCH);
CHECK(dns_view_createresolver(
view, named_g_loopmgr, ndisp, named_g_netmgr, resopts,
- named_g_server->tlsctx_client_cache, named_g_dispatchmgr,
- dispatch4, dispatch6));
+ named_g_server->tlsctx_client_cache, dispatch4, dispatch6));
if (resstats == NULL) {
CHECK(isc_stats_create(mctx, &resstats,
return (result);
}
+ dns_view_setdispatchmgr(view, named_g_dispatchmgr);
+
isc_nonce_buf(view->secret, sizeof(view->secret));
ISC_LIST_APPEND(*viewlist, view, link);
#include <dns/name.h>
#include <dns/rdataset.h>
#include <dns/request.h>
-#include <dns/resolver.h>
#include <dns/result.h>
#include <dns/types.h>
#include <dns/view.h>
#include <dns/rdataset.h>
#include <dns/rdatatype.h>
#include <dns/request.h>
-#include <dns/resolver.h>
#include <dns/types.h>
#include <dns/view.h>
return (result);
}
+ dns_view_setdispatchmgr(view, dispatchmgr);
+
/* Initialize view security roots */
result = dns_view_initsecroots(view, mctx);
if (result != ISC_R_SUCCESS) {
}
result = dns_view_createresolver(view, loopmgr, 1, nm, 0,
- tlsctx_client_cache, dispatchmgr,
- dispatchv4, dispatchv6);
+ tlsctx_client_cache, dispatchv4,
+ dispatchv6);
if (result != ISC_R_SUCCESS) {
goto cleanup_view;
}
dns_resolver_create(dns_view_t *view, isc_loopmgr_t *loopmgr,
unsigned int ndisp, isc_nm_t *nm, unsigned int options,
isc_tlsctx_cache_t *tlsctx_cache,
- dns_dispatchmgr_t *dispatchmgr, dns_dispatch_t *dispatchv4,
- dns_dispatch_t *dispatchv6, dns_resolver_t **resp);
+ dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6,
+ dns_resolver_t **resp);
/*%<
* Create a resolver.
*
*\li 'tlsctx_cache' != NULL.
*
- *\li 'dispatchmgr' != NULL.
- *
*\li 'dispatchv4' is a dispatch with an IPv4 UDP socket, or is NULL.
* If not NULL, 'ndisp' clones of it will be created by the resolver.
*
*\li 'fetch' is a valid fetch, and has completed.
*/
-dns_dispatchmgr_t *
-dns_resolver_dispatchmgr(dns_resolver_t *resolver);
-
dns_dispatch_t *
dns_resolver_dispatchv4(dns_resolver_t *resolver);
struct dns_view {
/* Unlocked. */
- unsigned int magic;
- isc_mem_t *mctx;
- dns_rdataclass_t rdclass;
- char *name;
- dns_zt_t *zonetable;
- dns_resolver_t *resolver;
- dns_adb_t *adb;
- dns_requestmgr_t *requestmgr;
- dns_cache_t *cache;
- dns_db_t *cachedb;
- dns_db_t *hints;
+ unsigned int magic;
+ isc_mem_t *mctx;
+ dns_rdataclass_t rdclass;
+ char *name;
+ dns_zt_t *zonetable;
+ dns_resolver_t *resolver;
+ dns_adb_t *adb;
+ dns_requestmgr_t *requestmgr;
+ dns_dispatchmgr_t *dispatchmgr;
+ dns_cache_t *cache;
+ dns_db_t *cachedb;
+ dns_db_t *hints;
/*
* security roots and negative trust anchors.
dns_view_createresolver(dns_view_t *view, isc_loopmgr_t *loopmgr,
unsigned int ndisp, isc_nm_t *netmgr,
unsigned int options, isc_tlsctx_cache_t *tlsctx_cache,
- dns_dispatchmgr_t *dispatchmgr,
dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6);
/*%<
* Create a resolver and address database for the view.
*
*\li 'view' does not have a resolver already.
*
+ *\li A dispatch manager has been associated with the view by calling
+ * dns_view_setdispatchmgr().
+ *
*\li The requirements of dns_resolver_create() apply to 'ndisp',
* 'netmgr', 'options', 'tlsctx_cache', 'dispatchv4', and 'dispatchv6'.
*
* Get the current EDNS UDP buffer size.
*/
+void
+dns_view_setdispatchmgr(dns_view_t *view, dns_dispatchmgr_t *dispatchmgr);
+dns_dispatchmgr_t *
+dns_view_getdispatchmgr(dns_view_t *view);
+/*%<
+ * Set/get the dispatch manager for the view; this wil be used
+ * by the resolver and request managers to send and receive DNS
+ * messages.
+ */
ISC_LANG_ENDDECLS
* 'zone' and a result code as arguments when the transfer finishes.
*
* Requires:
+ *\li 'xfrp' != NULL and '*xfrp' == NULL.
+ *
+ *\li 'done' != NULL.
+ *
+ *\li 'primaryaddr' has a non-zero port number.
+ *
+ *\li 'zone' is a valid zone and is associated with a view.
+ *
*\li 'xfrtype' is dns_rdatatype_axfr, dns_rdatatype_ixfr
* or dns_rdatatype_soa (soa query followed by axfr if
* serial is greater than current serial).
bool frozen;
unsigned int options;
isc_tlsctx_cache_t *tlsctx_cache;
- dns_dispatchmgr_t *dispatchmgr;
dns_dispatchset_t *dispatches4;
dns_dispatchset_t *dispatches6;
query = isc_mem_get(fctx->mctx, sizeof(*query));
*query = (resquery_t){ .options = options,
.addrinfo = addrinfo,
- .dispatchmgr = res->dispatchmgr };
+ .dispatchmgr = res->view->dispatchmgr };
#if DNS_RESOLVER_TRACE
fprintf(stderr, "rctx_init:%s:%s:%d:%p->references = 1\n", __func__,
}
isc_sockaddr_setport(&addr, 0);
- result = dns_dispatch_createtcp(res->dispatchmgr, &addr,
+ result = dns_dispatch_createtcp(res->view->dispatchmgr, &addr,
&addrinfo->sockaddr,
&query->dispatch);
if (result != ISC_R_SUCCESS) {
FCTXTRACE("connecting via TCP");
} else {
if (have_addr) {
- result = dns_dispatch_createudp(res->dispatchmgr, &addr,
+ result = dns_dispatch_createudp(res->view->dispatchmgr,
+ &addr,
&query->dispatch);
if (result != ISC_R_SUCCESS) {
goto cleanup_query;
static void
possibly_mark(fetchctx_t *fctx, dns_adbaddrinfo_t *addr) {
isc_netaddr_t na;
- isc_sockaddr_t *sa;
+ isc_sockaddr_t *sa = &addr->sockaddr;
bool aborted = false;
bool bogus;
dns_acl_t *blackhole;
isc_netaddr_t ipaddr;
dns_peer_t *peer = NULL;
- dns_resolver_t *res;
+ dns_resolver_t *res = fctx->res;
const char *msg = NULL;
- sa = &addr->sockaddr;
-
- res = fctx->res;
isc_netaddr_fromsockaddr(&ipaddr, sa);
- blackhole = dns_dispatchmgr_getblackhole(res->dispatchmgr);
+ blackhole = dns_dispatchmgr_getblackhole(res->view->dispatchmgr);
(void)dns_peerlist_peerbyaddr(res->view->peers, &ipaddr, &peer);
if (blackhole != NULL) {
dns_resolver_create(dns_view_t *view, isc_loopmgr_t *loopmgr,
unsigned int ndisp, isc_nm_t *nm, unsigned int options,
isc_tlsctx_cache_t *tlsctx_cache,
- dns_dispatchmgr_t *dispatchmgr, dns_dispatch_t *dispatchv4,
- dns_dispatch_t *dispatchv6, dns_resolver_t **resp) {
+ dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6,
+ dns_resolver_t **resp) {
isc_result_t result = ISC_R_SUCCESS;
dns_resolver_t *res = NULL;
REQUIRE(ndisp > 0);
REQUIRE(resp != NULL && *resp == NULL);
REQUIRE(tlsctx_cache != NULL);
- REQUIRE(dispatchmgr != NULL);
REQUIRE(dispatchv4 != NULL || dispatchv6 != NULL);
RTRACE("create");
.loopmgr = loopmgr,
.rdclass = view->rdclass,
.nm = nm,
- .dispatchmgr = dispatchmgr,
.options = options,
.tlsctx_cache = tlsctx_cache,
.spillatmin = 10,
UNLOCK(&fctx->lock);
}
-dns_dispatchmgr_t *
-dns_resolver_dispatchmgr(dns_resolver_t *resolver) {
- REQUIRE(VALID_RESOLVER(resolver));
- return (resolver->dispatchmgr);
-}
-
dns_dispatch_t *
dns_resolver_dispatchv4(dns_resolver_t *resolver) {
REQUIRE(VALID_RESOLVER(resolver));
dns_view_createresolver(dns_view_t *view, isc_loopmgr_t *loopmgr,
unsigned int ndisp, isc_nm_t *netmgr,
unsigned int options, isc_tlsctx_cache_t *tlsctx_cache,
- dns_dispatchmgr_t *dispatchmgr,
dns_dispatch_t *dispatchv4,
dns_dispatch_t *dispatchv6) {
isc_result_t result;
REQUIRE(DNS_VIEW_VALID(view));
REQUIRE(!view->frozen);
REQUIRE(view->resolver == NULL);
+ REQUIRE(view->dispatchmgr != NULL);
view->loop = isc_loop_current(loopmgr);
result = dns_resolver_create(view, loopmgr, ndisp, netmgr, options,
- tlsctx_cache, dispatchmgr, dispatchv4,
- dispatchv6, &view->resolver);
+ tlsctx_cache, dispatchv4, dispatchv6,
+ &view->resolver);
if (result != ISC_R_SUCCESS) {
return (result);
}
goto cleanup_resolver;
}
- result = dns_requestmgr_create(
- view->mctx, dns_resolver_dispatchmgr(view->resolver),
- dispatchv4, dispatchv6, &view->requestmgr);
+ result = dns_requestmgr_create(view->mctx, view->dispatchmgr,
+ dispatchv4, dispatchv6,
+ &view->requestmgr);
if (result != ISC_R_SUCCESS) {
goto cleanup_adb;
}
REQUIRE(DNS_VIEW_VALID(view));
return (view->udpsize);
}
+
+void
+dns_view_setdispatchmgr(dns_view_t *view, dns_dispatchmgr_t *dispatchmgr) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ view->dispatchmgr = dispatchmgr;
+}
+
+dns_dispatchmgr_t *
+dns_view_getdispatchmgr(dns_view_t *view) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ return (view->dispatchmgr);
+}
REQUIRE(xfrp != NULL && *xfrp == NULL);
REQUIRE(done != NULL);
REQUIRE(isc_sockaddr_getport(primaryaddr) != 0);
+ REQUIRE(zone != NULL);
+ REQUIRE(dns_zone_getview(zone) != NULL);
(void)dns_zone_getdb(zone, &db);
result = dns_test_makeview("view", false, &view);
assert_int_equal(result, ISC_R_SUCCESS);
+ dns_view_setdispatchmgr(view, dispatchmgr);
+
isc_sockaddr_any(&local);
result = dns_dispatch_createudp(dispatchmgr, &local, &dispatch);
assert_int_equal(result, ISC_R_SUCCESS);
isc_tlsctx_cache_create(mctx, &tlsctx_cache);
result = dns_resolver_create(view, loopmgr, 1, netmgr, 0, tlsctx_cache,
- dispatchmgr, dispatch, NULL, resolverp);
+ dispatch, NULL, resolverp);
assert_int_equal(result, ISC_R_SUCCESS);
}