diff options
author | seleznevae <seleznevae@protonmail.com> | 2020-05-31 19:59:49 +0300 |
---|---|---|
committer | seleznevae <seleznevae@protonmail.com> | 2020-05-31 19:59:49 +0300 |
commit | 83c58d49859f79c4eb23dd2461a2fa1f32d18117 (patch) | |
tree | 5ffef95653bd67a75f7c0fd508f77869c42b3934 /test | |
parent | c753ae876e2e1e2630ee9fac909027f4e52f0570 (diff) | |
download | libevent-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.c | 56 |
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 }; |