Adding upstream version 2.9.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
48f4eeaece
commit
07b818f278
13 changed files with 202 additions and 21 deletions
19
CHANGES
19
CHANGES
|
@ -1,3 +1,22 @@
|
||||||
|
2021-12-08 Jerry Lundström
|
||||||
|
|
||||||
|
Release 2.9.0
|
||||||
|
|
||||||
|
This release brings a new message suppression option and a way to control
|
||||||
|
how many queries are sent over a connection.
|
||||||
|
|
||||||
|
You can now suppress the message about receiving unexpected DNS message
|
||||||
|
IDs by using `-O suppress=unexpected`.
|
||||||
|
|
||||||
|
With `-O num-queries-per-conn=<num>` you can now limit the number of
|
||||||
|
queries sent over a connection before triggering a re-connection, see
|
||||||
|
the `dnsperf(3)` man-page for more information how this works.
|
||||||
|
|
||||||
|
cd9df40 Tests
|
||||||
|
864a968 Queries per connection
|
||||||
|
7c5d6ab Suppress unexpected
|
||||||
|
8e9f4a2 Suppress
|
||||||
|
|
||||||
2021-11-02 Jerry Lundström
|
2021-11-02 Jerry Lundström
|
||||||
|
|
||||||
Release 2.8.0
|
Release 2.8.0
|
||||||
|
|
20
configure
vendored
20
configure
vendored
|
@ -1,6 +1,6 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.69 for dnsperf 2.8.0.
|
# Generated by GNU Autoconf 2.69 for dnsperf 2.9.0.
|
||||||
#
|
#
|
||||||
# Report bugs to <admin@dns-oarc.net>.
|
# Report bugs to <admin@dns-oarc.net>.
|
||||||
#
|
#
|
||||||
|
@ -590,8 +590,8 @@ MAKEFLAGS=
|
||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='dnsperf'
|
PACKAGE_NAME='dnsperf'
|
||||||
PACKAGE_TARNAME='dnsperf'
|
PACKAGE_TARNAME='dnsperf'
|
||||||
PACKAGE_VERSION='2.8.0'
|
PACKAGE_VERSION='2.9.0'
|
||||||
PACKAGE_STRING='dnsperf 2.8.0'
|
PACKAGE_STRING='dnsperf 2.9.0'
|
||||||
PACKAGE_BUGREPORT='admin@dns-oarc.net'
|
PACKAGE_BUGREPORT='admin@dns-oarc.net'
|
||||||
PACKAGE_URL='https://github.com/DNS-OARC/dnsperf/issues'
|
PACKAGE_URL='https://github.com/DNS-OARC/dnsperf/issues'
|
||||||
|
|
||||||
|
@ -1360,7 +1360,7 @@ if test "$ac_init_help" = "long"; then
|
||||||
# Omit some internal or obsolete options to make the list less imposing.
|
# Omit some internal or obsolete options to make the list less imposing.
|
||||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures dnsperf 2.8.0 to adapt to many kinds of systems.
|
\`configure' configures dnsperf 2.9.0 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
|
@ -1431,7 +1431,7 @@ fi
|
||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of dnsperf 2.8.0:";;
|
short | recursive ) echo "Configuration of dnsperf 2.9.0:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
|
@ -1570,7 +1570,7 @@ fi
|
||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
dnsperf configure 2.8.0
|
dnsperf configure 2.9.0
|
||||||
generated by GNU Autoconf 2.69
|
generated by GNU Autoconf 2.69
|
||||||
|
|
||||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
|
@ -1939,7 +1939,7 @@ cat >config.log <<_ACEOF
|
||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by dnsperf $as_me 2.8.0, which was
|
It was created by dnsperf $as_me 2.9.0, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
$ $0 $@
|
$ $0 $@
|
||||||
|
@ -2802,7 +2802,7 @@ fi
|
||||||
|
|
||||||
# Define the identity of the package.
|
# Define the identity of the package.
|
||||||
PACKAGE='dnsperf'
|
PACKAGE='dnsperf'
|
||||||
VERSION='2.8.0'
|
VERSION='2.9.0'
|
||||||
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
@ -14410,7 +14410,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by dnsperf $as_me 2.8.0, which was
|
This file was extended by dnsperf $as_me 2.9.0, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
|
@ -14477,7 +14477,7 @@ _ACEOF
|
||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
dnsperf config.status 2.8.0
|
dnsperf config.status 2.9.0
|
||||||
configured by $0, generated by GNU Autoconf 2.69,
|
configured by $0, generated by GNU Autoconf 2.69,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
AC_PREREQ(2.64)
|
AC_PREREQ(2.64)
|
||||||
AC_INIT([dnsperf], [2.8.0], [admin@dns-oarc.net], [dnsperf], [https://github.com/DNS-OARC/dnsperf/issues])
|
AC_INIT([dnsperf], [2.9.0], [admin@dns-oarc.net], [dnsperf], [https://github.com/DNS-OARC/dnsperf/issues])
|
||||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
||||||
AC_CONFIG_SRCDIR([src/dnsperf.c])
|
AC_CONFIG_SRCDIR([src/dnsperf.c])
|
||||||
AC_CONFIG_HEADER([src/config.h])
|
AC_CONFIG_HEADER([src/config.h])
|
||||||
|
|
|
@ -413,6 +413,24 @@ Following type are available.
|
||||||
\fBsendfailed\fR: Suppress messages about failure to send packets or if only parts of the packet were sent
|
\fBsendfailed\fR: Suppress messages about failure to send packets or if only parts of the packet were sent
|
||||||
.br
|
.br
|
||||||
\fBsockready\fR: Suppress messages about socket readiness
|
\fBsockready\fR: Suppress messages about socket readiness
|
||||||
|
.br
|
||||||
|
\fBunexpected\fR: Suppress messages about answers with an unexpected message ID
|
||||||
|
.RE
|
||||||
|
|
||||||
|
\fBnum-queries-per-conn=\fINUMBER\fR
|
||||||
|
.br
|
||||||
|
.RS
|
||||||
|
This will limit the number of queries sent over a connection before
|
||||||
|
triggering a re-connection. Once re-connected it will reset the counter and
|
||||||
|
continue sending queries until the limit is reached again, triggering
|
||||||
|
another re-connection and so on.
|
||||||
|
Using this option will also enable counting number of responses received
|
||||||
|
for each connection and once the limit is reached for sending queries it
|
||||||
|
will wait until the same amount of responses has been received before
|
||||||
|
re-connecting.
|
||||||
|
Waiting for responses may timeout and the timeout used for this is the
|
||||||
|
same as specified by \fB-t\fR.
|
||||||
|
Note that this option is only useful for connection oriented protocols.
|
||||||
.RE
|
.RE
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
\fBresperf\fR(1)
|
\fBresperf\fR(1)
|
||||||
|
|
|
@ -89,6 +89,7 @@ typedef struct {
|
||||||
bool verbose;
|
bool verbose;
|
||||||
enum perf_net_mode mode;
|
enum perf_net_mode mode;
|
||||||
perf_suppress_t suppress;
|
perf_suppress_t suppress;
|
||||||
|
size_t num_queries_per_conn;
|
||||||
} config_t;
|
} config_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -491,6 +492,8 @@ setup(int argc, char** argv, config_t* config)
|
||||||
"the HTTP method to use for DNS-over-HTTPS: GET or POST", DEFAULT_DOH_METHOD, &doh_method);
|
"the HTTP method to use for DNS-over-HTTPS: GET or POST", DEFAULT_DOH_METHOD, &doh_method);
|
||||||
perf_long_opt_add("suppress", perf_opt_string, "message[,message,...]",
|
perf_long_opt_add("suppress", perf_opt_string, "message[,message,...]",
|
||||||
"suppress messages/warnings, see man-page for list of message types", NULL, &local_suppress);
|
"suppress messages/warnings, see man-page for list of message types", NULL, &local_suppress);
|
||||||
|
perf_long_opt_add("num-queries-per-conn", perf_opt_uint, "queries",
|
||||||
|
"Number of queries to send per connection", NULL, &config->num_queries_per_conn);
|
||||||
|
|
||||||
bool log_stdout = false;
|
bool log_stdout = false;
|
||||||
perf_opt_add('W', perf_opt_boolean, NULL, "log warnings and errors to stdout instead of stderr", NULL, &log_stdout);
|
perf_opt_add('W', perf_opt_boolean, NULL, "log warnings and errors to stdout instead of stderr", NULL, &log_stdout);
|
||||||
|
@ -1000,7 +1003,7 @@ do_recv(void* arg)
|
||||||
perf_log_warning("received short response");
|
perf_log_warning("received short response");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (recvd[i].unexpected) {
|
if (recvd[i].unexpected && !tinfo->config->suppress.unexpected) {
|
||||||
perf_log_warning("received a response with an "
|
perf_log_warning("received a response with an "
|
||||||
"unexpected (maybe timed out) "
|
"unexpected (maybe timed out) "
|
||||||
"id: %u",
|
"id: %u",
|
||||||
|
@ -1222,6 +1225,9 @@ threadinfo_init(threadinfo_t* tinfo, const config_t* config,
|
||||||
if (!tinfo->socks[i]) {
|
if (!tinfo->socks[i]) {
|
||||||
perf_log_fatal("perf_net_opensocket(): no socket returned, out of memory?");
|
perf_log_fatal("perf_net_opensocket(): no socket returned, out of memory?");
|
||||||
}
|
}
|
||||||
|
if (config->num_queries_per_conn && tinfo->socks[i]->num_queries_per_conn) {
|
||||||
|
tinfo->socks[i]->num_queries_per_conn(tinfo->socks[i], config->num_queries_per_conn, config->timeout);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
tinfo->current_sock = 0;
|
tinfo->current_sock = 0;
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,8 @@ typedef enum perf_socket_event {
|
||||||
/* Callback for socket events related to connection oriented protocols, for statistics */
|
/* Callback for socket events related to connection oriented protocols, for statistics */
|
||||||
typedef void (*perf_net_event_cb_t)(struct perf_net_socket* sock, perf_socket_event_t event, uint64_t elapsed_time);
|
typedef void (*perf_net_event_cb_t)(struct perf_net_socket* sock, perf_socket_event_t event, uint64_t elapsed_time);
|
||||||
|
|
||||||
|
typedef void (*perf_net_num_queries_per_conn_t)(struct perf_net_socket* sock, size_t num_queries_per_conn, size_t timeout);
|
||||||
|
|
||||||
struct perf_net_socket {
|
struct perf_net_socket {
|
||||||
void* data; /* user data */
|
void* data; /* user data */
|
||||||
|
|
||||||
|
@ -91,6 +93,8 @@ struct perf_net_socket {
|
||||||
perf_net_sockready_t sockready;
|
perf_net_sockready_t sockready;
|
||||||
perf_net_have_more_t have_more;
|
perf_net_have_more_t have_more;
|
||||||
|
|
||||||
|
perf_net_num_queries_per_conn_t num_queries_per_conn;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Not set by protocol, set by caller.
|
* Not set by protocol, set by caller.
|
||||||
* May be 0 if caller don't care.
|
* May be 0 if caller don't care.
|
||||||
|
|
|
@ -118,6 +118,10 @@ struct perf__doh_socket {
|
||||||
|
|
||||||
char recvbuf[TCP_RECV_BUF_SIZE];
|
char recvbuf[TCP_RECV_BUF_SIZE];
|
||||||
size_t recv_at;
|
size_t recv_at;
|
||||||
|
|
||||||
|
size_t num_queries_per_conn, nqpc_timeout;
|
||||||
|
unsigned int nqpc_sent, nqpc_recv;
|
||||||
|
uint64_t nqpc_ts;
|
||||||
};
|
};
|
||||||
|
|
||||||
static pthread_mutex_t _nghttp2_lock = PTHREAD_MUTEX_INITIALIZER;
|
static pthread_mutex_t _nghttp2_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
@ -157,6 +161,10 @@ static void perf__doh_connect(struct perf_net_socket* sock)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
self->nqpc_sent = 0;
|
||||||
|
ck_pr_store_uint(&self->nqpc_recv, 0);
|
||||||
|
self->nqpc_ts = 0;
|
||||||
|
|
||||||
nghttp2_session_del(self->http2.session);
|
nghttp2_session_del(self->http2.session);
|
||||||
ret = nghttp2_session_client_new2(&self->http2.session, _nghttp2_callbacks, sock, _nghttp2_option);
|
ret = nghttp2_session_client_new2(&self->http2.session, _nghttp2_callbacks, sock, _nghttp2_option);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -394,6 +402,9 @@ static ssize_t perf__doh_recv(struct perf_net_socket* sock, void* buf, size_t le
|
||||||
|
|
||||||
// self->have_more = false; TODO
|
// self->have_more = false; TODO
|
||||||
PERF_UNLOCK(&self->lock);
|
PERF_UNLOCK(&self->lock);
|
||||||
|
if (self->num_queries_per_conn) {
|
||||||
|
ck_pr_inc_uint(&self->nqpc_recv);
|
||||||
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -586,6 +597,8 @@ static ssize_t perf__doh_sendto(struct perf_net_socket* sock, uint16_t qid, cons
|
||||||
}
|
}
|
||||||
PERF_UNLOCK(&self->lock);
|
PERF_UNLOCK(&self->lock);
|
||||||
|
|
||||||
|
self->nqpc_sent++;
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -628,6 +641,21 @@ static int perf__doh_sockready(struct perf_net_socket* sock, int pipe_fd, int64_
|
||||||
}
|
}
|
||||||
self->is_sending = false;
|
self->is_sending = false;
|
||||||
sent = true;
|
sent = true;
|
||||||
|
self->nqpc_sent++;
|
||||||
|
}
|
||||||
|
if (self->num_queries_per_conn && self->nqpc_sent >= self->num_queries_per_conn) {
|
||||||
|
if (!self->nqpc_ts) {
|
||||||
|
self->nqpc_ts = perf_get_time() + self->nqpc_timeout;
|
||||||
|
}
|
||||||
|
unsigned int r = ck_pr_load_uint(&self->nqpc_recv);
|
||||||
|
if (r >= self->nqpc_sent || perf_get_time() > self->nqpc_ts) {
|
||||||
|
self->do_reconnect = true;
|
||||||
|
}
|
||||||
|
PERF_UNLOCK(&self->lock);
|
||||||
|
if (sent && sock->sent) {
|
||||||
|
sock->sent(sock, self->qid);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
PERF_UNLOCK(&self->lock);
|
PERF_UNLOCK(&self->lock);
|
||||||
if (sent && sock->sent) {
|
if (sent && sock->sent) {
|
||||||
|
@ -898,6 +926,12 @@ static int select_next_proto_cb(SSL* ssl, unsigned char** out,
|
||||||
}
|
}
|
||||||
#endif /* !OPENSSL_NO_NEXTPROTONEG */
|
#endif /* !OPENSSL_NO_NEXTPROTONEG */
|
||||||
|
|
||||||
|
static void perf__doh_num_queries_per_conn(struct perf_net_socket* sock, size_t num_queries_per_conn, size_t timeout)
|
||||||
|
{
|
||||||
|
self->num_queries_per_conn = num_queries_per_conn;
|
||||||
|
self->nqpc_timeout = timeout;
|
||||||
|
}
|
||||||
|
|
||||||
struct perf_net_socket* perf_net_doh_opensocket(const perf_sockaddr_t* server, const perf_sockaddr_t* local, size_t bufsize, void* data, perf_net_sent_cb_t sent, perf_net_event_cb_t event)
|
struct perf_net_socket* perf_net_doh_opensocket(const perf_sockaddr_t* server, const perf_sockaddr_t* local, size_t bufsize, void* data, perf_net_sent_cb_t sent, perf_net_event_cb_t event)
|
||||||
{
|
{
|
||||||
struct perf__doh_socket* tmp = calloc(1, sizeof(struct perf__doh_socket)); // clang scan-build
|
struct perf__doh_socket* tmp = calloc(1, sizeof(struct perf__doh_socket)); // clang scan-build
|
||||||
|
@ -915,6 +949,8 @@ struct perf_net_socket* perf_net_doh_opensocket(const perf_sockaddr_t* server, c
|
||||||
sock->sockready = perf__doh_sockready;
|
sock->sockready = perf__doh_sockready;
|
||||||
sock->have_more = perf__doh_have_more;
|
sock->have_more = perf__doh_have_more;
|
||||||
|
|
||||||
|
sock->num_queries_per_conn = perf__doh_num_queries_per_conn;
|
||||||
|
|
||||||
sock->data = data;
|
sock->data = data;
|
||||||
sock->sent = sent;
|
sock->sent = sent;
|
||||||
sock->event = event;
|
sock->event = event;
|
||||||
|
|
|
@ -55,12 +55,20 @@ struct perf__dot_socket {
|
||||||
|
|
||||||
uint64_t conn_ts;
|
uint64_t conn_ts;
|
||||||
perf_socket_event_t conn_event, conning_event;
|
perf_socket_event_t conn_event, conning_event;
|
||||||
|
|
||||||
|
size_t num_queries_per_conn, nqpc_timeout;
|
||||||
|
unsigned int nqpc_sent, nqpc_recv;
|
||||||
|
uint64_t nqpc_ts;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void perf__dot_connect(struct perf_net_socket* sock)
|
static void perf__dot_connect(struct perf_net_socket* sock)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
self->nqpc_sent = 0;
|
||||||
|
ck_pr_store_uint(&self->nqpc_recv, 0);
|
||||||
|
self->nqpc_ts = 0;
|
||||||
|
|
||||||
int fd = socket(self->server.sa.sa.sa_family, SOCK_STREAM, 0);
|
int fd = socket(self->server.sa.sa.sa_family, SOCK_STREAM, 0);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
char __s[256];
|
char __s[256];
|
||||||
|
@ -204,6 +212,9 @@ static ssize_t perf__dot_recv(struct perf_net_socket* sock, void* buf, size_t le
|
||||||
memcpy(buf, self->recvbuf + 2, len < dnslen ? len : dnslen);
|
memcpy(buf, self->recvbuf + 2, len < dnslen ? len : dnslen);
|
||||||
memmove(self->recvbuf, self->recvbuf + 2 + dnslen, self->at - 2 - dnslen);
|
memmove(self->recvbuf, self->recvbuf + 2 + dnslen, self->at - 2 - dnslen);
|
||||||
self->at -= 2 + dnslen;
|
self->at -= 2 + dnslen;
|
||||||
|
if (self->num_queries_per_conn) {
|
||||||
|
ck_pr_inc_uint(&self->nqpc_recv);
|
||||||
|
}
|
||||||
|
|
||||||
if (self->at > 2) {
|
if (self->at > 2) {
|
||||||
memcpy(&dnslen2, self->recvbuf, 2);
|
memcpy(&dnslen2, self->recvbuf, 2);
|
||||||
|
@ -283,6 +294,8 @@ static ssize_t perf__dot_sendto(struct perf_net_socket* sock, uint16_t qid, cons
|
||||||
}
|
}
|
||||||
PERF_UNLOCK(&self->lock);
|
PERF_UNLOCK(&self->lock);
|
||||||
|
|
||||||
|
self->nqpc_sent++;
|
||||||
|
|
||||||
return n - 2;
|
return n - 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,9 +355,22 @@ static int perf__dot_sockready(struct perf_net_socket* sock, int pipe_fd, int64_
|
||||||
if (sock->sent) {
|
if (sock->sent) {
|
||||||
sock->sent(sock, self->qid);
|
sock->sent(sock, self->qid);
|
||||||
}
|
}
|
||||||
return 1;
|
self->nqpc_sent++;
|
||||||
}
|
} else {
|
||||||
PERF_UNLOCK(&self->lock);
|
PERF_UNLOCK(&self->lock);
|
||||||
|
}
|
||||||
|
if (self->num_queries_per_conn && self->nqpc_sent >= self->num_queries_per_conn) {
|
||||||
|
if (!self->nqpc_ts) {
|
||||||
|
self->nqpc_ts = perf_get_time() + self->nqpc_timeout;
|
||||||
|
}
|
||||||
|
unsigned int r = ck_pr_load_uint(&self->nqpc_recv);
|
||||||
|
if (r >= self->nqpc_sent || perf_get_time() > self->nqpc_ts) {
|
||||||
|
PERF_LOCK(&self->lock);
|
||||||
|
perf__dot_reconnect(sock);
|
||||||
|
PERF_UNLOCK(&self->lock);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -417,6 +443,12 @@ static bool perf__dot_have_more(struct perf_net_socket* sock)
|
||||||
return self->have_more;
|
return self->have_more;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void perf__dot_num_queries_per_conn(struct perf_net_socket* sock, size_t num_queries_per_conn, size_t timeout)
|
||||||
|
{
|
||||||
|
self->num_queries_per_conn = num_queries_per_conn;
|
||||||
|
self->nqpc_timeout = timeout;
|
||||||
|
}
|
||||||
|
|
||||||
struct perf_net_socket* perf_net_dot_opensocket(const perf_sockaddr_t* server, const perf_sockaddr_t* local, size_t bufsize, void* data, perf_net_sent_cb_t sent, perf_net_event_cb_t event)
|
struct perf_net_socket* perf_net_dot_opensocket(const perf_sockaddr_t* server, const perf_sockaddr_t* local, size_t bufsize, void* data, perf_net_sent_cb_t sent, perf_net_event_cb_t event)
|
||||||
{
|
{
|
||||||
struct perf__dot_socket* tmp = calloc(1, sizeof(struct perf__dot_socket)); // clang scan-build
|
struct perf__dot_socket* tmp = calloc(1, sizeof(struct perf__dot_socket)); // clang scan-build
|
||||||
|
@ -434,6 +466,8 @@ struct perf_net_socket* perf_net_dot_opensocket(const perf_sockaddr_t* server, c
|
||||||
sock->sockready = perf__dot_sockready;
|
sock->sockready = perf__dot_sockready;
|
||||||
sock->have_more = perf__dot_have_more;
|
sock->have_more = perf__dot_have_more;
|
||||||
|
|
||||||
|
sock->num_queries_per_conn = perf__dot_num_queries_per_conn;
|
||||||
|
|
||||||
sock->data = data;
|
sock->data = data;
|
||||||
sock->sent = sent;
|
sock->sent = sent;
|
||||||
sock->event = event;
|
sock->event = event;
|
||||||
|
|
|
@ -80,6 +80,10 @@ struct perf__tcp_socket {
|
||||||
|
|
||||||
uint64_t conn_ts;
|
uint64_t conn_ts;
|
||||||
perf_socket_event_t conn_event, conning_event;
|
perf_socket_event_t conn_event, conning_event;
|
||||||
|
|
||||||
|
size_t num_queries_per_conn, nqpc_timeout;
|
||||||
|
unsigned int nqpc_sent, nqpc_recv;
|
||||||
|
uint64_t nqpc_ts;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int perf__tcp_connect(struct perf_net_socket* sock)
|
static int perf__tcp_connect(struct perf_net_socket* sock)
|
||||||
|
@ -87,6 +91,9 @@ static int perf__tcp_connect(struct perf_net_socket* sock)
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
self->is_ready = true;
|
self->is_ready = true;
|
||||||
|
self->nqpc_sent = 0;
|
||||||
|
ck_pr_store_uint(&self->nqpc_recv, 0);
|
||||||
|
self->nqpc_ts = 0;
|
||||||
|
|
||||||
fd = socket(self->server.sa.sa.sa_family, SOCK_STREAM, 0);
|
fd = socket(self->server.sa.sa.sa_family, SOCK_STREAM, 0);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
|
@ -192,6 +199,9 @@ static ssize_t perf__tcp_recv(struct perf_net_socket* sock, void* buf, size_t le
|
||||||
memcpy(buf, self->recvbuf + 2, len < dnslen ? len : dnslen);
|
memcpy(buf, self->recvbuf + 2, len < dnslen ? len : dnslen);
|
||||||
memmove(self->recvbuf, self->recvbuf + 2 + dnslen, self->at - 2 - dnslen);
|
memmove(self->recvbuf, self->recvbuf + 2 + dnslen, self->at - 2 - dnslen);
|
||||||
self->at -= 2 + dnslen;
|
self->at -= 2 + dnslen;
|
||||||
|
if (self->num_queries_per_conn) {
|
||||||
|
ck_pr_inc_uint(&self->nqpc_recv);
|
||||||
|
}
|
||||||
|
|
||||||
if (self->at > 2) {
|
if (self->at > 2) {
|
||||||
memcpy(&dnslen2, self->recvbuf, 2);
|
memcpy(&dnslen2, self->recvbuf, 2);
|
||||||
|
@ -251,6 +261,7 @@ static ssize_t perf__tcp_sendto(struct perf_net_socket* sock, uint16_t qid, cons
|
||||||
errno = EINPROGRESS;
|
errno = EINPROGRESS;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
self->nqpc_sent++;
|
||||||
|
|
||||||
return n - 2;
|
return n - 2;
|
||||||
}
|
}
|
||||||
|
@ -302,6 +313,17 @@ static int perf__tcp_sockready(struct perf_net_socket* sock, int pipe_fd, int64_
|
||||||
if (sock->sent) {
|
if (sock->sent) {
|
||||||
sock->sent(sock, self->qid);
|
sock->sent(sock, self->qid);
|
||||||
}
|
}
|
||||||
|
self->nqpc_sent++;
|
||||||
|
}
|
||||||
|
if (self->num_queries_per_conn && self->nqpc_sent >= self->num_queries_per_conn) {
|
||||||
|
if (!self->nqpc_ts) {
|
||||||
|
self->nqpc_ts = perf_get_time() + self->nqpc_timeout;
|
||||||
|
}
|
||||||
|
unsigned int r = ck_pr_load_uint(&self->nqpc_recv);
|
||||||
|
if (r >= self->nqpc_sent || perf_get_time() > self->nqpc_ts) {
|
||||||
|
self->need_reconnect = true;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -352,6 +374,7 @@ conn_cont:
|
||||||
if (sock->sent) {
|
if (sock->sent) {
|
||||||
sock->sent(sock, self->qid);
|
sock->sent(sock, self->qid);
|
||||||
}
|
}
|
||||||
|
self->nqpc_sent++;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -367,6 +390,12 @@ static bool perf__tcp_have_more(struct perf_net_socket* sock)
|
||||||
return self->have_more;
|
return self->have_more;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void perf__tcp_num_queries_per_conn(struct perf_net_socket* sock, size_t num_queries_per_conn, size_t timeout)
|
||||||
|
{
|
||||||
|
self->num_queries_per_conn = num_queries_per_conn;
|
||||||
|
self->nqpc_timeout = timeout;
|
||||||
|
}
|
||||||
|
|
||||||
struct perf_net_socket* perf_net_tcp_opensocket(const perf_sockaddr_t* server, const perf_sockaddr_t* local, size_t bufsize, void* data, perf_net_sent_cb_t sent, perf_net_event_cb_t event)
|
struct perf_net_socket* perf_net_tcp_opensocket(const perf_sockaddr_t* server, const perf_sockaddr_t* local, size_t bufsize, void* data, perf_net_sent_cb_t sent, perf_net_event_cb_t event)
|
||||||
{
|
{
|
||||||
struct perf__tcp_socket* tmp = calloc(1, sizeof(struct perf__tcp_socket)); // clang scan-build
|
struct perf__tcp_socket* tmp = calloc(1, sizeof(struct perf__tcp_socket)); // clang scan-build
|
||||||
|
@ -384,6 +413,8 @@ struct perf_net_socket* perf_net_tcp_opensocket(const perf_sockaddr_t* server, c
|
||||||
sock->sockready = perf__tcp_sockready;
|
sock->sockready = perf__tcp_sockready;
|
||||||
sock->have_more = perf__tcp_have_more;
|
sock->have_more = perf__tcp_have_more;
|
||||||
|
|
||||||
|
sock->num_queries_per_conn = perf__tcp_num_queries_per_conn;
|
||||||
|
|
||||||
sock->data = data;
|
sock->data = data;
|
||||||
sock->sent = sent;
|
sock->sent = sent;
|
||||||
sock->event = event;
|
sock->event = event;
|
||||||
|
|
|
@ -369,7 +369,7 @@ void perf_opt_parse(int argc, char** argv)
|
||||||
|
|
||||||
perf_suppress_t perf_opt_parse_suppress(const char* val)
|
perf_suppress_t perf_opt_parse_suppress(const char* val)
|
||||||
{
|
{
|
||||||
perf_suppress_t s = { false, false, false };
|
perf_suppress_t s = { false, false, false, false };
|
||||||
|
|
||||||
while (val && *val) {
|
while (val && *val) {
|
||||||
const char* next = strchr(val, ',');
|
const char* next = strchr(val, ',');
|
||||||
|
@ -390,6 +390,8 @@ perf_suppress_t perf_opt_parse_suppress(const char* val)
|
||||||
s.sendfailed = true;
|
s.sendfailed = true;
|
||||||
} else if (!strncmp(val, "sockready", len)) {
|
} else if (!strncmp(val, "sockready", len)) {
|
||||||
s.sockready = true;
|
s.sockready = true;
|
||||||
|
} else if (!strncmp(val, "unexpected", len)) {
|
||||||
|
s.unexpected = true;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "unknown message type to suppress: %.*s\n", len, val);
|
fprintf(stderr, "unknown message type to suppress: %.*s\n", len, val);
|
||||||
perf_opt_usage();
|
perf_opt_usage();
|
||||||
|
|
|
@ -37,6 +37,7 @@ typedef struct {
|
||||||
bool congestion;
|
bool congestion;
|
||||||
bool sendfailed;
|
bool sendfailed;
|
||||||
bool sockready;
|
bool sockready;
|
||||||
|
bool unexpected;
|
||||||
} perf_suppress_t;
|
} perf_suppress_t;
|
||||||
|
|
||||||
void perf_opt_add(char c, perf_opttype_t type, const char* desc, const char* help, const char* defval, void* valp);
|
void perf_opt_add(char c, perf_opttype_t type, const char* desc, const char* help, const char* defval, void* valp);
|
||||||
|
|
|
@ -255,6 +255,8 @@ static void setup(int argc, char** argv)
|
||||||
const char* doh_method = DEFAULT_DOH_METHOD;
|
const char* doh_method = DEFAULT_DOH_METHOD;
|
||||||
const char* local_suppress = 0;
|
const char* local_suppress = 0;
|
||||||
|
|
||||||
|
size_t num_queries_per_conn = 0;
|
||||||
|
|
||||||
sock_family = AF_UNSPEC;
|
sock_family = AF_UNSPEC;
|
||||||
server_port = 0;
|
server_port = 0;
|
||||||
local_port = DEFAULT_LOCAL_PORT;
|
local_port = DEFAULT_LOCAL_PORT;
|
||||||
|
@ -337,6 +339,8 @@ static void setup(int argc, char** argv)
|
||||||
"the HTTP method to use for DNS-over-HTTPS: GET or POST", DEFAULT_DOH_METHOD, &doh_method);
|
"the HTTP method to use for DNS-over-HTTPS: GET or POST", DEFAULT_DOH_METHOD, &doh_method);
|
||||||
perf_long_opt_add("suppress", perf_opt_string, "message[,message,...]",
|
perf_long_opt_add("suppress", perf_opt_string, "message[,message,...]",
|
||||||
"suppress messages/warnings, see dnsperf(1) man-page for list of message types", NULL, &local_suppress);
|
"suppress messages/warnings, see dnsperf(1) man-page for list of message types", NULL, &local_suppress);
|
||||||
|
perf_long_opt_add("num-queries-per-conn", perf_opt_uint, "queries",
|
||||||
|
"Number of queries to send per connection", NULL, &num_queries_per_conn);
|
||||||
|
|
||||||
perf_opt_parse(argc, argv);
|
perf_opt_parse(argc, argv);
|
||||||
|
|
||||||
|
@ -428,6 +432,9 @@ static void setup(int argc, char** argv)
|
||||||
if (!socks[i]) {
|
if (!socks[i]) {
|
||||||
perf_log_fatal("perf_net_opensocket(): no socket returned, out of memory?");
|
perf_log_fatal("perf_net_opensocket(): no socket returned, out of memory?");
|
||||||
}
|
}
|
||||||
|
if (num_queries_per_conn && socks[i]->num_queries_per_conn) {
|
||||||
|
socks[i]->num_queries_per_conn(socks[i], num_queries_per_conn, query_timeout);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -738,7 +745,9 @@ try_process_response(unsigned int sockindex)
|
||||||
|
|
||||||
size_t idx = qid * nsocks + sockindex;
|
size_t idx = qid * nsocks + sockindex;
|
||||||
if (idx >= max_outstanding || queries[idx].list != &outstanding_list) {
|
if (idx >= max_outstanding || queries[idx].list != &outstanding_list) {
|
||||||
|
if (!suppress.unexpected) {
|
||||||
perf_log_warning("received a response with an unexpected id: %u", qid);
|
perf_log_warning("received a response with an unexpected id: %u", qid);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
q = &queries[idx];
|
q = &queries[idx];
|
||||||
|
|
|
@ -3,21 +3,25 @@
|
||||||
test "$TEST_DNSPERF_WITH_NETWORK" = "1" || exit 0
|
test "$TEST_DNSPERF_WITH_NETWORK" = "1" || exit 0
|
||||||
|
|
||||||
dumdumd=`which dumdumd`
|
dumdumd=`which dumdumd`
|
||||||
|
dumdohd=`which dumdohd`
|
||||||
|
|
||||||
|
pkill -9 dumdumd || true
|
||||||
|
pkill -9 dumdohd || true
|
||||||
|
|
||||||
if [ -n "$dumdumd" ]; then
|
if [ -n "$dumdumd" ]; then
|
||||||
pkill -9 dumdumd || true
|
|
||||||
|
|
||||||
$dumdumd 127.0.0.1 5353 -r -D 100 &
|
$dumdumd 127.0.0.1 5353 -r -D 100 &
|
||||||
pid="$!"
|
pid="$!"
|
||||||
sleep 2
|
sleep 2
|
||||||
../dnsperf -s 127.0.0.1 -p 5353 -d "$srcdir/datafile" -t 2 -l 2 -Q 10 -m tcp
|
../dnsperf -s 127.0.0.1 -p 5353 -d "$srcdir/datafile" -t 2 -l 2 -Q 10 -m tcp
|
||||||
kill "$pid"
|
kill "$pid"
|
||||||
|
sleep 2
|
||||||
|
|
||||||
$dumdumd 127.0.0.1 5353 -r -D 10 &
|
$dumdumd 127.0.0.1 5353 -r -D 10 &
|
||||||
pid="$!"
|
pid="$!"
|
||||||
sleep 2
|
sleep 2
|
||||||
../dnsperf -s 127.0.0.1 -p 5353 -d "$srcdir/datafile" -t 2 -l 10 -Q 100 -m tcp
|
../dnsperf -s 127.0.0.1 -p 5353 -d "$srcdir/datafile" -t 2 -l 10 -Q 100 -m tcp
|
||||||
kill "$pid"
|
kill "$pid"
|
||||||
|
sleep 2
|
||||||
|
|
||||||
rm -f key.pem cert.pem
|
rm -f key.pem cert.pem
|
||||||
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd"
|
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd"
|
||||||
|
@ -27,12 +31,29 @@ if [ -n "$dumdumd" ]; then
|
||||||
sleep 2
|
sleep 2
|
||||||
../dnsperf -s 127.0.0.1 -p 5353 -d "$srcdir/datafile" -t 2 -l 2 -Q 10 -m dot
|
../dnsperf -s 127.0.0.1 -p 5353 -d "$srcdir/datafile" -t 2 -l 2 -Q 10 -m dot
|
||||||
kill "$pid"
|
kill "$pid"
|
||||||
|
sleep 2
|
||||||
|
|
||||||
$dumdumd 127.0.0.1 5353 -r -T -D 10 &
|
$dumdumd 127.0.0.1 5353 -r -T -D 10 &
|
||||||
pid="$!"
|
pid="$!"
|
||||||
sleep 2
|
sleep 2
|
||||||
../dnsperf -s 127.0.0.1 -p 5353 -d "$srcdir/datafile" -t 2 -l 10 -Q 100 -m dot
|
../dnsperf -s 127.0.0.1 -p 5353 -d "$srcdir/datafile" -t 2 -l 10 -Q 100 -m dot
|
||||||
kill "$pid"
|
kill "$pid"
|
||||||
|
fi
|
||||||
pkill -9 dumdumd || true
|
|
||||||
|
if [ -n "$dumdohd" ]; then
|
||||||
|
rm -f key.pem cert.pem
|
||||||
|
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd"
|
||||||
|
|
||||||
|
$dumdohd 5353 key.pem cert.pem -D 100 &
|
||||||
|
pid="$!"
|
||||||
|
sleep 2
|
||||||
|
../dnsperf -s 127.0.0.1 -p 5353 -d "$srcdir/datafile" -t 2 -l 2 -Q 10 -m doh
|
||||||
|
kill "$pid"
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
$dumdohd 5353 key.pem cert.pem -D 10 &
|
||||||
|
pid="$!"
|
||||||
|
sleep 2
|
||||||
|
../dnsperf -s 127.0.0.1 -p 5353 -d "$srcdir/datafile" -t 2 -l 10 -Q 100 -m doh
|
||||||
|
kill "$pid"
|
||||||
fi
|
fi
|
||||||
|
|
Loading…
Add table
Reference in a new issue