Adding upstream version 2.7.0.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-09 08:58:37 +01:00
parent dd7b5026ba
commit 462f4c9882
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
27 changed files with 1877 additions and 102 deletions

View file

@ -53,7 +53,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_SOCKET_BUFFER 32
#define DEFAULT_TIMEOUT 45
@ -218,8 +219,23 @@ stringify(double value, int precision)
static void perf__net_event(struct perf_net_socket* sock, perf_socket_event_t event, uint64_t elapsed_time);
static void perf__net_sent(struct perf_net_socket* sock, uint16_t qid);
static void
setup(int argc, char** argv)
static ramp_bucket* init_buckets(int n)
{
ramp_bucket* p;
int i;
if (!(p = calloc(n, sizeof(*p)))) {
perf_log_fatal("out of memory");
return 0; // fix clang scan-build
}
for (i = 0; i < n; i++) {
p[i].queries = p[i].responses = p[i].failures = 0;
p[i].latency_sum = 0.0;
}
return p;
}
static void setup(int argc, char** argv)
{
const char* family = NULL;
const char* server_name = DEFAULT_SERVER_NAME;
@ -233,6 +249,8 @@ setup(int argc, char** argv)
unsigned int i;
const char* _mode = 0;
const char* edns_option_str = NULL;
const char* doh_uri = DEFAULT_DOH_URI;
const char* doh_method = DEFAULT_DOH_METHOD;
sock_family = AF_UNSPEC;
server_port = 0;
@ -251,7 +269,7 @@ setup(int argc, char** argv)
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",
@ -310,6 +328,10 @@ setup(int argc, char** argv)
perf_opt_add('R', perf_opt_boolean, NULL, "reopen datafile on end, allow for infinit use of it", NULL, &reopen_datafile);
perf_opt_add('F', perf_opt_zpint, "fall_behind", "the maximum number of queries that is allowed to fall behind, zero to disable",
stringify(DEFAULT_MAX_FALL_BEHIND, 0), &max_fall_behind);
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);
perf_opt_parse(argc, argv);
@ -321,9 +343,27 @@ setup(int argc, char** argv)
mode = perf_net_parsemode(_mode);
if (!server_port) {
server_port = mode == sock_dot ? DEFAULT_SERVER_DOT_PORT : DEFAULT_SERVER_PORT;
switch (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(max_outstanding);
if (max_outstanding > nsocks * DEFAULT_MAX_OUTSTANDING)
perf_log_fatal("number of outstanding packets (%u) must not "
"be more than 64K per client",
@ -364,17 +404,23 @@ setup(int argc, char** argv)
if (edns_option_str != NULL)
edns_option = perf_edns_parseoption(edns_option_str);
traffic_time = ramp_time + sustain_time;
end_time = traffic_time + wait_time;
n_buckets = (traffic_time + bucket_interval - 1) / bucket_interval;
buckets = init_buckets(n_buckets);
time_now = perf_get_time();
time_of_program_start = time_now;
if (!(socks = calloc(nsocks, sizeof(*socks)))) {
perf_log_fatal("out of memory");
}
for (i = 0; i < nsocks; i++) {
socks[i] = perf_net_opensocket(mode, &server_addr, &local_addr, i, bufsize);
socks[i] = perf_net_opensocket(mode, &server_addr, &local_addr, i, bufsize, (void*)(intptr_t)i, perf__net_sent, perf__net_event);
if (!socks[i]) {
perf_log_fatal("perf_net_opensocket(): no socket returned, out of memory?");
}
socks[i]->data = (void*)(intptr_t)i;
socks[i]->sent = perf__net_sent;
socks[i]->event = perf__net_event;
}
}
@ -384,8 +430,10 @@ cleanup(void)
unsigned int i;
perf_datafile_close(&input);
for (i = 0; i < nsocks; i++)
for (i = 0; i < nsocks; i++) {
perf_net_stats_compile(mode, socks[i]);
(void)perf_net_close(socks[i]);
}
close(dummypipe[0]);
close(dummypipe[1]);
@ -499,23 +547,7 @@ print_statistics(void)
}
printf(" Maximum throughput: %.6lf qps\n", max_throughput);
printf(" Lost at that point: %.2f%%\n", loss_at_max_throughput);
}
static ramp_bucket*
init_buckets(int n)
{
ramp_bucket* p;
int i;
if (!(p = calloc(n, sizeof(*p)))) {
perf_log_fatal("out of memory");
return 0; // fix clang scan-build
}
for (i = 0; i < n; i++) {
p[i].queries = p[i].responses = p[i].failures = 0;
p[i].latency_sum = 0.0;
}
return p;
printf("\n");
}
/*
@ -776,6 +808,7 @@ int main(int argc, char** argv)
switch (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;
@ -788,15 +821,6 @@ int main(int argc, char** argv)
max_packet_size = edns ? MAX_EDNS_PACKET : MAX_UDP_PACKET;
perf_buffer_init(&msg, outpacket_buffer, max_packet_size);
traffic_time = ramp_time + sustain_time;
end_time = traffic_time + wait_time;
n_buckets = (traffic_time + bucket_interval - 1) / bucket_interval;
buckets = init_buckets(n_buckets);
time_now = perf_get_time();
time_of_program_start = time_now;
printf("[Status] Command line: %s", progname);
for (i = 1; i < argc; i++) {
printf(" %s", argv[i]);
@ -896,7 +920,9 @@ end_loop:
fclose(plotf);
print_statistics();
perf_net_stats_init(mode);
cleanup();
perf_net_stats_print(mode);
#if OPENSSL_VERSION_NUMBER < 0x10100000L
ERR_free_strings();
#endif