summaryrefslogtreecommitdiffstats
path: root/src/dnsperf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dnsperf.c')
-rw-r--r--src/dnsperf.c50
1 files changed, 40 insertions, 10 deletions
diff --git a/src/dnsperf.c b/src/dnsperf.c
index c3466ee..0f312ce 100644
--- a/src/dnsperf.c
+++ b/src/dnsperf.c
@@ -52,7 +52,8 @@
#define DEFAULT_SERVER_NAME "127.0.0.1"
#define DEFAULT_SERVER_PORT 53
#define DEFAULT_SERVER_DOT_PORT 853
-#define DEFAULT_SERVER_PORTS "udp/tcp 53 or DoT 853"
+#define DEFAULT_SERVER_DOH_PORT 443
+#define DEFAULT_SERVER_PORTS "udp/tcp 53, DoT 853 or DoH 443"
#define DEFAULT_LOCAL_PORT 0
#define DEFAULT_MAX_OUTSTANDING 100
#define DEFAULT_TIMEOUT 5
@@ -407,6 +408,8 @@ setup(int argc, char** argv, config_t* config)
const char* edns_option = NULL;
const char* tsigkey = NULL;
const char* mode = 0;
+ const char* doh_uri = DEFAULT_DOH_URI;
+ const char* doh_method = DEFAULT_DOH_METHOD;
memset(config, 0, sizeof(*config));
config->argc = argc;
@@ -422,7 +425,7 @@ setup(int argc, char** argv, config_t* config)
perf_opt_add('f', perf_opt_string, "family",
"address family of DNS transport, inet or inet6", "any",
&family);
- perf_opt_add('m', perf_opt_string, "mode", "set transport mode: udp, tcp or dot", "udp", &mode);
+ perf_opt_add('m', perf_opt_string, "mode", "set transport mode: udp, tcp, dot or doh", "udp", &mode);
perf_opt_add('s', perf_opt_string, "server_addr",
"the server to query", DEFAULT_SERVER_NAME, &server_name);
perf_opt_add('p', perf_opt_port, "port",
@@ -480,6 +483,11 @@ setup(int argc, char** argv, config_t* config)
perf_opt_add('v', perf_opt_boolean, NULL,
"verbose: report each query and additional information to stdout",
NULL, &config->verbose);
+ perf_long_opt_add("doh-uri", perf_opt_string, "doh_uri",
+ "the URI to use for DNS-over-HTTPS", DEFAULT_DOH_URI, &doh_uri);
+ perf_long_opt_add("doh-method", perf_opt_string, "doh_method",
+ "the HTTP method to use for DNS-over-HTTPS: GET or POST", DEFAULT_DOH_METHOD, &doh_method);
+
bool log_stdout = false;
perf_opt_add('W', perf_opt_boolean, NULL, "log warnings and errors to stdout instead of stderr", NULL, &log_stdout);
@@ -493,9 +501,27 @@ setup(int argc, char** argv, config_t* config)
config->mode = perf_net_parsemode(mode);
if (!server_port) {
- server_port = config->mode == sock_dot ? DEFAULT_SERVER_DOT_PORT : DEFAULT_SERVER_PORT;
+ switch (config->mode) {
+ case sock_doh:
+ server_port = DEFAULT_SERVER_DOH_PORT;
+ break;
+ case sock_dot:
+ server_port = DEFAULT_SERVER_DOT_PORT;
+ break;
+ default:
+ server_port = DEFAULT_SERVER_PORT;
+ break;
+ }
}
+ if (doh_uri) {
+ perf_net_doh_parse_uri(doh_uri);
+ }
+ if (doh_method) {
+ perf_net_doh_parse_method(doh_method);
+ }
+ perf_net_doh_set_max_concurrent_streams(config->max_outstanding);
+
if (family != NULL)
config->family = perf_net_parsefamily(family);
perf_net_parseserver(config->family, server_name, server_port,
@@ -1181,13 +1207,11 @@ threadinfo_init(threadinfo_t* tinfo, const config_t* config,
tinfo->socks[i] = perf_net_opensocket(config->mode, &config->server_addr,
&config->local_addr,
socket_offset++,
- config->bufsize);
+ config->bufsize,
+ tinfo, perf__net_sent, perf__net_event);
if (!tinfo->socks[i]) {
perf_log_fatal("perf_net_opensocket(): no socket returned, out of memory?");
}
- tinfo->socks[i]->data = tinfo;
- tinfo->socks[i]->sent = perf__net_sent;
- tinfo->socks[i]->event = perf__net_event;
}
tinfo->current_sock = 0;
@@ -1204,14 +1228,16 @@ threadinfo_stop(threadinfo_t* tinfo)
}
static void
-threadinfo_cleanup(threadinfo_t* tinfo, times_t* times)
+threadinfo_cleanup(config_t* config, threadinfo_t* tinfo, times_t* times)
{
unsigned int i;
if (interrupted)
cancel_queries(tinfo);
- for (i = 0; i < tinfo->nsocks; i++)
+ for (i = 0; i < tinfo->nsocks; i++) {
+ perf_net_stats_compile(config->mode, tinfo->socks[i]);
perf_net_close(tinfo->socks[i]);
+ }
if (tinfo->last_recv > times->end_time)
times->end_time = tinfo->last_recv;
}
@@ -1246,6 +1272,7 @@ int main(int argc, char** argv)
switch (config.mode) {
case sock_tcp:
case sock_dot:
+ case sock_doh:
// block SIGPIPE for TCP/DOT mode, if connection is closed it will generate a signal
perf_os_blocksignal(SIGPIPE, true);
break;
@@ -1296,13 +1323,16 @@ int main(int argc, char** argv)
if (config.stats_interval > 0)
PERF_JOIN(stats_thread.sender, NULL);
+ perf_net_stats_init(config.mode);
+
for (i = 0; i < config.threads; i++)
- threadinfo_cleanup(&threads[i], &times);
+ threadinfo_cleanup(&config, &threads[i], &times);
print_final_status(&config);
sum_stats(&config, &total_stats);
print_statistics(&config, &times, &total_stats);
+ perf_net_stats_print(config.mode);
cleanup(&config);
#if OPENSSL_VERSION_NUMBER < 0x10100000L