implement dns_dispatchmgr_t, replacing dns_dispatchlist_t. Use it throughout the library/server.
This commit is contained in:
@@ -26,6 +26,7 @@
|
||||
|
||||
#include <dns/cache.h>
|
||||
#include <dns/db.h>
|
||||
#include <dns/dispatch.h>
|
||||
#include <dns/log.h>
|
||||
#include <dns/resolver.h>
|
||||
#include <dns/result.h>
|
||||
@@ -53,6 +54,7 @@ dns_view_t *view;
|
||||
isc_taskmgr_t *taskmgr;
|
||||
isc_socketmgr_t *sockmgr;
|
||||
isc_timermgr_t *timermgr;
|
||||
dns_dispatchmgr_t *dispatchmgr;
|
||||
|
||||
isc_sockaddrlist_t forwarders;
|
||||
|
||||
@@ -88,7 +90,7 @@ create_view(isc_mem_t *mctx) {
|
||||
* XXXMLG hardwired number of tasks.
|
||||
*/
|
||||
result = dns_view_createresolver(view, taskmgr, 16, sockmgr,
|
||||
timermgr, 0, NULL, NULL);
|
||||
timermgr, dispatchmgr, 0, NULL, NULL);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto out;
|
||||
|
||||
@@ -271,6 +273,13 @@ main(int argc, char **argv) {
|
||||
result = isc_timermgr_create(mem, &timermgr);
|
||||
INSIST(result == ISC_R_SUCCESS);
|
||||
|
||||
/*
|
||||
* Create a dispatch manager.
|
||||
*/
|
||||
dispatchmgr = NULL;
|
||||
result = dns_dispatchmgr_create(mem, &dispatchmgr);
|
||||
INSIST(result == ISC_R_SUCCESS);
|
||||
|
||||
/*
|
||||
* Read resolv.conf to get our forwarders.
|
||||
*/
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
EXTERN isc_mem_t * ns_g_mctx INIT(NULL);
|
||||
EXTERN unsigned int ns_g_cpus INIT(1);
|
||||
EXTERN isc_taskmgr_t * ns_g_taskmgr INIT(NULL);
|
||||
EXTERN dns_dispatchmgr_t * ns_g_dispatchmgr INIT(NULL);
|
||||
/*
|
||||
* XXXRTH We're going to want multiple timer managers eventually. One
|
||||
* for really short timers, another for client timers, and one
|
||||
|
||||
@@ -87,8 +87,9 @@ struct ns_interface {
|
||||
|
||||
isc_result_t
|
||||
ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
|
||||
isc_socketmgr_t *socketmgr, ns_clientmgr_t *clientmgr,
|
||||
ns_interfacemgr_t **mgrp);
|
||||
isc_socketmgr_t *socketmgr,
|
||||
dns_dispatchmgr_t *dispatchmgr,
|
||||
ns_clientmgr_t *clientmgr, ns_interfacemgr_t **mgrp);
|
||||
|
||||
void
|
||||
ns_interfacemgr_attach(ns_interfacemgr_t *source, ns_interfacemgr_t **target);
|
||||
|
||||
@@ -42,6 +42,7 @@ struct ns_interfacemgr {
|
||||
isc_mem_t * mctx; /* Memory context. */
|
||||
isc_taskmgr_t * taskmgr; /* Task manager. */
|
||||
isc_socketmgr_t * socketmgr; /* Socket manager. */
|
||||
dns_dispatchmgr_t * dispatchmgr;
|
||||
ns_clientmgr_t * clientmgr; /* Client manager. */
|
||||
unsigned int generation; /* Current generation no. */
|
||||
ns_listenlist_t * listenon;
|
||||
@@ -71,8 +72,9 @@ sockaddr_format(isc_sockaddr_t *sa, char *array, unsigned int size) {
|
||||
|
||||
isc_result_t
|
||||
ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
|
||||
isc_socketmgr_t *socketmgr, ns_clientmgr_t *clientmgr,
|
||||
ns_interfacemgr_t **mgrp)
|
||||
isc_socketmgr_t *socketmgr,
|
||||
dns_dispatchmgr_t *dispatchmgr,
|
||||
ns_clientmgr_t *clientmgr, ns_interfacemgr_t **mgrp)
|
||||
{
|
||||
isc_result_t result;
|
||||
ns_interfacemgr_t *mgr;
|
||||
@@ -92,6 +94,7 @@ ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
|
||||
mgr->mctx = mctx;
|
||||
mgr->taskmgr = taskmgr;
|
||||
mgr->socketmgr = socketmgr;
|
||||
mgr->dispatchmgr = dispatchmgr;
|
||||
mgr->clientmgr = clientmgr;
|
||||
mgr->generation = 1;
|
||||
mgr->listenon = NULL;
|
||||
@@ -245,6 +248,7 @@ ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
|
||||
static isc_result_t
|
||||
ns_interface_listenudp(ns_interface_t *ifp) {
|
||||
isc_result_t result;
|
||||
unsigned int attrs;
|
||||
|
||||
/*
|
||||
* Open a UDP socket.
|
||||
@@ -266,9 +270,17 @@ ns_interface_listenudp(ns_interface_t *ifp) {
|
||||
isc_result_totext(result));
|
||||
goto udp_bind_failure;
|
||||
}
|
||||
result = dns_dispatch_create(ifp->mgr->mctx, ifp->udpsocket, ifp->task,
|
||||
4096, 1000, 32768, 8219, 8237, NULL,
|
||||
&ifp->udpdispatch);
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_UDP;
|
||||
if (isc_sockaddr_pf(&ifp->addr) == AF_INET)
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
else
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
attrs |= DNS_DISPATCHATTR_ACCEPTREQUEST;
|
||||
result = dns_dispatch_create(ifp->mgr->dispatchmgr, ifp->udpsocket,
|
||||
ifp->task, 4096, 1000, 32768, 8219,
|
||||
8237, NULL, attrs, &ifp->udpdispatch);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||
"UDP dns_dispatch_create(): %s",
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
#include <isc/timer.h>
|
||||
#include <isc/util.h>
|
||||
|
||||
#include <dns/dispatch.h>
|
||||
|
||||
#include <dst/result.h>
|
||||
|
||||
/*
|
||||
@@ -258,6 +260,14 @@ create_managers() {
|
||||
return (ISC_R_UNEXPECTED);
|
||||
}
|
||||
|
||||
result = dns_dispatchmgr_create(ns_g_mctx, &ns_g_dispatchmgr);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||
"dns_dispatchmgr_create() failed: %s",
|
||||
isc_result_totext(result));
|
||||
return (ISC_R_UNEXPECTED);
|
||||
}
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
@@ -274,6 +284,7 @@ destroy_managers(void) {
|
||||
isc_taskmgr_destroy(&ns_g_taskmgr);
|
||||
isc_timermgr_destroy(&ns_g_timermgr);
|
||||
isc_socketmgr_destroy(&ns_g_socketmgr);
|
||||
dns_dispatchmgr_destroy(&ns_g_dispatchmgr);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -356,7 +356,8 @@ configure_view(dns_view_t *view, dns_c_ctx_t *cctx, dns_c_view_t *cview,
|
||||
*/
|
||||
CHECK(dns_view_createresolver(view, ns_g_taskmgr, 31,
|
||||
ns_g_socketmgr, ns_g_timermgr,
|
||||
0, dispatchv4, dispatchv6));
|
||||
0, ns_g_dispatchmgr,
|
||||
dispatchv4, dispatchv6));
|
||||
|
||||
/*
|
||||
* Set resolver forwarding policy.
|
||||
@@ -866,6 +867,7 @@ static isc_result_t
|
||||
configure_server_querysource(dns_c_ctx_t *cctx, ns_server_t *server, int af,
|
||||
dns_dispatch_t **dispatchp) {
|
||||
isc_result_t result;
|
||||
unsigned int attrs;
|
||||
struct in_addr ina;
|
||||
isc_sockaddr_t sa, any4, any6, *any;
|
||||
isc_socket_t *socket;
|
||||
@@ -982,10 +984,18 @@ configure_server_querysource(dns_c_ctx_t *cctx, ns_server_t *server, int af,
|
||||
isc_socket_detach(&socket);
|
||||
return (result);
|
||||
}
|
||||
result = dns_dispatch_create(ns_g_mctx, socket,
|
||||
attrs = 0;
|
||||
attrs = DNS_DISPATCHATTR_UDP;
|
||||
attrs |= DNS_DISPATCHATTR_PRIVATE;
|
||||
if (af == AF_INET)
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
else
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
result = dns_dispatch_create(ns_g_dispatchmgr, socket,
|
||||
server->task, 4096,
|
||||
1000, 32768, 16411, 16433, NULL,
|
||||
server_dispatchp);
|
||||
attrs, server_dispatchp);
|
||||
/*
|
||||
* Regardless of whether dns_dispatch_create() succeeded or
|
||||
* failed, we don't need to keep the reference to the socket.
|
||||
@@ -1390,7 +1400,8 @@ run_server(isc_task_t *task, isc_event_t *event) {
|
||||
"creating client manager");
|
||||
|
||||
CHECKFATAL(ns_interfacemgr_create(ns_g_mctx, ns_g_taskmgr,
|
||||
ns_g_socketmgr, server->clientmgr,
|
||||
ns_g_socketmgr, ns_g_dispatchmgr,
|
||||
server->clientmgr,
|
||||
&server->interfacemgr),
|
||||
"creating interface manager");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user