#include <unistd.h>
#include <isc/atomic.h>
+#include <isc/loop.h>
#include <isc/mem.h>
#include <isc/mutex.h>
#include <isc/net.h>
unsigned int magic;
isc_refcount_t references;
dns_dispatch_t *disp;
+ isc_loop_t *loop;
isc_nmhandle_t *handle; /*%< netmgr handle for UDP connection */
dns_dispatchstate_t state;
dns_transport_t *transport;
* This is the wrong response. Check whether there is still enough
* time to wait for the correct one to arrive before the timeout fires.
*/
- now = isc_time_now();
+ now = isc_loop_now(resp->loop);
timeout = resp->timeout - dispentry_runtime(resp, &now);
if (timeout <= 0) {
/*
char buf[ISC_SOCKADDR_FORMATSIZE];
isc_sockaddr_t peer;
dns_displist_t resps = ISC_LIST_INITIALIZER;
- isc_time_t now = isc_time_now();
+ isc_time_t now;
int timeout;
REQUIRE(VALID_DISPATCH(disp));
* have been timed out out already, but non-matching TCP reads have
* prevented this.
*/
- dns_dispentry_t *next = NULL;
- for (resp = ISC_LIST_HEAD(disp->active); resp != NULL; resp = next) {
- next = ISC_LIST_NEXT(resp, alink);
+ resp = ISC_LIST_HEAD(disp->active);
+ if (resp != NULL) {
+ now = isc_loop_now(resp->loop);
+ }
+ while (resp != NULL) {
+ dns_dispentry_t *next = ISC_LIST_NEXT(resp, alink);
timeout = resp->timeout - dispentry_runtime(resp, &now);
if (timeout <= 0) {
tcp_recv_add(&resps, resp, ISC_R_TIMEDOUT);
}
+
+ resp = next;
}
/*
#endif
isc_result_t
-dns_dispatch_add(dns_dispatch_t *disp, unsigned int options,
+dns_dispatch_add(dns_dispatch_t *disp, isc_loop_t *loop, unsigned int options,
unsigned int timeout, const isc_sockaddr_t *dest,
dns_transport_t *transport, isc_tlsctx_cache_t *tlsctx_cache,
dispatch_cb_t connected, dispatch_cb_t sent,
REQUIRE(connected != NULL);
REQUIRE(response != NULL);
REQUIRE(sent != NULL);
+ REQUIRE(loop != NULL);
LOCK(&disp->lock);
.port = localport,
.timeout = timeout,
.peer = *dest,
+ .loop = loop,
.connected = connected,
.sent = sent,
.response = response,
dispentry_log(resp, LVL(90), "getnext for QID %d", resp->id);
- isc_time_t now = isc_time_now();
+ isc_time_t now = isc_loop_now(resp->loop);
timeout = resp->timeout - dispentry_runtime(resp, &now);
if (timeout <= 0) {
return (ISC_R_TIMEDOUT);
udp_dispatch_connect(dns_dispatch_t *disp, dns_dispentry_t *resp) {
LOCK(&disp->lock);
resp->state = DNS_DISPATCHSTATE_CONNECTING;
- resp->start = isc_time_now();
+ resp->start = isc_loop_now(resp->loop);
dns_dispentry_ref(resp); /* DISPENTRY004 */
ISC_LIST_APPEND(disp->pending, resp, plink);
UNLOCK(&disp->lock);
/* First connection, continue with connecting */
disp->state = DNS_DISPATCHSTATE_CONNECTING;
resp->state = DNS_DISPATCHSTATE_CONNECTING;
- resp->start = isc_time_now();
+ resp->start = isc_loop_now(resp->loop);
dns_dispentry_ref(resp); /* DISPENTRY005 */
ISC_LIST_APPEND(disp->pending, resp, plink);
UNLOCK(&disp->lock);
case DNS_DISPATCHSTATE_CONNECTING:
/* Connection pending; add resp to the list */
resp->state = DNS_DISPATCHSTATE_CONNECTING;
- resp->start = isc_time_now();
+ resp->start = isc_loop_now(resp->loop);
dns_dispentry_ref(resp); /* DISPENTRY005 */
ISC_LIST_APPEND(disp->pending, resp, plink);
UNLOCK(&disp->lock);
case DNS_DISPATCHSTATE_CONNECTED:
resp->state = DNS_DISPATCHSTATE_CONNECTED;
- resp->start = isc_time_now();
+ resp->start = isc_loop_now(resp->loop);
/* Add the resp to the reading list */
ISC_LIST_APPEND(disp->active, resp, alink);
void *cbarg);
isc_result_t
-dns_dispatch_add(dns_dispatch_t *disp, unsigned int options,
+dns_dispatch_add(dns_dispatch_t *disp, isc_loop_t *loop, unsigned int options,
unsigned int timeout, const isc_sockaddr_t *dest,
dns_transport_t *transport, isc_tlsctx_cache_t *tlsctx_cache,
dispatch_cb_t connected, dispatch_cb_t sent,
dispopt |= DNS_DISPATCHOPT_FIXEDID;
}
- result = dns_dispatch_add(request->dispatch, dispopt, request->timeout,
- destaddr, transport, tlsctx_cache,
- req_connected, req_senddone, req_response,
- request, &id, &request->dispentry);
+ result = dns_dispatch_add(
+ request->dispatch, loop, dispopt, request->timeout, destaddr,
+ transport, tlsctx_cache, req_connected, req_senddone,
+ req_response, request, &id, &request->dispentry);
if (result != ISC_R_SUCCESS) {
if ((options & DNS_REQUESTOPT_FIXEDID) != 0 && !newtcp) {
newtcp = true;
goto detach;
}
- result = dns_dispatch_add(request->dispatch, 0, request->timeout,
+ result = dns_dispatch_add(request->dispatch, loop, 0, request->timeout,
destaddr, transport, tlsctx_cache,
req_connected, req_senddone, req_response,
request, &id, &request->dispentry);
/* Set up the dispatch and set the query ID */
result = dns_dispatch_add(
- query->dispatch, 0, isc_interval_ms(&fctx->interval),
- &query->addrinfo->sockaddr, addrinfo->transport, tlsctx_cache,
- resquery_connected, resquery_senddone, resquery_response, query,
- &query->id, &query->dispentry);
+ query->dispatch, fctx->loop, 0,
+ isc_interval_ms(&fctx->interval), &query->addrinfo->sockaddr,
+ addrinfo->transport, tlsctx_cache, resquery_connected,
+ resquery_senddone, resquery_response, query, &query->id,
+ &query->dispentry);
if (result != ISC_R_SUCCESS) {
goto cleanup_udpfetch;
}
* XXX: timeouts are hard-coded to 30 seconds; this needs to be
* configurable.
*/
- CHECK(dns_dispatch_add(
- xfr->disp, 0, 30000, &xfr->primaryaddr, xfr->transport,
- xfr->tlsctx_cache, xfrin_connect_done, xfrin_send_done,
- xfrin_recv_done, xfr, &xfr->id, &xfr->dispentry));
+ CHECK(dns_dispatch_add(xfr->disp, dns_zone_getloop(xfr->zone), 0, 30000,
+ &xfr->primaryaddr, xfr->transport,
+ xfr->tlsctx_cache, xfrin_connect_done,
+ xfrin_send_done, xfrin_recv_done, xfr, &xfr->id,
+ &xfr->dispentry));
CHECK(dns_dispatch_connect(xfr->dispentry));
return (ISC_R_SUCCESS);
assert_int_equal(result, ISC_R_SUCCESS);
dns_dispatchmgr_detach(&dispatchmgr);
- result = dns_dispatch_add(
- dispatch, 0, T_CLIENT_CONNECT, &tcp_server_addr, NULL, NULL,
- timeout_connected, client_senddone, response_timeout,
- &testdata.region, &id, &dispentry);
+ result = dns_dispatch_add(dispatch, isc_loop_main(loopmgr), 0,
+ T_CLIENT_CONNECT, &tcp_server_addr, NULL,
+ NULL, timeout_connected, client_senddone,
+ response_timeout, &testdata.region, &id,
+ &dispentry);
assert_int_equal(result, ISC_R_SUCCESS);
dns_dispatch_detach(&dispatch);
assert_int_equal(result, ISC_R_SUCCESS);
dns_dispatchmgr_detach(&dispatchmgr);
- result = dns_dispatch_add(dispatch, 0, T_CLIENT_CONNECT,
- &tcp_server_addr, NULL, NULL, connected,
- client_senddone, response_timeout,
- &testdata.region, &id, &dispentry);
+ result = dns_dispatch_add(
+ dispatch, isc_loop_main(loopmgr), 0, T_CLIENT_CONNECT,
+ &tcp_server_addr, NULL, NULL, connected, client_senddone,
+ response_timeout, &testdata.region, &id, &dispentry);
assert_int_equal(result, ISC_R_SUCCESS);
dns_dispatch_detach(&dispatch);
assert_int_equal(result, ISC_R_SUCCESS);
dns_dispatchmgr_detach(&dispatchmgr);
- result = dns_dispatch_add(dispatch, 0, T_CLIENT_CONNECT,
- &tcp_server_addr, NULL, NULL, connected,
- client_senddone, response, &testdata.region,
- &id, &dispentry);
+ result = dns_dispatch_add(dispatch, isc_loop_main(loopmgr), 0,
+ T_CLIENT_CONNECT, &tcp_server_addr, NULL,
+ NULL, connected, client_senddone, response,
+ &testdata.region, &id, &dispentry);
assert_int_equal(result, ISC_R_SUCCESS);
dns_dispatch_detach(&dispatch);
assert_int_equal(result, ISC_R_SUCCESS);
dns_dispatchmgr_detach(&dispatchmgr);
- result = dns_dispatch_add(
- dispatch, 0, T_CLIENT_CONNECT, &tls_server_addr, tls_transport,
- tls_tlsctx_client_cache, connected, client_senddone, response,
- &testdata.region, &id, &dispentry);
+ result = dns_dispatch_add(dispatch, isc_loop_main(loopmgr), 0,
+ T_CLIENT_CONNECT, &tls_server_addr,
+ tls_transport, tls_tlsctx_client_cache,
+ connected, client_senddone, response,
+ &testdata.region, &id, &dispentry);
assert_int_equal(result, ISC_R_SUCCESS);
dns_dispatch_detach(&dispatch);
assert_int_equal(result, ISC_R_SUCCESS);
dns_dispatchmgr_detach(&dispatchmgr);
- result = dns_dispatch_add(dispatch, 0, T_CLIENT_CONNECT,
- &udp_server_addr, NULL, NULL, connected,
- client_senddone, response_timeout,
- &testdata.region, &id, &dispentry);
+ result = dns_dispatch_add(
+ dispatch, isc_loop_main(loopmgr), 0, T_CLIENT_CONNECT,
+ &udp_server_addr, NULL, NULL, connected, client_senddone,
+ response_timeout, &testdata.region, &id, &dispentry);
assert_int_equal(result, ISC_R_SUCCESS);
dns_dispatch_detach(&dispatch);
assert_int_equal(result, ISC_R_SUCCESS);
dns_dispatchmgr_detach(&dispatchmgr);
- result = dns_dispatch_add(dispatch, 0, T_CLIENT_CONNECT,
- &udp_server_addr, NULL, NULL, connected,
- client_senddone, response_getnext,
- &testdata.region, &id, &dispentry);
+ result = dns_dispatch_add(
+ dispatch, isc_loop_main(loopmgr), 0, T_CLIENT_CONNECT,
+ &udp_server_addr, NULL, NULL, connected, client_senddone,
+ response_getnext, &testdata.region, &id, &dispentry);
assert_int_equal(result, ISC_R_SUCCESS);
dns_dispatch_detach(&dispatch);