mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 06:55:30 +00:00
Merge the mlg-20000518 branch onto the mainline. Change summary:
dns_dispatch_create() no longer exists. dns_dispatch_createtcp() and dns_dispatch_getudp() are the replacements. _createtcp() takes a bound, connected TCP socket, while _getudp() will search for a sharable UDP socket, and if found, attach to it and return a pointer to it. If one is not found, it will create a udp socket, bind it to a supplied local address, and create a new dispatcher around it. dns_dispatch_remove{request,response}() no longer take the dispatch as an argument. query-source can now be set per view. The dispatch manager holds onto three memory pools, one for allocating dispatchers from, one for events, and one for requests/replies. The free list on these pools is hard-coded, but set to 1024. This keeps us from having to dig into the isc_mem_t the pools draw from as often. dns_resolver_create() and dns_view_createresolver() require that valid dispatchers be passed in; dispatchers are no longer created for the caller.
This commit is contained in:
@@ -183,9 +183,7 @@ client_deactivate(ns_client_t *client) {
|
||||
deventp = &client->dispevent;
|
||||
else
|
||||
deventp = NULL;
|
||||
dns_dispatch_removerequest(client->dispatch,
|
||||
&client->dispentry,
|
||||
deventp);
|
||||
dns_dispatch_removerequest(&client->dispentry, deventp);
|
||||
}
|
||||
if (client->dispatch != NULL)
|
||||
dns_dispatch_detach(&client->dispatch);
|
||||
|
@@ -56,10 +56,6 @@ struct ns_server {
|
||||
ns_interfacemgr_t * interfacemgr;
|
||||
dns_db_t * in_roothints;
|
||||
dns_tkey_ctx_t * tkeyctx;
|
||||
isc_sockaddr_t querysrc_addressv4;
|
||||
dns_dispatch_t * querysrc_dispatchv4;
|
||||
isc_sockaddr_t querysrc_addressv6;
|
||||
dns_dispatch_t * querysrc_dispatchv6;
|
||||
isc_timer_t * interface_timer;
|
||||
|
||||
isc_mutex_t reload_event_lock;
|
||||
|
@@ -197,7 +197,6 @@ ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
|
||||
}
|
||||
isc_task_setname(ifp->task, "ifp", ifp);
|
||||
|
||||
ifp->udpsocket = NULL;
|
||||
ifp->udpdispatch = NULL;
|
||||
|
||||
ifp->tcpsocket = NULL;
|
||||
@@ -232,38 +231,21 @@ static isc_result_t
|
||||
ns_interface_listenudp(ns_interface_t *ifp) {
|
||||
isc_result_t result;
|
||||
unsigned int attrs;
|
||||
unsigned int attrmask;
|
||||
|
||||
/*
|
||||
* Open a UDP socket.
|
||||
*/
|
||||
result = isc_socket_create(ifp->mgr->socketmgr,
|
||||
isc_sockaddr_pf(&ifp->addr),
|
||||
isc_sockettype_udp,
|
||||
&ifp->udpsocket);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_log_write(IFMGR_COMMON_LOGARGS, ISC_LOG_ERROR,
|
||||
"creating UDP socket: %s",
|
||||
isc_result_totext(result));
|
||||
goto udp_socket_failure;
|
||||
}
|
||||
result = isc_socket_bind(ifp->udpsocket, &ifp->addr);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_log_write(IFMGR_COMMON_LOGARGS, ISC_LOG_ERROR,
|
||||
"binding UDP socket: %s",
|
||||
isc_result_totext(result));
|
||||
goto udp_bind_failure;
|
||||
}
|
||||
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);
|
||||
attrmask = 0;
|
||||
attrmask |= DNS_DISPATCHATTR_UDP | DNS_DISPATCHATTR_TCP;
|
||||
attrmask |= DNS_DISPATCHATTR_IPV4 | DNS_DISPATCHATTR_IPV6;
|
||||
result = dns_dispatch_getudp(ifp->mgr->dispatchmgr, ns_g_socketmgr,
|
||||
ns_g_taskmgr, &ifp->addr,
|
||||
4096, 1000, 32768, 8219, 8237,
|
||||
attrs, attrmask, &ifp->udpdispatch);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||
"UDP dns_dispatch_create(): %s",
|
||||
@@ -284,9 +266,6 @@ ns_interface_listenudp(ns_interface_t *ifp) {
|
||||
addtodispatch_failure:
|
||||
dns_dispatch_detach(&ifp->udpdispatch);
|
||||
udp_dispatch_failure:
|
||||
udp_bind_failure:
|
||||
isc_socket_detach(&ifp->udpsocket);
|
||||
udp_socket_failure:
|
||||
return (result);
|
||||
}
|
||||
|
||||
@@ -383,10 +362,6 @@ ns_interface_destroy(ns_interface_t *ifp) {
|
||||
|
||||
if (ifp->udpdispatch != NULL)
|
||||
dns_dispatch_detach(&ifp->udpdispatch);
|
||||
if (ifp->udpsocket != NULL) {
|
||||
isc_socket_cancel(ifp->udpsocket, NULL, ISC_SOCKCANCEL_ALL);
|
||||
isc_socket_detach(&ifp->udpsocket);
|
||||
}
|
||||
if (ifp->tcpsocket != NULL) {
|
||||
isc_socket_cancel(ifp->tcpsocket, NULL, ISC_SOCKCANCEL_ALL);
|
||||
isc_socket_detach(&ifp->tcpsocket);
|
||||
|
@@ -260,14 +260,6 @@ create_managers(void) {
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -284,7 +276,6 @@ 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
|
||||
|
@@ -262,6 +262,96 @@ configure_view_dnsseckeys(dns_c_ctx_t *cctx,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Get a dispatch appropriate for the resolver of a given view.
|
||||
*/
|
||||
static isc_result_t
|
||||
get_view_querysource_dispatch(dns_c_ctx_t *cctx, dns_c_view_t *cview,
|
||||
int af, dns_dispatch_t **dispatchp)
|
||||
{
|
||||
isc_result_t result;
|
||||
dns_dispatch_t *disp;
|
||||
isc_sockaddr_t sa;
|
||||
unsigned int attrs, attrmask;
|
||||
|
||||
/*
|
||||
* Make compiler happy.
|
||||
*/
|
||||
result = ISC_R_FAILURE;
|
||||
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
result = ISC_R_NOTFOUND;
|
||||
if (cview != NULL)
|
||||
result = dns_c_view_getquerysource(cview, &sa);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
result = dns_c_ctx_getquerysource(cctx, &sa);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
isc_sockaddr_any(&sa);
|
||||
break;
|
||||
case AF_INET6:
|
||||
result = ISC_R_NOTFOUND;
|
||||
if (cview != NULL)
|
||||
result = dns_c_view_getquerysourcev6(cview, &sa);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
result = dns_c_ctx_getquerysourcev6(cctx, &sa);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
isc_sockaddr_any6(&sa);
|
||||
break;
|
||||
default:
|
||||
INSIST(0);
|
||||
}
|
||||
|
||||
INSIST(isc_sockaddr_pf(&sa) == af);
|
||||
|
||||
/*
|
||||
* If we don't support this address family, we're done!
|
||||
*/
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
result = isc_net_probeipv4();
|
||||
break;
|
||||
case AF_INET6:
|
||||
result = isc_net_probeipv6();
|
||||
break;
|
||||
default:
|
||||
INSIST(0);
|
||||
}
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (ISC_R_SUCCESS);
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
attrmask = 0;
|
||||
attrmask |= DNS_DISPATCHATTR_UDP;
|
||||
attrmask |= DNS_DISPATCHATTR_TCP;
|
||||
attrmask |= DNS_DISPATCHATTR_IPV4;
|
||||
attrmask |= DNS_DISPATCHATTR_IPV6;
|
||||
|
||||
disp = NULL;
|
||||
result = dns_dispatch_getudp(ns_g_dispatchmgr, ns_g_socketmgr,
|
||||
ns_g_taskmgr, &sa, 4096,
|
||||
1000, 32768, 16411, 16433,
|
||||
attrs, attrmask, &disp);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (result);
|
||||
|
||||
*dispatchp = disp;
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Configure 'view' according to 'cview', taking defaults from 'cctx'
|
||||
* where values are missing in cctx.
|
||||
@@ -271,8 +361,7 @@ configure_view_dnsseckeys(dns_c_ctx_t *cctx,
|
||||
*/
|
||||
static isc_result_t
|
||||
configure_view(dns_view_t *view, dns_c_ctx_t *cctx, dns_c_view_t *cview,
|
||||
isc_mem_t *mctx, dns_aclconfctx_t *actx,
|
||||
dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6)
|
||||
isc_mem_t *mctx, dns_aclconfctx_t *actx)
|
||||
{
|
||||
dns_cache_t *cache = NULL;
|
||||
isc_result_t result;
|
||||
@@ -286,6 +375,8 @@ configure_view(dns_view_t *view, dns_c_ctx_t *cctx, dns_c_view_t *cview,
|
||||
dns_view_t *pview = NULL; /* Production view */
|
||||
unsigned int i;
|
||||
isc_mem_t *cmctx;
|
||||
dns_dispatch_t *dispatch4 = NULL;
|
||||
dns_dispatch_t *dispatch6 = NULL;
|
||||
|
||||
REQUIRE(DNS_VIEW_VALID(view));
|
||||
|
||||
@@ -354,10 +445,18 @@ configure_view(dns_view_t *view, dns_c_ctx_t *cctx, dns_c_view_t *cview,
|
||||
*
|
||||
* XXXRTH Hardwired number of tasks.
|
||||
*/
|
||||
CHECK(get_view_querysource_dispatch(cctx, cview, AF_INET,
|
||||
&dispatch4));
|
||||
CHECK(get_view_querysource_dispatch(cctx, cview, AF_INET6,
|
||||
&dispatch6));
|
||||
CHECK(dns_view_createresolver(view, ns_g_taskmgr, 31,
|
||||
ns_g_socketmgr, ns_g_timermgr,
|
||||
0, ns_g_dispatchmgr,
|
||||
dispatchv4, dispatchv6));
|
||||
dispatch4, dispatch6));
|
||||
if (dispatch4 != NULL)
|
||||
dns_dispatch_detach(&dispatch4);
|
||||
if (dispatch6 != NULL)
|
||||
dns_dispatch_detach(&dispatch6);
|
||||
|
||||
/*
|
||||
* Set resolver forwarding policy.
|
||||
@@ -868,159 +967,6 @@ configure_server_quota(dns_c_ctx_t *cctx,
|
||||
quota->max = val;
|
||||
}
|
||||
|
||||
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;
|
||||
dns_dispatch_t **server_dispatchp;
|
||||
isc_sockaddr_t *server_dispatchaddr;
|
||||
|
||||
/*
|
||||
* Make compiler happy.
|
||||
*/
|
||||
result = ISC_R_FAILURE;
|
||||
any = NULL;
|
||||
server_dispatchp = NULL;
|
||||
server_dispatchaddr = NULL;
|
||||
|
||||
ina.s_addr = htonl(INADDR_ANY);
|
||||
isc_sockaddr_fromin(&any4, &ina, 0);
|
||||
isc_sockaddr_fromin6(&any6, &in6addr_any, 0);
|
||||
|
||||
*dispatchp = NULL;
|
||||
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
any = &any4;
|
||||
result = dns_c_ctx_getquerysource(cctx, &sa);
|
||||
break;
|
||||
case AF_INET6:
|
||||
any = &any6;
|
||||
result = dns_c_ctx_getquerysourcev6(cctx, &sa);
|
||||
break;
|
||||
default:
|
||||
INSIST(0);
|
||||
}
|
||||
if (result != ISC_R_SUCCESS)
|
||||
sa = *any;
|
||||
|
||||
INSIST(isc_sockaddr_pf(&sa) == af);
|
||||
|
||||
/*
|
||||
* If we don't support this address family, we're done!
|
||||
*/
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
result = isc_net_probeipv4();
|
||||
break;
|
||||
case AF_INET6:
|
||||
result = isc_net_probeipv6();
|
||||
break;
|
||||
default:
|
||||
INSIST(0);
|
||||
}
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (ISC_R_SUCCESS);
|
||||
|
||||
if (isc_sockaddr_equal(&sa, any)) {
|
||||
/*
|
||||
* The query source is fully wild. No special dispatcher
|
||||
* work needs to be done.
|
||||
*/
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the interface manager has a dispatcher for this address,
|
||||
* use it.
|
||||
*/
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
server_dispatchp = &server->querysrc_dispatchv4;
|
||||
server_dispatchaddr = &server->querysrc_addressv4;
|
||||
break;
|
||||
case AF_INET6:
|
||||
server_dispatchp = &server->querysrc_dispatchv6;
|
||||
server_dispatchaddr = &server->querysrc_addressv6;
|
||||
break;
|
||||
default:
|
||||
INSIST(0);
|
||||
}
|
||||
if (ns_interfacemgr_findudpdispatcher(server->interfacemgr, &sa,
|
||||
dispatchp) !=
|
||||
ISC_R_SUCCESS) {
|
||||
/*
|
||||
* The interface manager doesn't have a matching dispatcher.
|
||||
*/
|
||||
if (*server_dispatchp != NULL) {
|
||||
/*
|
||||
* We've already got a custom dispatcher. If it is
|
||||
* compatible with the new configuration, use it.
|
||||
*/
|
||||
if (isc_sockaddr_equal(server_dispatchaddr,
|
||||
&sa)) {
|
||||
dns_dispatch_attach(*server_dispatchp,
|
||||
dispatchp);
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
/*
|
||||
* The existing custom dispatcher is not compatible.
|
||||
* We don't need it anymore.
|
||||
*/
|
||||
dns_dispatch_detach(server_dispatchp);
|
||||
}
|
||||
/*
|
||||
* Create a custom dispatcher.
|
||||
*/
|
||||
INSIST(*server_dispatchp == NULL);
|
||||
*server_dispatchaddr = sa;
|
||||
socket = NULL;
|
||||
result = isc_socket_create(ns_g_socketmgr, af,
|
||||
isc_sockettype_udp,
|
||||
&socket);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (result);
|
||||
result = isc_socket_bind(socket, &sa);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_socket_detach(&socket);
|
||||
return (result);
|
||||
}
|
||||
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,
|
||||
attrs, server_dispatchp);
|
||||
/*
|
||||
* Regardless of whether dns_dispatch_create() succeeded or
|
||||
* failed, we don't need to keep the reference to the socket.
|
||||
*/
|
||||
isc_socket_detach(&socket);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (result);
|
||||
dns_dispatch_attach(*server_dispatchp, dispatchp);
|
||||
} else {
|
||||
/*
|
||||
* We're sharing a UDP dispatcher with the interface manager
|
||||
* now. Any prior custom dispatcher can be discarded.
|
||||
*/
|
||||
if (*server_dispatchp != NULL)
|
||||
dns_dispatch_detach(server_dispatchp);
|
||||
}
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is called as soon as the 'options' statement has been
|
||||
* parsed.
|
||||
@@ -1190,11 +1136,6 @@ load_configuration(const char *filename, ns_server_t *server,
|
||||
NULL, &interval, ISC_FALSE);
|
||||
}
|
||||
|
||||
CHECK(configure_server_querysource(cctx, server,
|
||||
AF_INET, &dispatchv4));
|
||||
CHECK(configure_server_querysource(cctx, server,
|
||||
AF_INET6, &dispatchv6));
|
||||
|
||||
/*
|
||||
* Configure and freeze all explicit views. Explicit
|
||||
* views that have zones were already created at parsing
|
||||
@@ -1211,8 +1152,7 @@ load_configuration(const char *filename, ns_server_t *server,
|
||||
&lctx.viewlist, &view));
|
||||
INSIST(view != NULL);
|
||||
CHECK(configure_view(view, cctx, cview, ns_g_mctx,
|
||||
&aclconfctx,
|
||||
dispatchv4, dispatchv6));
|
||||
&aclconfctx));
|
||||
dns_view_freeze(view);
|
||||
dns_view_detach(&view);
|
||||
}
|
||||
@@ -1232,8 +1172,7 @@ load_configuration(const char *filename, ns_server_t *server,
|
||||
*/
|
||||
CHECK(find_or_create_view(NULL, &lctx.viewlist, &view));
|
||||
CHECK(configure_view(view, cctx, NULL,
|
||||
ns_g_mctx, &aclconfctx,
|
||||
dispatchv4, dispatchv6));
|
||||
ns_g_mctx, &aclconfctx));
|
||||
dns_view_freeze(view);
|
||||
dns_view_detach(&view);
|
||||
} else {
|
||||
@@ -1400,6 +1339,9 @@ run_server(isc_task_t *task, isc_event_t *event) {
|
||||
|
||||
isc_event_free(&event);
|
||||
|
||||
CHECKFATAL(dns_dispatchmgr_create(ns_g_mctx, &ns_g_dispatchmgr),
|
||||
"creating dispatch manager");
|
||||
|
||||
CHECKFATAL(ns_clientmgr_create(ns_g_mctx, ns_g_taskmgr, ns_g_timermgr,
|
||||
&server->clientmgr),
|
||||
"creating client manager");
|
||||
@@ -1446,16 +1388,14 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
|
||||
dns_view_detach(&view);
|
||||
}
|
||||
|
||||
if (server->querysrc_dispatchv4 != NULL)
|
||||
dns_dispatch_detach(&server->querysrc_dispatchv4);
|
||||
if (server->querysrc_dispatchv6 != NULL)
|
||||
dns_dispatch_detach(&server->querysrc_dispatchv6);
|
||||
ns_clientmgr_destroy(&server->clientmgr);
|
||||
isc_timer_detach(&server->interface_timer);
|
||||
|
||||
ns_interfacemgr_shutdown(server->interfacemgr);
|
||||
ns_interfacemgr_detach(&server->interfacemgr);
|
||||
|
||||
dns_dispatchmgr_destroy(&ns_g_dispatchmgr);
|
||||
|
||||
dns_zonemgr_shutdown(server->zonemgr);
|
||||
dns_zonemgr_detach(&server->zonemgr);
|
||||
|
||||
@@ -1518,8 +1458,6 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) {
|
||||
server->tkeyctx = NULL;
|
||||
CHECKFATAL(dns_tkeyctx_create(ns_g_mctx, &server->tkeyctx),
|
||||
"creating TKEY context");
|
||||
server->querysrc_dispatchv4 = NULL;
|
||||
server->querysrc_dispatchv6 = NULL;
|
||||
|
||||
/*
|
||||
* Setup the server task, which is responsible for coordinating
|
||||
@@ -1550,8 +1488,6 @@ ns_server_destroy(ns_server_t **serverp) {
|
||||
ns_server_t *server = *serverp;
|
||||
REQUIRE(NS_SERVER_VALID(server));
|
||||
|
||||
REQUIRE(server->querysrc_dispatchv4 == NULL);
|
||||
REQUIRE(server->querysrc_dispatchv6 == NULL);
|
||||
if (server->tkeyctx != NULL)
|
||||
dns_tkeyctx_destroy(&server->tkeyctx);
|
||||
|
||||
|
@@ -21,34 +21,37 @@
|
||||
#include <unistd.h>
|
||||
|
||||
#include <isc/app.h>
|
||||
#include <isc/log.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/string.h>
|
||||
#include <isc/task.h>
|
||||
#include <isc/util.h>
|
||||
|
||||
#include <dns/dispatch.h>
|
||||
#include <dns/log.h>
|
||||
#include <dns/rdatalist.h>
|
||||
#include <dns/rdataset.h>
|
||||
#include <dns/result.h>
|
||||
|
||||
#include "printmsg.h"
|
||||
|
||||
#define NCLIENTS 16
|
||||
|
||||
typedef struct {
|
||||
unsigned int client_number;
|
||||
int count;
|
||||
dns_dispentry_t *resp;
|
||||
isc_buffer_t render;
|
||||
unsigned char render_buffer[1024];
|
||||
dns_rdataset_t rdataset;
|
||||
dns_rdatalist_t rdatalist;
|
||||
dns_dispentry_t *resp;
|
||||
} clictx_t;
|
||||
|
||||
isc_mem_t *mctx;
|
||||
isc_taskmgr_t *manager;
|
||||
isc_taskmgr_t *taskmgr;
|
||||
isc_socketmgr_t *socketmgr;
|
||||
dns_dispatchmgr_t *dispatchmgr;
|
||||
dns_dispatch_t *disp;
|
||||
isc_task_t *t0, *t1, *t2;
|
||||
clictx_t clients[16]; /* Lots of things might want to use this. */
|
||||
isc_task_t *t0;
|
||||
clictx_t clients[NCLIENTS]; /* Lots of things might want to use this. */
|
||||
unsigned int client_count = 0;
|
||||
isc_mutex_t client_lock;
|
||||
|
||||
@@ -102,7 +105,7 @@ send_done(isc_task_t *task, isc_event_t *ev_in) {
|
||||
isc_event_free(&ev_in);
|
||||
|
||||
printf("--- removing response (FAILURE)\n");
|
||||
dns_dispatch_removeresponse(disp, &cli->resp, NULL);
|
||||
dns_dispatch_removeresponse(&cli->resp, NULL);
|
||||
isc_app_shutdown();
|
||||
}
|
||||
|
||||
@@ -117,6 +120,8 @@ start_response(clictx_t *cli, char *query, isc_task_t *task) {
|
||||
isc_buffer_t target;
|
||||
isc_buffer_t source;
|
||||
isc_region_t region;
|
||||
dns_rdataset_t *rdataset;
|
||||
dns_rdatalist_t *rdatalist;
|
||||
|
||||
isc_buffer_init(&source, query, strlen(query));
|
||||
isc_buffer_add(&source, strlen(query));
|
||||
@@ -148,16 +153,28 @@ start_response(clictx_t *cli, char *query, isc_task_t *task) {
|
||||
|
||||
dns_message_addname(msg, name, DNS_SECTION_QUESTION);
|
||||
|
||||
cli->rdatalist.rdclass = dns_rdataclass_in;
|
||||
cli->rdatalist.type = dns_rdatatype_a;
|
||||
cli->rdatalist.ttl = 0;
|
||||
ISC_LIST_INIT(cli->rdatalist.rdata);
|
||||
rdataset = NULL;
|
||||
result = dns_message_gettemprdataset(msg, &rdataset);
|
||||
CHECKRESULT(result, "dns_message_gettemprdataset()");
|
||||
|
||||
dns_rdataset_init(&cli->rdataset);
|
||||
result = dns_rdatalist_tordataset(&cli->rdatalist, &cli->rdataset);
|
||||
rdatalist = NULL;
|
||||
result = dns_message_gettemprdatalist(msg, &rdatalist);
|
||||
CHECKRESULT(result, "dns_message_gettemprdatalist()");
|
||||
|
||||
dns_rdatalist_init(rdatalist);
|
||||
rdatalist->rdclass = dns_rdataclass_in;
|
||||
rdatalist->type = dns_rdatatype_a;
|
||||
rdatalist->ttl = 0;
|
||||
ISC_LIST_INIT(rdatalist->rdata);
|
||||
|
||||
dns_rdataset_init(rdataset);
|
||||
result = dns_rdatalist_tordataset(rdatalist, rdataset);
|
||||
CHECKRESULT(result, "dns_rdatalist_tordataset()");
|
||||
rdataset->attributes |= DNS_RDATASETATTR_QUESTION;
|
||||
|
||||
ISC_LIST_APPEND(name->list, &cli->rdataset, link);
|
||||
ISC_LIST_APPEND(name->list, rdataset, link);
|
||||
rdataset = NULL;
|
||||
rdatalist = NULL;
|
||||
|
||||
result = printmessage(msg);
|
||||
CHECKRESULT(result, "printmessage()");
|
||||
@@ -167,8 +184,6 @@ start_response(clictx_t *cli, char *query, isc_task_t *task) {
|
||||
result = dns_message_renderbegin(msg, &cli->render);
|
||||
CHECKRESULT(result, "dns_message_renderbegin()");
|
||||
|
||||
cli->rdataset.attributes |= DNS_RDATASETATTR_QUESTION;
|
||||
|
||||
result = dns_message_rendersection(msg, DNS_SECTION_QUESTION, 0);
|
||||
CHECKRESULT(result, "dns_message_rendersection(QUESTION)");
|
||||
|
||||
@@ -226,7 +241,7 @@ got_response(isc_task_t *task, isc_event_t *ev_in) {
|
||||
printf("--- shutting down dispatcher\n");
|
||||
dns_dispatch_cancel(disp);
|
||||
printf("--- removing response\n");
|
||||
dns_dispatch_removeresponse(disp, &resp, &ev);
|
||||
dns_dispatch_removeresponse(&resp, &ev);
|
||||
RUNTIME_CHECK(isc_mutex_lock(&client_lock) == ISC_R_SUCCESS);
|
||||
INSIST(client_count > 0);
|
||||
client_count--;
|
||||
@@ -252,7 +267,7 @@ got_response(isc_task_t *task, isc_event_t *ev_in) {
|
||||
printf("--- shutting down dispatcher\n");
|
||||
dns_dispatch_cancel(disp);
|
||||
printf("--- removing response\n");
|
||||
dns_dispatch_removeresponse(disp, &resp, &ev);
|
||||
dns_dispatch_removeresponse(&resp, &ev);
|
||||
RUNTIME_CHECK(isc_mutex_lock(&client_lock) == ISC_R_SUCCESS);
|
||||
INSIST(client_count > 0);
|
||||
client_count--;
|
||||
@@ -269,6 +284,8 @@ got_request(isc_task_t *task, isc_event_t *ev_in) {
|
||||
dns_message_t *msg;
|
||||
isc_result_t result;
|
||||
unsigned int cnt;
|
||||
unsigned char text[8192];
|
||||
isc_buffer_t textbuf;
|
||||
|
||||
printf("App: Got request. Result: %s\n",
|
||||
isc_result_totext(ev->result));
|
||||
@@ -277,7 +294,7 @@ got_request(isc_task_t *task, isc_event_t *ev_in) {
|
||||
RUNTIME_CHECK(isc_mutex_lock(&client_lock) == ISC_R_SUCCESS);
|
||||
printf("Got error, terminating CLIENT %p resp %p\n",
|
||||
cli, cli->resp);
|
||||
dns_dispatch_removerequest(disp, &cli->resp, &ev);
|
||||
dns_dispatch_removerequest(&cli->resp, &ev);
|
||||
INSIST(client_count > 0);
|
||||
client_count--;
|
||||
cnt = client_count;
|
||||
@@ -297,14 +314,20 @@ got_request(isc_task_t *task, isc_event_t *ev_in) {
|
||||
result = dns_message_parse(msg, &ev->buffer, ISC_FALSE);
|
||||
CHECKRESULT(result, "dns_message_parse() failed");
|
||||
|
||||
result = printmessage(msg);
|
||||
CHECKRESULT(result, "printmessage() failed");
|
||||
isc_buffer_init(&textbuf, text, sizeof text);
|
||||
result = dns_message_totext(msg, ISC_TRUE, ISC_TRUE,
|
||||
ISC_FALSE, ISC_FALSE, &textbuf);
|
||||
CHECKRESULT(result, "dns_message_totext() failed");
|
||||
|
||||
dns_message_destroy(&msg);
|
||||
|
||||
sleep (1);
|
||||
fprintf(stderr, "msg:\n%*s\n",
|
||||
isc_buffer_usedlength(&textbuf),
|
||||
isc_buffer_base(&textbuf));
|
||||
|
||||
cli->count++;
|
||||
printf("App: Client %p ready, count == %d.\n", cli, cli->count);
|
||||
printf("App: Client %p(%u) ready, count == %d.\n",
|
||||
cli, cli->client_number, cli->count);
|
||||
switch (cli->count) {
|
||||
case 4:
|
||||
printf("--- starting DNS lookup\n");
|
||||
@@ -316,7 +339,7 @@ got_request(isc_task_t *task, isc_event_t *ev_in) {
|
||||
|
||||
case 2:
|
||||
printf("--- removing request\n");
|
||||
dns_dispatch_removerequest(disp, &cli->resp, &ev);
|
||||
dns_dispatch_removerequest(&cli->resp, &ev);
|
||||
printf("--- adding request\n");
|
||||
RUNTIME_CHECK(dns_dispatch_addrequest(disp, task, got_request,
|
||||
cli, &cli->resp)
|
||||
@@ -331,12 +354,16 @@ got_request(isc_task_t *task, isc_event_t *ev_in) {
|
||||
|
||||
int
|
||||
main(int argc, char *argv[]) {
|
||||
isc_socket_t *s0;
|
||||
isc_sockaddr_t sockaddr;
|
||||
isc_sockaddr_t sa;
|
||||
unsigned int i;
|
||||
unsigned int attrs;
|
||||
isc_log_t *log;
|
||||
isc_logconfig_t *lcfg;
|
||||
isc_logdestination_t destination;
|
||||
isc_result_t result;
|
||||
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
UNUSED(argc);
|
||||
UNUSED(argv);
|
||||
|
||||
RUNTIME_CHECK(isc_app_start() == ISC_R_SUCCESS);
|
||||
|
||||
@@ -348,89 +375,121 @@ main(int argc, char *argv[]) {
|
||||
|
||||
dns_result_register();
|
||||
|
||||
log = NULL;
|
||||
lcfg = NULL;
|
||||
RUNTIME_CHECK(isc_log_create(mctx, &log, &lcfg) == ISC_R_SUCCESS);
|
||||
isc_log_setcontext(log);
|
||||
dns_log_init(log);
|
||||
dns_log_setcontext(log);
|
||||
|
||||
destination.file.stream = stderr;
|
||||
destination.file.name = NULL;
|
||||
destination.file.versions = ISC_LOG_ROLLNEVER;
|
||||
destination.file.maximum_size = 0;
|
||||
result = isc_log_createchannel(lcfg, "_default",
|
||||
ISC_LOG_TOFILEDESC,
|
||||
ISC_LOG_DYNAMIC,
|
||||
&destination, ISC_LOG_PRINTTIME);
|
||||
INSIST(result == ISC_R_SUCCESS);
|
||||
result = isc_log_usechannel(lcfg, "_default", NULL, NULL);
|
||||
INSIST(result == ISC_R_SUCCESS);
|
||||
|
||||
/*
|
||||
* The task manager is independent (other than memory context).
|
||||
*/
|
||||
manager = NULL;
|
||||
RUNTIME_CHECK(isc_taskmgr_create(mctx, 5, 0, &manager) ==
|
||||
taskmgr = NULL;
|
||||
RUNTIME_CHECK(isc_taskmgr_create(mctx, 5, 0, &taskmgr) ==
|
||||
ISC_R_SUCCESS);
|
||||
|
||||
isc_log_setdebuglevel(log, 99);
|
||||
|
||||
t0 = NULL;
|
||||
RUNTIME_CHECK(isc_task_create(manager, 0, &t0) == ISC_R_SUCCESS);
|
||||
t1 = NULL;
|
||||
RUNTIME_CHECK(isc_task_create(manager, 0, &t1) == ISC_R_SUCCESS);
|
||||
t2 = NULL;
|
||||
RUNTIME_CHECK(isc_task_create(manager, 0, &t2) == ISC_R_SUCCESS);
|
||||
RUNTIME_CHECK(isc_task_create(taskmgr, 0, &t0) == ISC_R_SUCCESS);
|
||||
|
||||
socketmgr = NULL;
|
||||
RUNTIME_CHECK(isc_socketmgr_create(mctx, &socketmgr) == ISC_R_SUCCESS);
|
||||
|
||||
/*
|
||||
* Open up a random socket. Who cares where.
|
||||
*/
|
||||
s0 = NULL;
|
||||
memset(&sockaddr, 0, sizeof(sockaddr));
|
||||
sockaddr.type.sin.sin_family = AF_INET;
|
||||
sockaddr.type.sin.sin_port = htons(5555);
|
||||
sockaddr.length = sizeof (struct sockaddr_in);
|
||||
RUNTIME_CHECK(isc_socket_create(socketmgr, PF_INET,
|
||||
isc_sockettype_udp, &s0) ==
|
||||
ISC_R_SUCCESS);
|
||||
RUNTIME_CHECK(isc_socket_bind(s0, &sockaddr) == ISC_R_SUCCESS);
|
||||
|
||||
dispatchmgr = NULL;
|
||||
RUNTIME_CHECK(dns_dispatchmgr_create(mctx, &dispatchmgr)
|
||||
== ISC_R_SUCCESS);
|
||||
|
||||
isc_sockaddr_any(&sa);
|
||||
isc_sockaddr_setport(&sa, 5356);
|
||||
|
||||
/*
|
||||
* Create a dispatch context.
|
||||
* Get or create a dispatch context.
|
||||
*/
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
attrs |= DNS_DISPATCHATTR_UDP;
|
||||
|
||||
disp = NULL;
|
||||
RUNTIME_CHECK(dns_dispatch_create(dispatchmgr, s0, t0, 512, 6, 1024,
|
||||
17, 19, NULL, 0, &disp)
|
||||
RUNTIME_CHECK(dns_dispatch_getudp(dispatchmgr, socketmgr,
|
||||
taskmgr, &sa, 512, 6, 1024,
|
||||
17, 19, attrs, attrs, &disp)
|
||||
== ISC_R_SUCCESS);
|
||||
INSIST(disp != NULL);
|
||||
|
||||
RUNTIME_CHECK(isc_mutex_init(&client_lock) == ISC_R_SUCCESS);
|
||||
RUNTIME_CHECK(isc_mutex_lock(&client_lock) == ISC_R_SUCCESS);
|
||||
|
||||
memset(clients, 0, sizeof (clients));
|
||||
for (i = 0 ; i < NCLIENTS ; i++)
|
||||
clients[i].client_number = i;
|
||||
|
||||
for (i = 0 ; i < 2 ; i++) {
|
||||
clients[i].count = 0;
|
||||
clients[i].resp = NULL;
|
||||
RUNTIME_CHECK(dns_dispatch_addrequest(disp, t1, got_request,
|
||||
RUNTIME_CHECK(dns_dispatch_addrequest(disp, t0, got_request,
|
||||
&clients[i],
|
||||
&clients[i].resp)
|
||||
== ISC_R_SUCCESS);
|
||||
INSIST(clients[i].resp != NULL);
|
||||
fprintf(stderr, "Started client %i via addrequest\n", i);
|
||||
client_count++;
|
||||
}
|
||||
RUNTIME_CHECK(isc_mutex_unlock(&client_lock) == ISC_R_SUCCESS);
|
||||
|
||||
isc_mem_stats(mctx, stderr);
|
||||
|
||||
isc_app_run();
|
||||
|
||||
fprintf(stderr, "canceling dispatcher\n");
|
||||
isc_mem_stats(mctx, stderr);
|
||||
sleep(2);
|
||||
dns_dispatch_cancel(disp);
|
||||
|
||||
fprintf(stderr, "detaching from socket\n");
|
||||
isc_socket_detach(&s0);
|
||||
|
||||
INSIST(disp != NULL);
|
||||
fprintf(stderr, "detaching from dispatcher\n");
|
||||
isc_mem_stats(mctx, stderr);
|
||||
sleep(2);
|
||||
dns_dispatch_detach(&disp);
|
||||
|
||||
fprintf(stderr, "destroying dispatch manager\n");
|
||||
isc_mem_stats(mctx, stderr);
|
||||
sleep(2);
|
||||
dns_dispatchmgr_destroy(&dispatchmgr);
|
||||
|
||||
fprintf(stderr, "Destroying socket manager\n");
|
||||
isc_mem_stats(mctx, stderr);
|
||||
sleep(2);
|
||||
isc_socketmgr_destroy(&socketmgr);
|
||||
|
||||
isc_task_shutdown(t0);
|
||||
isc_task_detach(&t0);
|
||||
isc_task_shutdown(t1);
|
||||
isc_task_detach(&t1);
|
||||
isc_task_shutdown(t2);
|
||||
isc_task_detach(&t2);
|
||||
|
||||
fprintf(stderr, "Destroying task manager\n");
|
||||
isc_taskmgr_destroy(&manager);
|
||||
|
||||
isc_mem_stats(mctx, stderr);
|
||||
isc_mem_destroy(&mctx);
|
||||
sleep(2);
|
||||
isc_taskmgr_destroy(&taskmgr);
|
||||
|
||||
isc_app_finish();
|
||||
|
||||
isc_log_destroy(&log);
|
||||
sleep(2);
|
||||
isc_mem_stats(mctx, stderr);
|
||||
fflush(stderr);
|
||||
isc_mem_detach(&mctx);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -85,21 +85,6 @@ struct dns_dispatchevent {
|
||||
isc_uint32_t attributes; /* mirrored from socket.h */
|
||||
};
|
||||
|
||||
/*
|
||||
* Functions to:
|
||||
*
|
||||
* Return if a packet is a query or a response,
|
||||
* Hash IDs,
|
||||
* Generate a new random ID,
|
||||
* Compare entries (IDs) for equality,
|
||||
*/
|
||||
struct dns_dispatchmethods {
|
||||
isc_uint32_t (*randomid)(dns_dispatch_t *);
|
||||
isc_uint32_t (*hash)(dns_dispatch_t *, isc_sockaddr_t *,
|
||||
isc_uint32_t);
|
||||
};
|
||||
typedef struct dns_dispatchmethods dns_dispatchmethods_t;
|
||||
|
||||
/*
|
||||
* Attributes for added dispatchers.
|
||||
*
|
||||
@@ -124,11 +109,6 @@ typedef struct dns_dispatchmethods dns_dispatchmethods_t;
|
||||
* _MAKEQUERY
|
||||
* The dispatcher can be used to issue queries to other servers, and
|
||||
* accept replies from them.
|
||||
*
|
||||
* _CONNECTED
|
||||
* The socket the dispatcher uses is a connected socket, and can
|
||||
* only send to a specific host. This will disallow wildcarded
|
||||
* remote addresses.
|
||||
*/
|
||||
#define DNS_DISPATCHATTR_PRIVATE 0x00000001U
|
||||
#define DNS_DISPATCHATTR_TCP 0x00000002U
|
||||
@@ -197,16 +177,24 @@ dns_dispatchmgr_find(dns_dispatchmgr_t *mgr,
|
||||
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_create(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
|
||||
isc_task_t *task, unsigned int maxbuffersize,
|
||||
dns_dispatch_getudp(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr,
|
||||
isc_taskmgr_t *taskmgr, isc_sockaddr_t *localaddr,
|
||||
unsigned int buffersize,
|
||||
unsigned int maxbuffers, unsigned int maxrequests,
|
||||
unsigned int buckets, unsigned int increment,
|
||||
dns_dispatchmethods_t *methods, unsigned int attributes,
|
||||
unsigned int attributes, unsigned int mask,
|
||||
dns_dispatch_t **dispp);
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_createtcp(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
|
||||
isc_taskmgr_t *taskmgr, unsigned int buffersize,
|
||||
unsigned int maxbuffers, unsigned int maxrequests,
|
||||
unsigned int buckets, unsigned int increment,
|
||||
unsigned int attributes, dns_dispatch_t **dispp);
|
||||
/*
|
||||
* Create a new dns_dispatch and attach it to the provided isc_socket_t.
|
||||
*
|
||||
* For all dispatches, "maxbuffersize" is the maximum packet size we will
|
||||
* For all dispatches, "buffersize" is the maximum packet size we will
|
||||
* accept.
|
||||
*
|
||||
* "maxbuffers" and "maxrequests" control the number of buffers in the
|
||||
@@ -218,10 +206,6 @@ dns_dispatch_create(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
|
||||
* "increment" is used in a collision avoidance function, and needs to be
|
||||
* a prime > buckets, and not 2.
|
||||
*
|
||||
* "methods" be NULL for normal DNS wire format, or all elements in that
|
||||
* structure be filled in with function pointers to control dispatch
|
||||
* behavior.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
* mgr is a valid dispatch manager.
|
||||
@@ -313,7 +297,7 @@ dns_dispatch_addresponse(dns_dispatch_t *disp, isc_sockaddr_t *dest,
|
||||
|
||||
|
||||
void
|
||||
dns_dispatch_removeresponse(dns_dispatch_t *disp, dns_dispentry_t **resp,
|
||||
dns_dispatch_removeresponse(dns_dispentry_t **resp,
|
||||
dns_dispatchevent_t **sockevent);
|
||||
/*
|
||||
* Stops the flow of responses for the provided id and destination.
|
||||
@@ -353,7 +337,7 @@ dns_dispatch_addrequest(dns_dispatch_t *disp,
|
||||
|
||||
|
||||
void
|
||||
dns_dispatch_removerequest(dns_dispatch_t *disp, dns_dispentry_t **resp,
|
||||
dns_dispatch_removerequest(dns_dispentry_t **resp,
|
||||
dns_dispatchevent_t **sockevent);
|
||||
/*
|
||||
* Stops the flow of requests for the provided id and destination.
|
||||
|
@@ -56,7 +56,7 @@ ISC_LANG_BEGINDECLS
|
||||
|
||||
isc_result_t
|
||||
dns_requestmgr_create(isc_mem_t *mctx, isc_timermgr_t *timermgr,
|
||||
isc_socketmgr_t *socketmgr,
|
||||
isc_socketmgr_t *socketmgr, isc_taskmgr_t *taskmgr,
|
||||
dns_dispatchmgr_t *dispatchmgr,
|
||||
dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6,
|
||||
dns_requestmgr_t **requestmgrp);
|
||||
@@ -71,6 +71,8 @@ dns_requestmgr_create(isc_mem_t *mctx, isc_timermgr_t *timermgr,
|
||||
*
|
||||
* 'socketmgr' is a valid socket manager.
|
||||
*
|
||||
* 'taskmgr' is a valid task manager.
|
||||
*
|
||||
* 'dispatchv4' is a valid dispatcher with an IPv4 UDP socket, or is NULL.
|
||||
*
|
||||
* 'dispatchv6' is a valid dispatcher with an IPv6 UDP socket, or is NULL.
|
||||
|
@@ -351,6 +351,9 @@ 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);
|
||||
|
||||
ISC_LANG_ENDDECLS
|
||||
|
||||
#endif /* DNS_RESOLVER_H */
|
||||
|
@@ -51,6 +51,7 @@ struct dns_requestmgr {
|
||||
isc_int32_t iref;
|
||||
isc_timermgr_t *timermgr;
|
||||
isc_socketmgr_t *socketmgr;
|
||||
isc_taskmgr_t *taskmgr;
|
||||
dns_dispatchmgr_t *dispatchmgr;
|
||||
dns_dispatch_t *dispatchv4;
|
||||
dns_dispatch_t *dispatchv6;
|
||||
@@ -111,6 +112,7 @@ isc_result_t
|
||||
dns_requestmgr_create(isc_mem_t *mctx,
|
||||
isc_timermgr_t *timermgr,
|
||||
isc_socketmgr_t *socketmgr,
|
||||
isc_taskmgr_t *taskmgr,
|
||||
dns_dispatchmgr_t *dispatchmgr,
|
||||
dns_dispatch_t *dispatchv4,
|
||||
dns_dispatch_t *dispatchv6,
|
||||
@@ -126,6 +128,7 @@ dns_requestmgr_create(isc_mem_t *mctx,
|
||||
REQUIRE(requestmgrp != NULL && *requestmgrp == NULL);
|
||||
REQUIRE(timermgr != NULL);
|
||||
REQUIRE(socketmgr != NULL);
|
||||
REQUIRE(taskmgr != NULL);
|
||||
REQUIRE(dispatchmgr != NULL);
|
||||
if (dispatchv4 != NULL) {
|
||||
socket = dns_dispatch_getsocket(dispatchv4);
|
||||
@@ -157,6 +160,7 @@ dns_requestmgr_create(isc_mem_t *mctx,
|
||||
}
|
||||
requestmgr->timermgr = timermgr;
|
||||
requestmgr->socketmgr = socketmgr;
|
||||
requestmgr->taskmgr = taskmgr;
|
||||
requestmgr->dispatchmgr = dispatchmgr;
|
||||
requestmgr->dispatchv4 = NULL;
|
||||
if (dispatchv4 != NULL)
|
||||
@@ -492,9 +496,9 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
|
||||
else
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
result = dns_dispatch_create(requestmgr->dispatchmgr,
|
||||
socket, task,
|
||||
4096, 2, 1, 1, 3, NULL, attrs,
|
||||
result = dns_dispatch_createtcp(requestmgr->dispatchmgr,
|
||||
socket, requestmgr->taskmgr,
|
||||
4096, 2, 1, 1, 3, attrs,
|
||||
&request->dispatch);
|
||||
isc_socket_detach(&socket);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
@@ -530,8 +534,7 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
|
||||
* Try again using TCP.
|
||||
*/
|
||||
dns_message_renderreset(message);
|
||||
dns_dispatch_removeresponse(request->dispatch,
|
||||
&request->dispentry, NULL);
|
||||
dns_dispatch_removeresponse(&request->dispentry, NULL);
|
||||
dns_dispatch_detach(&request->dispatch);
|
||||
socket = NULL;
|
||||
isc_buffer_free(&request->query);
|
||||
@@ -589,8 +592,7 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
|
||||
if (request->requestmgr != NULL)
|
||||
requestmgr_detach(&request->requestmgr);
|
||||
if (request->dispentry != NULL)
|
||||
dns_dispatch_removeresponse(request->dispatch,
|
||||
&request->dispentry, NULL);
|
||||
dns_dispatch_removeresponse(&request->dispentry, NULL);
|
||||
if (request->dispatch != NULL)
|
||||
dns_dispatch_detach(&request->dispatch);
|
||||
if (request->event != NULL)
|
||||
@@ -819,8 +821,7 @@ req_response(isc_task_t *task, isc_event_t *event) {
|
||||
/*
|
||||
* Cleanup.
|
||||
*/
|
||||
dns_dispatch_removeresponse(request->dispatch, &request->dispentry,
|
||||
&devent);
|
||||
dns_dispatch_removeresponse(&request->dispentry, &devent);
|
||||
req_cancel(request);
|
||||
/*
|
||||
* Send completion event.
|
||||
@@ -878,8 +879,7 @@ req_destroy(dns_request_t *request) {
|
||||
if (request->event != NULL)
|
||||
isc_event_free((isc_event_t **)&request->event);
|
||||
if (request->dispentry != NULL)
|
||||
dns_dispatch_removeresponse(request->dispatch,
|
||||
&request->dispentry, NULL);
|
||||
dns_dispatch_removeresponse(&request->dispentry, NULL);
|
||||
if (request->dispatch != NULL)
|
||||
dns_dispatch_detach(&request->dispatch);
|
||||
if (request->timer != NULL)
|
||||
@@ -906,8 +906,7 @@ req_cancel(dns_request_t *request) {
|
||||
if (request->timer != NULL)
|
||||
isc_timer_detach(&request->timer);
|
||||
if (request->dispentry != NULL)
|
||||
dns_dispatch_removeresponse(request->dispatch,
|
||||
&request->dispentry, NULL);
|
||||
dns_dispatch_removeresponse(&request->dispentry, NULL);
|
||||
if (DNS_REQUEST_CONNECTING(request)) {
|
||||
socket = dns_dispatch_getsocket(request->dispatch);
|
||||
isc_socket_cancel(socket, NULL, ISC_SOCKCANCEL_CONNECT);
|
||||
|
@@ -209,13 +209,12 @@ struct dns_resolver {
|
||||
dns_rdataclass_t rdclass;
|
||||
isc_socketmgr_t * socketmgr;
|
||||
isc_timermgr_t * timermgr;
|
||||
isc_taskmgr_t * taskmgr;
|
||||
dns_view_t * view;
|
||||
isc_boolean_t frozen;
|
||||
isc_sockaddrlist_t forwarders;
|
||||
dns_fwdpolicy_t fwdpolicy;
|
||||
unsigned int options;
|
||||
isc_socket_t * udpsocketv4;
|
||||
isc_socket_t * udpsocketv6;
|
||||
dns_dispatchmgr_t * dispatchmgr;
|
||||
dns_dispatch_t * dispatchv4;
|
||||
dns_dispatch_t * dispatchv6;
|
||||
@@ -377,8 +376,7 @@ fctx_cancelquery(resquery_t **queryp, dns_dispatchevent_t **deventp,
|
||||
}
|
||||
|
||||
if (query->dispentry != NULL)
|
||||
dns_dispatch_removeresponse(query->dispatch, &query->dispentry,
|
||||
deventp);
|
||||
dns_dispatch_removeresponse(&query->dispentry, deventp);
|
||||
ISC_LIST_UNLINK(fctx->queries, query, link);
|
||||
if (query->tsig != NULL) {
|
||||
dns_rdata_freestruct(query->tsig);
|
||||
@@ -967,9 +965,7 @@ resquery_send(resquery_t *query) {
|
||||
/*
|
||||
* Stop the dispatcher from listening.
|
||||
*/
|
||||
dns_dispatch_removeresponse(query->dispatch,
|
||||
&query->dispentry,
|
||||
NULL);
|
||||
dns_dispatch_removeresponse(&query->dispentry, NULL);
|
||||
|
||||
cleanup_temps:
|
||||
if (qname != NULL)
|
||||
@@ -1028,14 +1024,17 @@ resquery_connected(isc_task_t *task, isc_event_t *event) {
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
|
||||
result = dns_dispatch_create(query->dispatchmgr,
|
||||
query->tcpsocket, task,
|
||||
4096, 2, 1, 1, 3, NULL, attrs,
|
||||
result = dns_dispatch_createtcp(query->dispatchmgr,
|
||||
query->tcpsocket,
|
||||
query->fctx->res->taskmgr,
|
||||
4096, 2, 1, 1, 3,
|
||||
attrs,
|
||||
&query->dispatch);
|
||||
|
||||
/*
|
||||
* Regardless of whether dns_dispatch_create() succeeded or
|
||||
* not, we don't need our reference to the socket anymore.
|
||||
* Regardless of whether dns_dispatch_create()
|
||||
* succeeded or not, we don't need our reference
|
||||
* to the socket anymore.
|
||||
*/
|
||||
isc_socket_detach(&query->tcpsocket);
|
||||
|
||||
@@ -3904,12 +3903,8 @@ destroy(dns_resolver_t *res) {
|
||||
res->nbuckets * sizeof (fctxbucket_t));
|
||||
if (res->dispatchv4 != NULL)
|
||||
dns_dispatch_detach(&res->dispatchv4);
|
||||
if (res->udpsocketv4 != NULL)
|
||||
isc_socket_detach(&res->udpsocketv4);
|
||||
if (res->dispatchv6 != NULL)
|
||||
dns_dispatch_detach(&res->dispatchv6);
|
||||
if (res->udpsocketv6 != NULL)
|
||||
isc_socket_detach(&res->udpsocketv6);
|
||||
free_forwarders(res);
|
||||
res->magic = 0;
|
||||
isc_mem_put(res->mctx, res, sizeof *res);
|
||||
@@ -3964,7 +3959,6 @@ dns_resolver_create(dns_view_t *view,
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
unsigned int i, buckets_created = 0;
|
||||
char name[16];
|
||||
unsigned int attrs;
|
||||
|
||||
/*
|
||||
* Create a resolver.
|
||||
@@ -3974,6 +3968,7 @@ dns_resolver_create(dns_view_t *view,
|
||||
REQUIRE(ntasks > 0);
|
||||
REQUIRE(resp != NULL && *resp == NULL);
|
||||
REQUIRE(dispatchmgr != NULL);
|
||||
REQUIRE(dispatchv4 != NULL || dispatchv6 != NULL);
|
||||
|
||||
res = isc_mem_get(view->mctx, sizeof *res);
|
||||
if (res == NULL)
|
||||
@@ -3983,6 +3978,7 @@ dns_resolver_create(dns_view_t *view,
|
||||
res->rdclass = view->rdclass;
|
||||
res->socketmgr = socketmgr;
|
||||
res->timermgr = timermgr;
|
||||
res->taskmgr = taskmgr;
|
||||
res->dispatchmgr = dispatchmgr;
|
||||
res->view = view;
|
||||
res->options = options;
|
||||
@@ -4012,80 +4008,12 @@ dns_resolver_create(dns_view_t *view,
|
||||
buckets_created++;
|
||||
}
|
||||
|
||||
/*
|
||||
* IPv4 Dispatcher.
|
||||
*/
|
||||
res->dispatchv4 = NULL;
|
||||
res->udpsocketv4 = NULL;
|
||||
if (dispatchv4 != NULL) {
|
||||
if (dispatchv4 != NULL)
|
||||
dns_dispatch_attach(dispatchv4, &res->dispatchv4);
|
||||
} else if (isc_net_probeipv4() == ISC_R_SUCCESS) {
|
||||
isc_sockaddr_t saddr;
|
||||
|
||||
/*
|
||||
* Create an IPv4 UDP socket and a dispatcher for it.
|
||||
*/
|
||||
result = isc_socket_create(socketmgr, AF_INET,
|
||||
isc_sockettype_udp,
|
||||
&res->udpsocketv4);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup_buckets;
|
||||
isc_sockaddr_any(&saddr);
|
||||
#if 1 /* XXXMLG */
|
||||
result = isc_socket_bind(res->udpsocketv4, &saddr);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup_udpsocketv4;
|
||||
#endif
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_UDP;
|
||||
attrs |= DNS_DISPATCHATTR_PRIVATE;
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
result = dns_dispatch_create(res->dispatchmgr,
|
||||
res->udpsocketv4,
|
||||
res->buckets[0].task, 4096,
|
||||
1000, 32768, 16411, 16433, NULL,
|
||||
attrs, &res->dispatchv4);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup_udpsocketv4;
|
||||
}
|
||||
|
||||
/*
|
||||
* IPv6 Dispatcher.
|
||||
*/
|
||||
res->dispatchv6 = NULL;
|
||||
res->udpsocketv6 = NULL;
|
||||
if (dispatchv6 != NULL) {
|
||||
if (dispatchv6 != NULL)
|
||||
dns_dispatch_attach(dispatchv6, &res->dispatchv6);
|
||||
} else if (isc_net_probeipv6() == ISC_R_SUCCESS) {
|
||||
isc_sockaddr_t saddr;
|
||||
/*
|
||||
* Create an IPv6 UDP socket and a dispatcher for it.
|
||||
*/
|
||||
result = isc_socket_create(socketmgr, AF_INET6,
|
||||
isc_sockettype_udp,
|
||||
&res->udpsocketv6);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup_dispatchv4;
|
||||
isc_sockaddr_any6(&saddr);
|
||||
#if 1 /* XXXMLG */
|
||||
result = isc_socket_bind(res->udpsocketv6, &saddr);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup_udpsocketv6;
|
||||
#endif
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_UDP;
|
||||
attrs |= DNS_DISPATCHATTR_PRIVATE;
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
result = dns_dispatch_create(res->dispatchmgr,
|
||||
res->udpsocketv6,
|
||||
res->buckets[0].task, 4096,
|
||||
1000, 32768, 16411, 16433, NULL,
|
||||
attrs, &res->dispatchv6);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup_udpsocketv6;
|
||||
}
|
||||
|
||||
/*
|
||||
* Forwarding.
|
||||
@@ -4102,7 +4030,7 @@ dns_resolver_create(dns_view_t *view,
|
||||
|
||||
result = isc_mutex_init(&res->lock);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup_dispatchv6;
|
||||
goto cleanup_dispatches;
|
||||
|
||||
res->magic = RES_MAGIC;
|
||||
|
||||
@@ -4110,22 +4038,12 @@ dns_resolver_create(dns_view_t *view,
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
|
||||
cleanup_dispatchv6:
|
||||
cleanup_dispatches:
|
||||
if (res->dispatchv6 != NULL)
|
||||
dns_dispatch_detach(&res->dispatchv6);
|
||||
|
||||
cleanup_udpsocketv6:
|
||||
if (res->udpsocketv6 != NULL)
|
||||
isc_socket_detach(&res->udpsocketv6);
|
||||
|
||||
cleanup_dispatchv4:
|
||||
if (res->dispatchv4 != NULL)
|
||||
dns_dispatch_detach(&res->dispatchv4);
|
||||
|
||||
cleanup_udpsocketv4:
|
||||
if (res->udpsocketv4 != NULL)
|
||||
isc_socket_detach(&res->udpsocketv4);
|
||||
|
||||
cleanup_buckets:
|
||||
for (i = 0; i < buckets_created; i++) {
|
||||
(void)isc_mutex_destroy(&res->buckets[i].lock);
|
||||
@@ -4359,6 +4277,7 @@ void
|
||||
dns_resolver_shutdown(dns_resolver_t *res) {
|
||||
unsigned int i;
|
||||
fetchctx_t *fctx;
|
||||
isc_socket_t *sock;
|
||||
|
||||
REQUIRE(VALID_RESOLVER(res));
|
||||
|
||||
@@ -4376,14 +4295,16 @@ dns_resolver_shutdown(dns_resolver_t *res) {
|
||||
fctx != NULL;
|
||||
fctx = ISC_LIST_NEXT(fctx, link))
|
||||
fctx_shutdown(fctx);
|
||||
if (res->udpsocketv4 != NULL)
|
||||
isc_socket_cancel(res->udpsocketv4,
|
||||
res->buckets[i].task,
|
||||
if (res->dispatchv4 != NULL) {
|
||||
sock = dns_dispatch_getsocket(res->dispatchv4);
|
||||
isc_socket_cancel(sock, res->buckets[i].task,
|
||||
ISC_SOCKCANCEL_ALL);
|
||||
if (res->udpsocketv6 != NULL)
|
||||
isc_socket_cancel(res->udpsocketv6,
|
||||
res->buckets[i].task,
|
||||
}
|
||||
if (res->dispatchv6 != NULL) {
|
||||
sock = dns_dispatch_getsocket(res->dispatchv6);
|
||||
isc_socket_cancel(sock, res->buckets[i].task,
|
||||
ISC_SOCKCANCEL_ALL);
|
||||
}
|
||||
res->buckets[i].exiting = ISC_TRUE;
|
||||
if (ISC_LIST_EMPTY(res->buckets[i].fctxs)) {
|
||||
INSIST(res->activebuckets > 0);
|
||||
@@ -4691,3 +4612,9 @@ dns_resolver_socketmgr(dns_resolver_t *resolver) {
|
||||
REQUIRE(VALID_RESOLVER(resolver));
|
||||
return (resolver->socketmgr);
|
||||
}
|
||||
|
||||
isc_taskmgr_t *
|
||||
dns_resolver_taskmgr(dns_resolver_t *resolver) {
|
||||
REQUIRE(VALID_RESOLVER(resolver));
|
||||
return (resolver->taskmgr);
|
||||
}
|
||||
|
@@ -450,6 +450,7 @@ dns_view_createresolver(dns_view_t *view,
|
||||
view->attributes &= ~DNS_VIEWATTR_ADBSHUTDOWN;
|
||||
|
||||
result = dns_requestmgr_create(view->mctx, timermgr, socketmgr,
|
||||
dns_resolver_taskmgr(view->resolver),
|
||||
dns_resolver_dispatchmgr(view->resolver),
|
||||
dns_resolver_dispatchv4(view->resolver),
|
||||
dns_resolver_dispatchv6(view->resolver),
|
||||
|
@@ -381,7 +381,7 @@ process_cmsg(isc_socket_t *sock, struct msghdr *msg, isc_socketevent_t *dev) {
|
||||
|
||||
cmsgp = CMSG_FIRSTHDR(msg);
|
||||
while (cmsgp != NULL) {
|
||||
socket_log(sock, NULL, TRACE, "Processing cmsg %p", cmsgp);
|
||||
socket_log(sock, NULL, TRACE, "processing cmsg %p", cmsgp);
|
||||
|
||||
#ifdef ISC_PLATFORM_HAVEIPV6
|
||||
if (cmsgp->cmsg_level == IPPROTO_IPV6
|
||||
@@ -2531,6 +2531,7 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr) {
|
||||
}
|
||||
}
|
||||
|
||||
socket_log(sock, sockaddr, TRACE, "bound");
|
||||
sock->bound = 1;
|
||||
|
||||
UNLOCK(&sock->lock);
|
||||
|
Reference in New Issue
Block a user