fix: usr: Report client transport in 'rndc recursing'

When `rndc recursing` is used to dump the list of recursing clients, it now indicates whether a query was sent via UDP, TCP, TLS, or HTTP.

Closes #4971

Merge branch '4971-recursing-show-client-transport' into 'main'

See merge request isc-projects/bind9!9590
This commit is contained in:
Evan Hunt 2024-10-14 21:16:27 +00:00
commit 87ec2ce498
8 changed files with 98 additions and 8 deletions

View file

@ -429,8 +429,10 @@ Currently supported commands are:
The first list includes all unique clients that are waiting for
recursion to complete, including the query that is awaiting a
response and the timestamp (seconds since the Unix epoch) of
when named started processing this client query.
response, the timestamp (seconds since the Unix epoch) of
when named started processing this client query, the client's
address, and the transport over which the the query was received
(UDP, TCP, TLS, or HTTP).
The second list comprises of domains for which there are active
(or recently active) fetches in progress. It reports the number

View file

@ -28,4 +28,4 @@ rm -f curl.out.*
rm -f stats*out
rm -f ns*/managed-keys.bind*
rm -f xsltproc.out.*
rm -f named.stats.* ns*/named.stats.*
rm -f named.stats.* ns*/named.stats.* ns*/named.recursing

View file

@ -98,6 +98,10 @@ getstats() {
grep "2 recursing clients" $last_stats >/dev/null || return 1
}
retry_quiet 5 getstats || ret=1
# confirm agreement with 'rndc recursing'
$RNDCCMD -s 10.53.0.3 recursing || ret=1
lines=$(grep -c "; client .*(tcp)" ns3/named.recursing || true)
[ "$lines" -eq 2 ] || ret=1
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
n=$((n + 1))

View file

@ -204,3 +204,9 @@ dns_transport_list_detach(dns_transport_list_t **listp);
*\li 'listp' is not NULL.
*\li '*listp' is a valid transport list.
*/
const char *
dns_transport_totext(dns_transport_type_t type);
/*%<
* Convert a transport type value into a string.
*/

View file

@ -772,3 +772,19 @@ dns_transport_list_detach(dns_transport_list_t **listp) {
transport_list_destroy(list);
}
}
const char *
dns_transport_totext(dns_transport_type_t type) {
switch (type) {
case DNS_TRANSPORT_UDP:
return ("udp");
case DNS_TRANSPORT_TCP:
return ("tcp");
case DNS_TRANSPORT_TLS:
return ("tls");
case DNS_TRANSPORT_HTTP:
return ("https");
default:
UNREACHABLE();
}
}

View file

@ -141,7 +141,6 @@ static void
compute_cookie(ns_client_t *client, uint32_t when, const unsigned char *secret,
isc_buffer_t *buf);
#ifdef HAVE_DNSTAP
static dns_transport_type_t
ns_client_transport_type(const ns_client_t *client) {
/*
@ -186,7 +185,6 @@ ns_client_transport_type(const ns_client_t *client) {
return DNS_TRANSPORT_UDP;
}
#endif /* HAVE_DNSTAP */
void
ns_client_recursing(ns_client_t *client) {
@ -2921,10 +2919,12 @@ ns_client_dumprecursing(FILE *f, ns_clientmgr_t *manager) {
}
UNLOCK(&client->query.fetchlock);
fprintf(f,
"; client %s%s%s: id %u '%s/%s/%s'%s%s "
"; client %s (%s)%s%s: id %u '%s/%s/%s'%s%s "
"requesttime %u\n",
peerbuf, sep, name, client->message->id, namebuf,
typebuf, classbuf, origfor, original,
peerbuf,
dns_transport_totext(ns_client_transport_type(client)),
sep, name, client->message->id, namebuf, typebuf,
classbuf, origfor, original,
isc_time_seconds(&client->requesttime));
client = ISC_LIST_NEXT(client, rlink);
}

View file

@ -46,6 +46,7 @@ check_PROGRAMS = \
sigs_test \
skr_test \
time_test \
transport_test \
tsig_test \
update_test \
zonemgr_test \

View file

@ -0,0 +1,61 @@
/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#include <inttypes.h>
#include <sched.h> /* IWYU pragma: keep */
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define UNIT_TESTING
#include <cmocka.h>
#include <isc/string.h>
#include <isc/util.h>
#include <dns/transport.h>
#include <tests/dns.h>
ISC_RUN_TEST_IMPL(dns_transport_totext) {
dns_transport_t *udp = NULL, *tcp = NULL;
dns_transport_t *tls = NULL, *http = NULL;
dns_transport_list_t *tlist = NULL;
tlist = dns_transport_list_new(mctx);
udp = dns_transport_new(dns_rootname, DNS_TRANSPORT_UDP, tlist);
tcp = dns_transport_new(dns_rootname, DNS_TRANSPORT_TCP, tlist);
tls = dns_transport_new(dns_rootname, DNS_TRANSPORT_TLS, tlist);
http = dns_transport_new(dns_rootname, DNS_TRANSPORT_HTTP, tlist);
assert_string_equal(dns_transport_totext(dns_transport_get_type(udp)),
"udp");
assert_string_equal(dns_transport_totext(dns_transport_get_type(tcp)),
"tcp");
assert_string_equal(dns_transport_totext(dns_transport_get_type(tls)),
"tls");
assert_string_equal(dns_transport_totext(dns_transport_get_type(http)),
"https");
dns_transport_list_detach(&tlist);
}
ISC_TEST_LIST_START
ISC_TEST_ENTRY(dns_transport_totext)
ISC_TEST_LIST_END
ISC_TEST_MAIN