summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorseleznevae <seleznevae@protonmail.com>2020-05-31 19:59:49 +0300
committerseleznevae <seleznevae@protonmail.com>2020-05-31 19:59:49 +0300
commit83c58d49859f79c4eb23dd2461a2fa1f32d18117 (patch)
tree5ffef95653bd67a75f7c0fd508f77869c42b3934 /test
parentc753ae876e2e1e2630ee9fac909027f4e52f0570 (diff)
downloadlibevent-83c58d49859f79c4eb23dd2461a2fa1f32d18117.tar.gz
evdns: Add support for setting maximum UDP DNS message size.
Added new option `edns-udp-size` for evdns_base which allows to control maximum allowed size of UDP DNS messages. This maximum size is passed to the DNS server via edns mechanism.
Diffstat (limited to 'test')
-rw-r--r--test/regress_dns.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/test/regress_dns.c b/test/regress_dns.c
index e1ebf508..1675a98d 100644
--- a/test/regress_dns.c
+++ b/test/regress_dns.c
@@ -2608,6 +2608,60 @@ end:
}
static void
+test_edns(void *arg)
+{
+ struct basic_test_data *data = arg;
+ struct event_base *base = data->base;
+ struct evdns_base *dns = NULL;
+ ev_uint16_t portnum = 0;
+ char buf[64];
+ struct generic_dns_callback_result r;
+ struct in_addr addrs[2048]; /* used by macros `assert_request_results` */
+ int k_; /* used by macros `assert_request_results` */
+
+ exit_base = base;
+ tt_assert(regress_dnsserver(base, &portnum, search_table, NULL));
+ evutil_snprintf(buf, sizeof(buf), "127.0.0.1:%d", (int)portnum);
+ dns = evdns_base_new(base, 0);
+ tt_assert(!evdns_base_nameserver_ip_add(dns, buf));
+
+ n_replies_left = 1;
+ evdns_base_resolve_ipv4(dns, "medium.b.example.com",
+ DNS_QUERY_IGNTC, generic_dns_callback, &r);
+ event_base_dispatch(base);
+ tt_int_op(r.result, ==, DNS_ERR_TRUNCATED);
+ tt_int_op(r.count, ==, 0);
+
+ tt_assert(!evdns_base_set_option(dns, "edns-udp-size", "4096"));
+ n_replies_left = 1;
+ evdns_base_resolve_ipv4(dns, "medium.b.example.com",
+ DNS_QUERY_IGNTC, generic_dns_callback, &r);
+ event_base_dispatch(base);
+ assert_request_results(r, DNS_ERR_NONE, REPEAT_64("11.22.33.45") "," REPEAT_64("12.22.33.45"));
+
+ n_replies_left = 1;
+ evdns_base_resolve_ipv4(dns, "large.c.example.com",
+ DNS_QUERY_IGNTC, generic_dns_callback, &r);
+ event_base_dispatch(base);
+ tt_int_op(r.result, ==, DNS_ERR_TRUNCATED);
+ tt_int_op(r.count, ==, 0);
+
+ tt_assert(!evdns_base_set_option(dns, "edns-udp-size", "65535"));
+ n_replies_left = 1;
+ evdns_base_resolve_ipv4(dns, "large.c.example.com",
+ DNS_QUERY_IGNTC, generic_dns_callback, &r);
+ event_base_dispatch(base);
+ assert_request_results(r, DNS_ERR_NONE,
+ REPEAT_256("11.22.33.45") "," REPEAT_256("12.22.33.45") "," REPEAT_256("13.22.33.45") "," REPEAT_256("14.22.33.45"));
+
+end:
+ if (dns)
+ evdns_base_free(dns, 0);
+
+ regress_clean_dnsserver();
+}
+
+static void
test_set_so_rcvbuf_so_sndbuf(void *arg)
{
struct basic_test_data *data = arg;
@@ -2832,6 +2886,8 @@ struct testcase_t dns_testcases[] = {
TT_FORK|TT_NEED_BASE, &basic_setup, NULL },
{ "set_server_options", test_set_server_option,
TT_FORK|TT_NEED_BASE, &basic_setup, NULL },
+ { "edns", test_edns,
+ TT_FORK|TT_NEED_BASE, &basic_setup, NULL },
END_OF_TESTCASES
};