checkpoint: convert dig to use netmgr for UDP

This commit is contained in:
Evan Hunt
2020-08-31 10:58:37 -07:00
parent db354895e7
commit 77bedef71e
3 changed files with 128 additions and 119 deletions
+126 -116
View File
@@ -233,7 +233,7 @@ recv_done(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region,
void *arg);
static void
send_udp(dig_query_t *query);
start_udp(dig_query_t *query);
static void
connect_timeout(isc_task_t *task, isc_event_t *event);
@@ -1607,7 +1607,6 @@ clear_query(dig_query_t *query) {
isc_mempool_put(commctx, query->recvspace);
isc_mempool_put(commctx, query->tmpsendspace);
isc_buffer_invalidate(&query->recvbuf);
if (query->waiting_senddone) {
query->pending_free = true;
@@ -2420,8 +2419,8 @@ setup_lookup(dig_lookup_t *lookup) {
*
* (For future work: preserve the offset into
* the buffer where the family field is;
* that way we can update it in send_udp()
* or send_tcp_connect() once we know
* that way we can update it in start_udp()
* or start_tcp() once we know
* what it outght to be.)
*/
switch (sa->sa_family) {
@@ -2565,7 +2564,6 @@ setup_lookup(dig_lookup_t *lookup) {
query->waiting_connect = false;
query->waiting_senddone = false;
query->pending_free = false;
query->recv_made = false;
query->first_pass = true;
query->first_soa_rcvd = false;
query->second_rr_rcvd = false;
@@ -2587,7 +2585,6 @@ setup_lookup(dig_lookup_t *lookup) {
fatal("memory allocation failure");
}
isc_buffer_init(&query->recvbuf, query->recvspace, COMMSIZE);
query->sendbuf = lookup->renderbuf;
isc_time_settoepoch(&query->time_sent);
@@ -2643,7 +2640,7 @@ send_done(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) {
debug("sending next, since searching");
next = ISC_LIST_NEXT(query, link);
if (next != NULL) {
send_udp(next);
start_udp(next);
}
}
@@ -2669,7 +2666,9 @@ cancel_lookup(dig_lookup_t *lookup) {
REQUIRE(DIG_VALID_QUERY(query));
next = ISC_LIST_NEXT(query, link);
if (query->handle != NULL) {
isc_nm_cancelread(query->handle);
if (query->lookup->tcp_mode) {
isc_nm_cancelread(query->handle);
}
check_if_done();
} else {
clear_query(query);
@@ -2736,21 +2735,21 @@ force_timeout(dig_query_t *query) {
}
static void
connect_done(isc_nmhandle_t *handle, isc_result_t eresult, void *arg);
tcp_connected(isc_nmhandle_t *handle, isc_result_t eresult, void *arg);
/*%
* Unlike send_udp, this can't be called multiple times with the same
* Unlike start_udp, this can't be called multiple times with the same
* query. When we retry TCP, we requeue the whole lookup, which should
* start anew.
*/
static void
send_tcp_connect(dig_query_t *query) {
start_tcp(dig_query_t *query) {
isc_result_t result;
dig_query_t *next;
dig_lookup_t *l;
REQUIRE(DIG_VALID_QUERY(query));
debug("send_tcp_connect(%p)", query);
debug("start_tcp(%p)", query);
l = query->lookup;
query->waiting_connect = true;
@@ -2789,7 +2788,7 @@ send_tcp_connect(dig_query_t *query) {
check_next_lookup(l);
return;
}
send_tcp_connect(next);
start_tcp(next);
return;
}
@@ -2819,10 +2818,9 @@ send_tcp_connect(dig_query_t *query) {
result = isc_nm_tcpdnsconnect(netmgr,
(isc_nmiface_t *)&localaddr,
(isc_nmiface_t *)&query->sockaddr,
connect_done, query, 0);
tcp_connected, query, 0);
check_result(result, "isc_nm_tcpdnsconnect");
/* XXX: set DSCP */
/* XXX: set IPV6ONLY */
bringup_timer(query, TCP_TIMEOUT);
}
@@ -2840,7 +2838,7 @@ send_tcp_connect(dig_query_t *query) {
}
ISC_LIST_ENQUEUE(l->connecting, query, clink);
if (next != NULL) {
send_tcp_connect(next);
start_tcp(next);
}
}
}
@@ -2853,92 +2851,11 @@ print_query_size(dig_query_t *query) {
}
}
/*%
* Send a UDP packet to the remote nameserver, possible starting the
* recv action as well. Also make sure that the timer is running and
* is properly reset.
*/
static void
send_udp(dig_query_t *query) {
dig_lookup_t *l = NULL;
isc_result_t result;
dig_query_t *next;
isc_region_t r;
REQUIRE(DIG_VALID_QUERY(query));
debug("send_udp(%p)", query);
INSIST(query->handle != NULL);
l = query->lookup;
bringup_timer(query, UDP_TIMEOUT);
l->current_query = query;
debug("working on lookup %p, query %p", query->lookup, query);
if (!query->recv_made) {
/* XXX Check the sense of this, need assertion? */
query->waiting_connect = false;
result = get_address(query->servname, port, &query->sockaddr);
if (result != ISC_R_SUCCESS) {
/* This servname doesn't have an address. */
force_timeout(query);
return;
}
if (!l->mapped &&
isc_sockaddr_pf(&query->sockaddr) == AF_INET6 &&
IN6_IS_ADDR_V4MAPPED(&query->sockaddr.type.sin6.sin6_addr))
{
isc_netaddr_t netaddr;
char buf[ISC_NETADDR_FORMATSIZE];
isc_netaddr_fromsockaddr(&netaddr, &query->sockaddr);
isc_netaddr_format(&netaddr, buf, sizeof(buf));
dighost_warning("Skipping mapped address '%s'", buf);
next = ISC_LIST_NEXT(query, link);
l = query->lookup;
clear_query(query);
if (next == NULL) {
dighost_warning("No acceptable nameservers");
check_next_lookup(l);
} else {
send_udp(next);
}
return;
}
if (!specified_source) {
if ((isc_sockaddr_pf(&query->sockaddr) == AF_INET) &&
have_ipv4) {
isc_sockaddr_any(&localaddr);
} else {
isc_sockaddr_any6(&localaddr);
}
}
/* XXX: udpconnect */
#if 0
result = isc_socket_create(socketmgr,
isc_sockaddr_pf(&query->sockaddr),
isc_sockettype_udp, &query->sock);
check_result(result, "isc_socket_create");
#endif
sockcount++;
debug("sockcount=%d", sockcount);
/* XXX: set up DSCP */
/* XXX: set IPV6ONLY */
query->recv_made = true;
isc_buffer_availableregion(&query->recvbuf, &r);
debug("recving with lookup=%p, query=%p, handle=%p",
query->lookup, query, query->handle);
isc_nmhandle_ref(query->handle);
isc_nm_read(query->handle, recv_done, query);
check_result(result, "isc_nm_read");
recvcount++;
debug("recvcount=%d", recvcount);
}
isc_buffer_usedregion(&query->sendbuf, &r);
debug("sending a request");
TIME_NOW(&query->time_sent);
@@ -2966,6 +2883,98 @@ send_udp(dig_query_t *query) {
}
}
static void
udp_ready(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) {
dig_query_t *query = (dig_query_t *)arg;
isc_result_t result;
UNUSED(eresult);
query->handle = handle;
debug("recving with lookup=%p, query=%p, handle=%p",
query->lookup, query, query->handle);
isc_nmhandle_ref(query->handle);
result = isc_nm_read(query->handle, recv_done, query);
check_result(result, "isc_nm_read");
recvcount++;
debug("recvcount=%d", recvcount);
send_udp(query);
}
/*%
* Send a UDP packet to the remote nameserver, possible starting the
* recv action as well. Also make sure that the timer is running and
* is properly reset.
*/
static void
start_udp(dig_query_t *query) {
dig_lookup_t *l = NULL;
isc_result_t result;
dig_query_t *next;
REQUIRE(DIG_VALID_QUERY(query));
debug("start_udp(%p)", query);
l = query->lookup;
bringup_timer(query, UDP_TIMEOUT);
l->current_query = query;
debug("working on lookup %p, query %p", query->lookup, query);
if (query->handle != NULL) {
send_udp(query);
return;
}
query->waiting_connect = false;
result = get_address(query->servname, port, &query->sockaddr);
if (result != ISC_R_SUCCESS) {
/* This servname doesn't have an address. */
force_timeout(query);
return;
}
if (!l->mapped &&
isc_sockaddr_pf(&query->sockaddr) == AF_INET6 &&
IN6_IS_ADDR_V4MAPPED(&query->sockaddr.type.sin6.sin6_addr))
{
isc_netaddr_t netaddr;
char buf[ISC_NETADDR_FORMATSIZE];
isc_netaddr_fromsockaddr(&netaddr, &query->sockaddr);
isc_netaddr_format(&netaddr, buf, sizeof(buf));
dighost_warning("Skipping mapped address '%s'", buf);
next = ISC_LIST_NEXT(query, link);
l = query->lookup;
clear_query(query);
if (next == NULL) {
dighost_warning("No acceptable nameservers");
check_next_lookup(l);
} else {
start_udp(next);
}
return;
}
if (!specified_source) {
if ((isc_sockaddr_pf(&query->sockaddr) == AF_INET) &&
have_ipv4) {
isc_sockaddr_any(&localaddr);
} else {
isc_sockaddr_any6(&localaddr);
}
}
result = isc_nm_udpconnect(netmgr,
(isc_nmiface_t *)&localaddr,
(isc_nmiface_t *)&query->sockaddr,
udp_ready, query, 0);
check_result(result, "isc_nm_udpconnect");
sockcount++;
debug("sockcount=%d", sockcount);
}
/*%
* If there are more servers available for querying within 'lookup', initiate a
* TCP or UDP query to the next available server and return true; otherwise,
@@ -2988,9 +2997,9 @@ try_next_server(dig_lookup_t *lookup) {
debug("trying next server...");
if (lookup->tcp_mode) {
send_tcp_connect(next_query);
start_tcp(next_query);
} else {
send_udp(next_query);
start_udp(next_query);
}
return (true);
@@ -3045,7 +3054,7 @@ connect_timeout(isc_task_t *task, isc_event_t *event) {
if (!l->tcp_mode) {
l->retries--;
debug("resending UDP request to first server");
send_udp(ISC_LIST_HEAD(l->q));
start_udp(ISC_LIST_HEAD(l->q));
} else {
debug("making new TCP request, %d tries left",
l->retries);
@@ -3155,9 +3164,6 @@ launch_next_query(dig_query_t *query) {
}
}
query->waiting_connect = false;
#if 0
check_next_lookup(query->lookup);
#endif /* if 0 */
return;
}
@@ -3167,7 +3173,7 @@ launch_next_query(dig_query_t *query) {
* question.
*/
static void
connect_done(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) {
tcp_connected(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) {
dig_query_t *query = (dig_query_t *)arg;
dig_query_t *next = NULL;
char sockstr[ISC_SOCKADDR_FORMATSIZE];
@@ -3177,7 +3183,7 @@ connect_done(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) {
REQUIRE(query->handle == NULL);
INSIST(!free_now);
debug("connect_done()");
debug("tcp_connected()");
LOCK_LOOKUP;
@@ -3229,7 +3235,7 @@ connect_done(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) {
clear_query(query);
if (next != NULL) {
bringup_timer(next, TCP_TIMEOUT);
send_tcp_connect(next);
start_tcp(next);
} else {
check_next_lookup(l);
}
@@ -3504,7 +3510,6 @@ static void
recv_done(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region,
void *arg) {
dig_query_t *query = (dig_query_t *) arg;
isc_region_t r;
isc_buffer_t b;
dns_message_t *msg = NULL;
isc_result_t result;
@@ -3877,9 +3882,9 @@ recv_done(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region,
if (next != NULL) {
debug("sending query %p\n", next);
if (l->tcp_mode) {
send_tcp_connect(next);
start_tcp(next);
} else {
send_udp(next);
start_udp(next);
}
}
/*
@@ -4073,9 +4078,6 @@ recv_done(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region,
return;
udp_mismatch:
isc_buffer_invalidate(&query->recvbuf);
isc_buffer_init(&query->recvbuf, query->recvspace, COMMSIZE);
isc_buffer_availableregion(&query->recvbuf, &r);
recvcount++;
UNLOCK_LOOKUP;
return;
@@ -4156,9 +4158,9 @@ do_lookup(dig_lookup_t *lookup) {
if (query != NULL) {
REQUIRE(DIG_VALID_QUERY(query));
if (lookup->tcp_mode) {
send_tcp_connect(query);
start_tcp(query);
} else {
send_udp(query);
start_udp(query);
}
}
}
@@ -4199,7 +4201,11 @@ cancel_all(void) {
debug("canceling pending query %p, belonging to %p", q,
current_lookup);
if (q->handle != NULL) {
isc_nm_cancelread(q->handle);
if (q->lookup->tcp_mode) {
isc_nm_cancelread(q->handle);
}
isc_nmhandle_unref(q->handle);
q->handle = NULL;
} else {
clear_query(q);
}
@@ -4210,7 +4216,11 @@ cancel_all(void) {
debug("canceling connecting query %p, belonging to %p",
q, current_lookup);
if (q->handle != NULL) {
isc_nm_cancelread(q->handle);
if (q->lookup->tcp_mode) {
isc_nm_cancelread(q->handle);
}
isc_nmhandle_unref(q->handle);
q->handle = NULL;
} else {
clear_query(q);
}
+2 -2
View File
@@ -168,7 +168,7 @@ struct dig_query {
unsigned int magic;
dig_lookup_t *lookup;
bool waiting_connect, pending_free, waiting_senddone, first_pass,
first_soa_rcvd, second_rr_rcvd, first_repeat_rcvd, recv_made,
first_soa_rcvd, second_rr_rcvd, first_repeat_rcvd,
warn_id, timedout;
uint32_t first_rr_serial;
uint32_t second_rr_serial;
@@ -177,7 +177,7 @@ struct dig_query {
bool ixfr_axfr;
char *servname;
char *userarg;
isc_buffer_t recvbuf, sendbuf;
isc_buffer_t sendbuf;
char *recvspace, *tmpsendspace, lengthspace[4];
isc_nmhandle_t *handle;
ISC_LINK(dig_query_t) link;
-1
View File
@@ -921,7 +921,6 @@ flush_lookup_list(void) {
isc_nmhandle_unref(q->handle);
q->handle = NULL;
}
isc_buffer_invalidate(&q->recvbuf);
qp = q;
q = ISC_LIST_NEXT(q, link);
ISC_LIST_DEQUEUE(l->q, qp, link);