diff -Nru knot-resolver-3.0.0/ci/debian-unstable/Dockerfile knot-resolver-3.1.0/ci/debian-unstable/Dockerfile --- knot-resolver-3.0.0/ci/debian-unstable/Dockerfile 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/ci/debian-unstable/Dockerfile 2018-11-02 15:29:58.000000000 +0000 @@ -1,6 +1,6 @@ FROM debian:unstable MAINTAINER Knot Resolver -ARG KNOT_BRANCH=master +ARG KNOT_BRANCH=2.7 WORKDIR /root CMD ["/bin/bash"] diff -Nru knot-resolver-3.0.0/ci/fedora/Dockerfile knot-resolver-3.1.0/ci/fedora/Dockerfile --- knot-resolver-3.0.0/ci/fedora/Dockerfile 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/ci/fedora/Dockerfile 2018-11-02 15:29:58.000000000 +0000 @@ -1,4 +1,4 @@ -FROM fedora:27 +FROM fedora:29 WORKDIR "/tmp" CMD ["/bin/bash"] @@ -7,3 +7,16 @@ # for scripts/make-distrofiles.sh RUN dnf install -y dpkg-dev perl-Digest-* + +# add OBS repo with Knot DNS to mock +RUN curl -Lo obs-epel7.repo 'https://download.opensuse.org/repositories/home:CZ-NIC:knot-resolver-testing/CentOS_7_EPEL/home:CZ-NIC:knot-resolver-testing.repo' +RUN sed -i -e "/^config_opts\[.yum.conf.]/r obs-epel7.repo" /etc/mock/epel-7-x86_64.cfg +RUN curl -Lo obs-fedora.repo 'https://download.opensuse.org/repositories/home:CZ-NIC:knot-resolver-testing/Fedora_Rawhide/home:CZ-NIC:knot-resolver-testing.repo' +RUN sed -i -e "/^config_opts\[.yum.conf.]/r obs-fedora.repo" /etc/mock/fedora-29-x86_64.cfg + +# cache packages in mock to speed up CI tests +# This would require privileged build: https://github.com/moby/moby/issues/1916 +# RUN dnf download --source knot-resolver +# RUN mock --no-clean --dnf --old-chroot -r epel-7-x86_64 --rebuild knot-resolver-*.src.rpm +# RUN mock --no-clean --old-chroot -r fedora-29-x86_64 --rebuild knot-resolver-*.src.rpm +# RUN rm *.src.rpm diff -Nru knot-resolver-3.0.0/ci/respdiff/respdiff-tcp.conf knot-resolver-3.1.0/ci/respdiff/respdiff-tcp.conf --- knot-resolver-3.0.0/ci/respdiff/respdiff-tcp.conf 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/ci/respdiff/respdiff-tcp.conf 2018-11-02 15:29:58.000000000 +0000 @@ -41,10 +41,10 @@ target = kresd # fields and comparison methods used when comparing two DNS messages -criteria = opcode, rcode, flags, question, qname, qtype, answertypes, answerrrsigs +criteria = opcode, rcode, flags, question, answertypes, answerrrsigs # other supported criteria values: authority, additional, edns, nsid [report] # diffsum reports mismatches in field values in this order # if particular message has multiple mismatches, it is counted only once into category with highest weight -field_weights = timeout, opcode, qcase, qtype, rcode, flags, answertypes, answerrrsigs, answer, authority, additional, edns, nsid +field_weights = timeout, malformed, opcode, question, rcode, flags, answertypes, answerrrsigs, answer, authority, additional, edns, nsid diff -Nru knot-resolver-3.0.0/ci/respdiff/respdiff-tls.conf knot-resolver-3.1.0/ci/respdiff/respdiff-tls.conf --- knot-resolver-3.0.0/ci/respdiff/respdiff-tls.conf 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/ci/respdiff/respdiff-tls.conf 2018-11-02 15:29:58.000000000 +0000 @@ -41,10 +41,10 @@ target = kresd # fields and comparison methods used when comparing two DNS messages -criteria = opcode, rcode, flags, question, qname, qtype, answertypes, answerrrsigs +criteria = opcode, rcode, flags, question, answertypes, answerrrsigs # other supported criteria values: authority, additional, edns, nsid [report] # diffsum reports mismatches in field values in this order # if particular message has multiple mismatches, it is counted only once into category with highest weight -field_weights = timeout, opcode, qcase, qtype, rcode, flags, answertypes, answerrrsigs, answer, authority, additional, edns, nsid +field_weights = timeout, malformed, opcode, question, rcode, flags, answertypes, answerrrsigs, answer, authority, additional, edns, nsid diff -Nru knot-resolver-3.0.0/ci/respdiff/respdiff-udp.conf knot-resolver-3.1.0/ci/respdiff/respdiff-udp.conf --- knot-resolver-3.0.0/ci/respdiff/respdiff-udp.conf 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/ci/respdiff/respdiff-udp.conf 2018-11-02 15:29:58.000000000 +0000 @@ -41,10 +41,10 @@ target = kresd # fields and comparison methods used when comparing two DNS messages -criteria = opcode, rcode, flags, question, qname, qtype, answertypes, answerrrsigs +criteria = opcode, rcode, flags, question, answertypes, answerrrsigs # other supported criteria values: authority, additional, edns, nsid [report] # diffsum reports mismatches in field values in this order # if particular message has multiple mismatches, it is counted only once into category with highest weight -field_weights = timeout, opcode, qcase, qtype, rcode, flags, answertypes, answerrrsigs, answer, authority, additional, edns, nsid +field_weights = timeout, malformed, opcode, question, rcode, flags, answertypes, answerrrsigs, answer, authority, additional, edns, nsid diff -Nru knot-resolver-3.0.0/ci/respdiff/run-respdiff-tests.sh knot-resolver-3.1.0/ci/respdiff/run-respdiff-tests.sh --- knot-resolver-3.0.0/ci/respdiff/run-respdiff-tests.sh 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/ci/respdiff/run-respdiff-tests.sh 2018-11-02 15:29:58.000000000 +0000 @@ -5,7 +5,7 @@ NDIFFREPRO=3 -wget https://gitlab.labs.nic.cz/knot/knot-resolver/snippets/69/raw?inline=false -O /tmp/queries.txt +wget -qO- https://gitlab.labs.nic.cz/knot/respdiff/snippets/238/raw?inline=false | head -n 5000 > /tmp/queries.txt mkdir results rm -rf respdiff.db diff -Nru knot-resolver-3.0.0/config.mk knot-resolver-3.1.0/config.mk --- knot-resolver-3.0.0/config.mk 2018-08-17 12:13:40.000000000 +0000 +++ knot-resolver-3.1.0/config.mk 2018-11-02 15:29:58.000000000 +0000 @@ -1,6 +1,6 @@ # Project MAJOR := 3 -MINOR := 0 +MINOR := 1 PATCH := 0 EXTRA ?= ABIVER := 8 diff -Nru knot-resolver-3.0.0/daemon/bindings.c knot-resolver-3.1.0/daemon/bindings.c --- knot-resolver-3.0.0/daemon/bindings.c 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/daemon/bindings.c 2018-11-02 15:29:58.000000000 +0000 @@ -793,37 +793,53 @@ static int net_outgoing_v4(lua_State *L) { return net_outgoing(L, AF_INET); } static int net_outgoing_v6(lua_State *L) { return net_outgoing(L, AF_INET6); } -static int net_tcp_in_idle(lua_State *L) +static int net_update_timeout(lua_State *L, uint64_t *timeout, const char *name) { - struct engine *engine = engine_luaget(L); - struct network *net = &engine->net; - /* Only return current idle timeout. */ if (lua_gettop(L) == 0) { - lua_pushnumber(L, net->tcp.in_idle_timeout); + lua_pushnumber(L, *timeout); return 1; } if ((lua_gettop(L) != 1)) { - lua_pushstring(L, "net.tcp_in_idle takes one parameter: (\"idle timeout\")"); + lua_pushstring(L, name); + lua_pushstring(L, " takes one parameter: (\"idle timeout\")"); lua_error(L); } if (lua_isnumber(L, 1)) { int idle_timeout = lua_tointeger(L, 1); if (idle_timeout <= 0) { - lua_pushstring(L, "net.tcp_in_idle parameter has to be positive number"); + lua_pushstring(L, name); + lua_pushstring(L, " parameter has to be positive number"); lua_error(L); } - net->tcp.in_idle_timeout = idle_timeout; + *timeout = idle_timeout; } else { - lua_pushstring(L, "net.tcp_in_idle parameter has to be positive number"); + lua_pushstring(L, name); + lua_pushstring(L, " parameter has to be positive number"); lua_error(L); } lua_pushboolean(L, true); return 1; } +static int net_tcp_in_idle(lua_State *L) +{ + struct engine *engine = engine_luaget(L); + struct network *net = &engine->net; + + return net_update_timeout(L, &net->tcp.in_idle_timeout, "net.tcp_in_idle"); +} + +static int net_tls_handshake_timeout(lua_State *L) +{ + struct engine *engine = engine_luaget(L); + struct network *net = &engine->net; + + return net_update_timeout(L, &net->tcp.tls_handshake_timeout, "net.tls_handshake_timeout"); +} + int lib_net(lua_State *L) { static const luaL_Reg lib[] = { @@ -842,6 +858,7 @@ { "outgoing_v4", net_outgoing_v4 }, { "outgoing_v6", net_outgoing_v6 }, { "tcp_in_idle", net_tcp_in_idle }, + { "tls_handshake_timeout", net_tls_handshake_timeout }, { NULL, NULL } }; register_lib(L, "net", lib); @@ -1205,7 +1222,7 @@ } /** Set time interval for cleaning rtt cache. - * Servers with score >= KR_NS_TIMEOUTED will be cleaned after + * Servers with score >= KR_NS_TIMEOUT will be cleaned after * this interval ended up, so that they will be able to participate * in NS elections again. */ static int cache_ns_tout(lua_State *L) diff -Nru knot-resolver-3.0.0/daemon/cache.test/clear.test.lua knot-resolver-3.1.0/daemon/cache.test/clear.test.lua --- knot-resolver-3.0.0/daemon/cache.test/clear.test.lua 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/daemon/cache.test/clear.test.lua 2018-11-02 15:29:58.000000000 +0000 @@ -31,7 +31,8 @@ ev = event.after(0, function () return 1 end) --- import fake root zone +-- Import fake root zone; avoid interference with configured KEYFILE_DEFAULT. +trust_anchors.keyfile_default = nil trust_anchors.add('. IN DS 48409 8 2 3D63A0C25BCE86621DE63636F11B35B908EFE8E9381E0E3E9DEFD89EA952C27D') local function check_answer(desc, qname, qtype, expected_rcode) @@ -80,7 +81,7 @@ end local function test_exact_match_qname() - res = cache.clear('a.b.subtree1.') + res = cache.clear('a.b.SubTree1.') is(res.count, 2, 'single qname can be cleared at once') check_answer('exact match on qname must flush all RRs with the same owner from cache', 'a.b.subtree1.', kres.type.AAAA, kres.rcode.SERVFAIL) diff -Nru knot-resolver-3.0.0/daemon/daemon.mk knot-resolver-3.1.0/daemon/daemon.mk --- knot-resolver-3.0.0/daemon/daemon.mk 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/daemon/daemon.mk 2018-11-02 15:29:58.000000000 +0000 @@ -9,6 +9,7 @@ daemon/tls_ephemeral_credentials.c \ daemon/tls_session_ticket-srv.c \ daemon/zimport.c \ + daemon/session.c \ daemon/main.c kresd_DIST := daemon/lua/kres.lua daemon/lua/kres-gen.lua \ diff -Nru knot-resolver-3.0.0/daemon/engine.c knot-resolver-3.1.0/daemon/engine.c --- knot-resolver-3.0.0/daemon/engine.c 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/daemon/engine.c 2018-11-02 15:29:58.000000000 +0000 @@ -33,6 +33,21 @@ #include "lib/cache/cdb_lmdb.h" #include "lib/dnssec/ta.h" +/* Magic defaults for the engine. */ +#ifndef LRU_RTT_SIZE +#define LRU_RTT_SIZE 65536 /**< NS RTT cache size */ +#endif +#ifndef LRU_REP_SIZE +#define LRU_REP_SIZE (LRU_RTT_SIZE / 4) /**< NS reputation cache size */ +#endif +#ifndef LRU_COOKIES_SIZE + #ifdef ENABLE_COOKIES + #define LRU_COOKIES_SIZE LRU_RTT_SIZE /**< DNS cookies cache size. */ + #else + #define LRU_COOKIES_SIZE LRU_ASSOC /* simpler than guards everywhere */ + #endif +#endif + /** @internal Compatibility wrapper for Lua < 5.2 */ #if LUA_VERSION_NUM < 502 #define lua_rawlen(L, obj) lua_objlen((L), (obj)) @@ -608,6 +623,7 @@ static int init_resolver(struct engine *engine) { + /* Note: it had been zored by engine_init(). */ /* Open resolution context */ engine->resolver.trust_anchors = map_make(NULL); engine->resolver.negative_anchors = map_make(NULL); diff -Nru knot-resolver-3.0.0/daemon/engine.h knot-resolver-3.1.0/daemon/engine.h --- knot-resolver-3.0.0/daemon/engine.h 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/daemon/engine.h 2018-11-02 15:29:58.000000000 +0000 @@ -16,33 +16,6 @@ #pragma once -/* Magic defaults */ -#ifndef LRU_RTT_SIZE -#define LRU_RTT_SIZE 65536 /**< NS RTT cache size */ -#endif -#ifndef LRU_REP_SIZE -#define LRU_REP_SIZE (LRU_RTT_SIZE / 4) /**< NS reputation cache size */ -#endif -#ifndef LRU_COOKIES_SIZE -#define LRU_COOKIES_SIZE LRU_RTT_SIZE /**< DNS cookies cache size. */ -#endif -#ifndef MP_FREELIST_SIZE -# ifdef __clang_analyzer__ -# define MP_FREELIST_SIZE 0 -# else -# define MP_FREELIST_SIZE 64 /**< Maximum length of the worker mempool freelist */ -# endif -#endif -#ifndef RECVMMSG_BATCH -#define RECVMMSG_BATCH 4 -#endif -#ifndef QUERY_RATE_THRESHOLD -#define QUERY_RATE_THRESHOLD (2 * MP_FREELIST_SIZE) /**< Nr of parallel queries considered as high rate */ -#endif -#ifndef MAX_PIPELINED -#define MAX_PIPELINED 100 -#endif - /* * @internal These are forward decls to allow building modules with engine but without Lua. */ diff -Nru knot-resolver-3.0.0/daemon/io.c knot-resolver-3.1.0/daemon/io.c --- knot-resolver-3.0.0/daemon/io.c 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/daemon/io.c 2018-11-02 15:29:58.000000000 +0000 @@ -24,6 +24,7 @@ #include "daemon/network.h" #include "daemon/worker.h" #include "daemon/tls.h" +#include "daemon/session.h" #define negotiate_bufsize(func, handle, bufsize_want) do { \ int bufsize = 0; func(handle, &bufsize); \ @@ -33,112 +34,38 @@ } \ } while (0) -void io_release(uv_handle_t *handle); - static void check_bufsize(uv_handle_t* handle) { + return; /* TODO: resurrect after https://github.com/libuv/libuv/issues/419 */ /* We want to buffer at least N waves in advance. * This is magic presuming we can pull in a whole recvmmsg width in one wave. * Linux will double this the bufsize wanted. */ - const int bufsize_want = RECVMMSG_BATCH * 65535 * 2; + const int bufsize_want = 2 * sizeof( ((struct worker_ctx *)NULL)->wire_buf ) ; negotiate_bufsize(uv_recv_buffer_size, handle, bufsize_want); negotiate_bufsize(uv_send_buffer_size, handle, bufsize_want); } #undef negotiate_bufsize -static void session_clear(struct session *s) -{ - assert(s->tasks.len == 0 && s->waiting.len == 0); - array_clear(s->tasks); - array_clear(s->waiting); - tls_free(s->tls_ctx); - tls_client_ctx_free(s->tls_client_ctx); - memset(s, 0, sizeof(*s)); -} - -void session_free(struct session *s) -{ - if (s) { - assert(s->tasks.len == 0 && s->waiting.len == 0); - session_clear(s); - free(s); - } -} - -struct session *session_new(void) -{ - return calloc(1, sizeof(struct session)); -} - -static struct session *session_borrow(struct worker_ctx *worker) -{ - struct session *s = NULL; - if (worker->pool_sessions.len > 0) { - s = array_tail(worker->pool_sessions); - array_pop(worker->pool_sessions); - kr_asan_unpoison(s, sizeof(*s)); - } else { - s = session_new(); - } - return s; -} - -static void session_release(struct worker_ctx *worker, uv_handle_t *handle) -{ - if (!worker || !handle) { - return; - } - struct session *s = handle->data; - if (!s) { - return; - } - assert(s->waiting.len == 0 && s->tasks.len == 0); - assert(s->buffering == NULL); - if (!s->outgoing && handle->type == UV_TCP) { - worker_end_tcp(worker, handle); /* to free the buffering task */ - } - if (worker->pool_sessions.len < MP_FREELIST_SIZE) { - session_clear(s); - array_push(worker->pool_sessions, s); - kr_asan_poison(s, sizeof(*s)); - } else { - session_free(s); - } -} - -static uv_stream_t *handle_borrow(uv_loop_t *loop) -{ - struct worker_ctx *worker = loop->data; - void *req = worker_iohandle_borrow(worker); - if (!req) { - return NULL; - } - - return (uv_stream_t *)req; -} - static void handle_getbuf(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { - /* Worker has single buffer which is reused for all incoming - * datagrams / stream reads, the content of the buffer is + /* UDP sessions use worker buffer for wire data, + * TCP sessions use session buffer for wire data + * (see session_set_handle()). + * TLS sessions use buffer from TLS context. + * The content of the worker buffer is * guaranteed to be unchanged only for the duration of * udp_read() and tcp_read(). */ - struct session *session = handle->data; - uv_loop_t *loop = handle->loop; - struct worker_ctx *worker = loop->data; - buf->base = (char *)worker->wire_buf; - /* Limit TCP stream buffer size to 4K for granularity in batches of incoming queries. */ - if (handle->type == UV_TCP) { - buf->len = MIN(suggested_size, 4096); - /* Regular buffer size for subrequests. */ - } else if (session->outgoing) { - buf->len = suggested_size; - /* Use recvmmsg() on master sockets if possible. */ + struct session *s = handle->data; + if (!session_flags(s)->has_tls) { + buf->base = (char *) session_wirebuf_get_free_start(s); + buf->len = session_wirebuf_get_free_size(s); } else { - buf->len = sizeof(worker->wire_buf); + struct tls_common_ctx *ctx = session_tls_get_common_ctx(s); + buf->base = (char *) ctx->recv_buf; + buf->len = sizeof(ctx->recv_buf); } } @@ -148,29 +75,32 @@ uv_loop_t *loop = handle->loop; struct worker_ctx *worker = loop->data; struct session *s = handle->data; - if (s->closing) { + if (session_flags(s)->closing) { return; } if (nread <= 0) { if (nread < 0) { /* Error response, notify resolver */ - worker_submit(worker, (uv_handle_t *)handle, NULL, addr); + worker_submit(s, NULL); } /* nread == 0 is for freeing buffers, we don't need to do this */ return; } if (addr->sa_family == AF_UNSPEC) { return; } - if (s->outgoing) { - assert(s->peer.ip.sa_family != AF_UNSPEC); - if (kr_sockaddr_cmp(&s->peer.ip, addr) != 0) { + struct sockaddr *peer = session_get_peer(s); + if (session_flags(s)->outgoing) { + assert(peer->sa_family != AF_UNSPEC); + if (kr_sockaddr_cmp(peer, addr) != 0) { return; } + } else { + memcpy(peer, addr, kr_sockaddr_len(addr)); } - knot_pkt_t *query = knot_pkt_new(buf->base, nread, &worker->pkt_pool); - if (query) { - query->max_size = KNOT_WIRE_MAX_PKTSIZE; - worker_submit(worker, (uv_handle_t *)handle, query, addr); - } + ssize_t consumed = session_wirebuf_consume(s, (const uint8_t *)buf->base, + nread); + assert(consumed == nread); (void)consumed; + session_wirebuf_process(s); + session_wirebuf_discard(s); mp_flush(worker->pkt_pool.ctx); } @@ -178,11 +108,9 @@ { check_bufsize(handle); /* Handle is already created, just create context. */ - struct session *session = session_new(); - assert(session); - session->outgoing = false; - session->handle = handle; - handle->data = session; + struct session *s = session_new(handle); + assert(s); + session_flags(s)->outgoing = false; return io_start_read(handle); } @@ -212,16 +140,45 @@ return udp_bind_finalize((uv_handle_t *)handle); } -static void tcp_timeout_trigger(uv_timer_t *timer) +void tcp_timeout_trigger(uv_timer_t *timer) { - struct session *session = timer->data; + struct session *s = timer->data; + + assert(!session_flags(s)->closing); + assert(session_waitinglist_is_empty(s)); + + struct worker_ctx *worker = timer->loop->data; - assert(session->outgoing == false); - if (session->tasks.len > 0) { - uv_timer_again(timer); - } else if (!session->closing) { + if (!session_tasklist_is_empty(s)) { + int finalized = session_tasklist_finalize_expired(s); + worker->stats.timeout += finalized; + /* session_tasklist_finalize_expired() may call worker_task_finalize(). + * If session is a source session and there were IO errors, + * worker_task_finalize() can filnalize all tasks and close session. */ + if (session_flags(s)->closing) { + return; + } + + } + if (!session_tasklist_is_empty(s)) { uv_timer_stop(timer); - worker_session_close(session); + session_timer_start(s, tcp_timeout_trigger, + KR_RESOLVE_TIME_LIMIT / 2, + KR_RESOLVE_TIME_LIMIT / 2); + } else { + const struct engine *engine = worker->engine; + const struct network *net = &engine->net; + uint64_t idle_in_timeout = net->tcp.in_idle_timeout; + uint64_t last_activity = session_last_activity(s); + uint64_t idle_time = kr_now() - last_activity; + if (idle_time < idle_in_timeout) { + idle_in_timeout -= idle_time; + uv_timer_stop(timer); + session_timer_start(s, tcp_timeout_trigger, + idle_in_timeout, idle_in_timeout); + } else { + session_close(s); + } } } @@ -229,99 +186,130 @@ { uv_loop_t *loop = handle->loop; struct session *s = handle->data; - if (s->closing) { + + assert(s && session_get_handle(s) == (uv_handle_t *)handle && + handle->type == UV_TCP); + + if (session_flags(s)->closing) { return; } + /* nread might be 0, which does not indicate an error or EOF. * This is equivalent to EAGAIN or EWOULDBLOCK under read(2). */ if (nread == 0) { return; } - if (nread == UV_EOF) { - nread = 0; - } + struct worker_ctx *worker = loop->data; - /* TCP pipelining is rather complicated and requires cooperation from the worker - * so the whole message reassembly and demuxing logic is inside worker */ - int ret = 0; - if (s->has_tls) { - ret = tls_process(worker, handle, (const uint8_t *)buf->base, nread); - } else { - ret = worker_process_tcp(worker, handle, (const uint8_t *)buf->base, nread); + + if (nread < 0 || !buf->base) { + if (kr_verbose_status) { + struct sockaddr *peer = session_get_peer(s); + char peer_str[INET6_ADDRSTRLEN]; + inet_ntop(peer->sa_family, kr_inaddr(peer), + peer_str, sizeof(peer_str)); + kr_log_verbose("[io] => connection to '%s' closed by peer (%s)\n", peer_str, + uv_strerror(nread)); + } + worker_end_tcp(s); + return; + } + + ssize_t consumed = 0; + const uint8_t *data = (const uint8_t *)buf->base; + ssize_t data_len = nread; + if (session_flags(s)->has_tls) { + /* buf->base points to start of the tls receive buffer. + Decode data free space in session wire buffer. */ + consumed = tls_process_input_data(s, (const uint8_t *)buf->base, nread); + data = session_wirebuf_get_free_start(s); + data_len = consumed; } + + /* data points to start of the free space in session wire buffer. + Simple increase internal counter. */ + consumed = session_wirebuf_consume(s, data, data_len); + assert(consumed == data_len); + + int ret = session_wirebuf_process(s); if (ret < 0) { - worker_end_tcp(worker, (uv_handle_t *)handle); - /* Exceeded per-connection quota for outstanding requests - * stop reading from stream and close after last message is processed. */ - if (!s->outgoing && !uv_is_closing((uv_handle_t *)&s->timeout)) { - uv_timer_stop(&s->timeout); - if (s->tasks.len == 0) { - worker_session_close(s); - } else { /* If there are tasks running, defer until they finish. */ - uv_timer_start(&s->timeout, tcp_timeout_trigger, - MAX_TCP_INACTIVITY, MAX_TCP_INACTIVITY); - } - } - /* Connection spawned at least one request, reset its deadline for next query. - * https://tools.ietf.org/html/rfc7766#section-6.2.3 */ - } else if (ret > 0 && !s->outgoing && !s->closing) { - uv_timer_again(&s->timeout); + /* An error has occurred, close the session. */ + worker_end_tcp(s); } + session_wirebuf_compress(s); mp_flush(worker->pkt_pool.ctx); } static void _tcp_accept(uv_stream_t *master, int status, bool tls) { - if (status != 0) { + if (status != 0) { return; } - uv_stream_t *client = handle_borrow(master->loop); + struct worker_ctx *worker = (struct worker_ctx *)master->loop->data; + uv_tcp_t *client = malloc(sizeof(uv_tcp_t)); if (!client) { return; } - memset(client, 0, sizeof(*client)); - io_create(master->loop, (uv_handle_t *)client, SOCK_STREAM); - if (uv_accept(master, client) != 0) { - uv_close((uv_handle_t *)client, io_release); + int res = io_create(master->loop, (uv_handle_t *)client, SOCK_STREAM, AF_UNSPEC); + if (res) { + if (res == UV_EMFILE) { + worker->too_many_open = true; + worker->rconcurrent_highwatermark = worker->stats.rconcurrent; + } + /* Since res isn't OK struct session wasn't allocated \ borrowed. + * We must release client handle only. + */ + free(client); + return; + } + + /* struct session was allocated \ borrowed from memory pool. */ + struct session *session = client->data; + assert(session_flags(session)->outgoing == false); + + if (uv_accept(master, (uv_stream_t *)client) != 0) { + /* close session, close underlying uv handles and + * deallocate (or return to memory pool) memory. */ + session_close(session); return; } /* Set deadlines for TCP connection and start reading. * It will re-check every half of a request time limit if the connection * is idle and should be terminated, this is an educated guess. */ - struct session *session = client->data; - assert(session->outgoing == false); + struct session *s = client->data; + assert(session_flags(s)->outgoing == false); - struct sockaddr *addr = &(session->peer.ip); - int addr_len = sizeof(union inaddr); - int ret = uv_tcp_getpeername((uv_tcp_t *)client, addr, &addr_len); - if (ret || addr->sa_family == AF_UNSPEC) { - worker_session_close(session); + struct sockaddr *peer = session_get_peer(s); + int peer_len = sizeof(union inaddr); + int ret = uv_tcp_getpeername(client, peer, &peer_len); + if (ret || peer->sa_family == AF_UNSPEC) { + session_close(s); return; } - const struct worker_ctx *worker = (struct worker_ctx *)master->loop->data; const struct engine *engine = worker->engine; const struct network *net = &engine->net; uint64_t idle_in_timeout = net->tcp.in_idle_timeout; uint64_t timeout = KR_CONN_RTT_MAX / 2; - session->has_tls = tls; + session_flags(s)->has_tls = tls; if (tls) { timeout += TLS_MAX_HANDSHAKE_TIME; - if (!session->tls_ctx) { - session->tls_ctx = tls_new(master->loop->data); - if (!session->tls_ctx) { - worker_session_close(session); + struct tls_ctx_t *ctx = session_tls_get_server_ctx(s); + if (!ctx) { + ctx = tls_new(worker); + if (!ctx) { + session_close(s); return; } - session->tls_ctx->c.session = session; - session->tls_ctx->c.handshake_state = TLS_HS_IN_PROGRESS; + ctx->c.session = s; + ctx->c.handshake_state = TLS_HS_IN_PROGRESS; + session_tls_set_server_ctx(s, ctx); } } - uv_timer_t *timer = &session->timeout; - uv_timer_start(timer, tcp_timeout_trigger, timeout, idle_in_timeout); + session_timer_start(s, tcp_timeout_trigger, timeout, idle_in_timeout); io_start_read((uv_handle_t *)client); } @@ -424,23 +412,23 @@ return _tcp_bindfd(handle, fd, tls_accept); } -void io_create(uv_loop_t *loop, uv_handle_t *handle, int type) +int io_create(uv_loop_t *loop, uv_handle_t *handle, int type, unsigned family) { int ret = -1; if (type == SOCK_DGRAM) { ret = uv_udp_init(loop, (uv_udp_t *)handle); } else if (type == SOCK_STREAM) { - ret = uv_tcp_init(loop, (uv_tcp_t *)handle); + ret = uv_tcp_init_ex(loop, (uv_tcp_t *)handle, family); uv_tcp_nodelay((uv_tcp_t *)handle, 1); } - assert(ret == 0); - struct worker_ctx *worker = loop->data; - struct session *session = session_borrow(worker); - assert(session); - session->handle = handle; - handle->data = session; - session->timeout.data = session; - uv_timer_init(worker->loop, &session->timeout); + if (ret != 0) { + return ret; + } + struct session *s = session_new(handle); + if (s == NULL) { + ret = -1; + } + return ret; } void io_deinit(uv_handle_t *handle) @@ -448,36 +436,16 @@ if (!handle) { return; } - uv_loop_t *loop = handle->loop; - if (loop && loop->data) { - struct worker_ctx *worker = loop->data; - session_release(worker, handle); - } else { - session_free(handle->data); - } + session_free(handle->data); handle->data = NULL; } void io_free(uv_handle_t *handle) { - if (!handle) { - return; - } io_deinit(handle); free(handle); } -void io_release(uv_handle_t *handle) -{ - if (!handle) { - return; - } - uv_loop_t *loop = handle->loop; - struct worker_ctx *worker = loop->data; - io_deinit(handle); - worker_iohandle_release(worker, handle); -} - int io_start_read(uv_handle_t *handle) { switch (handle->type) { diff -Nru knot-resolver-3.0.0/daemon/io.h knot-resolver-3.1.0/daemon/io.h --- knot-resolver-3.0.0/daemon/io.h 2018-02-14 12:39:34.000000000 +0000 +++ knot-resolver-3.1.0/daemon/io.h 2018-11-02 15:29:58.000000000 +0000 @@ -25,42 +25,18 @@ struct tls_ctx_t; struct tls_client_ctx_t; -/* Per-session (TCP or UDP) persistent structure, - * that exists between remote counterpart and a local socket. - */ -struct session { - bool outgoing; /**< True: to upstream; false: from a client. */ - bool throttled; - bool has_tls; - bool connected; - bool closing; - union inaddr peer; - uv_handle_t *handle; - uv_timer_t timeout; - struct qr_task *buffering; /**< Worker buffers the incomplete TCP query here. */ - struct tls_ctx_t *tls_ctx; - struct tls_client_ctx_t *tls_client_ctx; - - uint8_t msg_hdr[4]; /**< Buffer for DNS message header. */ - ssize_t msg_hdr_idx; /**< The number of bytes in msg_hdr filled so far. */ - - qr_tasklist_t tasks; - qr_tasklist_t waiting; - ssize_t bytes_to_skip; -}; - -void session_free(struct session *s); -struct session *session_new(void); - int udp_bind(uv_udp_t *handle, struct sockaddr *addr); int udp_bindfd(uv_udp_t *handle, int fd); int tcp_bind(uv_tcp_t *handle, struct sockaddr *addr); int tcp_bind_tls(uv_tcp_t *handle, struct sockaddr *addr); int tcp_bindfd(uv_tcp_t *handle, int fd); int tcp_bindfd_tls(uv_tcp_t *handle, int fd); +void tcp_timeout_trigger(uv_timer_t *timer); -/** Initialize the handle, incl. ->data = struct session * instance. type = SOCK_* */ -void io_create(uv_loop_t *loop, uv_handle_t *handle, int type); +/** Initialize the handle, incl. ->data = struct session * instance. + * \param type = SOCK_* + * \param family = AF_* */ +int io_create(uv_loop_t *loop, uv_handle_t *handle, int type, unsigned family); void io_deinit(uv_handle_t *handle); void io_free(uv_handle_t *handle); diff -Nru knot-resolver-3.0.0/daemon/lua/kres-gen.lua knot-resolver-3.1.0/daemon/lua/kres-gen.lua --- knot-resolver-3.0.0/daemon/lua/kres-gen.lua 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/daemon/lua/kres-gen.lua 2018-11-02 15:29:58.000000000 +0000 @@ -195,6 +195,7 @@ trace_callback_f trace_finish; int vars_ref; knot_mm_t pool; + unsigned int uid; }; enum kr_rank {KR_RANK_INITIAL, KR_RANK_OMIT, KR_RANK_TRY, KR_RANK_INDET = 4, KR_RANK_BOGUS, KR_RANK_MISMATCH, KR_RANK_MISSING, KR_RANK_INSECURE, KR_RANK_AUTH = 16, KR_RANK_SECURE = 32}; struct kr_cache { @@ -262,6 +263,7 @@ _Bool knot_dname_is_equal(const knot_dname_t *, const knot_dname_t *); size_t knot_dname_labels(const uint8_t *, const uint8_t *); size_t knot_dname_size(const knot_dname_t *); +void knot_dname_to_lower(knot_dname_t *); char *knot_dname_to_str(char *, const knot_dname_t *, size_t); knot_rdata_t *knot_rdataset_at(const knot_rdataset_t *, uint16_t); int knot_rdataset_merge(knot_rdataset_t *, const knot_rdataset_t *, knot_mm_t *); diff -Nru knot-resolver-3.0.0/daemon/lua/kres-gen.sh knot-resolver-3.1.0/daemon/lua/kres-gen.sh --- knot-resolver-3.0.0/daemon/lua/kres-gen.sh 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/daemon/lua/kres-gen.sh 2018-11-02 15:29:58.000000000 +0000 @@ -108,6 +108,7 @@ knot_dname_is_equal knot_dname_labels knot_dname_size + knot_dname_to_lower knot_dname_to_str # Resource records knot_rdataset_at diff -Nru knot-resolver-3.0.0/daemon/lua/kres.lua knot-resolver-3.1.0/daemon/lua/kres.lua --- knot-resolver-3.0.0/daemon/lua/kres.lua 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/daemon/lua/kres.lua 2018-11-02 15:29:58.000000000 +0000 @@ -323,7 +323,7 @@ -- Convert dname pointer to wireformat string local function dname2wire(name) - if name == nil then return end + if name == nil then return nil end return ffi.string(name, knot.knot_dname_size(name)) end @@ -915,14 +915,19 @@ pkt_t = function (udata) return ffi.cast('knot_pkt_t *', udata) end, request_t = function (udata) return ffi.cast('struct kr_request *', udata) end, sockaddr_t = function (udata) return ffi.cast('struct sockaddr *', udata) end, + -- Global API functions + -- Convert a lua string to a lower-case wire format (inside GC-ed ffi.string). str2dname = function(name) if type(name) ~= 'string' then return end local dname = ffi.gc(C.knot_dname_from_str(nil, name, 0), C.free) + if dname == nil then return nil end + ffi.C.knot_dname_to_lower(dname); return dname2wire(dname) end, dname2str = dname2str, dname2wire = dname2wire, + rr2str = rr2str, str2ip = function (ip) local family = C.kr_straddr_family(ip) diff -Nru knot-resolver-3.0.0/daemon/lua/sandbox.lua knot-resolver-3.1.0/daemon/lua/sandbox.lua --- knot-resolver-3.0.0/daemon/lua/sandbox.lua 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/daemon/lua/sandbox.lua 2018-11-02 15:29:58.000000000 +0000 @@ -180,17 +180,17 @@ -- we assume they are advanced enough not to need the check. -- The point is to avoid repeating the check in each callback iteration. if callback == nil then - local names = ffi.new('knot_dname_t *[1]') -- C: dname **names - local ret = ffi.C.kr_cache_closest_apex(cach, dname, false, names) + local apex_array = ffi.new('knot_dname_t *[1]') -- C: dname **apex_array + local ret = ffi.C.kr_cache_closest_apex(cach, dname, false, apex_array) if ret < 0 then error(ffi.string(ffi.C.knot_strerror(ret))) end - ffi.gc(names[0], ffi.C.free) - local apex = kres.dname2str(names[0]) - if apex ~= name then + if not ffi.C.knot_dname_is_equal(apex_array[0], dname) then + local apex_str = kres.dname2str(apex_array[0]) rettable.not_apex = 'to clear proofs of non-existence call ' - .. 'cache.clear(\'' .. tostring(apex) ..'\')' - rettable.subtree = apex + .. 'cache.clear(\'' .. tostring(apex_str) ..'\')' + rettable.subtree = apex_str end + ffi.C.free(apex_array[0]) end if rr_type ~= nil then diff -Nru knot-resolver-3.0.0/daemon/main.c knot-resolver-3.1.0/daemon/main.c --- knot-resolver-3.0.0/daemon/main.c 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/daemon/main.c 2018-11-02 15:29:58.000000000 +0000 @@ -15,21 +15,23 @@ */ #include +#include +#include +#include #include #include #include -#include -#include +#include + #include -#include -#include -#include -#include -#include #ifdef HAS_SYSTEMD #include #endif +#include +#include +#include +#include #include "lib/defines.h" #include "lib/resolve.h" #include "lib/dnssec.h" @@ -300,6 +302,42 @@ uv_signal_stop(handle); } +/** SIGBUS -> attempt to remove the overflowing cache file and abort. */ +static void sigbus_handler(int sig, siginfo_t *siginfo, void *ptr) +{ + /* We can't safely assume that printf-like functions work, but write() is OK. + * See POSIX for the safe functions, e.g. 2017 version just above this link: + * http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_04 + */ + #define WRITE_ERR(err_charray) \ + (void)write(STDERR_FILENO, err_charray, sizeof(err_charray)) + /* Unfortunately, void-cast on the write isn't enough to avoid the warning. */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-result" + const char msg_typical[] = + "\nSIGBUS received; this is most likely due to filling up the filesystem where cache resides.\n", + msg_unknown[] = "\nSIGBUS received, cause unknown.\n", + msg_deleted[] = "Cache file deleted.\n", + msg_del_fail[] = "Cache file deletion failed.\n", + msg_final[] = "kresd can not recover reliably by itself, exiting.\n"; + if (siginfo->si_code != BUS_ADRERR) { + WRITE_ERR(msg_unknown); + goto end; + } + WRITE_ERR(msg_typical); + if (!kr_cache_emergency_file_to_remove) goto end; + if (unlink(kr_cache_emergency_file_to_remove)) { + WRITE_ERR(msg_del_fail); + } else { + WRITE_ERR(msg_deleted); + } +end: + WRITE_ERR(msg_final); + _exit(128 - sig); /*< regular return from OS-raised SIGBUS can't work anyway */ + #undef WRITE_ERR + #pragma GCC diagnostic pop +} + /** Split away port from the address. */ static const char *set_addr(char *addr, int *port) { @@ -689,7 +727,36 @@ return EXIT_FAILURE; } - uv_loop_t *loop = NULL; + uv_loop_t *loop = uv_default_loop(); + worker->loop = loop; + loop->data = worker; + + /* Catch some signals. */ + uv_signal_t sigint, sigterm; + if (true) ret = uv_signal_init(loop, &sigint); + if (!ret) ret = uv_signal_init(loop, &sigterm); + if (!ret) ret = uv_signal_start(&sigint, signal_handler, SIGINT); + if (!ret) ret = uv_signal_start(&sigterm, signal_handler, SIGTERM); + /* Block SIGPIPE; see https://github.com/libuv/libuv/issues/45 */ + if (!ret && signal(SIGPIPE, SIG_IGN) == SIG_ERR) ret = errno; + if (!ret) { + /* Catching SIGBUS via uv_signal_* can't work; see: + * https://github.com/libuv/libuv/pull/1987 */ + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sa.sa_sigaction = sigbus_handler; + sa.sa_flags = SA_SIGINFO; + if (sigaction(SIGBUS, &sa, NULL)) { + ret = errno; + } + } + if (ret) { + kr_log_error("[system] failed to set up signal handlers: %s\n", + strerror(abs(errno))); + ret = EXIT_FAILURE; + goto cleanup; + } + /* Bind to passed fds and sockets*/ if (bind_fds(&engine.net, &args.fd_set, false) != 0 || bind_fds(&engine.net, &args.tls_fd_set, true) != 0 || @@ -700,30 +767,8 @@ goto cleanup; } - /* Workaround for https://github.com/libuv/libuv/issues/45 - * (Write after ECONNRESET crash.) */ - if (ret == 0 && signal(SIGPIPE, SIG_IGN) == SIG_ERR) { - kr_log_error("[system] can't block SIGPIPE signal: %s\n", - strerror(errno)); - ret = EXIT_FAILURE; - } - - if (ret != 0) { - goto cleanup; - } - - engine_set_moduledir(&engine, args.moduledir); - - /* Block signals. */ - loop = uv_default_loop(); - uv_signal_t sigint, sigterm; - uv_signal_init(loop, &sigint); - uv_signal_init(loop, &sigterm); - uv_signal_start(&sigint, signal_handler, SIGINT); - uv_signal_start(&sigterm, signal_handler, SIGTERM); /* Start the scripting engine */ - worker->loop = loop; - loop->data = worker; + engine_set_moduledir(&engine, args.moduledir); if (engine_load_sandbox(&engine) != 0) { ret = EXIT_FAILURE; diff -Nru knot-resolver-3.0.0/daemon/network.c knot-resolver-3.1.0/daemon/network.c --- knot-resolver-3.0.0/daemon/network.c 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/daemon/network.c 2018-11-02 15:29:58.000000000 +0000 @@ -53,8 +53,9 @@ net->endpoints = map_make(NULL); net->tls_client_params = map_make(NULL); net->tls_session_ticket_ctx = /* unsync. random, by default */ - tls_session_ticket_ctx_create(loop, NULL, 0); + tls_session_ticket_ctx_create(loop, NULL, 0); net->tcp.in_idle_timeout = 10000; + net->tcp.tls_handshake_timeout = TLS_MAX_HANDSHAKE_TIME; } } diff -Nru knot-resolver-3.0.0/daemon/network.h knot-resolver-3.1.0/daemon/network.h --- knot-resolver-3.0.0/daemon/network.h 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/daemon/network.h 2018-11-02 15:29:58.000000000 +0000 @@ -44,6 +44,7 @@ struct net_tcp_param { uint64_t in_idle_timeout; + uint64_t tls_handshake_timeout; }; struct tls_session_ticket_ctx; diff -Nru knot-resolver-3.0.0/daemon/README.rst knot-resolver-3.1.0/daemon/README.rst --- knot-resolver-3.0.0/daemon/README.rst 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/daemon/README.rst 2018-11-02 15:29:58.000000000 +0000 @@ -9,6 +9,14 @@ $ kresd -h # Get help $ kresd -a ::1 +If you're using our packages, they also provide systemd integration. To start the resolver under systemd, you can use the ``kresd@1.service`` service. By default, the resolver only binds to local interfaces. + +.. code-block:: bash + + $ man kresd.systemd # Help for systemd integration configuration + $ systemctl start kresd@1.service + + Configuration ============= @@ -318,13 +326,14 @@ > user('root') Operation not permitted -.. function:: resolve(name, type[, class = kres.class.IN, options = {}, finish = nil]) +.. function:: resolve(name, type[, class = kres.class.IN, options = {}, finish = nil, init = nil]) :param string name: Query name (e.g. 'com.') :param number type: Query type (e.g. ``kres.type.NS``) :param number class: Query class *(optional)* (e.g. ``kres.class.IN``) - :param number options: Resolution options (see query flags) + :param strings options: Resolution options (see :c:type:`kr_qflags`) :param function finish: Callback to be executed when resolution completes (e.g. `function cb (pkt, req) end`). The callback gets a packet containing the final answer and doesn't have to return anything. + :param function init: Callback to be executed with the :c:type:`kr_request` before resolution starts. :return: boolean The function can also be executed with a table of arguments instead. This is useful if you'd like to skip some arguments, for example: @@ -376,11 +385,64 @@ 2.1.1 +.. _network-configuration: + Network configuration ^^^^^^^^^^^^^^^^^^^^^ For when listening on ``localhost`` just doesn't cut it. +**Systemd socket configuration** + +If you're using our packages with systemd with sockets support (not supported +on CentOS 7), network interfaces are configured using systemd drop-in files for +``kresd.socket`` and ``kresd-tls.socket``. + +To configure kresd to listen on public interface, create a drop-in file: + +.. code-block:: bash + + $ systemctl edit kresd.socket + +.. code-block:: none + + # /etc/systemd/system/kresd.socket.d/override.conf + [Socket] + ListenDatagram=192.0.2.115:53 + ListenStream=192.0.2.115:53 + +.. _kresd-socket-override-port: + +The default port can also be overriden by using an empty ``ListenDatagram=`` or ``ListenStream=`` directive. This can be useful if you want to use the Knot DNS with the `dnsproxy module`_ to have both resolver and authoritative server running on the same machine. + +.. code-block:: none + + # /etc/systemd/system/kresd.socket.d/override.conf + [Socket] + ListenDatagram= + ListenStream= + ListenDatagram=127.0.0.1:53000 + ListenStream=127.0.0.1:53000 + ListenDatagram=[::1]:53000 + ListenStream=[::1]:53000 + +The ``kresd-tls.socket`` can also be configured to listen for TLS connections. + +.. code-block:: bash + + $ systemctl edit kresd-tls.socket + +.. code-block:: none + + # /etc/systemd/system/kresd-tls.socket.d/override.conf + [Socket] + ListenStream=192.0.2.115:853 + +**Daemon network configuration** + +If you don't use systemd with sockets to run kresd, network interfaces are +configured in the config file. + .. tip:: Use declarative interface for network. .. code-block:: lua @@ -388,6 +450,13 @@ net = { '127.0.0.1', net.eth0, net.eth1.addr[1] } net.ipv4 = false +.. warning:: On machines with multiple IP addresses avoid binding to wildcard ``0.0.0.0`` or ``::`` (see example below). Knot Resolver could answer from different IP in case the ranges overlap and client will probably refuse such a response. + + .. code-block:: lua + + net = { '0.0.0.0' } + + .. envvar:: net.ipv6 = true|false :return: boolean (default: true) @@ -486,6 +555,8 @@ > net.tcp_pipeline(50) 50 + .. warning:: Please note that too large limit may have negative impact on performance and can lead to increased number of SERVFAIL answers. + .. function:: net.outgoing_v4([string address]) Get/set the IPv4 address used to perform queries. There is also ``net.outgoing_v6`` for IPv6. @@ -683,7 +754,7 @@ The default cache in Knot Resolver is persistent with LMDB backend, this means that the daemon doesn't lose the cached data on restart or crash to avoid cold-starts. The cache may be reused between cache -daemons or manipulated from other processes, making for example synchronised load-balanced recursors possible. +daemons or manipulated from other processes, making for example synchronized load-balanced recursors possible. .. function:: cache.open(max_size[, config_uri]) @@ -807,7 +878,7 @@ :return: current maximum TTL - Get or set minimum cache TTL. Any entry inserted into cache with TTL lower than minimal will be overriden to minimum TTL. Forcing TTL higher than specified violates DNS standards, use with care. + Get or set minimum cache TTL. Any entry inserted into cache with TTL lower than minimal will be overridden to minimum TTL. Forcing TTL higher than specified violates DNS standards, use with care. .. note:: The `ttl` value must be in range `<0, max_ttl)`. @@ -824,7 +895,7 @@ .. function:: cache.ns_tout([timeout]) - :param number timeout: NS retry interval in miliseconds (default: :c:macro:`KR_NS_TIMEOUT_RETRY_INTERVAL`) + :param number timeout: NS retry interval in milliseconds (default: :c:macro:`KR_NS_TIMEOUT_RETRY_INTERVAL`) :return: current timeout Get or set time interval for which a nameserver address will be ignored after determining that it doesn't return (useful) answers. @@ -842,7 +913,7 @@ Purge cache records matching specified criteria. There are two specifics: * To reliably remove **negative** cache entries you need to clear subtree with the whole zone. E.g. to clear negative cache entries for (formerly non-existing) record `www.example.com. A` you need to flush whole subtree starting at zone apex, e.g. `example.com.` [#]_. - * This operation is asynchonous and might not be yet finished when call to ``cache.clear()`` function returns. Return value indicates if clearing continues asynchronously or not. + * This operation is asynchronous and might not be yet finished when call to ``cache.clear()`` function returns. Return value indicates if clearing continues asynchronously or not. :param string name: subtree to purge; if the name isn't provided, whole cache is purged (and any other parameters are disregarded). @@ -861,12 +932,12 @@ :param table prev_state: return value from previous run (can be used by callback) :rtype: table - :return: ``count`` key is always present. Other keys are optional and their presense indicate special conditions. + :return: ``count`` key is always present. Other keys are optional and their presence indicate special conditions. * **count** *(integer)* - number of items removed from cache by this call (can be 0 if no entry matched criteria) * **not_apex** - cleared subtree is not cached as zone apex; proofs of non-existence were probably not removed * **subtree** *(string)* - hint where zone apex lies (this is estimation from cache content and might not be accurate) - * **chunk_limit** - more than ``chunk_size`` items needs to be cleared, clearing will continue asynchonously + * **chunk_limit** - more than ``chunk_size`` items needs to be cleared, clearing will continue asynchronously Examples: @@ -993,7 +1064,7 @@ .. function:: worker.coroutine(function) - Start a new coroutine with given function (closure). The function can do I/O or run timers without blocking the main thread. See cqueues_ for documentation of possible operations and synchronisation primitives. The main limitation is that you can't wait for a finish of a coroutine from processing layers, because it's not currently possible to suspend and resume execution of processing layers. + Start a new coroutine with given function (closure). The function can do I/O or run timers without blocking the main thread. See cqueues_ for documentation of possible operations and synchronization primitives. The main limitation is that you can't wait for a finish of a coroutine from processing layers, because it's not currently possible to suspend and resume execution of processing layers. Example: @@ -1094,17 +1165,6 @@ print(worker.stats().concurrent) -Running supervised -================== - -Knot Resolver can run under a supervisor to allow for graceful restarts, watchdog process and socket activation. This way the supervisor binds to sockets and lends them to the resolver daemon. If the resolver terminates or is killed, the sockets remain open and no queries are dropped. - -The watchdog process must notify kresd about active file descriptors, and kresd will automatically determine the socket type and bound address, thus it will appear as any other address. You should have a look at `real process managers`_. - -The daemon also supports `systemd socket activation`_, it is automatically detected and requires no configuration on users's side. - -See ``kresd.systemd(7)`` for details. - .. _enabling-dnssec: Enabling DNSSEC @@ -1159,7 +1219,7 @@ You've just enabled DNSSEC! -.. note:: Bootstrapping and automatic update need write access to keyfile direcory. If you want to manage root anchors manually you should use ``trust_anchors.add_file('root.keys', true)``. +.. note:: Bootstrapping and automatic update need write access to keyfile directory. If you want to manage root anchors manually you should use ``trust_anchors.add_file('root.keys', true)``. CLI interface ============= @@ -1193,12 +1253,54 @@ $ nohup ./daemon/kresd -a 127.0.0.1 -f 1 -v & -Scaling out -=========== +Control sockets +=============== + +Unless ran manually, knot-resolver is typically started in non-interactive mode. +The mode gets triggered by using the ``-f`` command-line parameter or by passing sockets from systemd. +You can attach to the the consoles for each process; by default they are in ``rundir/tty/$PID``. + +.. note:: When running kresd with systemd, you can find the location of the socket(s) using ``systemctl status kresd-control@*.socket``. Typically, these are in ``/run/knot-resolver/control@*``. + +.. code-block:: bash + + $ nc -U rundir/tty/3008 # or socat - UNIX-CONNECT:rundir/tty/3008 + > cache.count() + 53 + +The *direct output* of the CLI command is captured and sent over the socket, while also printed to the daemon standard outputs (for accountability). This gives you an immediate response on the outcome of your command. +Error or debug logs aren't captured, but you can find them in the daemon standard outputs. + +This is also a way to enumerate and test running instances, the list of files in ``tty`` corresponds to the list +of running processes, and you can test the process for liveliness by connecting to the UNIX socket. + + +Utilizing multiple CPUs +======================= + +The server can run in multiple independent processes, all sharing the same socket and cache. These processes can be started or stopped during runtime based on the load. + +**Using systemd** -The server can clone itself into multiple processes upon startup, this enables you to scale it on multiple cores. -Multiple processes can serve different addresses, but still share the same working directory and cache. -You can add, start and stop processes during runtime based on the load. +To run multiple daemons using systemd, use a different numeric identifier for +the instance, for example: + +.. code-block:: bash + + $ systemctl start kresd@1.service + $ systemctl start kresd@2.service + $ systemctl start kresd@3.service + $ systemctl start kresd@4.service + +With the use of brace expansion, the equivalent command looks like: + +.. code-block:: bash + + $ systemctl start kresd@{1..4}.service + +For more details, see ``kresd.systemd(7)``. + +**Daemon only** .. code-block:: bash @@ -1220,21 +1322,6 @@ .. note:: On recent Linux supporting ``SO_REUSEPORT`` (since 3.9, backported to RHEL 2.6.32) it is also able to bind to the same endpoint and distribute the load between the forked processes. If your OS doesn't support it, use only one daemon process. -Notice the absence of an interactive CLI. You can attach to the the consoles for each process, they are in ``rundir/tty/PID``. - -.. code-block:: bash - - $ nc -U rundir/tty/3008 # or socat - UNIX-CONNECT:rundir/tty/3008 - > cache.count() - 53 - -The *direct output* of the CLI command is captured and sent over the socket, while also printed to the daemon standard outputs (for accountability). This gives you an immediate response on the outcome of your command. -Error or debug logs aren't captured, but you can find them in the daemon standard outputs. - -This is also a way to enumerate and test running instances, the list of files in ``tty`` corresponds to the list -of running processes, and you can test the process for liveliness by connecting to the UNIX socket. - -.. _daemon-supervised: Using CLI tools =============== @@ -1281,4 +1368,5 @@ .. _luasocket: https://luarocks.org/modules/luarocks/luasocket .. _cqueues: https://25thandclement.com/~william/projects/cqueues.html .. _`real process managers`: http://blog.crocodoc.com/post/48703468992/process-managers-the-good-the-bad-and-the-ugly -.. _`systemd socket activation`: http://0pointer.de/blog/projects/socket-activation.html +.. _`socket activation`: http://0pointer.de/blog/projects/socket-activation.html +.. _`dnsproxy module`: https://www.knot-dns.cz/docs/2.7/html/modules.html#dnsproxy-tiny-dns-proxy diff -Nru knot-resolver-3.0.0/daemon/session.c knot-resolver-3.1.0/daemon/session.c --- knot-resolver-3.0.0/daemon/session.c 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/daemon/session.c 2018-11-02 15:29:58.000000000 +0000 @@ -0,0 +1,756 @@ +/* Copyright (C) 2018 CZ.NIC, z.s.p.o. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include + +#include + +#include "lib/defines.h" +#include "daemon/session.h" +#include "daemon/engine.h" +#include "daemon/tls.h" +#include "daemon/worker.h" +#include "daemon/io.h" +#include "lib/generic/queue.h" + +/* Per-session (TCP or UDP) persistent structure, + * that exists between remote counterpart and a local socket. + */ +struct session { + struct session_flags sflags; /**< miscellaneous flags. */ + union inaddr peer; /**< address of peer; is not set for client's UDP sessions. */ + uv_handle_t *handle; /**< libuv handle for IO operations. */ + uv_timer_t timeout; /**< libuv handle for timer. */ + + struct tls_ctx_t *tls_ctx; /**< server side tls-related data. */ + struct tls_client_ctx_t *tls_client_ctx; /**< client side tls-related data. */ + + trie_t *tasks; /**< list of tasks assotiated with given session. */ + queue_t(struct qr_task *) waiting; /**< list of tasks waiting for sending to upstream. */ + + uint8_t *wire_buf; /**< Buffer for DNS message. */ + ssize_t wire_buf_size; /**< Buffer size. */ + ssize_t wire_buf_start_idx; /**< Data start offset in wire_buf. */ + ssize_t wire_buf_end_idx; /**< Data end offset in wire_buf. */ + uint64_t last_activity; /**< Time of last IO activity (if any occurs). + * Otherwise session creation time. */ +}; + +static void on_session_close(uv_handle_t *handle) +{ + struct session *session = handle->data; + assert(session->handle == handle); (void)session; + io_free(handle); +} + +static void on_session_timer_close(uv_handle_t *timer) +{ + struct session *session = timer->data; + uv_handle_t *handle = session->handle; + assert(handle && handle->data == session); + assert (session->sflags.outgoing || handle->type == UV_TCP); + if (!uv_is_closing(handle)) { + uv_close(handle, on_session_close); + } +} + +void session_free(struct session *session) +{ + if (session) { + assert(session_is_empty(session)); + session_clear(session); + free(session); + } +} + +void session_clear(struct session *session) +{ + assert(session_is_empty(session)); + if (session->handle && session->handle->type == UV_TCP) { + free(session->wire_buf); + } + trie_clear(session->tasks); + trie_free(session->tasks); + queue_deinit(session->waiting); + tls_free(session->tls_ctx); + tls_client_ctx_free(session->tls_client_ctx); + memset(session, 0, sizeof(*session)); +} + +void session_close(struct session *session) +{ + assert(session_is_empty(session)); + if (session->sflags.closing) { + return; + } + + uv_handle_t *handle = session->handle; + io_stop_read(handle); + session->sflags.closing = true; + if (session->peer.ip.sa_family != AF_UNSPEC) { + struct worker_ctx *worker = handle->loop->data; + struct sockaddr *peer = &session->peer.ip; + worker_del_tcp_connected(worker, peer); + session->sflags.connected = false; + } + + if (!uv_is_closing((uv_handle_t *)&session->timeout)) { + uv_timer_stop(&session->timeout); + if (session->tls_client_ctx) { + tls_close(&session->tls_client_ctx->c); + } + if (session->tls_ctx) { + tls_close(&session->tls_ctx->c); + } + + session->timeout.data = session; + uv_close((uv_handle_t *)&session->timeout, on_session_timer_close); + } +} + +int session_start_read(struct session *session) +{ + return io_start_read(session->handle); +} + +int session_stop_read(struct session *session) +{ + return io_stop_read(session->handle); +} + +int session_waitinglist_push(struct session *session, struct qr_task *task) +{ + queue_push(session->waiting, task); + worker_task_ref(task); + return kr_ok(); +} + +struct qr_task *session_waitinglist_get(const struct session *session) +{ + return queue_head(session->waiting); +} + +struct qr_task *session_waitinglist_pop(struct session *session, bool deref) +{ + struct qr_task *t = session_waitinglist_get(session); + queue_pop(session->waiting); + if (deref) { + worker_task_unref(t); + } + return t; +} + +int session_tasklist_add(struct session *session, struct qr_task *task) +{ + trie_t *t = session->tasks; + uint16_t task_msg_id = 0; + const char *key = NULL; + size_t key_len = 0; + if (session->sflags.outgoing) { + knot_pkt_t *pktbuf = worker_task_get_pktbuf(task); + task_msg_id = knot_wire_get_id(pktbuf->wire); + key = (const char *)&task_msg_id; + key_len = sizeof(task_msg_id); + } else { + key = (const char *)&task; + key_len = sizeof(char *); + } + trie_val_t *v = trie_get_ins(t, key, key_len); + if (unlikely(!v)) { + assert(false); + return kr_error(ENOMEM); + } + if (*v == NULL) { + *v = task; + worker_task_ref(task); + } else if (*v != task) { + assert(false); + return kr_error(EINVAL); + } + return kr_ok(); +} + +int session_tasklist_del(struct session *session, struct qr_task *task) +{ + trie_t *t = session->tasks; + uint16_t task_msg_id = 0; + const char *key = NULL; + size_t key_len = 0; + trie_val_t val; + if (session->sflags.outgoing) { + knot_pkt_t *pktbuf = worker_task_get_pktbuf(task); + task_msg_id = knot_wire_get_id(pktbuf->wire); + key = (const char *)&task_msg_id; + key_len = sizeof(task_msg_id); + } else { + key = (const char *)&task; + key_len = sizeof(char *); + } + int ret = trie_del(t, key, key_len, &val); + if (ret == kr_ok()) { + assert(val == task); + worker_task_unref(val); + } + return ret; +} + +struct qr_task *session_tasklist_get_first(struct session *session) +{ + trie_val_t *val = trie_get_first(session->tasks, NULL, NULL); + return val ? (struct qr_task *) *val : NULL; +} + +struct qr_task *session_tasklist_del_first(struct session *session, bool deref) +{ + trie_val_t val = NULL; + int res = trie_del_first(session->tasks, NULL, NULL, &val); + if (res != kr_ok()) { + val = NULL; + } else if (deref) { + worker_task_unref(val); + } + return (struct qr_task *)val; +} +struct qr_task* session_tasklist_del_msgid(const struct session *session, uint16_t msg_id) +{ + trie_t *t = session->tasks; + assert(session->sflags.outgoing); + struct qr_task *ret = NULL; + const char *key = (const char *)&msg_id; + size_t key_len = sizeof(msg_id); + trie_val_t val; + int res = trie_del(t, key, key_len, &val); + if (res == kr_ok()) { + if (worker_task_numrefs(val) > 1) { + ret = val; + } + worker_task_unref(val); + } + return ret; +} + +struct qr_task* session_tasklist_find_msgid(const struct session *session, uint16_t msg_id) +{ + trie_t *t = session->tasks; + assert(session->sflags.outgoing); + struct qr_task *ret = NULL; + trie_val_t *val = trie_get_try(t, (char *)&msg_id, sizeof(msg_id)); + if (val) { + ret = *val; + } + return ret; +} + +struct session_flags *session_flags(struct session *session) +{ + return &session->sflags; +} + +struct sockaddr *session_get_peer(struct session *session) +{ + return &session->peer.ip; +} + +struct tls_ctx_t *session_tls_get_server_ctx(const struct session *session) +{ + return session->tls_ctx; +} + +void session_tls_set_server_ctx(struct session *session, struct tls_ctx_t *ctx) +{ + session->tls_ctx = ctx; +} + +struct tls_client_ctx_t *session_tls_get_client_ctx(const struct session *session) +{ + return session->tls_client_ctx; +} + +void session_tls_set_client_ctx(struct session *session, struct tls_client_ctx_t *ctx) +{ + session->tls_client_ctx = ctx; +} + +struct tls_common_ctx *session_tls_get_common_ctx(const struct session *session) +{ + struct tls_common_ctx *tls_ctx = session->sflags.outgoing ? &session->tls_client_ctx->c : + &session->tls_ctx->c; + return tls_ctx; +} + +uv_handle_t *session_get_handle(struct session *session) +{ + return session->handle; +} + +struct session *session_get(uv_handle_t *h) +{ + return h->data; +} + +struct session *session_new(uv_handle_t *handle) +{ + if (!handle) { + return NULL; + } + struct session *session = calloc(1, sizeof(struct session)); + if (!session) { + return NULL; + } + + queue_init(session->waiting); + session->tasks = trie_create(NULL); + if (handle->type == UV_TCP) { + uint8_t *wire_buf = malloc(KNOT_WIRE_MAX_PKTSIZE); + if (!wire_buf) { + free(session); + return NULL; + } + session->wire_buf = wire_buf; + session->wire_buf_size = KNOT_WIRE_MAX_PKTSIZE; + } else if (handle->type == UV_UDP) { + /* We use the singleton buffer from worker for all UDP (!) + * libuv documentation doesn't really guarantee this is OK, + * but the implementation for unix systems does not hold + * the buffer (both UDP and TCP) - always makes a NON-blocking + * syscall that fills the buffer and immediately calls + * the callback, whatever the result of the operation. + * We still need to keep in mind to only touch the buffer + * in this callback... */ + assert(handle->loop->data); + struct worker_ctx *worker = handle->loop->data; + session->wire_buf = worker->wire_buf; + session->wire_buf_size = sizeof(worker->wire_buf); + } + + uv_timer_init(handle->loop, &session->timeout); + + session->handle = handle; + handle->data = session; + session->timeout.data = session; + session_touch(session); + + return session; +} + +size_t session_tasklist_get_len(const struct session *session) +{ + return trie_weight(session->tasks); +} + +size_t session_waitinglist_get_len(const struct session *session) +{ + return queue_len(session->waiting); +} + +bool session_tasklist_is_empty(const struct session *session) +{ + return session_tasklist_get_len(session) == 0; +} + +bool session_waitinglist_is_empty(const struct session *session) +{ + return session_waitinglist_get_len(session) == 0; +} + +bool session_is_empty(const struct session *session) +{ + return session_tasklist_is_empty(session) && + session_waitinglist_is_empty(session); +} + +bool session_has_tls(const struct session *session) +{ + return session->sflags.has_tls; +} + +void session_set_has_tls(struct session *session, bool has_tls) +{ + session->sflags.has_tls = has_tls; +} + +void session_waitinglist_retry(struct session *session, bool increase_timeout_cnt) +{ + while (!session_waitinglist_is_empty(session)) { + struct qr_task *task = session_waitinglist_pop(session, false); + if (increase_timeout_cnt) { + worker_task_timeout_inc(task); + } + worker_task_step(task, NULL, NULL); + worker_task_unref(task); + } +} + +void session_waitinglist_finalize(struct session *session, int status) +{ + while (!session_waitinglist_is_empty(session)) { + struct qr_task *t = session_waitinglist_pop(session, false); + worker_task_finalize(t, status); + worker_task_unref(t); + } +} + +void session_tasklist_finalize(struct session *session, int status) +{ + while (session_tasklist_get_len(session) > 0) { + struct qr_task *t = session_tasklist_del_first(session, false); + assert(worker_task_numrefs(t) > 0); + worker_task_finalize(t, status); + worker_task_unref(t); + } +} + +int session_tasklist_finalize_expired(struct session *session) +{ + int ret = 0; + queue_t(struct qr_task *) q; + uint64_t now = kr_now(); + trie_t *t = session->tasks; + trie_it_t *it; + queue_init(q); + for (it = trie_it_begin(t); !trie_it_finished(it); trie_it_next(it)) { + trie_val_t *v = trie_it_val(it); + struct qr_task *task = (struct qr_task *)*v; + if ((now - worker_task_creation_time(task)) >= KR_RESOLVE_TIME_LIMIT) { + queue_push(q, task); + worker_task_ref(task); + } + } + trie_it_free(it); + + struct qr_task *task = NULL; + uint16_t msg_id = 0; + char *key = (char *)&task; + int32_t keylen = sizeof(struct qr_task *); + if (session->sflags.outgoing) { + key = (char *)&msg_id; + keylen = sizeof(msg_id); + } + while (queue_len(q) > 0) { + task = queue_head(q); + if (session->sflags.outgoing) { + knot_pkt_t *pktbuf = worker_task_get_pktbuf(task); + msg_id = knot_wire_get_id(pktbuf->wire); + } + int res = trie_del(t, key, keylen, NULL); + if (!worker_task_finished(task)) { + /* task->pending_count must be zero, + * but there are can be followers, + * so run worker_task_subreq_finalize() to ensure retrying + * for all the followers. */ + worker_task_subreq_finalize(task); + worker_task_finalize(task, KR_STATE_FAIL); + } + if (res == KNOT_EOK) { + worker_task_unref(task); + } + queue_pop(q); + worker_task_unref(task); + ++ret; + } + + queue_deinit(q); + return ret; +} + +int session_timer_start(struct session *session, uv_timer_cb cb, + uint64_t timeout, uint64_t repeat) +{ + uv_timer_t *timer = &session->timeout; + assert(timer->data == session); + int ret = uv_timer_start(timer, cb, timeout, repeat); + if (ret != 0) { + uv_timer_stop(timer); + return kr_error(ENOMEM); + } + return 0; +} + +int session_timer_restart(struct session *session) +{ + return uv_timer_again(&session->timeout); +} + +int session_timer_stop(struct session *session) +{ + return uv_timer_stop(&session->timeout); +} + +ssize_t session_wirebuf_consume(struct session *session, const uint8_t *data, ssize_t len) +{ + if (data != &session->wire_buf[session->wire_buf_end_idx]) { + /* shouldn't happen */ + return kr_error(EINVAL); + } + + if (session->wire_buf_end_idx + len > session->wire_buf_size) { + /* shouldn't happen */ + return kr_error(EINVAL); + } + + session->wire_buf_end_idx += len; + return len; +} + +knot_pkt_t *session_produce_packet(struct session *session, knot_mm_t *mm) +{ + session->sflags.wirebuf_error = false; + if (session->wire_buf_end_idx == 0) { + return NULL; + } + + if (session->wire_buf_start_idx == session->wire_buf_end_idx) { + session->wire_buf_start_idx = 0; + session->wire_buf_end_idx = 0; + return NULL; + } + + if (session->wire_buf_start_idx > session->wire_buf_end_idx) { + session->sflags.wirebuf_error = true; + session->wire_buf_start_idx = 0; + session->wire_buf_end_idx = 0; + return NULL; + } + + const uv_handle_t *handle = session->handle; + uint8_t *msg_start = &session->wire_buf[session->wire_buf_start_idx]; + ssize_t wirebuf_msg_data_size = session->wire_buf_end_idx - session->wire_buf_start_idx; + uint16_t msg_size = wirebuf_msg_data_size; + + if (!handle) { + session->sflags.wirebuf_error = true; + return NULL; + } else if (handle->type == UV_TCP) { + if (msg_size < 2) { + return NULL; + } + msg_size = knot_wire_read_u16(msg_start); + if (msg_size >= session->wire_buf_size) { + session->sflags.wirebuf_error = true; + return NULL; + } + if (msg_size + 2 > wirebuf_msg_data_size) { + return NULL; + } + msg_start += 2; + } + + knot_pkt_t *pkt = knot_pkt_new(msg_start, msg_size, mm); + if (pkt) { + session->sflags.wirebuf_error = false; + } + return pkt; +} + +int session_discard_packet(struct session *session, const knot_pkt_t *pkt) +{ + uv_handle_t *handle = session->handle; + /* Pointer to data start in wire_buf */ + uint8_t *wirebuf_data_start = &session->wire_buf[session->wire_buf_start_idx]; + /* Number of data bytes in wire_buf */ + size_t wirebuf_data_size = session->wire_buf_end_idx - session->wire_buf_start_idx; + /* Pointer to message start in wire_buf */ + uint8_t *wirebuf_msg_start = wirebuf_data_start; + /* Number of message bytes in wire_buf. + * For UDP it is the same number as wirebuf_data_size. */ + size_t wirebuf_msg_size = wirebuf_data_size; + /* Wire data from parsed packet. */ + uint8_t *pkt_msg_start = pkt->wire; + /* Number of bytes in packet wire buffer. */ + size_t pkt_msg_size = pkt->size; + if (knot_pkt_has_tsig(pkt)) { + pkt_msg_size += pkt->tsig_wire.len; + } + + session->sflags.wirebuf_error = true; + + if (!handle) { + return kr_error(EINVAL); + } else if (handle->type == UV_TCP) { + /* wire_buf contains TCP DNS message. */ + if (wirebuf_data_size < 2) { + /* TCP message length field isn't in buffer, must not happen. */ + assert(0); + session->wire_buf_start_idx = 0; + session->wire_buf_end_idx = 0; + return kr_error(EINVAL); + } + wirebuf_msg_size = knot_wire_read_u16(wirebuf_msg_start); + wirebuf_msg_start += 2; + if (wirebuf_msg_size + 2 > wirebuf_data_size) { + /* TCP message length field is greater then + * number of bytes in buffer, must not happen. */ + assert(0); + session->wire_buf_start_idx = 0; + session->wire_buf_end_idx = 0; + return kr_error(EINVAL); + } + } + + if (wirebuf_msg_start != pkt_msg_start) { + /* packet wirebuf must be located at the beginning + * of the session wirebuf, must not happen. */ + assert(0); + session->wire_buf_start_idx = 0; + session->wire_buf_end_idx = 0; + return kr_error(EINVAL); + } + + if (wirebuf_msg_size < pkt_msg_size) { + /* Message length field is lesser then packet size, + * must not happen. */ + assert(0); + session->wire_buf_start_idx = 0; + session->wire_buf_end_idx = 0; + return kr_error(EINVAL); + } + + if (handle->type == UV_TCP) { + session->wire_buf_start_idx += wirebuf_msg_size + 2; + } else { + session->wire_buf_start_idx += pkt_msg_size; + } + session->sflags.wirebuf_error = false; + + wirebuf_data_size = session->wire_buf_end_idx - session->wire_buf_start_idx; + if (wirebuf_data_size == 0) { + session_wirebuf_discard(session); + } else if (wirebuf_data_size < KNOT_WIRE_HEADER_SIZE) { + session_wirebuf_compress(session); + } + + return kr_ok(); +} + +void session_wirebuf_discard(struct session *session) +{ + session->wire_buf_start_idx = 0; + session->wire_buf_end_idx = 0; +} + +void session_wirebuf_compress(struct session *session) +{ + if (session->wire_buf_start_idx == 0) { + return; + } + uint8_t *wirebuf_data_start = &session->wire_buf[session->wire_buf_start_idx]; + size_t wirebuf_data_size = session->wire_buf_end_idx - session->wire_buf_start_idx; + if (session->wire_buf_start_idx < wirebuf_data_size) { + memmove(session->wire_buf, wirebuf_data_start, wirebuf_data_size); + } else { + memcpy(session->wire_buf, wirebuf_data_start, wirebuf_data_size); + } + session->wire_buf_start_idx = 0; + session->wire_buf_end_idx = wirebuf_data_size; +} + +bool session_wirebuf_error(struct session *session) +{ + return session->sflags.wirebuf_error; +} + +uint8_t *session_wirebuf_get_start(struct session *session) +{ + return session->wire_buf; +} + +size_t session_wirebuf_get_len(struct session *session) +{ + return session->wire_buf_end_idx; +} + +size_t session_wirebuf_get_size(struct session *session) +{ + return sizeof(session->wire_buf); +} + +uint8_t *session_wirebuf_get_free_start(struct session *session) +{ + return &session->wire_buf[session->wire_buf_end_idx]; +} + +size_t session_wirebuf_get_free_size(struct session *session) +{ + return session->wire_buf_size - session->wire_buf_end_idx; +} + +void session_poison(struct session *session) +{ + kr_asan_poison(session, sizeof(*session)); +} + +void session_unpoison(struct session *session) +{ + kr_asan_unpoison(session, sizeof(*session)); +} + +int session_wirebuf_process(struct session *session) +{ + int ret = 0; + if (session->wire_buf_start_idx == session->wire_buf_end_idx) { + return ret; + } + struct worker_ctx *worker = session_get_handle(session)->loop->data; + size_t wirebuf_data_size = session->wire_buf_end_idx - session->wire_buf_start_idx; + uint32_t max_iterations = (wirebuf_data_size / (KNOT_WIRE_HEADER_SIZE + KNOT_WIRE_QUESTION_MIN_SIZE)) + 1; + knot_pkt_t *query = NULL; + while (((query = session_produce_packet(session, &worker->pkt_pool)) != NULL) && + (ret < max_iterations)) { + assert (!session_wirebuf_error(session)); + int res = worker_submit(session, query); + if (res != kr_error(EILSEQ)) { + /* Packet has been successfully parsed. */ + ret += 1; + } + if (session_discard_packet(session, query) < 0) { + /* Packet data isn't stored in memory as expected. + something went wrong, normally should not happen. */ + break; + } + } + if (session_wirebuf_error(session)) { + ret = -1; + } + return ret; +} + +void session_kill_ioreq(struct session *s, struct qr_task *task) +{ + if (!s) { + return; + } + assert(s->sflags.outgoing && s->handle); + if (s->sflags.closing) { + return; + } + session_tasklist_del(s, task); + if (s->handle->type == UV_UDP) { + assert(session_tasklist_is_empty(s)); + session_close(s); + return; + } +} + +/** Update timestamp */ +void session_touch(struct session *s) +{ + s->last_activity = kr_now(); +} + +uint64_t session_last_activity(struct session *s) +{ + return s->last_activity; +} diff -Nru knot-resolver-3.0.0/daemon/session.h knot-resolver-3.1.0/daemon/session.h --- knot-resolver-3.0.0/daemon/session.h 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/daemon/session.h 2018-11-02 15:29:58.000000000 +0000 @@ -0,0 +1,148 @@ +/* Copyright (C) 2018 CZ.NIC, z.s.p.o. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#pragma once + +#include +#include + +struct qr_task; +struct worker_ctx; +struct session; + +struct session_flags { + bool outgoing : 1; /**< True: to upstream; false: from a client. */ + bool throttled : 1; /**< True: data reading from peer is temporarily stopped. */ + bool has_tls : 1; /**< True: given session uses TLS. */ + bool connected : 1; /**< True: TCP connection is established. */ + bool closing : 1; /**< True: session close sequence is in progress. */ + bool wirebuf_error : 1; /**< True: last operation with wirebuf ended up with an error. */ +}; + +/* Allocate new session for a libuv handle. */ +struct session *session_new(uv_handle_t *handle); +/* Clear and free given session. */ +void session_free(struct session *session); +/* Clear session. */ +void session_clear(struct session *session); +/** Close session. */ +void session_close(struct session *session); +/** Start reading from underlying libuv IO handle. */ +int session_start_read(struct session *session); +/** Stop reading from underlying libuv IO handle. */ +int session_stop_read(struct session *session); + +/** List of tasks been waiting for IO. */ +/** Check if list is empty. */ +bool session_waitinglist_is_empty(const struct session *session); +/** Add task to the end of the list. */ +int session_waitinglist_push(struct session *session, struct qr_task *task); +/** Get the first element. */ +struct qr_task *session_waitinglist_get(const struct session *session); +/** Get the first element and remove it from the list. */ +struct qr_task *session_waitinglist_pop(struct session *session, bool deref); +/** Get the list length. */ +size_t session_waitinglist_get_len(const struct session *session); +/** Retry resolution for each task in the list. */ +void session_waitinglist_retry(struct session *session, bool increase_timeout_cnt); +/** Finalize all tasks in the list. */ +void session_waitinglist_finalize(struct session *session, int status); + +/** List of tasks associated with session. */ +/** Check if list is empty. */ +bool session_tasklist_is_empty(const struct session *session); +/** Get the first element. */ +struct qr_task *session_tasklist_get_first(struct session *session); +/** Get the first element and remove it from the list. */ +struct qr_task *session_tasklist_del_first(struct session *session, bool deref); +/** Get the list length. */ +size_t session_tasklist_get_len(const struct session *session); +/** Add task to the list. */ +int session_tasklist_add(struct session *session, struct qr_task *task); +/** Remove task from the list. */ +int session_tasklist_del(struct session *session, struct qr_task *task); +/** Remove task with given msg_id, session_flags(session)->outgoing must be true. */ +struct qr_task* session_tasklist_del_msgid(const struct session *session, uint16_t msg_id); +/** Find task with given msg_id */ +struct qr_task* session_tasklist_find_msgid(const struct session *session, uint16_t msg_id); +/** Finalize all tasks in the list. */ +void session_tasklist_finalize(struct session *session, int status); +/** Finalize all expired tasks in the list. */ +int session_tasklist_finalize_expired(struct session *session); + +/** Both of task lists (associated & waiting). */ +/** Check if empty. */ +bool session_is_empty(const struct session *session); +/** Get pointer to session flags */ +struct session_flags *session_flags(struct session *session); +/** Get peer address. */ +struct sockaddr *session_get_peer(struct session *session); +/** Get pointer to server-side tls-related data. */ +struct tls_ctx_t *session_tls_get_server_ctx(const struct session *session); +/** Set pointer to server-side tls-related data. */ +void session_tls_set_server_ctx(struct session *session, struct tls_ctx_t *ctx); +/** Get pointer to client-side tls-related data. */ +struct tls_client_ctx_t *session_tls_get_client_ctx(const struct session *session); +/** Set pointer to client-side tls-related data. */ +void session_tls_set_client_ctx(struct session *session, struct tls_client_ctx_t *ctx); +/** Get pointer to that part of tls-related data which has common structure for + * server and client. */ +struct tls_common_ctx *session_tls_get_common_ctx(const struct session *session); + +/** Get pointer to underlying libuv handle for IO operations. */ +uv_handle_t *session_get_handle(struct session *session); +struct session *session_get(uv_handle_t *h); + +/** Start session timer. */ +int session_timer_start(struct session *session, uv_timer_cb cb, + uint64_t timeout, uint64_t repeat); +/** Restart session timer without changing it parameters. */ +int session_timer_restart(struct session *session); +/** Stop session timer. */ +int session_timer_stop(struct session *session); + +/** Get pointer to the beginning of session wirebuffer. */ +uint8_t *session_wirebuf_get_start(struct session *session); +/** Get size of session wirebuffer. */ +size_t session_wirebuf_get_size(struct session *session); +/** Get length of data in the session wirebuffer. */ +size_t session_wirebuf_get_len(struct session *session); +/** Get pointer to the beginning of free space in session wirebuffer. */ +uint8_t *session_wirebuf_get_free_start(struct session *session); +/** Get amount of free space in session wirebuffer. */ +size_t session_wirebuf_get_free_size(struct session *session); +/** Discard all data in session wirebuffer. */ +void session_wirebuf_discard(struct session *session); +/** Move all data to the beginning of the buffer. */ +void session_wirebuf_compress(struct session *session); +int session_wirebuf_process(struct session *session); +ssize_t session_wirebuf_consume(struct session *session, + const uint8_t *data, ssize_t len); + +/** poison session structure with ASAN. */ +void session_poison(struct session *session); +/** unpoison session structure with ASAN. */ +void session_unpoison(struct session *session); + +knot_pkt_t *session_produce_packet(struct session *session, knot_mm_t *mm); +int session_discard_packet(struct session *session, const knot_pkt_t *pkt); + +void session_kill_ioreq(struct session *s, struct qr_task *task); +/** Update timestamp */ +void session_touch(struct session *s); +/** Returns either creation time or time of last IO activity if any occurs. */ +/* Used for TCP timeout calculation. */ +uint64_t session_last_activity(struct session *s); diff -Nru knot-resolver-3.0.0/daemon/tls.c knot-resolver-3.1.0/daemon/tls.c --- knot-resolver-3.0.0/daemon/tls.c 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/daemon/tls.c 2018-11-02 15:29:58.000000000 +0000 @@ -34,6 +34,7 @@ #include "daemon/io.h" #include "daemon/tls.h" #include "daemon/worker.h" +#include "daemon/session.h" #define EPHEMERAL_CERT_EXPIRATION_SECONDS_RENEW_BEFORE 60*60*24*7 #define GNUTLS_PIN_MIN_VERSION 0x030400 @@ -45,6 +46,12 @@ #define DEBUG_MSG(fmt...) #endif +struct async_write_ctx { + uv_write_t write_req; + struct tls_common_ctx *t; + char buf[0]; +}; + static char const server_logstring[] = "tls"; static char const client_logstring[] = "tls_client"; @@ -90,6 +97,188 @@ return transfer; } +static void on_write_complete(uv_write_t *req, int status) +{ + assert(req->data != NULL); + struct async_write_ctx *async_ctx = (struct async_write_ctx *)req->data; + struct tls_common_ctx *t = async_ctx->t; + assert(t->write_queue_size); + t->write_queue_size -= 1; + free(req->data); +} + +static bool stream_queue_is_empty(struct tls_common_ctx *t) +{ + return (t->write_queue_size == 0); +} + +static ssize_t kres_gnutls_vec_push(gnutls_transport_ptr_t h, const giovec_t * iov, int iovcnt) +{ + struct tls_common_ctx *t = (struct tls_common_ctx *)h; + + if (t == NULL) { + errno = EFAULT; + return -1; + } + + if (iovcnt == 0) { + return 0; + } + + assert(t->session); + uv_stream_t *handle = (uv_stream_t *)session_get_handle(t->session); + assert(handle && handle->type == UV_TCP); + + /* + * This is a little bit complicated. There are two different writes: + * 1. Immediate, these don't need to own the buffered data and return immediately + * 2. Asynchronous, these need to own the buffers until the write completes + * In order to avoid copying the buffer, an immediate write is tried first if possible. + * If it isn't possible to write the data without queueing, an asynchronous write + * is created (with copied buffered data). + */ + + size_t total_len = 0; + uv_buf_t uv_buf[iovcnt]; + for (int i = 0; i < iovcnt; ++i) { + uv_buf[i].base = iov[i].iov_base; + uv_buf[i].len = iov[i].iov_len; + total_len += iov[i].iov_len; + } + + /* Try to perform the immediate write first to avoid copy */ + int ret = 0; + if (stream_queue_is_empty(t)) { + ret = uv_try_write(handle, uv_buf, iovcnt); + DEBUG_MSG("[%s] push %zu <%p> = %d\n", + t->client_side ? "tls_client" : "tls", total_len, h, ret); + /* from libuv documentation - + uv_try_write will return either: + > 0: number of bytes written (can be less than the supplied buffer size). + < 0: negative error code (UV_EAGAIN is returned if no data can be sent immediately). + */ + if (ret == total_len) { + /* All the data were buffered by libuv. + * Return. */ + return ret; + } + + if (ret < 0 && ret != UV_EAGAIN) { + /* uv_try_write() has returned error code other then UV_EAGAIN. + * Return. */ + ret = -1; + errno = EIO; + return ret; + } + /* Since we are here expression below is true + * (ret != total_len) && (ret >= 0 || ret == UV_EAGAIN) + * or the same + * (ret != total_len && ret >= 0) || (ret != total_len && ret == UV_EAGAIN) + * i.e. either occurs partial write or UV_EAGAIN. + * Proceed and copy data amount to owned memory and perform async write. + */ + if (ret == UV_EAGAIN) { + /* No data were buffered, so we must buffer all the data. */ + ret = 0; + } + } + + /* Fallback when the queue is full, and it's not possible to do an immediate write */ + char *p = malloc(sizeof(struct async_write_ctx) + total_len - ret); + if (p != NULL) { + struct async_write_ctx *async_ctx = (struct async_write_ctx *)p; + /* Save pointer to session tls context */ + async_ctx->t = t; + char *buf = async_ctx->buf; + /* Skip data written in the partial write */ + size_t to_skip = ret; + /* Copy the buffer into owned memory */ + size_t off = 0; + for (int i = 0; i < iovcnt; ++i) { + if (to_skip > 0) { + /* Ignore current buffer if it's all skipped */ + if (to_skip >= uv_buf[i].len) { + to_skip -= uv_buf[i].len; + continue; + } + /* Skip only part of the buffer */ + uv_buf[i].base += to_skip; + uv_buf[i].len -= to_skip; + to_skip = 0; + } + memcpy(buf + off, uv_buf[i].base, uv_buf[i].len); + off += uv_buf[i].len; + } + uv_buf[0].base = buf; + uv_buf[0].len = off; + + /* Create an asynchronous write request */ + uv_write_t *write_req = &async_ctx->write_req; + memset(write_req, 0, sizeof(uv_write_t)); + write_req->data = p; + + /* Perform an asynchronous write with a callback */ + if (uv_write(write_req, handle, uv_buf, 1, on_write_complete) == 0) { + ret = total_len; + t->write_queue_size += 1; + } else { + free(p); + errno = EIO; + ret = -1; + } + } else { + errno = ENOMEM; + ret = -1; + } + + DEBUG_MSG("[%s] queued %zu <%p> = %d\n", + t->client_side ? "tls_client" : "tls", total_len, h, ret); + + return ret; +} + +/** Perform TLS handshake and handle error codes according to the documentation. + * See See https://gnutls.org/manual/html_node/TLS-handshake.html#TLS-handshake + * The function returns kr_ok() or success or non fatal error, kr_error(EAGAIN) on blocking, or kr_error(EIO) on fatal error. + */ +static int tls_handshake(struct tls_common_ctx *ctx, tls_handshake_cb handshake_cb) { + struct session *session = ctx->session; + const char *logstring = ctx->client_side ? client_logstring : server_logstring; + + int err = gnutls_handshake(ctx->tls_session); + if (err == GNUTLS_E_SUCCESS) { + /* Handshake finished, return success */ + ctx->handshake_state = TLS_HS_DONE; + struct sockaddr *peer = session_get_peer(session); + kr_log_verbose("[%s] TLS handshake with %s has completed\n", + logstring, kr_straddr(peer)); + if (handshake_cb) { + handshake_cb(session, 0); + } + } else if (err == GNUTLS_E_AGAIN) { + return kr_error(EAGAIN); + } else if (gnutls_error_is_fatal(err)) { + /* Fatal errors, return error as it's not recoverable */ + kr_log_verbose("[%s] gnutls_handshake failed: %s (%d)\n", + logstring, + gnutls_strerror_name(err), err); + if (handshake_cb) { + handshake_cb(session, -1); + } + return kr_error(EIO); + } else if (err == GNUTLS_E_WARNING_ALERT_RECEIVED) { + /* Handle warning when in verbose mode */ + const char *alert_name = gnutls_alert_get_name(gnutls_alert_get(ctx->tls_session)); + if (alert_name != NULL) { + struct sockaddr *peer = session_get_peer(session); + kr_log_verbose("[%s] TLS alert from %s received: %s\n", + logstring, kr_straddr(peer), alert_name); + } + } + return kr_ok(); +} + + struct tls_ctx_t *tls_new(struct worker_ctx *worker) { assert(worker != NULL); @@ -158,7 +347,7 @@ tls->c.client_side = false; gnutls_transport_set_pull_function(tls->c.tls_session, kres_gnutls_pull); - gnutls_transport_set_push_function(tls->c.tls_session, worker_gnutls_push); + gnutls_transport_set_vec_push_function(tls->c.tls_session, kres_gnutls_vec_push); gnutls_transport_set_ptr(tls->c.tls_session, tls); if (net->tls_session_ticket_ctx) { @@ -178,9 +367,10 @@ assert(ctx->session); if (ctx->handshake_state == TLS_HS_DONE) { + const struct sockaddr *peer = session_get_peer(ctx->session); kr_log_verbose("[%s] closing tls connection to `%s`\n", ctx->client_side ? "tls_client" : "tls", - kr_straddr(&ctx->session->peer.ip)); + kr_straddr(peer)); ctx->handshake_state = TLS_HS_CLOSING; gnutls_bye(ctx->tls_session, GNUTLS_SHUT_RDWR); } @@ -202,27 +392,22 @@ free(tls); } -int tls_push(struct qr_task *task, uv_handle_t *handle, knot_pkt_t *pkt) +int tls_write(uv_write_t *req, uv_handle_t *handle, knot_pkt_t *pkt, uv_write_cb cb) { if (!pkt || !handle || !handle->data) { return kr_error(EINVAL); } - struct session *session = handle->data; - struct tls_common_ctx *tls_ctx = session->outgoing ? &session->tls_client_ctx->c : - &session->tls_ctx->c; + struct session *s = handle->data; + struct tls_common_ctx *tls_ctx = session_tls_get_common_ctx(s); assert (tls_ctx); - assert (session->outgoing == tls_ctx->client_side); + assert (session_flags(s)->outgoing == tls_ctx->client_side); const uint16_t pkt_size = htons(pkt->size); const char *logstring = tls_ctx->client_side ? client_logstring : server_logstring; gnutls_session_t tls_session = tls_ctx->tls_session; - tls_ctx->task = task; - - assert(gnutls_record_check_corked(tls_session) == 0); - gnutls_record_cork(tls_session); ssize_t count = 0; if ((count = gnutls_record_send(tls_session, &pkt_size, sizeof(pkt_size)) < 0) || @@ -232,113 +417,95 @@ return kr_error(EIO); } - ssize_t submitted = 0; - ssize_t retries = 0; - do { - count = gnutls_record_uncork(tls_session, 0); - if (count < 0) { - if (gnutls_error_is_fatal(count)) { - kr_log_error("[%s] gnutls_record_uncork failed: %s (%zd)\n", - logstring, gnutls_strerror_name(count), count); - return kr_error(EIO); - } - if (++retries > TLS_MAX_UNCORK_RETRIES) { - kr_log_error("[%s] gnutls_record_uncork: too many sequential non-fatal errors (%zd), last error is: %s (%zd)\n", - logstring, retries, gnutls_strerror_name(count), count); - return kr_error(EIO); - } - } else if (count != 0) { - submitted += count; - retries = 0; - } else if (gnutls_record_check_corked(tls_session) != 0) { - if (++retries > TLS_MAX_UNCORK_RETRIES) { - kr_log_error("[%s] gnutls_record_uncork: too many retries (%zd)\n", - logstring, retries); - return kr_error(EIO); - } - } else if (submitted != sizeof(pkt_size) + pkt->size) { - kr_log_error("[%s] gnutls_record_uncork didn't send all data(%zd of %zd)\n", - logstring, submitted, sizeof(pkt_size) + pkt->size); + const ssize_t submitted = sizeof(pkt_size) + pkt->size; + + int ret = gnutls_record_uncork(tls_session, GNUTLS_RECORD_WAIT); + if (ret < 0) { + if (!gnutls_error_is_fatal(ret)) { + return kr_error(EAGAIN); + } else { + kr_log_error("[%s] gnutls_record_uncork failed: %s (%d)\n", + logstring, gnutls_strerror_name(ret), ret); return kr_error(EIO); } - } while (submitted != sizeof(pkt_size) + pkt->size); + } + + if (ret != submitted) { + kr_log_error("[%s] gnutls_record_uncork didn't send all data (%d of %zd)\n", + logstring, ret, submitted); + return kr_error(EIO); + } + + /* The data is now accepted in gnutls internal buffers, the message can be treated as sent */ + req->handle = (uv_stream_t *)handle; + cb(req, 0); return kr_ok(); } -int tls_process(struct worker_ctx *worker, uv_stream_t *handle, const uint8_t *buf, ssize_t nread) +ssize_t tls_process_input_data(struct session *s, const uint8_t *buf, ssize_t nread) { - struct session *session = handle->data; - struct tls_common_ctx *tls_p = session->outgoing ? &session->tls_client_ctx->c : - &session->tls_ctx->c; + struct tls_common_ctx *tls_p = session_tls_get_common_ctx(s); if (!tls_p) { return kr_error(ENOSYS); } - assert(tls_p->session == session); - + assert(tls_p->session == s); + assert(tls_p->recv_buf == buf && nread <= sizeof(tls_p->recv_buf)); + const char *logstring = tls_p->client_side ? client_logstring : server_logstring; tls_p->buf = buf; tls_p->nread = nread >= 0 ? nread : 0; tls_p->consumed = 0; - /* Ensure TLS handshake is performed before receiving data. */ - while (tls_p->handshake_state == TLS_HS_IN_PROGRESS) { - int err = gnutls_handshake(tls_p->tls_session); - if (err == GNUTLS_E_SUCCESS) { - tls_p->handshake_state = TLS_HS_DONE; - kr_log_verbose("[%s] TLS handshake with %s has completed\n", - logstring, kr_straddr(&session->peer.ip)); - if (tls_p->handshake_cb) { - tls_p->handshake_cb(tls_p->session, 0); - } - } else if (err == GNUTLS_E_AGAIN) { - return 0; - } else if (gnutls_error_is_fatal(err)) { - kr_log_verbose("[%s] gnutls_handshake failed: %s (%d)\n", - logstring, - gnutls_strerror_name(err), err); - if (tls_p->handshake_cb) { - tls_p->handshake_cb(tls_p->session, -1); - } - return kr_error(err); + /* Ensure TLS handshake is performed before receiving data. + * See https://www.gnutls.org/manual/html_node/TLS-handshake.html */ + while (tls_p->handshake_state <= TLS_HS_IN_PROGRESS) { + int err = tls_handshake(tls_p, tls_p->handshake_cb); + if (err == kr_error(EAGAIN)) { + return 0; /* Wait for more data */ + } else if (err != kr_ok()) { + return err; } } - int submitted = 0; - bool is_retrying = false; - uint64_t retrying_start = 0; + /* See https://gnutls.org/manual/html_node/Data-transfer-and-termination.html#Data-transfer-and-termination */ + ssize_t submitted = 0; + uint8_t *wire_buf = session_wirebuf_get_free_start(s); + size_t wire_buf_size = session_wirebuf_get_free_size(s); while (true) { - ssize_t count = gnutls_record_recv(tls_p->tls_session, tls_p->recv_buf, sizeof(tls_p->recv_buf)); + ssize_t count = gnutls_record_recv(tls_p->tls_session, wire_buf, wire_buf_size); if (count == GNUTLS_E_AGAIN) { - break; /* No data available */ - } else if (count == GNUTLS_E_INTERRUPTED || - count == GNUTLS_E_REHANDSHAKE) { - if (!is_retrying) { - is_retrying = true; - retrying_start = kr_now(); - } - uint64_t elapsed = kr_now() - retrying_start; - if (elapsed > TLS_MAX_HANDSHAKE_TIME) { - return kr_error(EIO); + break; /* No data available */ + } else if (count == GNUTLS_E_INTERRUPTED) { + continue; + } else if (count == GNUTLS_E_REHANDSHAKE) { + /* See https://www.gnutls.org/manual/html_node/Re_002dauthentication.html */ + tls_set_hs_state(tls_p, TLS_HS_IN_PROGRESS); + while (tls_p->handshake_state <= TLS_HS_IN_PROGRESS) { + int err = tls_handshake(tls_p, tls_p->handshake_cb); + if (err == kr_error(EAGAIN)) { + break; + } else if (err != kr_ok()) { + return err; + } } - continue; /* Try reading again */ + /* Wait for more data */ + break; } else if (count < 0) { kr_log_verbose("[%s] gnutls_record_recv failed: %s (%zd)\n", logstring, gnutls_strerror_name(count), count); return kr_error(EIO); - } - DEBUG_MSG("[%s] submitting %zd data to worker\n", logstring, count); - int ret = worker_process_tcp(worker, handle, tls_p->recv_buf, count); - if (ret < 0) { - return ret; - } - if (count == 0) { + } else if (count == 0) { break; } - submitted += ret; + DEBUG_MSG("[%s] received %zd data\n", logstring, count); + wire_buf += count; + wire_buf_size -= count; + submitted += count; } + assert(tls_p->consumed == tls_p->nread); return submitted; } @@ -562,9 +729,9 @@ free(tls_credentials); } -static int client_paramlist_entry_clear(const char *k, void *v, void *baton) +static int client_paramlist_entry_free(struct tls_client_paramlist_entry *entry) { - struct tls_client_paramlist_entry *entry = (struct tls_client_paramlist_entry *)v; + DEBUG_MSG("freeing TLS parameters %p\n", entry); while (entry->ca_files.len > 0) { if (entry->ca_files.at[0] != NULL) { @@ -604,6 +771,32 @@ return 0; } +static void client_paramlist_entry_ref(struct tls_client_paramlist_entry *entry) +{ + if (entry != NULL) { + entry->refs += 1; + } +} + +static void client_paramlist_entry_unref(struct tls_client_paramlist_entry *entry) +{ + if (entry != NULL) { + assert(entry->refs > 0); + entry->refs -= 1; + + /* Last reference frees the object */ + if (entry->refs == 0) { + client_paramlist_entry_free(entry); + } + } +} + +static int client_paramlist_entry_clear(const char *k, void *v, void *baton) +{ + struct tls_client_paramlist_entry *entry = (struct tls_client_paramlist_entry *)v; + return client_paramlist_entry_free(entry); +} + int tls_client_params_set(map_t *tls_client_paramlist, const char *addr, uint16_t port, const char *param, tls_client_param_t param_type) @@ -645,6 +838,7 @@ return kr_error(ENOMEM); } gnutls_certificate_set_verify_function(entry->credentials, client_verify_certificate); + client_paramlist_entry_ref(entry); } int ret = kr_ok(); @@ -744,7 +938,7 @@ } if ((ret != kr_ok()) && is_first_entry) { - client_paramlist_entry_clear(NULL, (void *)entry, NULL); + client_paramlist_entry_unref(entry); } return ret; @@ -879,15 +1073,19 @@ return GNUTLS_E_CERTIFICATE_ERROR; } -struct tls_client_ctx_t *tls_client_ctx_new(const struct tls_client_paramlist_entry *entry, +struct tls_client_ctx_t *tls_client_ctx_new(struct tls_client_paramlist_entry *entry, struct worker_ctx *worker) { struct tls_client_ctx_t *ctx = calloc(1, sizeof (struct tls_client_ctx_t)); if (!ctx) { return NULL; } - - int ret = gnutls_init(&ctx->c.tls_session, GNUTLS_CLIENT | GNUTLS_NONBLOCK); + unsigned int flags = GNUTLS_CLIENT | GNUTLS_NONBLOCK +#ifdef GNUTLS_ENABLE_FALSE_START + | GNUTLS_ENABLE_FALSE_START +#endif + ; + int ret = gnutls_init(&ctx->c.tls_session, flags); if (ret != GNUTLS_E_SUCCESS) { tls_client_ctx_free(ctx); return NULL; @@ -899,6 +1097,11 @@ return NULL; } + /* Must take a reference on parameters as the credentials are owned by it + * and must not be freed while the session is active. */ + client_paramlist_entry_ref(entry); + ctx->params = entry; + ret = gnutls_credentials_set(ctx->c.tls_session, GNUTLS_CRD_CERTIFICATE, entry->credentials); if (ret != GNUTLS_E_SUCCESS) { @@ -910,7 +1113,7 @@ ctx->c.client_side = true; gnutls_transport_set_pull_function(ctx->c.tls_session, kres_gnutls_pull); - gnutls_transport_set_push_function(ctx->c.tls_session, worker_gnutls_push); + gnutls_transport_set_vec_push_function(ctx->c.tls_session, kres_gnutls_vec_push); gnutls_transport_set_ptr(ctx->c.tls_session, ctx); return ctx; } @@ -926,6 +1129,9 @@ ctx->c.tls_session = NULL; } + /* Must decrease the refcount for referenced parameters */ + client_paramlist_entry_unref(ctx->params); + free (ctx); } @@ -937,13 +1143,13 @@ return kr_error(EINVAL); } - assert(session->outgoing && session->handle->type == UV_TCP); + assert(session_flags(session)->outgoing && session_get_handle(session)->type == UV_TCP); struct tls_common_ctx *ctx = &client_ctx->c; gnutls_session_set_ptr(ctx->tls_session, client_ctx); - gnutls_handshake_set_timeout(ctx->tls_session, KR_CONN_RTT_MAX * 3); - session->tls_client_ctx = client_ctx; + gnutls_handshake_set_timeout(ctx->tls_session, ctx->worker->engine->net.tcp.tls_handshake_timeout); + session_tls_set_client_ctx(session, client_ctx); ctx->handshake_cb = handshake_cb; ctx->handshake_state = TLS_HS_IN_PROGRESS; ctx->session = session; @@ -954,14 +1160,15 @@ tls_params->session_data.size); } - int ret = gnutls_handshake(ctx->tls_session); - if (ret == GNUTLS_E_SUCCESS) { - return kr_ok(); - } else if (gnutls_error_is_fatal(ret) != 0) { - kr_log_verbose("[tls_client] handshake failed (%s)\n", gnutls_strerror(ret)); - return kr_error(ECONNABORTED); + /* See https://www.gnutls.org/manual/html_node/Asynchronous-operation.html */ + while (ctx->handshake_state <= TLS_HS_IN_PROGRESS) { + /* Don't pass the handshake callback as the connection isn't registered yet. */ + int ret = tls_handshake(ctx, NULL); + if (ret != kr_ok()) { + return ret; + } } - return kr_error(EAGAIN); + return kr_ok(); } tls_hs_state_t tls_get_hs_state(const struct tls_common_ctx *ctx) @@ -978,14 +1185,11 @@ return kr_ok(); } -int tls_client_ctx_set_params(struct tls_client_ctx_t *ctx, - struct tls_client_paramlist_entry *entry, - struct session *session) +int tls_client_ctx_set_session(struct tls_client_ctx_t *ctx, struct session *session) { if (!ctx) { return kr_error(EINVAL); } - ctx->params = entry; ctx->c.session = session; return kr_ok(); } diff -Nru knot-resolver-3.0.0/daemon/tls_ephemeral_credentials.c knot-resolver-3.1.0/daemon/tls_ephemeral_credentials.c --- knot-resolver-3.0.0/daemon/tls_ephemeral_credentials.c 2018-02-14 12:39:34.000000000 +0000 +++ knot-resolver-3.1.0/daemon/tls_ephemeral_credentials.c 2018-11-02 15:29:58.000000000 +0000 @@ -145,7 +145,9 @@ ssize_t bytes_written; bytes_written = write(datafd, data.data, data.size); if (bytes_written != data.size) - kr_log_error("[tls] failed to write %d octets to " EPHEMERAL_PRIVKEY_FILENAME " (%ld written)\n", + kr_log_error("[tls] failed to write %d octets to " + EPHEMERAL_PRIVKEY_FILENAME + " (%zd written)\n", data.size, bytes_written); } } diff -Nru knot-resolver-3.0.0/daemon/tls.h knot-resolver-3.1.0/daemon/tls.h --- knot-resolver-3.0.0/daemon/tls.h 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/daemon/tls.h 2018-11-02 15:29:58.000000000 +0000 @@ -42,6 +42,9 @@ */ #define TLS_MAX_HANDSHAKE_TIME (KR_CONN_RTT_MAX * 3) +/** Transport session (opaque). */ +struct session; + struct tls_ctx_t; struct tls_client_ctx_t; struct tls_credentials { @@ -59,6 +62,7 @@ array_t(const char *) pins; gnutls_certificate_credentials_t credentials; gnutls_datum_t session_data; + uint32_t refs; }; struct worker_ctx; @@ -90,10 +94,10 @@ const uint8_t *buf; ssize_t nread; ssize_t consumed; - uint8_t recv_buf[4096]; + uint8_t recv_buf[8192]; tls_handshake_cb handshake_cb; struct worker_ctx *worker; - struct qr_task *task; + size_t write_queue_size; }; struct tls_ctx_t { @@ -126,12 +130,12 @@ void tls_free(struct tls_ctx_t* tls); /*! Push new data to TLS context for sending */ -int tls_push(struct qr_task *task, uv_handle_t* handle, knot_pkt_t * pkt); +int tls_write(uv_write_t *req, uv_handle_t* handle, knot_pkt_t * pkt, uv_write_cb cb); /*! Unwrap incoming data from a TLS stream and pass them to TCP session. * @return the number of newly-completed requests (>=0) or an error code */ -int tls_process(struct worker_ctx *worker, uv_stream_t *handle, const uint8_t *buf, ssize_t nread); +ssize_t tls_process_input_data(struct session *s, const uint8_t *buf, ssize_t nread); /*! Set TLS certificate and key from files. */ int tls_certificate_set(struct network *net, const char *tls_cert, const char *tls_key); @@ -158,6 +162,12 @@ /*! Set TLS handshake state. */ int tls_set_hs_state(struct tls_common_ctx *ctx, tls_hs_state_t state); +/*! Find TLS parameters for given address. Attempt opportunistic upgrade for port 53 to 853, + * if the address is configured with a working DoT on port 853. + */ +struct tls_client_paramlist_entry *tls_client_try_upgrade(map_t *tls_client_paramlist, + const struct sockaddr *addr); + /*! Set TLS authentication parameters for given address. * Note: hostnames must be imported before ca files, * otherwise ca files will not be imported at all. @@ -170,7 +180,7 @@ int tls_client_params_free(map_t *tls_client_paramlist); /*! Allocate new client TLS context */ -struct tls_client_ctx_t *tls_client_ctx_new(const struct tls_client_paramlist_entry *entry, +struct tls_client_ctx_t *tls_client_ctx_new(struct tls_client_paramlist_entry *entry, struct worker_ctx *worker); /*! Free client TLS context */ @@ -180,9 +190,7 @@ struct session *session, tls_handshake_cb handshake_cb); -int tls_client_ctx_set_params(struct tls_client_ctx_t *ctx, - struct tls_client_paramlist_entry *entry, - struct session *session); +int tls_client_ctx_set_session(struct tls_client_ctx_t *ctx, struct session *session); /* Session tickets, server side. Implementation in ./tls_session_ticket-srv.c */ diff -Nru knot-resolver-3.0.0/daemon/worker.c knot-resolver-3.1.0/daemon/worker.c --- knot-resolver-3.0.0/daemon/worker.c 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/daemon/worker.c 2018-11-02 15:29:58.000000000 +0000 @@ -36,6 +36,23 @@ #include "daemon/io.h" #include "daemon/tls.h" #include "daemon/zimport.h" +#include "daemon/session.h" + + +/* Magic defaults for the worker. */ +#ifndef MP_FREELIST_SIZE +# ifdef __clang_analyzer__ +# define MP_FREELIST_SIZE 0 +# else +# define MP_FREELIST_SIZE 64 /**< Maximum length of the worker mempool freelist */ +# endif +#endif +#ifndef QUERY_RATE_THRESHOLD +#define QUERY_RATE_THRESHOLD (2 * MP_FREELIST_SIZE) /**< Nr of parallel queries considered as high rate */ +#endif +#ifndef MAX_PIPELINED +#define MAX_PIPELINED 100 +#endif #define VERBOSE_MSG(qry, fmt...) QRVERBOSE(qry, "wrkr", fmt) @@ -52,7 +69,7 @@ struct session *session; } source; struct worker_ctx *worker; - qr_tasklist_t tasks; + struct qr_task *task; }; /** Query resolution task. */ @@ -61,17 +78,17 @@ struct request_ctx *ctx; knot_pkt_t *pktbuf; qr_tasklist_t waiting; - uv_handle_t *pending[MAX_PENDING]; + struct session *pending[MAX_PENDING]; uint16_t pending_count; uint16_t addrlist_count; uint16_t addrlist_turn; uint16_t timeouts; uint16_t iter_count; - uint16_t bytes_remaining; struct sockaddr *addrlist; uint32_t refs; bool finished : 1; bool leading : 1; + uint64_t creation_time; }; @@ -80,8 +97,6 @@ do { ++(task)->refs; } while(0) #define qr_task_unref(task) \ do { if (task && --(task)->refs == 0) { qr_task_free(task); } } while (0) -#define qr_valid_handle(task, checked) \ - (!uv_is_closing((checked)) || (task)->ctx->source.session->handle == (checked)) /** @internal get key for tcp session * @note kr_straddr() return pointer to static string @@ -93,15 +108,10 @@ static int qr_task_step(struct qr_task *task, const struct sockaddr *packet_source, knot_pkt_t *packet); -static int qr_task_send(struct qr_task *task, uv_handle_t *handle, +static int qr_task_send(struct qr_task *task, struct session *session, struct sockaddr *addr, knot_pkt_t *pkt); static int qr_task_finalize(struct qr_task *task, int state); static void qr_task_complete(struct qr_task *task); -static int worker_add_tcp_connected(struct worker_ctx *worker, - const struct sockaddr *addr, - struct session *session); -static int worker_del_tcp_connected(struct worker_ctx *worker, - const struct sockaddr *addr); static struct session* worker_find_tcp_connected(struct worker_ctx *worker, const struct sockaddr *addr); static int worker_add_tcp_waiting(struct worker_ctx *worker, @@ -111,16 +121,7 @@ const struct sockaddr *addr); static struct session* worker_find_tcp_waiting(struct worker_ctx *worker, const struct sockaddr *addr); -static int session_add_waiting(struct session *session, struct qr_task *task); -static int session_del_waiting(struct session *session, struct qr_task *task); -static int session_add_tasks(struct session *session, struct qr_task *task); -static int session_del_tasks(struct session *session, struct qr_task *task); -static void session_close(struct session *session); -static void on_session_idle_timeout(uv_timer_t *timer); -static int timer_start(struct session *session, uv_timer_cb cb, - uint64_t timeout, uint64_t repeat); static void on_tcp_connect_timeout(uv_timer_t *timer); -static void on_tcp_watchdog_timeout(uv_timer_t *timer); /** @internal Get singleton worker. */ static inline struct worker_ctx *get_worker(void) @@ -128,76 +129,9 @@ return uv_default_loop()->data; } -static inline void *iohandle_borrow(struct worker_ctx *worker) -{ - void *h = NULL; - - const size_t size = sizeof(uv_handles_t); - if (worker->pool_iohandles.len > 0) { - h = array_tail(worker->pool_iohandles); - array_pop(worker->pool_iohandles); - kr_asan_unpoison(h, size); - } else { - h = malloc(size); - } - - return h; -} - -static inline void iohandle_release(struct worker_ctx *worker, void *h) -{ - assert(h); - - if (worker->pool_iohandles.len < MP_FREELIST_SIZE) { - array_push(worker->pool_iohandles, h); - kr_asan_poison(h, sizeof(uv_handles_t)); - } else { - free(h); - } -} - -void *worker_iohandle_borrow(struct worker_ctx *worker) -{ - return iohandle_borrow(worker); -} - -void worker_iohandle_release(struct worker_ctx *worker, void *h) -{ - iohandle_release(worker, h); -} - -static inline void *iorequest_borrow(struct worker_ctx *worker) -{ - void *r = NULL; - - const size_t size = sizeof(uv_reqs_t); - if (worker->pool_ioreqs.len > 0) { - r = array_tail(worker->pool_ioreqs); - array_pop(worker->pool_ioreqs); - kr_asan_unpoison(r, size); - } else { - r = malloc(size); - } - - return r; -} - -static inline void iorequest_release(struct worker_ctx *worker, void *r) -{ - assert(r); - - if (worker->pool_ioreqs.len < MP_FREELIST_SIZE) { - array_push(worker->pool_ioreqs, r); - kr_asan_poison(r, sizeof(uv_reqs_t)); - } else { - free(r); - } -} - - /*! @internal Create a UDP/TCP handle for an outgoing AF_INET* connection. * socktype is SOCK_* */ -static uv_handle_t *ioreq_spawn(struct qr_task *task, int socktype, sa_family_t family) +static uv_handle_t *ioreq_spawn(struct worker_ctx *worker, int socktype, sa_family_t family) { bool precond = (socktype == SOCK_DGRAM || socktype == SOCK_STREAM) && (family == AF_INET || family == AF_INET6); @@ -207,17 +141,21 @@ return NULL; } - if (task->pending_count >= MAX_PENDING) { - return NULL; - } /* Create connection for iterative query */ - struct worker_ctx *worker = task->ctx->worker; - void *h = iohandle_borrow(worker); - uv_handle_t *handle = (uv_handle_t *)h; + uv_handle_t *handle = malloc(socktype == SOCK_DGRAM + ? sizeof(uv_udp_t) : sizeof(uv_tcp_t)); if (!handle) { return NULL; } - io_create(worker->loop, handle, socktype); + int ret = io_create(worker->loop, handle, socktype, family); + if (ret) { + if (ret == UV_EMFILE) { + worker->too_many_open = true; + worker->rconcurrent_highwatermark = worker->stats.rconcurrent; + } + free(handle); + return NULL; + } /* Bind to outgoing address, according to IP v4/v6. */ union inaddr *addr; @@ -226,7 +164,6 @@ } else { addr = (union inaddr *)&worker->out_addr6; } - int ret = 0; if (addr->ip.sa_family != AF_UNSPEC) { assert(addr->ip.sa_family == family); if (socktype == SOCK_DGRAM) { @@ -238,203 +175,27 @@ } } - /* Set current handle as a subrequest type. */ - struct session *session = handle->data; - if (ret == 0) { - session->outgoing = true; - ret = session_add_tasks(session, task); - } - if (ret < 0) { + if (ret != 0) { io_deinit(handle); - iohandle_release(worker, h); + free(handle); return NULL; } - /* Connect or issue query datagram */ - task->pending[task->pending_count] = handle; - task->pending_count += 1; - return handle; -} -static void on_session_close(uv_handle_t *handle) -{ - uv_loop_t *loop = handle->loop; - struct worker_ctx *worker = loop->data; + /* Set current handle as a subrequest type. */ struct session *session = handle->data; - assert(session->handle == handle); - session->handle = NULL; - io_deinit(handle); - iohandle_release(worker, handle); -} - -static void on_session_timer_close(uv_handle_t *timer) -{ - struct session *session = timer->data; - uv_handle_t *handle = session->handle; - assert(handle && handle->data == session); - assert (session->outgoing || handle->type == UV_TCP); - if (!uv_is_closing(handle)) { - uv_close(handle, on_session_close); - } -} - -static void ioreq_kill_udp(uv_handle_t *req, struct qr_task *task) -{ - assert(req); - struct session *session = req->data; - assert(session->outgoing); - if (session->closing) { - return; - } - uv_timer_stop(&session->timeout); - session_del_tasks(session, task); - assert(session->tasks.len == 0); - session_close(session); -} - -static void ioreq_kill_tcp(uv_handle_t *req, struct qr_task *task) -{ - assert(req); - struct session *session = req->data; - assert(session->outgoing); - if (session->closing) { - return; - } - - session_del_waiting(session, task); - session_del_tasks(session, task); - - int res = 0; - - if (session->outgoing && session->peer.ip.sa_family != AF_UNSPEC && - session->tasks.len == 0 && session->waiting.len == 0 && !session->closing) { - assert(session->peer.ip.sa_family == AF_INET || - session->peer.ip.sa_family == AF_INET6); - res = 1; - if (session->connected) { - /* This is outbound TCP connection which can be reused. - * Close it after timeout */ - uv_timer_t *timer = &session->timeout; - timer->data = session; - uv_timer_stop(timer); - res = uv_timer_start(timer, on_session_idle_timeout, - KR_CONN_RTT_MAX, 0); - } - } - - if (res != 0) { - /* if any errors, close the session immediately */ - session_close(session); - } + session_flags(session)->outgoing = true; + /* Connect or issue query datagram */ + return handle; } static void ioreq_kill_pending(struct qr_task *task) { for (uint16_t i = 0; i < task->pending_count; ++i) { - if (task->pending[i]->type == UV_UDP) { - ioreq_kill_udp(task->pending[i], task); - } else if (task->pending[i]->type == UV_TCP) { - ioreq_kill_tcp(task->pending[i], task); - } else { - assert(false); - } + session_kill_ioreq(task->pending[i], task); } task->pending_count = 0; } -static void session_close(struct session *session) -{ - assert(session->tasks.len == 0 && session->waiting.len == 0); - - if (session->closing) { - return; - } - - if (!session->outgoing && session->buffering != NULL) { - qr_task_complete(session->buffering); - } - session->buffering = NULL; - - uv_handle_t *handle = session->handle; - io_stop_read(handle); - session->closing = true; - if (session->outgoing && - session->peer.ip.sa_family != AF_UNSPEC) { - struct worker_ctx *worker = get_worker(); - struct sockaddr *peer = &session->peer.ip; - worker_del_tcp_connected(worker, peer); - session->connected = false; - } - - if (!uv_is_closing((uv_handle_t *)&session->timeout)) { - uv_timer_stop(&session->timeout); - if (session->tls_client_ctx) { - tls_close(&session->tls_client_ctx->c); - } - if (session->tls_ctx) { - tls_close(&session->tls_ctx->c); - } - - session->timeout.data = session; - uv_close((uv_handle_t *)&session->timeout, on_session_timer_close); - } -} - -static int session_add_waiting(struct session *session, struct qr_task *task) -{ - for (int i = 0; i < session->waiting.len; ++i) { - if (session->waiting.at[i] == task) { - return i; - } - } - int ret = array_push(session->waiting, task); - if (ret >= 0) { - qr_task_ref(task); - } - return ret; -} - -static int session_del_waiting(struct session *session, struct qr_task *task) -{ - int ret = kr_error(ENOENT); - for (int i = 0; i < session->waiting.len; ++i) { - if (session->waiting.at[i] == task) { - array_del(session->waiting, i); - qr_task_unref(task); - ret = kr_ok(); - break; - } - } - return ret; -} - -static int session_add_tasks(struct session *session, struct qr_task *task) -{ - for (int i = 0; i < session->tasks.len; ++i) { - if (session->tasks.at[i] == task) { - return i; - } - } - int ret = array_push(session->tasks, task); - if (ret >= 0) { - qr_task_ref(task); - } - return ret; -} - -static int session_del_tasks(struct session *session, struct qr_task *task) -{ - int ret = kr_error(ENOENT); - for (int i = 0; i < session->tasks.len; ++i) { - if (session->tasks.at[i] == task) { - array_del(session->tasks, i); - qr_task_unref(task); - ret = kr_ok(); - break; - } - } - return ret; -} - /** @cond This memory layout is internal to mempool.c, use only for debugging. */ #if defined(__SANITIZE_ADDRESS__) struct mempool_chunk { @@ -504,7 +265,8 @@ */ static struct request_ctx *request_create(struct worker_ctx *worker, uv_handle_t *handle, - const struct sockaddr *addr) + const struct sockaddr *addr, + uint32_t uid) { knot_mm_t pool = { .ctx = pool_borrow(worker), @@ -522,16 +284,16 @@ /* TODO Relocate pool to struct request */ ctx->worker = worker; - array_init(ctx->tasks); - struct session *session = handle ? handle->data : NULL; - if (session) { - assert(session->outgoing == false); + struct session *s = handle ? handle->data : NULL; + if (s) { + assert(session_flags(s)->outgoing == false); } - ctx->source.session = session; + ctx->source.session = s; struct kr_request *req = &ctx->req; req->pool = pool; req->vars_ref = LUA_NOREF; + req->uid = uid; /* Remember query source addr */ if (!addr || (addr->sa_family != AF_INET && addr->sa_family != AF_INET6)) { @@ -577,8 +339,8 @@ struct kr_request *req = &ctx->req; /* source.session can be empty if request was generated by kresd itself */ - if (!ctx->source.session || - ctx->source.session->handle->type == UV_TCP) { + struct session *s = ctx->source.session; + if (!s || session_get_handle(s)->type == UV_TCP) { answer_max = KNOT_WIRE_MAX_PKTSIZE; } else if (knot_pkt_has_edns(query)) { /* EDNS */ answer_max = MAX(knot_edns_get_payload(query->opt_rr), @@ -644,35 +406,6 @@ worker->stats.rconcurrent -= 1; } -static int request_add_tasks(struct request_ctx *ctx, struct qr_task *task) -{ - for (int i = 0; i < ctx->tasks.len; ++i) { - if (ctx->tasks.at[i] == task) { - return i; - } - } - int ret = array_push(ctx->tasks, task); - if (ret >= 0) { - qr_task_ref(task); - } - return ret; -} - -static int request_del_tasks(struct request_ctx *ctx, struct qr_task *task) -{ - int ret = kr_error(ENOENT); - for (int i = 0; i < ctx->tasks.len; ++i) { - if (ctx->tasks.at[i] == task) { - array_del(ctx->tasks, i); - qr_task_unref(task); - ret = kr_ok(); - break; - } - } - return ret; -} - - static struct qr_task *qr_task_create(struct request_ctx *ctx) { /* How much can client handle? */ @@ -688,7 +421,7 @@ if (!task) { return NULL; } - memset(task, 0, sizeof(*task)); /* avoid accidentally unitialized fields */ + memset(task, 0, sizeof(*task)); /* avoid accidentally unintialized fields */ /* Create packet buffers for answer and subrequests */ knot_pkt_t *pktbuf = knot_pkt_new(NULL, pktbuf_max, &ctx->req.pool); @@ -702,12 +435,11 @@ task->pktbuf = pktbuf; array_init(task->waiting); task->refs = 0; - int ret = request_add_tasks(ctx, task); - if (ret < 0) { - mm_free(&ctx->req.pool, task); - mm_free(&ctx->req.pool, pktbuf); - return NULL; - } + assert(ctx->task == NULL); + ctx->task = task; + /* Make the primary reference to task. */ + qr_task_ref(task); + task->creation_time = kr_now(); ctx->worker->stats.concurrent += 1; return task; } @@ -719,25 +451,9 @@ assert(ctx); - /* Process outbound session. */ - struct session *source_session = ctx->source.session; struct worker_ctx *worker = ctx->worker; - /* Process source session. */ - if (source_session && - source_session->tasks.len < worker->tcp_pipeline_max/2 && - !source_session->closing && source_session->throttled) { - uv_handle_t *handle = source_session->handle; - /* Start reading again if the session is throttled and - * the number of outgoing requests is below watermark. */ - if (handle) { - io_start_read(handle); - source_session->throttled = false; - } - } - - if (ctx->tasks.len == 0) { - array_clear(ctx->tasks); + if (ctx->task == NULL) { request_free(ctx); } @@ -748,14 +464,9 @@ /*@ Register new qr_task within session. */ static int qr_task_register(struct qr_task *task, struct session *session) { - assert(session->outgoing == false && session->handle->type == UV_TCP); - - int ret = array_reserve(session->tasks, session->tasks.len + 1); - if (ret != 0) { - return kr_error(ENOMEM); - } + assert(!session_flags(session)->outgoing && session_get_handle(session)->type == UV_TCP); - session_add_tasks(session, task); + session_tasklist_add(session, task); struct request_ctx *ctx = task->ctx; assert(ctx && (ctx->source.session == NULL || ctx->source.session == session)); @@ -765,12 +476,10 @@ * an in effect shrink TCP window size. To get more precise throttling, * we would need to copy remainder of the unread buffer and reassemble * when resuming reading. This is NYI. */ - if (session->tasks.len >= task->ctx->worker->tcp_pipeline_max) { - uv_handle_t *handle = session->handle; - if (handle && !session->throttled && !session->closing) { - io_stop_read(handle); - session->throttled = true; - } + if (session_tasklist_get_len(session) >= task->ctx->worker->tcp_pipeline_max && + !session_flags(session)->throttled && !session_flags(session)->closing) { + session_stop_read(session); + session_flags(session)->throttled = true; } return 0; @@ -785,231 +494,112 @@ assert(task->waiting.len == 0); assert(task->leading == false); - struct session *source_session = ctx->source.session; - if (source_session) { - assert(source_session->outgoing == false && - source_session->waiting.len == 0); - session_del_tasks(source_session, task); + struct session *s = ctx->source.session; + if (s) { + assert(!session_flags(s)->outgoing && session_waitinglist_is_empty(s)); + ctx->source.session = NULL; + session_tasklist_del(s, task); } /* Release primary reference to task. */ - request_del_tasks(ctx, task); + if (ctx->task == task) { + ctx->task = NULL; + qr_task_unref(task); + } } /* This is called when we send subrequest / answer */ static int qr_task_on_send(struct qr_task *task, uv_handle_t *handle, int status) { + if (task->finished) { assert(task->leading == false); qr_task_complete(task); - if (!handle || handle->type != UV_TCP) { - return status; - } - struct session* session = handle->data; - assert(session); - if (!session->outgoing || - session->waiting.len == 0) { - return status; - } } - if (handle) { - struct session* session = handle->data; - if (!session->outgoing && task->ctx->source.session) { - assert (task->ctx->source.session->handle == handle); - } - if (handle->type == UV_TCP && session->outgoing && - session->waiting.len > 0) { - session_del_waiting(session, task); - if (session->closing) { - return status; - } - /* Finalize the task, if any errors. - * We can't add it to the end of waiting list for retrying - * since it may lead endless loop in some circumstances - * (for instance: tls; send->tls_push->too many non-critical errors-> - * on_send with nonzero status->re-add to waiting->send->etc).*/ - if (status != 0) { - if (session->outgoing) { - qr_task_finalize(task, KR_STATE_FAIL); - } else { - assert(task->ctx->source.session == session); - task->ctx->source.session = NULL; - } - session_del_tasks(session, task); - } - if (session->waiting.len > 0) { - struct qr_task *t = session->waiting.at[0]; - int ret = qr_task_send(t, handle, &session->peer.ip, t->pktbuf); - if (ret != kr_ok()) { - while (session->waiting.len > 0) { - struct qr_task *t = session->waiting.at[0]; - if (session->outgoing) { - qr_task_finalize(t, KR_STATE_FAIL); - } else { - assert(t->ctx->source.session == session); - t->ctx->source.session = NULL; - } - array_del(session->waiting, 0); - session_del_tasks(session, t); - qr_task_unref(t); - } - while (session->tasks.len > 0) { - struct qr_task *t = session->tasks.at[0]; - if (session->outgoing) { - qr_task_finalize(t, KR_STATE_FAIL); - } else { - assert(t->ctx->source.session == session); - t->ctx->source.session = NULL; - } - session_del_tasks(session, t); - } - session_close(session); - return status; - } - } - } - if (!session->closing) { - io_start_read(handle); /* Start reading new query */ - } + if (!handle || handle->type != UV_TCP) { + return status; + } + + struct session* s = handle->data; + assert(s); + if (status != 0) { + session_tasklist_del(s, task); + } + + if (session_flags(s)->outgoing || session_flags(s)->closing) { + return status; + } + + struct worker_ctx *worker = task->ctx->worker; + if (session_flags(s)->throttled && + session_tasklist_get_len(s) < worker->tcp_pipeline_max/2) { + /* Start reading again if the session is throttled and + * the number of outgoing requests is below watermark. */ + session_start_read(s); + session_flags(s)->throttled = false; } + return status; } static void on_send(uv_udp_send_t *req, int status) { - uv_handle_t *handle = (uv_handle_t *)(req->handle); - uv_loop_t *loop = handle->loop; - struct worker_ctx *worker = loop->data; - assert(worker == get_worker()); struct qr_task *task = req->data; - qr_task_on_send(task, handle, status); + uv_handle_t *h = (uv_handle_t *)req->handle; + qr_task_on_send(task, h, status); qr_task_unref(task); - iorequest_release(worker, req); + free(req); } -static void on_task_write(uv_write_t *req, int status) +static void on_write(uv_write_t *req, int status) { - uv_handle_t *handle = (uv_handle_t *)(req->handle); - uv_loop_t *loop = handle->loop; - struct worker_ctx *worker = loop->data; - assert(worker == get_worker()); struct qr_task *task = req->data; - qr_task_on_send(task, handle, status); + uv_handle_t *h = (uv_handle_t *)req->handle; + qr_task_on_send(task, h, status); qr_task_unref(task); - iorequest_release(worker, req); -} - -static void on_nontask_write(uv_write_t *req, int status) -{ - uv_handle_t *handle = (uv_handle_t *)(req->handle); - uv_loop_t *loop = handle->loop; - struct worker_ctx *worker = loop->data; - assert(worker == get_worker()); - iorequest_release(worker, req); + free(req); } -ssize_t worker_gnutls_push(gnutls_transport_ptr_t h, const void *buf, size_t len) +static int qr_task_send(struct qr_task *task, struct session *session, + struct sockaddr *addr, knot_pkt_t *pkt) { - struct tls_common_ctx *t = (struct tls_common_ctx *)h; - const uv_buf_t uv_buf[1] = { - { (char *)buf, len } - }; - - if (t == NULL) { - errno = EFAULT; - return -1; + if (!session) { + return qr_task_on_send(task, NULL, kr_error(EIO)); } - assert(t->session && t->session->handle && - t->session->handle->type == UV_TCP); - - VERBOSE_MSG(NULL,"[%s] push %zu <%p>\n", - t->client_side ? "tls_client" : "tls", len, h); + int ret = 0; + struct request_ctx *ctx = task->ctx; + struct kr_request *req = &ctx->req; - struct worker_ctx *worker = t->worker; - assert(worker); + uv_handle_t *handle = session_get_handle(session); + assert(handle && handle->data == session); + const bool is_stream = handle->type == UV_TCP; + if (!is_stream && handle->type != UV_UDP) abort(); - void *ioreq = worker_iohandle_borrow(worker); - if (!ioreq) { - errno = EFAULT; - return -1; + if (addr == NULL) { + addr = session_get_peer(session); } - uv_write_t *write_req = (uv_write_t *)ioreq; - - struct qr_task *task = t->task; - uv_write_cb write_cb = on_task_write; - if (t->handshake_state == TLS_HS_DONE) { - assert(task); - } else { - task = NULL; - write_cb = on_nontask_write; + if (pkt == NULL) { + pkt = worker_task_get_pktbuf(task); } - write_req->data = task; - - ssize_t ret = -1; - int res = uv_write(write_req, (uv_stream_t *)t->session->handle, uv_buf, 1, write_cb); - if (res == 0) { - if (task) { - qr_task_ref(task); /* Pending ioreq on current task */ - struct request_ctx *ctx = task->ctx; - if (ctx && ctx->source.session && - t->session->handle != ctx->source.session->handle) { - struct sockaddr *addr = &t->session->peer.ip; - worker->stats.tls += 1; - if (addr->sa_family == AF_INET6) - worker->stats.ipv6 += 1; - else if (addr->sa_family == AF_INET) - worker->stats.ipv4 += 1; - } - } - if (worker->too_many_open && - worker->stats.rconcurrent < - worker->rconcurrent_highwatermark - 10) { - worker->too_many_open = false; + if (session_flags(session)->outgoing && handle->type == UV_TCP) { + size_t try_limit = session_tasklist_get_len(session) + 1; + uint16_t msg_id = knot_wire_get_id(pkt->wire); + size_t try_count = 0; + while (session_tasklist_find_msgid(session, msg_id) && + try_count <= try_limit) { + ++msg_id; + ++try_count; } - ret = len; - } else { - VERBOSE_MSG(NULL,"[%s] uv_write: %s\n", - t->client_side ? "tls_client" : "tls", uv_strerror(res)); - iorequest_release(worker, ioreq); - errno = EIO; - } - return ret; -} - -static int qr_task_send(struct qr_task *task, uv_handle_t *handle, - struct sockaddr *addr, knot_pkt_t *pkt) -{ - if (!handle) { - return qr_task_on_send(task, handle, kr_error(EIO)); - } - - /* Synchronous push to TLS context, bypassing event loop. */ - struct session *session = handle->data; - assert(session->closing == false); - if (session->has_tls) { - struct kr_request *req = &task->ctx->req; - if (session->outgoing) { - int ret = kr_resolve_checkout(req, NULL, addr, - SOCK_STREAM, pkt); - if (ret != kr_ok()) { - return ret; - } + if (try_count > try_limit) { + return kr_error(ENOENT); } - return tls_push(task, handle, pkt); + worker_task_pkt_set_msgid(task, msg_id); } - int ret = 0; - struct request_ctx *ctx = task->ctx; - struct worker_ctx *worker = ctx->worker; - struct kr_request *req = &ctx->req; - void *ioreq = iorequest_borrow(worker); - if (!ioreq) { - return qr_task_on_send(task, handle, kr_error(ENOMEM)); - } if (knot_wire_get_qr(pkt->wire) == 0) { /* * Query must be finalised using destination address before @@ -1024,15 +614,29 @@ * trying to obtain the IP address from it. */ ret = kr_resolve_checkout(req, NULL, addr, - handle->type == UV_UDP ? SOCK_DGRAM : SOCK_STREAM, + is_stream ? SOCK_STREAM : SOCK_DGRAM, pkt); if (ret != 0) { - iorequest_release(worker, ioreq); return ret; } } + + uv_handle_t *ioreq = malloc(is_stream ? sizeof(uv_write_t) : sizeof(uv_udp_send_t)); + if (!ioreq) { + return qr_task_on_send(task, handle, kr_error(ENOMEM)); + } + + /* Pending ioreq on current task */ + qr_task_ref(task); + + struct worker_ctx *worker = ctx->worker; /* Send using given protocol */ - if (handle->type == UV_UDP) { + assert(!session_flags(session)->closing); + if (session_flags(session)->has_tls) { + uv_write_t *write_req = (uv_write_t *)ioreq; + write_req->data = task; + ret = tls_write(write_req, handle, pkt, &on_write); + } else if (handle->type == UV_UDP) { uv_udp_send_t *send_req = (uv_udp_send_t *)ioreq; uv_buf_t buf = { (char *)pkt->wire, pkt->size }; send_req->data = task; @@ -1045,34 +649,40 @@ { (char *)pkt->wire, pkt->size } }; write_req->data = task; - ret = uv_write(write_req, (uv_stream_t *)handle, buf, 2, &on_task_write); + ret = uv_write(write_req, (uv_stream_t *)handle, buf, 2, &on_write); } else { assert(false); } if (ret == 0) { - qr_task_ref(task); /* Pending ioreq on current task */ + session_touch(session); + if (session_flags(session)->outgoing) { + session_tasklist_add(session, task); + } if (worker->too_many_open && worker->stats.rconcurrent < worker->rconcurrent_highwatermark - 10) { worker->too_many_open = false; } } else { - iorequest_release(worker, ioreq); + free(ioreq); + qr_task_unref(task); if (ret == UV_EMFILE) { worker->too_many_open = true; worker->rconcurrent_highwatermark = worker->stats.rconcurrent; + ret = kr_error(UV_EMFILE); } } /* Update statistics */ - if (ctx->source.session && - handle != ctx->source.session->handle && - addr) { - if (handle->type == UV_UDP) + if (session_flags(session)->outgoing && addr) { + if (session_flags(session)->has_tls) + worker->stats.tls += 1; + else if (handle->type == UV_UDP) worker->stats.udp += 1; else worker->stats.tcp += 1; + if (addr->sa_family == AF_INET6) worker->stats.ipv6 += 1; else if (addr->sa_family == AF_INET) @@ -1081,33 +691,25 @@ return ret; } -static int session_next_waiting_send(struct session *session) +static int session_tls_hs_cb(struct session *session, int status) { - union inaddr *peer = &session->peer; - int ret = kr_ok(); - if (session->waiting.len > 0) { - struct qr_task *task = session->waiting.at[0]; - ret = qr_task_send(task, session->handle, &peer->ip, task->pktbuf); - } - return ret; -} - -static int session_tls_hs_cb(struct session *session, int status) -{ - struct worker_ctx *worker = get_worker(); - union inaddr *peer = &session->peer; - int deletion_res = worker_del_tcp_waiting(worker, &peer->ip); + assert(session_flags(session)->outgoing); + uv_handle_t *handle = session_get_handle(session); + uv_loop_t *loop = handle->loop; + struct worker_ctx *worker = loop->data; + struct sockaddr *peer = session_get_peer(session); + int deletion_res = worker_del_tcp_waiting(worker, peer); int ret = kr_ok(); if (status) { - kr_nsrep_update_rtt(NULL, &peer->ip, KR_NS_DEAD, + kr_nsrep_update_rtt(NULL, peer, KR_NS_DEAD, worker->engine->resolver.cache_rtt, KR_NS_UPDATE_NORESET); return ret; } /* handshake was completed successfully */ - struct tls_client_ctx_t *tls_client_ctx = session->tls_client_ctx; + struct tls_client_ctx_t *tls_client_ctx = session_tls_get_client_ctx(session); struct tls_client_paramlist_entry *tls_params = tls_client_ctx->params; gnutls_session_t tls_session = tls_client_ctx->c.tls_session; if (gnutls_session_is_resumed(tls_session) != 0) { @@ -1128,9 +730,16 @@ } } - ret = worker_add_tcp_connected(worker, &peer->ip, session); + ret = worker_add_tcp_connected(worker, peer, session); if (deletion_res == kr_ok() && ret == kr_ok()) { - ret = session_next_waiting_send(session); + while (!session_waitinglist_is_empty(session)) { + struct qr_task *t = session_waitinglist_get(session); + ret = qr_task_send(t, session, NULL, NULL); + if (ret != 0) { + break; + } + session_waitinglist_pop(session, true); + } } else { ret = kr_error(EINVAL); } @@ -1140,146 +749,123 @@ * Session isn't in the list of waiting sessions, * or addition to the list of connected sessions failed, * or write to upstream failed. */ - while (session->waiting.len > 0) { - struct qr_task *task = session->waiting.at[0]; - session_del_tasks(session, task); - array_del(session->waiting, 0); - qr_task_finalize(task, KR_STATE_FAIL); - qr_task_unref(task); - } - worker_del_tcp_connected(worker, &peer->ip); - assert(session->tasks.len == 0); + worker_del_tcp_connected(worker, peer); + session_waitinglist_finalize(session, KR_STATE_FAIL); + assert(session_tasklist_is_empty(session)); session_close(session); } else { - uv_timer_stop(&session->timeout); - session->timeout.data = session; - timer_start(session, on_tcp_watchdog_timeout, MAX_TCP_INACTIVITY, 0); + session_timer_stop(session); + session_timer_start(session, tcp_timeout_trigger, + MAX_TCP_INACTIVITY, MAX_TCP_INACTIVITY); } return kr_ok(); } -static struct kr_query *session_current_query(struct session *session) -{ - if (session->waiting.len == 0) { - return NULL; - } - struct qr_task *task = session->waiting.at[0]; - if (task->ctx->req.rplan.pending.len == 0) { +static struct kr_query *task_get_last_pending_query(struct qr_task *task) +{ + if (!task || task->ctx->req.rplan.pending.len == 0) { return NULL; } return array_tail(task->ctx->req.rplan.pending); } +static int send_waiting(struct session *session) +{ + int ret = 0; + while (!session_waitinglist_is_empty(session)) { + struct qr_task *t = session_waitinglist_get(session); + ret = qr_task_send(t, session, NULL, NULL); + if (ret != 0) { + session_waitinglist_finalize(session, KR_STATE_FAIL); + session_tasklist_finalize(session, KR_STATE_FAIL); + session_close(session); + break; + } + session_waitinglist_pop(session, true); + } + return ret; +} + static void on_connect(uv_connect_t *req, int status) { struct worker_ctx *worker = get_worker(); uv_stream_t *handle = req->handle; struct session *session = handle->data; - union inaddr *peer = &session->peer; + struct sockaddr *peer = session_get_peer(session); + free(req); + + assert(session_flags(session)->outgoing); if (status == UV_ECANCELED) { - worker_del_tcp_waiting(worker, &peer->ip); - assert(session->closing && session->waiting.len == 0 && session->tasks.len == 0); - iorequest_release(worker, req); + worker_del_tcp_waiting(worker, peer); + assert(session_is_empty(session) && session_flags(session)->closing); return; } - if (session->closing) { - worker_del_tcp_waiting(worker, &peer->ip); - assert(session->waiting.len == 0 && session->tasks.len == 0); - iorequest_release(worker, req); + if (session_flags(session)->closing) { + worker_del_tcp_waiting(worker, peer); + assert(session_is_empty(session)); return; } - uv_timer_stop(&session->timeout); - if (status != 0) { - worker_del_tcp_waiting(worker, &peer->ip); - while (session->waiting.len > 0) { - struct qr_task *task = session->waiting.at[0]; - session_del_tasks(session, task); - array_del(session->waiting, 0); - assert(task->refs > 1); - qr_task_unref(task); - qr_task_step(task, NULL, NULL); - } - assert(session->tasks.len == 0); - iorequest_release(worker, req); + worker_del_tcp_waiting(worker, peer); + assert(session_tasklist_is_empty(session)); + session_waitinglist_retry(session, false); session_close(session); return; } - if (!session->has_tls) { + if (!session_flags(session)->has_tls) { /* if there is a TLS, session still waiting for handshake, * otherwise remove it from waiting list */ - if (worker_del_tcp_waiting(worker, &peer->ip) != 0) { + if (worker_del_tcp_waiting(worker, peer) != 0) { /* session isn't in list of waiting queries, * * something gone wrong */ - while (session->waiting.len > 0) { - struct qr_task *task = session->waiting.at[0]; - session_del_tasks(session, task); - array_del(session->waiting, 0); - ioreq_kill_pending(task); - assert(task->pending_count == 0); - qr_task_finalize(task, KR_STATE_FAIL); - qr_task_unref(task); - } - assert(session->tasks.len == 0); - iorequest_release(worker, req); + session_waitinglist_finalize(session, KR_STATE_FAIL); + assert(session_tasklist_is_empty(session)); session_close(session); return; } } - struct kr_query *qry = session_current_query(session); + struct qr_task *task = session_waitinglist_get(session); + struct kr_query *qry = task_get_last_pending_query(task); WITH_VERBOSE (qry) { - char addr_str[INET6_ADDRSTRLEN]; - inet_ntop(session->peer.ip.sa_family, kr_inaddr(&session->peer.ip), - addr_str, sizeof(addr_str)); - VERBOSE_MSG(qry, "=> connected to '%s'\n", addr_str); + struct sockaddr *peer = session_get_peer(session); + char peer_str[INET6_ADDRSTRLEN]; + inet_ntop(peer->sa_family, kr_inaddr(peer), peer_str, sizeof(peer_str)); + VERBOSE_MSG(qry, "=> connected to '%s'\n", peer_str); } - session->connected = true; - session->handle = (uv_handle_t *)handle; + session_flags(session)->connected = true; + session_start_read(session); int ret = kr_ok(); - if (session->has_tls) { - ret = tls_client_connect_start(session->tls_client_ctx, - session, session_tls_hs_cb); + if (session_flags(session)->has_tls) { + struct tls_client_ctx_t *tls_ctx = session_tls_get_client_ctx(session); + ret = tls_client_connect_start(tls_ctx, session, session_tls_hs_cb); if (ret == kr_error(EAGAIN)) { - iorequest_release(worker, req); - io_start_read(session->handle); - timer_start(session, on_tcp_watchdog_timeout, MAX_TCP_INACTIVITY, 0); - return; - } - } - - if (ret == kr_ok()) { - ret = session_next_waiting_send(session); - if (ret == kr_ok()) { - timer_start(session, on_tcp_watchdog_timeout, MAX_TCP_INACTIVITY, 0); - worker_add_tcp_connected(worker, &session->peer.ip, session); - iorequest_release(worker, req); + session_timer_stop(session); + session_timer_start(session, tcp_timeout_trigger, + MAX_TCP_INACTIVITY, MAX_TCP_INACTIVITY); return; } + } else { + worker_add_tcp_connected(worker, peer, session); } - while (session->waiting.len > 0) { - struct qr_task *task = session->waiting.at[0]; - session_del_tasks(session, task); - array_del(session->waiting, 0); - ioreq_kill_pending(task); - assert(task->pending_count == 0); - qr_task_finalize(task, KR_STATE_FAIL); - qr_task_unref(task); + ret = send_waiting(session); + if (ret != 0) { + worker_del_tcp_connected(worker, peer); + return; } - assert(session->tasks.len == 0); - - iorequest_release(worker, req); - session_close(session); + session_timer_stop(session); + session_timer_start(session, tcp_timeout_trigger, + MAX_TCP_INACTIVITY, MAX_TCP_INACTIVITY); } static void on_tcp_connect_timeout(uv_timer_t *timer) @@ -1289,76 +875,26 @@ uv_timer_stop(timer); struct worker_ctx *worker = get_worker(); - assert (session->waiting.len == session->tasks.len); + assert (session_tasklist_is_empty(session)); - union inaddr *peer = &session->peer; - worker_del_tcp_waiting(worker, &peer->ip); + struct sockaddr *peer = session_get_peer(session); + worker_del_tcp_waiting(worker, peer); - struct kr_query *qry = session_current_query(session); + struct qr_task *task = session_waitinglist_get(session); + struct kr_query *qry = task_get_last_pending_query(task); WITH_VERBOSE (qry) { - char addr_str[INET6_ADDRSTRLEN]; - inet_ntop(peer->ip.sa_family, kr_inaddr(&peer->ip), addr_str, sizeof(addr_str)); - VERBOSE_MSG(qry, "=> connection to '%s' failed\n", addr_str); + char peer_str[INET6_ADDRSTRLEN]; + inet_ntop(peer->sa_family, kr_inaddr(peer), peer_str, sizeof(peer_str)); + VERBOSE_MSG(qry, "=> connection to '%s' failed\n", peer_str); } - kr_nsrep_update_rtt(NULL, &peer->ip, KR_NS_DEAD, + kr_nsrep_update_rtt(NULL, peer, KR_NS_DEAD, worker->engine->resolver.cache_rtt, KR_NS_UPDATE_NORESET); - while (session->waiting.len > 0) { - struct qr_task *task = session->waiting.at[0]; - assert(task->ctx); - task->timeouts += 1; - worker->stats.timeout += 1; - session_del_tasks(session, task); - array_del(session->waiting, 0); - assert(task->refs > 1); - qr_task_unref(task); - qr_task_step(task, NULL, NULL); - } - - assert (session->tasks.len == 0); - session_close(session); -} - -static void on_tcp_watchdog_timeout(uv_timer_t *timer) -{ - struct session *session = timer->data; - - assert(session->outgoing); - uv_timer_stop(timer); - struct worker_ctx *worker = get_worker(); - if (session->outgoing) { - if (session->has_tls) { - worker_del_tcp_waiting(worker, &session->peer.ip); - } - worker_del_tcp_connected(worker, &session->peer.ip); - - while (session->waiting.len > 0) { - struct qr_task *task = session->waiting.at[0]; - task->timeouts += 1; - worker->stats.timeout += 1; - array_del(session->waiting, 0); - session_del_tasks(session, task); - ioreq_kill_pending(task); - assert(task->pending_count == 0); - qr_task_finalize(task, KR_STATE_FAIL); - qr_task_unref(task); - } - } - - while (session->tasks.len > 0) { - struct qr_task *task = session->tasks.at[0]; - task->timeouts += 1; - worker->stats.timeout += 1; - assert(task->refs > 1); - array_del(session->tasks, 0); - ioreq_kill_pending(task); - assert(task->pending_count == 0); - qr_task_finalize(task, KR_STATE_FAIL); - qr_task_unref(task); - } - + worker->stats.timeout += session_waitinglist_get_len(session); + session_waitinglist_retry(session, true); + assert (session_tasklist_is_empty(session)); session_close(session); } @@ -1366,14 +902,14 @@ static void on_udp_timeout(uv_timer_t *timer) { struct session *session = timer->data; - assert(session->handle->data == session); + assert(session_get_handle(session)->data == session); + assert(session_tasklist_get_len(session) == 1); + assert(session_waitinglist_is_empty(session)); uv_timer_stop(timer); - assert(session->tasks.len == 1); - assert(session->waiting.len == 0); /* Penalize all tried nameservers with a timeout. */ - struct qr_task *task = session->tasks.at[0]; + struct qr_task *task = session_tasklist_get_first(session); struct worker_ctx *worker = task->ctx->worker; if (task->leading && task->pending_count > 0) { struct kr_query *qry = array_tail(task->ctx->req.rplan.pending); @@ -1395,21 +931,6 @@ qr_task_step(task, NULL, NULL); } -static void on_session_idle_timeout(uv_timer_t *timer) -{ - struct session *s = timer->data; - assert(s); - uv_timer_stop(timer); - if (s->closing) { - return; - } - /* session was not in use during timer timeout - * remove it from connection list and close - */ - assert(s->tasks.len == 0 && s->waiting.len == 0); - session_close(s); -} - static uv_handle_t *retransmit(struct qr_task *task) { uv_handle_t *ret = NULL; @@ -1418,18 +939,28 @@ if (!choice) { return ret; } - ret = ioreq_spawn(task, SOCK_DGRAM, choice->sin6_family); + if (task->pending_count >= MAX_PENDING) { + return ret; + } + ret = ioreq_spawn(task->ctx->worker, SOCK_DGRAM, choice->sin6_family); if (!ret) { return ret; } struct sockaddr *addr = (struct sockaddr *)choice; struct session *session = ret->data; - assert (session->peer.ip.sa_family == AF_UNSPEC && session->outgoing); - memcpy(&session->peer, addr, sizeof(session->peer)); - if (qr_task_send(task, ret, (struct sockaddr *)choice, - task->pktbuf) == 0) { + struct sockaddr *peer = session_get_peer(session); + assert (peer->sa_family == AF_UNSPEC && session_flags(session)->outgoing); + memcpy(peer, addr, kr_sockaddr_len(addr)); + if (qr_task_send(task, session, (struct sockaddr *)choice, + task->pktbuf) != 0) { + session_close(session); + ret = NULL; + } else { + task->pending[task->pending_count] = session; + task->pending_count += 1; task->addrlist_turn = (task->addrlist_turn + 1) % task->addrlist_count; /* Round robin */ + session_start_read(session); /* Start reading answer */ } } return ret; @@ -1438,10 +969,10 @@ static void on_retransmit(uv_timer_t *req) { struct session *session = req->data; - assert(session->tasks.len == 1); + assert(session_tasklist_get_len(session) == 1); uv_timer_stop(req); - struct qr_task *task = session->tasks.at[0]; + struct qr_task *task = session_tasklist_get_first(session); if (retransmit(task) == NULL) { /* Not possible to spawn request, start timeout timer with remaining deadline. */ uint64_t timeout = KR_CONN_RTT_MAX - task->pending_count * KR_CONN_RETRY; @@ -1451,21 +982,11 @@ } } -static int timer_start(struct session *session, uv_timer_cb cb, - uint64_t timeout, uint64_t repeat) -{ - uv_timer_t *timer = &session->timeout; - assert(timer->data == session); - int ret = uv_timer_start(timer, cb, timeout, repeat); - if (ret != 0) { - uv_timer_stop(timer); - return kr_error(ENOMEM); - } - return 0; -} - static void subreq_finalize(struct qr_task *task, const struct sockaddr *packet_source, knot_pkt_t *pkt) { + if (!task || task->finished) { + return; + } /* Close pending timer */ ioreq_kill_pending(task); /* Clear from outgoing table. */ @@ -1535,7 +1056,6 @@ return true; } - static int qr_task_finalize(struct qr_task *task, int state) { assert(task && task->leading == false); @@ -1544,44 +1064,273 @@ } struct request_ctx *ctx = task->ctx; kr_resolve_finish(&ctx->req, state); + task->finished = true; if (ctx->source.session == NULL) { (void) qr_task_on_send(task, NULL, kr_error(EIO)); return state == KR_STATE_DONE ? 0 : kr_error(EIO); } + /* Reference task as the callback handler can close it */ + qr_task_ref(task); + /* Send back answer */ struct session *source_session = ctx->source.session; - uv_handle_t *handle = source_session->handle; - assert(source_session->closing == false); - assert(handle && handle->data == ctx->source.session); + assert(!session_flags(source_session)->closing); assert(ctx->source.addr.ip.sa_family != AF_UNSPEC); - int res = qr_task_send(task, handle, + int res = qr_task_send(task, source_session, (struct sockaddr *)&ctx->source.addr, ctx->req.answer); if (res != kr_ok()) { (void) qr_task_on_send(task, NULL, kr_error(EIO)); /* Since source session is erroneous detach all tasks. */ - while (source_session->tasks.len > 0) { - struct qr_task *t = source_session->tasks.at[0]; + while (!session_tasklist_is_empty(source_session)) { + struct qr_task *t = session_tasklist_del_first(source_session, false); struct request_ctx *c = t->ctx; assert(c->source.session == source_session); c->source.session = NULL; /* Don't finalize them as there can be other tasks * waiting for answer to this particular task. * (ie. task->leading is true) */ - session_del_tasks(source_session, t); + worker_task_unref(t); } session_close(source_session); - } else if (handle->type == UV_TCP) { - /* Don't try to close source session at least - * retry_interval_for_timeout_timer milliseconds */ - uv_timer_again(&ctx->source.session->timeout); } + qr_task_unref(task); + return state == KR_STATE_DONE ? 0 : kr_error(EIO); } +static int udp_task_step(struct qr_task *task, + const struct sockaddr *packet_source, knot_pkt_t *packet) +{ + struct request_ctx *ctx = task->ctx; + struct kr_request *req = &ctx->req; + + /* If there is already outgoing query, enqueue to it. */ + if (subreq_enqueue(task)) { + return kr_ok(); /* Will be notified when outgoing query finishes. */ + } + /* Start transmitting */ + uv_handle_t *handle = retransmit(task); + if (handle == NULL) { + subreq_finalize(task, packet_source, packet); + return qr_task_finalize(task, KR_STATE_FAIL); + } + /* Check current query NSLIST */ + struct kr_query *qry = array_tail(req->rplan.pending); + assert(qry != NULL); + /* Retransmit at default interval, or more frequently if the mean + * RTT of the server is better. If the server is glued, use default rate. */ + size_t timeout = qry->ns.score; + if (timeout > KR_NS_GLUED) { + /* We don't have information about variance in RTT, expect +10ms */ + timeout = MIN(qry->ns.score + 10, KR_CONN_RETRY); + } else { + timeout = KR_CONN_RETRY; + } + /* Announce and start subrequest. + * @note Only UDP can lead I/O as it doesn't touch 'task->pktbuf' for reassembly. + */ + subreq_lead(task); + struct session *session = handle->data; + assert(session_get_handle(session) == handle && (handle->type == UV_UDP)); + int ret = session_timer_start(session, on_retransmit, timeout, 0); + /* Start next step with timeout, fatal if can't start a timer. */ + if (ret != 0) { + subreq_finalize(task, packet_source, packet); + return qr_task_finalize(task, KR_STATE_FAIL); + } + return kr_ok(); +} + +static int tcp_task_waiting_connection(struct session *session, struct qr_task *task) +{ + assert(session_flags(session)->outgoing); + if (session_flags(session)->closing) { + /* Something went wrong. Better answer with KR_STATE_FAIL. + * TODO: normally should not happen, + * consider possibility to transform this into + * assert(!session_flags(session)->closing). */ + return kr_error(EINVAL); + } + /* Add task to the end of list of waiting tasks. + * It will be notified in on_connect() or qr_task_on_send(). */ + int ret = session_waitinglist_push(session, task); + if (ret < 0) { + return kr_error(EINVAL); + } + return kr_ok(); +} + +static int tcp_task_existing_connection(struct session *session, struct qr_task *task) +{ + assert(session_flags(session)->outgoing); + struct request_ctx *ctx = task->ctx; + struct worker_ctx *worker = ctx->worker; + + if (session_flags(session)->closing) { + /* Something went wrong. Better answer with KR_STATE_FAIL. + * TODO: normally should not happen, + * consider possibility to transform this into + * assert(!session_flags(session)->closing). */ + return kr_error(EINVAL); + } + + /* If there are any unsent queries, send it first. */ + int ret = send_waiting(session); + if (ret != 0) { + return kr_error(EINVAL); + } + + /* No unsent queries at that point. */ + if (session_tasklist_get_len(session) >= worker->tcp_pipeline_max) { + /* Too many outstanding queries, answer with SERFVAIL, */ + return kr_error(EINVAL); + } + + /* Send query to upstream. */ + ret = qr_task_send(task, session, NULL, NULL); + if (ret != 0) { + /* Error, finalize task with SERVFAIL and + * close connection to upstream. */ + session_tasklist_finalize(session, KR_STATE_FAIL); + session_close(session); + return kr_error(EINVAL); + } + + return kr_ok(); +} + +static int tcp_task_make_connection(struct session *session, struct qr_task *task, + const struct sockaddr *addr /* , knot_pkt_t *packet */) +{ + struct request_ctx *ctx = task->ctx; + struct worker_ctx *worker = ctx->worker; + + uv_connect_t *conn = malloc(sizeof(uv_connect_t)); + if (!conn) { + return kr_error(EINVAL); + } + uv_handle_t *client = ioreq_spawn(worker, SOCK_STREAM, + addr->sa_family); + if (!client) { + free(conn); + return kr_error(EINVAL); + } + session = client->data; + + /* Add address to the waiting list. + * Now it "is waiting to be connected to." */ + int ret = worker_add_tcp_waiting(ctx->worker, addr, session); + if (ret < 0) { + free(conn); + return kr_error(EINVAL); + } + + /* Check if there must be TLS */ + struct engine *engine = ctx->worker->engine; + struct network *net = &engine->net; + const char *key = tcpsess_key(addr); + struct tls_client_paramlist_entry *entry = map_get(&net->tls_client_params, key); + if (entry) { + /* Address is configured to be used with TLS. + * We need to allocate auxiliary data structure. */ + assert(session_tls_get_client_ctx(session) == NULL); + struct tls_client_ctx_t *tls_ctx = tls_client_ctx_new(entry, worker); + if (!tls_ctx) { + worker_del_tcp_waiting(ctx->worker, addr); + free(conn); + return kr_error(EINVAL); + } + tls_client_ctx_set_session(tls_ctx, session); + session_tls_set_client_ctx(session, tls_ctx); + session_flags(session)->has_tls = true; + } + + conn->data = session; + /* Store peer address for the session. */ + struct sockaddr *peer = session_get_peer(session); + memcpy(peer, addr, kr_sockaddr_len(addr)); + + /* Start watchdog to catch eventual connection timeout. */ + ret = session_timer_start(session, on_tcp_connect_timeout, + KR_CONN_RTT_MAX, 0); + if (ret != 0) { + worker_del_tcp_waiting(ctx->worker, addr); + free(conn); + return kr_error(EINVAL); + } + + struct kr_query *qry = task_get_last_pending_query(task); + WITH_VERBOSE (qry) { + const char *peer_str = kr_straddr(peer); + VERBOSE_MSG(qry, "=> connecting to: '%s'\n", peer_str ? peer_str : ""); + } + + /* Start connection process to upstream. */ + if (uv_tcp_connect(conn, (uv_tcp_t *)client, addr , on_connect) != 0) { + session_timer_stop(session); + worker_del_tcp_waiting(ctx->worker, addr); + free(conn); + return kr_error(EAGAIN); + } + + /* Add task to the end of list of waiting tasks. + * Will be notified either in on_connect() or in qr_task_on_send(). */ + ret = session_waitinglist_push(session, task); + if (ret < 0) { + session_timer_stop(session); + worker_del_tcp_waiting(ctx->worker, addr); + free(conn); + return kr_error(EINVAL); + } + + return kr_ok(); +} + +static int tcp_task_step(struct qr_task *task, + const struct sockaddr *packet_source, knot_pkt_t *packet) +{ + assert(task->pending_count == 0); + struct request_ctx *ctx = task->ctx; + + const struct sockaddr *addr = + packet_source ? packet_source : task->addrlist; + if (addr->sa_family == AF_UNSPEC) { + /* Target isn't defined. Finalize task with SERVFAIL. + * Although task->pending_count is zero, there are can be followers, + * so we need to call subreq_finalize() to handle them properly. */ + subreq_finalize(task, packet_source, packet); + return qr_task_finalize(task, KR_STATE_FAIL); + } + int ret = kr_error(EINVAL); + struct session* session = NULL; + if ((session = worker_find_tcp_waiting(ctx->worker, addr)) != NULL) { + /* Connection is in the list of waiting connections. + * It means that connection establishing is coming right now. */ + ret = tcp_task_waiting_connection(session, task); + } else if ((session = worker_find_tcp_connected(ctx->worker, addr)) != NULL) { + /* Connection has been already established. */ + ret = tcp_task_existing_connection(session, task); + } else { + /* Make connection. */ + ret = tcp_task_make_connection(session, task, addr); + } + + if (ret != kr_ok()) { + subreq_finalize(task, packet_source, packet); + if (ret == kr_error(EAGAIN)) { + ret = qr_task_step(task, NULL, NULL); + } else { + ret = qr_task_finalize(task, KR_STATE_FAIL); + } + } + + return ret; +} + static int qr_task_step(struct qr_task *task, const struct sockaddr *packet_source, knot_pkt_t *packet) { @@ -1601,16 +1350,19 @@ task->addrlist = NULL; task->addrlist_count = 0; task->addrlist_turn = 0; - req->has_tls = (ctx->source.session && ctx->source.session->has_tls); + req->has_tls = (ctx->source.session && session_flags(ctx->source.session)->has_tls); if (worker->too_many_open) { + /* */ struct kr_rplan *rplan = &req->rplan; if (worker->stats.rconcurrent < worker->rconcurrent_highwatermark - 10) { worker->too_many_open = false; - } else if (packet && kr_rplan_empty(rplan)) { - /* new query; TODO - make this detection more obvious */ - kr_resolve_consume(req, packet_source, packet); + } else { + if (packet && kr_rplan_empty(rplan)) { + /* new query; TODO - make this detection more obvious */ + kr_resolve_consume(req, packet_source, packet); + } return qr_task_finalize(task, KR_STATE_FAIL); } } @@ -1639,226 +1391,16 @@ choice += 1; } - /* Start fast retransmit with UDP, otherwise connect. */ int ret = 0; if (sock_type == SOCK_DGRAM) { - /* If there is already outgoing query, enqueue to it. */ - if (subreq_enqueue(task)) { - return kr_ok(); /* Will be notified when outgoing query finishes. */ - } - /* Start transmitting */ - uv_handle_t *handle = retransmit(task); - if (handle == NULL) { - return qr_task_step(task, NULL, NULL); - } - /* Check current query NSLIST */ - struct kr_query *qry = array_tail(req->rplan.pending); - assert(qry != NULL); - /* Retransmit at default interval, or more frequently if the mean - * RTT of the server is better. If the server is glued, use default rate. */ - size_t timeout = qry->ns.score; - if (timeout > KR_NS_GLUED) { - /* We don't have information about variance in RTT, expect +10ms */ - timeout = MIN(qry->ns.score + 10, KR_CONN_RETRY); - } else { - timeout = KR_CONN_RETRY; - } - /* Announce and start subrequest. - * @note Only UDP can lead I/O as it doesn't touch 'task->pktbuf' for reassembly. - */ - subreq_lead(task); - struct session *session = handle->data; - assert(session->handle->type == UV_UDP); - ret = timer_start(session, on_retransmit, timeout, 0); - /* Start next step with timeout, fatal if can't start a timer. */ - if (ret != 0) { - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } + /* Start fast retransmit with UDP. */ + ret = udp_task_step(task, packet_source, packet); } else { + /* TCP. Connect to upstream or send the query if connection already exists. */ assert (sock_type == SOCK_STREAM); - const struct sockaddr *addr = - packet_source ? packet_source : task->addrlist; - if (addr->sa_family == AF_UNSPEC) { - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } - struct session* session = NULL; - if ((session = worker_find_tcp_waiting(ctx->worker, addr)) != NULL) { - assert(session->outgoing); - if (session->closing) { - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } - /* There are waiting tasks. - * It means that connection establishing or data sending - * is coming right now. */ - /* Task will be notified in on_connect() or qr_task_on_send(). */ - ret = session_add_waiting(session, task); - if (ret < 0) { - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } - ret = session_add_tasks(session, task); - if (ret < 0) { - session_del_waiting(session, task); - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } - assert(task->pending_count == 0); - task->pending[task->pending_count] = session->handle; - task->pending_count += 1; - } else if ((session = worker_find_tcp_connected(ctx->worker, addr)) != NULL) { - /* Connection has been already established */ - assert(session->outgoing); - if (session->closing) { - session_del_tasks(session, task); - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } - - if (session->tasks.len >= worker->tcp_pipeline_max) { - session_del_tasks(session, task); - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } - - /* will be removed in qr_task_on_send() */ - ret = session_add_waiting(session, task); - if (ret < 0) { - session_del_tasks(session, task); - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } - ret = session_add_tasks(session, task); - if (ret < 0) { - session_del_waiting(session, task); - session_del_tasks(session, task); - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } - if (session->waiting.len == 1) { - ret = qr_task_send(task, session->handle, - &session->peer.ip, task->pktbuf); - if (ret < 0) { - session_del_waiting(session, task); - session_del_tasks(session, task); - while (session->tasks.len != 0) { - struct qr_task *t = session->tasks.at[0]; - qr_task_finalize(t, KR_STATE_FAIL); - session_del_tasks(session, t); - } - subreq_finalize(task, packet_source, packet); - session_close(session); - return qr_task_finalize(task, KR_STATE_FAIL); - } - if (session->tasks.len == 1) { - uv_timer_stop(&session->timeout); - ret = timer_start(session, on_tcp_watchdog_timeout, - MAX_TCP_INACTIVITY, 0); - } - if (ret < 0) { - session_del_waiting(session, task); - session_del_tasks(session, task); - while (session->tasks.len != 0) { - struct qr_task *t = session->tasks.at[0]; - qr_task_finalize(t, KR_STATE_FAIL); - session_del_tasks(session, t); - } - subreq_finalize(task, packet_source, packet); - session_close(session); - return qr_task_finalize(task, KR_STATE_FAIL); - } - } - assert(task->pending_count == 0); - task->pending[task->pending_count] = session->handle; - task->pending_count += 1; - } else { - /* Make connection */ - uv_connect_t *conn = (uv_connect_t *)iorequest_borrow(ctx->worker); - if (!conn) { - return qr_task_step(task, NULL, NULL); - } - uv_handle_t *client = ioreq_spawn(task, sock_type, - addr->sa_family); - if (!client) { - iorequest_release(ctx->worker, conn); - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } - session = client->data; - ret = worker_add_tcp_waiting(ctx->worker, addr, session); - if (ret < 0) { - session_del_tasks(session, task); - iorequest_release(ctx->worker, conn); - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } - /* will be removed in qr_task_on_send() */ - ret = session_add_waiting(session, task); - if (ret < 0) { - session_del_tasks(session, task); - worker_del_tcp_waiting(ctx->worker, addr); - iorequest_release(ctx->worker, conn); - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } - - /* Check if there must be TLS */ - struct engine *engine = ctx->worker->engine; - struct network *net = &engine->net; - const char *key = tcpsess_key(addr); - struct tls_client_paramlist_entry *entry = map_get(&net->tls_client_params, key); - if (entry) { - assert(session->tls_client_ctx == NULL); - struct tls_client_ctx_t *tls_ctx = tls_client_ctx_new(entry, worker); - if (!tls_ctx) { - session_del_tasks(session, task); - session_del_waiting(session, task); - worker_del_tcp_waiting(ctx->worker, addr); - iorequest_release(ctx->worker, conn); - subreq_finalize(task, packet_source, packet); - return qr_task_step(task, NULL, NULL); - } - tls_client_ctx_set_params(tls_ctx, entry, session); - session->tls_client_ctx = tls_ctx; - session->has_tls = true; - } - - conn->data = session; - memcpy(&session->peer, addr, sizeof(session->peer)); - - ret = timer_start(session, on_tcp_connect_timeout, - KR_CONN_RTT_MAX, 0); - if (ret != 0) { - session_del_tasks(session, task); - session_del_waiting(session, task); - worker_del_tcp_waiting(ctx->worker, addr); - iorequest_release(ctx->worker, conn); - subreq_finalize(task, packet_source, packet); - return qr_task_finalize(task, KR_STATE_FAIL); - } - - struct kr_query *qry = session_current_query(session); - WITH_VERBOSE (qry) { - char addr_str[INET6_ADDRSTRLEN]; - inet_ntop(session->peer.ip.sa_family, kr_inaddr(&session->peer.ip), addr_str, sizeof(addr_str)); - VERBOSE_MSG(qry, "=> connecting to: '%s'\n", addr_str); - } - - if (uv_tcp_connect(conn, (uv_tcp_t *)client, - addr , on_connect) != 0) { - uv_timer_stop(&session->timeout); - session_del_tasks(session, task); - session_del_waiting(session, task); - worker_del_tcp_waiting(ctx->worker, addr); - iorequest_release(ctx->worker, conn); - subreq_finalize(task, packet_source, packet); - return qr_task_step(task, NULL, NULL); - } - } + ret = tcp_task_step(task, packet_source, packet); } - return kr_ok(); + return ret; } static int parse_packet(knot_pkt_t *query) @@ -1882,46 +1424,43 @@ return ret; } -static struct qr_task* find_task(const struct session *session, uint16_t msg_id) +int worker_submit(struct session *session, knot_pkt_t *query) { - struct qr_task *ret = NULL; - const qr_tasklist_t *tasklist = &session->tasks; - for (size_t i = 0; i < tasklist->len; ++i) { - struct qr_task *task = tasklist->at[i]; - uint16_t task_msg_id = knot_wire_get_id(task->pktbuf->wire); - if (task_msg_id == msg_id) { - ret = task; - break; - } + if (!session) { + assert(false); + return kr_error(EINVAL); } - return ret; -} - -int worker_submit(struct worker_ctx *worker, uv_handle_t *handle, - knot_pkt_t *query, const struct sockaddr* addr) -{ - bool OK = worker && handle && handle->data; + uv_handle_t *handle = session_get_handle(session); + bool OK = handle && handle->loop->data; if (!OK) { assert(false); return kr_error(EINVAL); } - struct session *session = handle->data; + struct worker_ctx *worker = handle->loop->data; /* Parse packet */ int ret = parse_packet(query); + const bool is_query = (knot_wire_get_qr(query->wire) == 0); + const bool is_outgoing = session_flags(session)->outgoing; + /* Ignore badly formed queries. */ + if (!query || + (ret != kr_ok() && ret != kr_error(EMSGSIZE)) || + (is_query == is_outgoing)) { + if (query && !is_outgoing) worker->stats.dropped += 1; + return kr_error(EILSEQ); + } + /* Start new task on listening sockets, * or resume if this is subrequest */ struct qr_task *task = NULL; - if (!session->outgoing) { /* request from a client */ - /* Ignore badly formed queries. */ - if (!query || ret != 0 || knot_wire_get_qr(query->wire)) { - if (query) worker->stats.dropped += 1; - return kr_error(EILSEQ); - } - struct request_ctx *ctx = request_create(worker, handle, addr); + struct sockaddr *addr = NULL; + if (!is_outgoing) { /* request from a client */ + struct request_ctx *ctx = request_create(worker, handle, + session_get_peer(session), + knot_wire_get_id(query->wire)); if (!ctx) { return kr_error(ENOMEM); } @@ -1937,21 +1476,23 @@ request_free(ctx); return kr_error(ENOMEM); } - addr = NULL; - } else if (query) { /* response from upstream */ - if ((ret != kr_ok() && ret != kr_error(EMSGSIZE)) || - !knot_wire_get_qr(query->wire)) { - /* Ignore badly formed responses. */ - return kr_error(EILSEQ); + + if (handle->type == UV_TCP && qr_task_register(task, session)) { + return kr_error(ENOMEM); } - task = find_task(session, knot_wire_get_id(query->wire)); + } else if (query) { /* response from upstream */ + task = session_tasklist_del_msgid(session, knot_wire_get_id(query->wire)); if (task == NULL) { return kr_error(ENOENT); } - assert(session->closing == false); + assert(!session_flags(session)->closing); + addr = session_get_peer(session); } - assert(uv_is_closing(session->handle) == false); + assert(uv_is_closing(session_get_handle(session)) == false); + /* Packet was successfully parsed. + * Task was created (found). */ + session_touch(session); /* Consume input and produce next message */ return qr_task_step(task, addr, query); } @@ -1986,7 +1527,7 @@ return ret; } -static int worker_add_tcp_connected(struct worker_ctx *worker, +int worker_add_tcp_connected(struct worker_ctx *worker, const struct sockaddr* addr, struct session *session) { @@ -1999,7 +1540,7 @@ return map_add_tcp_session(&worker->tcp_connected, addr, session); } -static int worker_del_tcp_connected(struct worker_ctx *worker, +int worker_del_tcp_connected(struct worker_ctx *worker, const struct sockaddr* addr) { assert(addr && tcpsess_key(addr)); @@ -2038,385 +1579,73 @@ return map_find_tcp_session(&worker->tcp_waiting, addr); } -/* Return DNS/TCP message size. */ -static int get_msg_size(const uint8_t *msg) -{ - return wire_read_u16(msg); -} - -/* If buffering, close last task as it isn't live yet. */ -static void discard_buffered(struct session *session) +int worker_end_tcp(struct session *session) { - if (session->buffering) { - qr_task_free(session->buffering); - session->buffering = NULL; - session->msg_hdr_idx = 0; - } -} - -int worker_end_tcp(struct worker_ctx *worker, uv_handle_t *handle) -{ - if (!worker || !handle) { + if (!session) { return kr_error(EINVAL); } - /* If this is subrequest, notify parent task with empty input - * because in this case session doesn't own tasks, it has just - * borrowed the task from parent session. */ - struct session *session = handle->data; - if (session->outgoing) { - worker_submit(worker, handle, NULL, NULL); - } else { - discard_buffered(session); - } - return 0; -} -int worker_process_tcp(struct worker_ctx *worker, uv_stream_t *handle, - const uint8_t *msg, ssize_t len) + session_timer_stop(session); + + uv_handle_t *handle = session_get_handle(session); + struct worker_ctx *worker = handle->loop->data; + struct sockaddr *peer = session_get_peer(session); -{ - if (!worker || !handle) { - return kr_error(EINVAL); + worker_del_tcp_connected(worker, peer); + session_flags(session)->connected = false; + + struct tls_client_ctx_t *tls_client_ctx = session_tls_get_client_ctx(session); + if (tls_client_ctx) { + /* Avoid gnutls_bye() call */ + tls_set_hs_state(&tls_client_ctx->c, TLS_HS_NOT_STARTED); } - /* Connection error or forced disconnect */ - struct session *session = handle->data; - assert(session && session->handle == (uv_handle_t *)handle && handle->type == UV_TCP); - if (session->closing) { - return kr_ok(); - } - if (len <= 0 || !msg) { - /* If we have pending tasks, we must dissociate them from the - * connection so they don't try to access closed and freed handle. - * @warning Do not modify task if this is outgoing request - * as it is shared with originator. - */ - struct kr_query *qry = session_current_query(session); - WITH_VERBOSE (qry) { - char addr_str[INET6_ADDRSTRLEN]; - inet_ntop(session->peer.ip.sa_family, kr_inaddr(&session->peer.ip), - addr_str, sizeof(addr_str)); - VERBOSE_MSG(qry, "=> connection to '%s' closed by peer\n", addr_str); - } - uv_timer_t *timer = &session->timeout; - uv_timer_stop(timer); - struct sockaddr *peer = &session->peer.ip; - worker_del_tcp_connected(worker, peer); - session->connected = false; - if (session->tls_client_ctx) { - /* Avoid gnutls_bye() call */ - tls_set_hs_state(&session->tls_client_ctx->c, - TLS_HS_NOT_STARTED); - } - - if (session->tls_ctx) { - /* Avoid gnutls_bye() call */ - tls_set_hs_state(&session->tls_ctx->c, - TLS_HS_NOT_STARTED); - } - - if (session->outgoing && session->buffering) { - session->buffering = NULL; - } - - assert(session->tasks.len >= session->waiting.len); - while (session->waiting.len > 0) { - struct qr_task *task = session->waiting.at[0]; - array_del(session->waiting, 0); - assert(task->refs > 1); - session_del_tasks(session, task); - if (session->outgoing) { - if (task->ctx->req.options.FORWARD) { - /* We are in TCP_FORWARD mode. - * To prevent failing at kr_resolve_consume() - * qry.flags.TCP must be cleared. - * TODO - refactoring is needed. */ - struct kr_request *req = &task->ctx->req; - struct kr_rplan *rplan = &req->rplan; - struct kr_query *qry = array_tail(rplan->pending); - qry->flags.TCP = false; - } - qr_task_step(task, NULL, NULL); - } else { - assert(task->ctx->source.session == session); - task->ctx->source.session = NULL; - } - qr_task_unref(task); - } - while (session->tasks.len > 0) { - struct qr_task *task = session->tasks.at[0]; - if (session->outgoing) { - if (task->ctx->req.options.FORWARD) { + struct tls_ctx_t *tls_ctx = session_tls_get_server_ctx(session); + if (tls_ctx) { + /* Avoid gnutls_bye() call */ + tls_set_hs_state(&tls_ctx->c, TLS_HS_NOT_STARTED); + } + + while (!session_waitinglist_is_empty(session)) { + struct qr_task *task = session_waitinglist_pop(session, false); + assert(task->refs > 1); + session_tasklist_del(session, task); + if (session_flags(session)->outgoing) { + if (task->ctx->req.options.FORWARD) { + /* We are in TCP_FORWARD mode. + * To prevent failing at kr_resolve_consume() + * qry.flags.TCP must be cleared. + * TODO - refactoring is needed. */ struct kr_request *req = &task->ctx->req; struct kr_rplan *rplan = &req->rplan; struct kr_query *qry = array_tail(rplan->pending); qry->flags.TCP = false; - } - qr_task_step(task, NULL, NULL); - } else { - assert(task->ctx->source.session == session); - task->ctx->source.session = NULL; - } - session_del_tasks(session, task); - } - session_close(session); - return kr_ok(); - } - - if (session->bytes_to_skip) { - assert(session->buffering == NULL); - ssize_t min_len = MIN(session->bytes_to_skip, len); - len -= min_len; - msg += min_len; - session->bytes_to_skip -= min_len; - if (len < 0 || session->bytes_to_skip < 0) { - /* Something gone wrong. - * Better kill the connection */ - return kr_error(EILSEQ); - } - if (len == 0) { - return kr_ok(); - } - assert(session->bytes_to_skip == 0); - } - - int submitted = 0; - struct qr_task *task = session->buffering; - knot_pkt_t *pkt_buf = NULL; - if (task) { - pkt_buf = task->pktbuf; - } else { - /* Update DNS header in session->msg_hdr* */ - assert(session->msg_hdr_idx <= sizeof(session->msg_hdr)); - ssize_t hdr_amount = sizeof(session->msg_hdr) - - session->msg_hdr_idx; - if (hdr_amount > len) { - hdr_amount = len; - } - if (hdr_amount > 0) { - memcpy(session->msg_hdr + session->msg_hdr_idx, msg, hdr_amount); - session->msg_hdr_idx += hdr_amount; - len -= hdr_amount; - msg += hdr_amount; - } - if (len == 0) { /* no data beyond msg_hdr -> not much to do */ - return kr_ok(); - } - assert(session->msg_hdr_idx == sizeof(session->msg_hdr)); - session->msg_hdr_idx = 0; - uint16_t msg_size = get_msg_size(session->msg_hdr); - uint16_t msg_id = knot_wire_get_id(session->msg_hdr + 2); - if (msg_size < KNOT_WIRE_HEADER_SIZE) { - /* better kill the connection; we would probably get out of sync */ - uv_timer_t *timer = &session->timeout; - uv_timer_stop(timer); - while (session->waiting.len > 0) { - struct qr_task *task = session->waiting.at[0]; - if (session->outgoing) { - qr_task_finalize(task, KR_STATE_FAIL); - } else { - assert(task->ctx->source.session == session); - task->ctx->source.session = NULL; - } - array_del(session->waiting, 0); - session_del_tasks(session, task); - qr_task_unref(task); - } - while (session->tasks.len > 0) { - struct qr_task *task = session->tasks.at[0]; - if (session->outgoing) { - qr_task_finalize(task, KR_STATE_FAIL); - } else { - assert(task->ctx->source.session == session); - task->ctx->source.session = NULL; - } - session_del_tasks(session, task); - } - session_close(session); - - return kr_ok(); - } - - /* get task */ - if (!session->outgoing) { - /* This is a new query, create a new task that we can use - * to buffer incoming message until it's complete. */ - struct sockaddr *addr = &(session->peer.ip); - assert(addr->sa_family != AF_UNSPEC); - struct request_ctx *ctx = request_create(worker, - (uv_handle_t *)handle, - addr); - if (!ctx) { - return kr_error(ENOMEM); - } - task = qr_task_create(ctx); - if (!task) { - request_free(ctx); - return kr_error(ENOMEM); } + qr_task_step(task, NULL, NULL); } else { - /* Start of response from upstream. - * The session task list must contain a task - * with the same msg id. */ - task = find_task(session, msg_id); - /* FIXME: on high load over one connection, it's likely - * that we will get multiple matches sooner or later (!) */ - if (task) { - /* Make sure we can process maximum packet sizes over TCP for outbound queries. - * Previous packet is allocated with mempool, so there's no need to free it manually. */ - if (task->pktbuf->max_size < KNOT_WIRE_MAX_PKTSIZE) { - knot_mm_t *pool = &task->pktbuf->mm; - pkt_buf = knot_pkt_new(NULL, KNOT_WIRE_MAX_PKTSIZE, pool); - if (!pkt_buf) { - return kr_error(ENOMEM); - } - task->pktbuf = pkt_buf; - } - knot_pkt_clear(task->pktbuf); - assert(task->leading == false); - } else { - session->bytes_to_skip = msg_size - 2; - ssize_t min_len = MIN(session->bytes_to_skip, len); - len -= min_len; - msg += min_len; - session->bytes_to_skip -= min_len; - if (len < 0 || session->bytes_to_skip < 0) { - /* Something gone wrong. - * Better kill the connection */ - return kr_error(EILSEQ); - } - if (len == 0) { - return submitted; - } - assert(session->bytes_to_skip == 0); - int ret = worker_process_tcp(worker, handle, msg, len); - if (ret < 0) { - submitted = ret; - } else { - submitted += ret; - } - return submitted; - } + assert(task->ctx->source.session == session); + task->ctx->source.session = NULL; } - - pkt_buf = task->pktbuf; - knot_wire_set_id(pkt_buf->wire, msg_id); - pkt_buf->size = 2; - task->bytes_remaining = msg_size - 2; - assert(session->buffering == NULL); - session->buffering = task; + worker_task_unref(task); } - /* At this point session must have either created new task - * or it's already assigned. */ - assert(task); - assert(len > 0); - - /* Message is too long, can't process it. */ - ssize_t to_read = MIN(len, task->bytes_remaining); - if (pkt_buf->size + to_read > pkt_buf->max_size) { - // TODO reallocate pkt_buf - pkt_buf->size = 0; - len -= to_read; - msg += to_read; - session->bytes_to_skip = task->bytes_remaining - to_read; - task->bytes_remaining = 0; - if (session->buffering) { - if (!session->outgoing) { - qr_task_complete(session->buffering); + while (!session_tasklist_is_empty(session)) { + struct qr_task *task = session_tasklist_del_first(session, false); + if (session_flags(session)->outgoing) { + if (task->ctx->req.options.FORWARD) { + struct kr_request *req = &task->ctx->req; + struct kr_rplan *rplan = &req->rplan; + struct kr_query *qry = array_tail(rplan->pending); + qry->flags.TCP = false; } - session->buffering = NULL; - } - if (len > 0) { - int ret = worker_process_tcp(worker, handle, msg, len); - if (ret < 0) { - submitted = ret; - } else { - submitted += ret; - } - } - return submitted; - } - /* Buffer message and check if it's complete */ - memcpy(pkt_buf->wire + pkt_buf->size, msg, to_read); - pkt_buf->size += to_read; - task->bytes_remaining -= to_read; - len -= to_read; - msg += to_read; - if (task->bytes_remaining == 0) { - /* Message was assembled, clear temporary. */ - session->buffering = NULL; - session->msg_hdr_idx = 0; - const struct sockaddr *addr = NULL; - knot_pkt_t *pkt = pkt_buf; - if (session->outgoing) { - addr = &session->peer.ip; - assert ((task->pending_count == 1) && (task->pending[0] == session->handle)); - task->pending_count = 0; - session_del_tasks(session, task); - } - /* Parse the packet and start resolving complete query */ - int ret = parse_packet(pkt); - if (ret == 0) { - if (session->outgoing) { - /* To prevent slow lorris attack restart watchdog only after - * the whole message was successfully assembled and parsed */ - if (session->tasks.len > 0 || session->waiting.len > 0) { - uv_timer_stop(&session->timeout); - timer_start(session, on_tcp_watchdog_timeout, MAX_TCP_INACTIVITY, 0); - } - } else { - /* Start only new queries, - * not subrequests that are already pending */ - ret = request_start(task->ctx, pkt); - if (ret != 0) { - /* Allocation of answer buffer has failed. - * We can't notify client about failure, - * so just end the task processing. */ - qr_task_complete(task); - goto next_msg; - } - - ret = qr_task_register(task, session); - if (ret != 0) { - /* Answer buffer has been allocated, - * but task can't be attached to the given - * session due to memory problems. - * Finalize the task, otherwise it becomes orphaned. */ - knot_pkt_init_response(task->ctx->req.answer, pkt); - qr_task_finalize(task, KR_STATE_FAIL); - goto next_msg; - } - submitted += 1; - if (task->leading) { - assert(false); - } - } - } else if (session->outgoing) { - /* Drop malformed packet and retry resolution */ - pkt = NULL; - ret = 0; + qr_task_step(task, NULL, NULL); } else { - qr_task_complete(task); - } - /* Only proceed if the message is valid, or it's an invalid response to - * an outbound query which needs to be treated as a timeout. */ - if (ret == 0) { - /* since there can be next dns message, we must to proceed - * even if qr_task_step() returns error */ - qr_task_step(task, addr, pkt); - } -next_msg: - if (len > 0) { - /* TODO: this is simple via iteration; recursion doesn't really help */ - ret = worker_process_tcp(worker, handle, msg, len); - if (ret < 0) { - return ret; - } - submitted += ret; + assert(task->ctx->source.session == session); + task->ctx->source.session = NULL; } + worker_task_unref(task); } - assert(submitted >= 0); - return submitted; + session_close(session); + return kr_ok(); } struct qr_task *worker_resolve_start(struct worker_ctx *worker, knot_pkt_t *query, struct kr_qflags options) @@ -2426,7 +1655,8 @@ return NULL; } - struct request_ctx *ctx = request_create(worker, NULL, NULL); + + struct request_ctx *ctx = request_create(worker, NULL, NULL, worker->next_request_uid); if (!ctx) { return NULL; } @@ -2443,12 +1673,17 @@ if (ret != 0) { /* task is attached to request context, * so dereference (and deallocate) it first */ - request_del_tasks(ctx, task); - array_clear(ctx->tasks); + ctx->task = NULL; + qr_task_unref(task); request_free(ctx); return NULL; } + worker->next_request_uid += 1; + if (worker->next_request_uid == 0) { + worker->next_request_uid = UINT16_MAX + 1; + } + /* Set options late, as qr_task_start() -> kr_resolve_begin() rewrite it. */ kr_qflags_set(&task->ctx->req.options, options); return task; @@ -2462,6 +1697,11 @@ return qr_task_step(task, NULL, query); } +int worker_task_numrefs(const struct qr_task *task) +{ + return task->refs; +} + struct kr_request *worker_task_request(struct qr_task *task) { if (!task || !task->ctx) { @@ -2476,22 +1716,86 @@ return qr_task_finalize(task, state); } -void worker_session_close(struct session *session) + int worker_task_step(struct qr_task *task, const struct sockaddr *packet_source, + knot_pkt_t *packet) + { + return qr_task_step(task, packet_source, packet); + } + +void worker_task_complete(struct qr_task *task) { - session_close(session); + return qr_task_complete(task); } +void worker_task_ref(struct qr_task *task) +{ + qr_task_ref(task); +} + +void worker_task_unref(struct qr_task *task) +{ + qr_task_unref(task); +} + +void worker_task_timeout_inc(struct qr_task *task) +{ + task->timeouts += 1; +} + +knot_pkt_t *worker_task_get_pktbuf(const struct qr_task *task) +{ + return task->pktbuf; +} + +struct request_ctx *worker_task_get_request(struct qr_task *task) +{ + return task->ctx; +} + +struct session *worker_request_get_source_session(struct request_ctx *ctx) +{ + return ctx->source.session; +} + +void worker_request_set_source_session(struct request_ctx *ctx, struct session *session) +{ + ctx->source.session = session; +} + +uint16_t worker_task_pkt_get_msgid(struct qr_task *task) +{ + knot_pkt_t *pktbuf = worker_task_get_pktbuf(task); + uint16_t msg_id = knot_wire_get_id(pktbuf->wire); + return msg_id; +} + +void worker_task_pkt_set_msgid(struct qr_task *task, uint16_t msgid) +{ + knot_pkt_t *pktbuf = worker_task_get_pktbuf(task); + knot_wire_set_id(pktbuf->wire, msgid); + struct kr_query *q = task_get_last_pending_query(task); + q->id = msgid; +} + +uint64_t worker_task_creation_time(struct qr_task *task) +{ + return task->creation_time; +} + +void worker_task_subreq_finalize(struct qr_task *task) +{ + subreq_finalize(task, NULL, NULL); +} + +bool worker_task_finished(struct qr_task *task) +{ + return task->finished; +} /** Reserve worker buffers */ static int worker_reserve(struct worker_ctx *worker, size_t ring_maxlen) { array_init(worker->pool_mp); - array_init(worker->pool_ioreqs); - array_init(worker->pool_iohandles); - array_init(worker->pool_sessions); - if (array_reserve(worker->pool_mp, ring_maxlen) || - array_reserve(worker->pool_ioreqs, ring_maxlen) || - array_reserve(worker->pool_iohandles, ring_maxlen) || - array_reserve(worker->pool_sessions, ring_maxlen)) { + if (array_reserve(worker->pool_mp, ring_maxlen)) { return kr_error(ENOMEM); } memset(&worker->pkt_pool, 0, sizeof(worker->pkt_pool)); @@ -2505,20 +1809,19 @@ return kr_ok(); } -#define reclaim_freelist(list, type, cb) \ - for (unsigned i = 0; i < list.len; ++i) { \ - void *elm = list.at[i]; \ - kr_asan_unpoison(elm, sizeof(type)); \ - cb(elm); \ - } \ - array_clear(list) +static inline void reclaim_mp_freelist(mp_freelist_t *list) +{ + for (unsigned i = 0; i < list->len; ++i) { + struct mempool *e = list->at[i]; + kr_asan_unpoison(e, sizeof(*e)); + mp_delete(e); + } + array_clear(*list); +} void worker_reclaim(struct worker_ctx *worker) { - reclaim_freelist(worker->pool_mp, struct mempool, mp_delete); - reclaim_freelist(worker->pool_ioreqs, uv_reqs_t, free); - reclaim_freelist(worker->pool_iohandles, uv_handles_t, free); - reclaim_freelist(worker->pool_sessions, struct session, session_free); + reclaim_mp_freelist(&worker->pool_mp); mp_delete(worker->pkt_pool.ctx); worker->pkt_pool.ctx = NULL; trie_free(worker->subreq_out); @@ -2550,6 +1853,7 @@ worker->id = worker_id; worker->count = worker_count; worker->engine = engine; + worker->next_request_uid = UINT16_MAX + 1; worker_reserve(worker, MP_FREELIST_SIZE); worker->out_addr4.sin_family = AF_UNSPEC; worker->out_addr6.sin6_family = AF_UNSPEC; diff -Nru knot-resolver-3.0.0/daemon/worker.h knot-resolver-3.1.0/daemon/worker.h --- knot-resolver-3.0.0/daemon/worker.h 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/daemon/worker.h 2018-11-02 15:29:58.000000000 +0000 @@ -16,8 +16,6 @@ #pragma once -#include - #include "daemon/engine.h" #include "lib/generic/array.h" #include "lib/generic/map.h" @@ -39,30 +37,17 @@ /** * Process an incoming packet (query from a client or answer from upstream). * - * @param worker the singleton worker - * @param handle socket through which the request came - * @param query the packet, or NULL on an error from the transport layer - * @param addr the address from which the packet came (or NULL, possibly, on error) + * @param session session the where packet came from + * @param query the packet, or NULL on an error from the transport layer * @return 0 or an error code */ -int worker_submit(struct worker_ctx *worker, uv_handle_t *handle, knot_pkt_t *query, - const struct sockaddr* addr); - -/** - * Process incoming DNS message fragment(s) that arrived over a stream (TCP, TLS). - * - * If the fragment contains only a partial message, it is buffered. - * If the fragment contains a complete query or completes current fragment, execute it. - * @return the number of newly-completed requests (>=0) or an error code - */ -int worker_process_tcp(struct worker_ctx *worker, uv_stream_t *handle, - const uint8_t *msg, ssize_t len); +int worker_submit(struct session *session, knot_pkt_t *query); /** * End current DNS/TCP session, this disassociates pending tasks from this session * which may be freely closed afterwards. */ -int worker_end_tcp(struct worker_ctx *worker, uv_handle_t *handle); +int worker_end_tcp(struct session *session); /** * Start query resolution with given query. @@ -85,19 +70,41 @@ /** Collect worker mempools */ void worker_reclaim(struct worker_ctx *worker); -/** Closes given session */ -void worker_session_close(struct session *session); +int worker_task_step(struct qr_task *task, const struct sockaddr *packet_source, + knot_pkt_t *packet); -void *worker_iohandle_borrow(struct worker_ctx *worker); +int worker_task_numrefs(const struct qr_task *task); -void worker_iohandle_release(struct worker_ctx *worker, void *h); +/** Finalize given task */ +int worker_task_finalize(struct qr_task *task, int state); -ssize_t worker_gnutls_push(gnutls_transport_ptr_t h, const void *buf, size_t len); +void worker_task_complete(struct qr_task *task); -ssize_t worker_gnutls_client_push(gnutls_transport_ptr_t h, const void *buf, size_t len); +void worker_task_ref(struct qr_task *task); -/** Finalize given task */ -int worker_task_finalize(struct qr_task *task, int state); +void worker_task_unref(struct qr_task *task); + +void worker_task_timeout_inc(struct qr_task *task); + +int worker_add_tcp_connected(struct worker_ctx *worker, + const struct sockaddr *addr, + struct session *session); +int worker_del_tcp_connected(struct worker_ctx *worker, + const struct sockaddr *addr); + +knot_pkt_t *worker_task_get_pktbuf(const struct qr_task *task); + +struct request_ctx *worker_task_get_request(struct qr_task *task); + +struct session *worker_request_get_source_session(struct request_ctx *); + +void worker_request_set_source_session(struct request_ctx *, struct session *session); + +uint16_t worker_task_pkt_get_msgid(struct qr_task *task); +void worker_task_pkt_set_msgid(struct qr_task *task, uint16_t msgid); +uint64_t worker_task_creation_time(struct qr_task *task); +void worker_task_subreq_finalize(struct qr_task *task); +bool worker_task_finished(struct qr_task *task); /** @cond internal */ @@ -107,15 +114,16 @@ /** Maximum response time from TCP upstream, milliseconds */ #define MAX_TCP_INACTIVITY (KR_RESOLVE_TIME_LIMIT + KR_CONN_RTT_MAX) +#ifndef RECVMMSG_BATCH /* see check_bufsize() */ +#define RECVMMSG_BATCH 1 +#endif + /** Freelist of available mempools. */ -typedef array_t(void *) mp_freelist_t; +typedef array_t(struct mempool *) mp_freelist_t; /** List of query resolution tasks. */ typedef array_t(struct qr_task *) qr_tasklist_t; -/** Session list. */ -typedef array_t(struct session *) qr_sessionlist_t; - /** \details Worker state is meant to persist during the whole life of daemon. */ struct worker_ctx { struct engine *engine; @@ -129,11 +137,8 @@ struct sockaddr_in out_addr4; struct sockaddr_in6 out_addr6; -#if __linux__ uint8_t wire_buf[RECVMMSG_BATCH * KNOT_WIRE_MAX_PKTSIZE]; -#else - uint8_t wire_buf[KNOT_WIRE_MAX_PKTSIZE]; -#endif + struct { size_t concurrent; size_t rconcurrent; @@ -157,35 +162,9 @@ /** Subrequest leaders (struct qr_task*), indexed by qname+qtype+qclass. */ trie_t *subreq_out; mp_freelist_t pool_mp; - mp_freelist_t pool_ioreqs; - mp_freelist_t pool_sessions; - mp_freelist_t pool_iohandles; knot_mm_t pkt_pool; + unsigned int next_request_uid; }; -/* @internal Union of some libuv handles for freelist. - * These have session as their `handle->data` and own it. - * Subset of uv_any_handle. */ -union uv_handles { - uv_handle_t handle; - uv_stream_t stream; - uv_udp_t udp; - uv_tcp_t tcp; - uv_timer_t timer; -}; -typedef union uv_any_handle uv_handles_t; - -/* @internal Union of derivatives from uv_req_t libuv request handles for freelist. - * These have only a reference to the task they're operating on. - * Subset of uv_any_req. */ -union uv_reqs { - uv_req_t req; - uv_shutdown_t sdown; - uv_write_t write; - uv_connect_t connect; - uv_udp_send_t send; -}; -typedef union uv_reqs uv_reqs_t; - /** @endcond */ diff -Nru knot-resolver-3.0.0/debian/changelog knot-resolver-3.1.0/debian/changelog --- knot-resolver-3.0.0/debian/changelog 2018-09-12 17:02:45.000000000 +0000 +++ knot-resolver-3.1.0/debian/changelog 2018-11-20 20:47:19.000000000 +0000 @@ -1,3 +1,16 @@ +knot-resolver (3.1.0-1) unstable; urgency=medium + + * new upstream release + * set knot-resolver-doc to Multi-Arch: foreign + * drop upstreamed patch; avoid use of git during installcheck + * make reproducible datestamp in kresd(8) + * increase build-dep on libknot to 2.7.2 + * updated libkres8.symbols + * minimize upstream signing keys + * drop unused lintian-overrides + + -- Daniel Kahn Gillmor Tue, 20 Nov 2018 15:47:19 -0500 + knot-resolver (3.0.0-9) unstable; urgency=medium * autopkg: allow stderr on "make installcheck" diff -Nru knot-resolver-3.0.0/debian/control knot-resolver-3.1.0/debian/control --- knot-resolver-3.0.0/debian/control 2018-09-05 23:35:26.000000000 +0000 +++ knot-resolver-3.1.0/debian/control 2018-11-20 20:47:19.000000000 +0000 @@ -19,7 +19,7 @@ libedit-dev, libgeoip-dev, libgnutls28-dev, - libknot-dev (>= 2.7), + libknot-dev (>= 2.7.2), liblmdb-dev, libluajit-5.1-dev, libsystemd-dev (>= 227) [linux-any], @@ -89,6 +89,7 @@ Package: knot-resolver-doc Architecture: all +Multi-Arch: foreign Section: doc Depends: libjs-jquery, diff -Nru knot-resolver-3.0.0/debian/libkres8.symbols knot-resolver-3.1.0/debian/libkres8.symbols --- knot-resolver-3.0.0/debian/libkres8.symbols 2018-08-27 23:07:01.000000000 +0000 +++ knot-resolver-3.1.0/debian/libkres8.symbols 2018-11-20 20:47:19.000000000 +0000 @@ -1,10 +1,12 @@ libkres.so.8 libkres8 #MINVER# +* Build-Depends-Package: libkres-dev cache_api@Base 2.2.0 iterate_api@Base 2.2.0 kr_bitcmp@Base 2.2.0 kr_cache_clear@Base 2.2.0 kr_cache_close@Base 2.2.0 kr_cache_closest_apex@Base 3.0.0 + kr_cache_emergency_file_to_remove@Base 3.1.0 kr_cache_insert_rr@Base 2.4.0 kr_cache_match@Base 3.0.0 kr_cache_materialize@Base 2.2.0 @@ -28,6 +30,7 @@ kr_inaddr_family@Base 2.2.0 kr_inaddr_len@Base 2.2.0 kr_inaddr_port@Base 2.2.0 + kr_inaddr_set_port@Base 3.1.0 kr_inaddr_str@Base 2.2.0 kr_log_trace@Base 2.2.0 kr_log_verbose@Base 2.2.0 @@ -116,11 +119,18 @@ map_get@Base 2.2.0 map_set@Base 2.2.0 map_walk_prefixed@Base 2.2.0 + queue_deinit_impl@Base 3.1.0 + queue_init_impl@Base 3.1.0 + queue_push_head_impl@Base 3.1.0 + queue_push_impl@Base 3.1.0 trie_clear@Base 2.3.0 trie_create@Base 2.3.0 trie_del@Base 2.3.0 + trie_del_first@Base 3.1.0 trie_free@Base 2.3.0 + trie_get_first@Base 3.1.0 trie_get_ins@Base 2.3.0 + trie_get_leq@Base 3.1.0 trie_get_try@Base 2.3.0 trie_it_begin@Base 2.3.0 trie_it_finished@Base 2.3.0 diff -Nru knot-resolver-3.0.0/debian/patches/0002-avoid-invocations-of-git-during-make-installcheck.patch knot-resolver-3.1.0/debian/patches/0002-avoid-invocations-of-git-during-make-installcheck.patch --- knot-resolver-3.0.0/debian/patches/0002-avoid-invocations-of-git-during-make-installcheck.patch 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/debian/patches/0002-avoid-invocations-of-git-during-make-installcheck.patch 2018-11-20 20:47:19.000000000 +0000 @@ -0,0 +1,33 @@ +From: Daniel Kahn Gillmor +Date: Wed, 12 Sep 2018 09:47:35 -0400 +Subject: avoid invocations of git during "make installcheck" + +The continuous integration test suite was printing a warning to stderr +because of an attempt to invoke git. The debian builds are done from +tarballs, so invoking git wouldn't make sense anyway. +--- + tests/test_integration.mk | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tests/test_integration.mk b/tests/test_integration.mk +index a5d36c3..9c0768c 100644 +--- a/tests/test_integration.mk ++++ b/tests/test_integration.mk +@@ -4,7 +4,7 @@ + # 1. Run tests from main Deckard repo (generic DNS tests) + # 2. Run tests from kresd repo (kresd-specific tests) + +-SUBMODULES_DIRTY := $(shell git submodule status --recursive | cut -c 1 | grep -q '[^ ]' && echo $$?) ++SUBMODULES_DIRTY := + REAL_PREFIX=$(realpath $(PREFIX)) + REAL_CURDIR=$(realpath $(CURDIR)) + +@@ -12,7 +12,7 @@ REAL_CURDIR=$(realpath $(CURDIR)) + deckard_DIR := $(TOPSRCDIR)/tests/deckard + + $(deckard_DIR)/Makefile: +- @git submodule update --init --recursive ++ touch $@ + + # this is necessary to avoid multiple parallel but independent runs + # of 'make depend' from $(deckard_DIR)/run.sh diff -Nru knot-resolver-3.0.0/debian/patches/0002-cache-tests-don-t-fail-with-KEYFILE_DEFAULT.patch knot-resolver-3.1.0/debian/patches/0002-cache-tests-don-t-fail-with-KEYFILE_DEFAULT.patch --- knot-resolver-3.0.0/debian/patches/0002-cache-tests-don-t-fail-with-KEYFILE_DEFAULT.patch 2018-09-12 13:50:48.000000000 +0000 +++ knot-resolver-3.1.0/debian/patches/0002-cache-tests-don-t-fail-with-KEYFILE_DEFAULT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -From: =?utf-8?b?VmxhZGltw61yIMSMdW7DoXQ=?= -Date: Tue, 11 Sep 2018 15:38:07 +0200 -Subject: cache tests: don't fail with KEYFILE_DEFAULT - -(cherry picked from commit ac14e5f6006468e6b3e7f58892e3e83bf7b75794) ---- - daemon/cache.test/clear.test.lua | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/daemon/cache.test/clear.test.lua b/daemon/cache.test/clear.test.lua -index cec5e80..31a028a 100644 ---- a/daemon/cache.test/clear.test.lua -+++ b/daemon/cache.test/clear.test.lua -@@ -31,7 +31,8 @@ event.cancel(ev) - ev = event.after(0, function () return 1 end) - - ---- import fake root zone -+-- Import fake root zone; avoid interference with configured KEYFILE_DEFAULT. -+trust_anchors.keyfile_default = nil - trust_anchors.add('. IN DS 48409 8 2 3D63A0C25BCE86621DE63636F11B35B908EFE8E9381E0E3E9DEFD89EA952C27D') - - local function check_answer(desc, qname, qtype, expected_rcode) diff -Nru knot-resolver-3.0.0/debian/patches/0003-doc-draw-date-in-kresd.8-from-NEWS.patch knot-resolver-3.1.0/debian/patches/0003-doc-draw-date-in-kresd.8-from-NEWS.patch --- knot-resolver-3.0.0/debian/patches/0003-doc-draw-date-in-kresd.8-from-NEWS.patch 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/debian/patches/0003-doc-draw-date-in-kresd.8-from-NEWS.patch 2018-11-20 20:47:19.000000000 +0000 @@ -0,0 +1,27 @@ +From: Daniel Kahn Gillmor +Date: Tue, 20 Nov 2018 13:26:08 -0500 +Subject: doc: draw date in kresd.8 from NEWS + +Ideally, we'll just use the datestamp in the first line of NEWS directly. + +if we can't find that, then fall back to the timestamp of the file +(which might be different on different machines because of how git +applies updates). In any event, choose the datestamp using UTC, to +avoid building a different kresd.8 depending on the TZ of the machine. +--- + daemon/daemon.mk | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/daemon/daemon.mk b/daemon/daemon.mk +index eef6e8e..e0d0000 100644 +--- a/daemon/daemon.mk ++++ b/daemon/daemon.mk +@@ -53,7 +53,7 @@ endif + $(eval $(call make_sbin,kresd,daemon,yes)) + + # Targets +-date := $(shell date -r NEWS +%F) ++date := $(shell head -n1 < NEWS | sed 's/.*(\(.*\)).*/\1/' | grep -E '^[0-9]{4}-[0-9]{2}-[0-9]{2}$$' || date -u -r NEWS +%F) + daemon: $(kresd) $(kresd_DIST) + daemon-install: kresd-install bindings-install + ifneq ($(SED),) diff -Nru knot-resolver-3.0.0/debian/patches/series knot-resolver-3.1.0/debian/patches/series --- knot-resolver-3.0.0/debian/patches/series 2018-09-12 17:01:01.000000000 +0000 +++ knot-resolver-3.1.0/debian/patches/series 2018-11-20 20:47:19.000000000 +0000 @@ -1,2 +1,3 @@ 0001-Update-documentation-of-keyfile-ro.patch -0002-cache-tests-don-t-fail-with-KEYFILE_DEFAULT.patch +0002-avoid-invocations-of-git-during-make-installcheck.patch +0003-doc-draw-date-in-kresd.8-from-NEWS.patch diff -Nru knot-resolver-3.0.0/debian/source/lintian-overrides knot-resolver-3.1.0/debian/source/lintian-overrides --- knot-resolver-3.0.0/debian/source/lintian-overrides 2018-08-27 23:07:01.000000000 +0000 +++ knot-resolver-3.1.0/debian/source/lintian-overrides 2018-11-20 20:47:19.000000000 +0000 @@ -1,7 +1,5 @@ # the lines in epoch.js are just human-written long lines: -knot-resolver source: source-is-missing debian/missing-sources/epoch.js line length is 287 characters (>256) knot-resolver source: source-contains-prebuilt-javascript-object debian/missing-sources/epoch.js line length is 287 characters (>256) # the style line in datamaps.world.js is an ugly one-liner but still human-modifiable -knot-resolver source: source-is-missing debian/missing-sources/datamaps.world.js line length is 826 characters (>512) knot-resolver source: insane-line-length-in-source-file debian/missing-sources/datamaps.world.js line length is 832 characters (>512) knot-resolver source: source-contains-prebuilt-javascript-object debian/missing-sources/datamaps.world.js line length is 826 characters (>512) diff -Nru knot-resolver-3.0.0/debian/upstream/signing-key.asc knot-resolver-3.1.0/debian/upstream/signing-key.asc --- knot-resolver-3.0.0/debian/upstream/signing-key.asc 2018-08-27 23:07:01.000000000 +0000 +++ knot-resolver-3.1.0/debian/upstream/signing-key.asc 2018-11-20 20:47:19.000000000 +0000 @@ -24,261 +24,214 @@ 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 -=gYwp +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 +ig6o2x3kYSEKZ6AMs1T+Xfo/zdRTDySRImGUqv9T4Q75sXIqWOYX50T468iTLUD7 +B3XOBGRyWOv0M590uwCovichv8sL31kPbuVpIQChplqAddYxU/QQTEzf5PhXmw8n +eCGsrWECTmykBf3IdRIXbjbOj7lKP+X90Yv89cN4Ik8eN91A1SQpxFNWVsAiN+Xm +aT//vfPdeZFIqn1HkewIpCMELlDfxr9lUN1qJLAjHDawMusjj73XJywneCO3KKrI +7jdrhjqZAfD1VnG51gbWEnX6kAQ/Iuj/EikYiU6joGaZLPuBiBM8oH92YYU7H9C2 +u3yM22LLejJFEw91DZWX8xEBn45VKxKmV/S4YWuFY5fo4+XqHuG7WYxuYetC2Czz +fllV8x/YigrpCQU0WSfodt2AX7ghlpfhuvVapk3ZznWEpwgTgAdNJVJfBdGB03/t +DZuY4fYi9+pM5fcfJ+sipQuepS4Pi1kHlD7PtXkfq/MbkZHYIWXCRKBprKimUsbu +HheHofKZqf3m2X/FLrVN5J+e/s1ghmPp/Di95RQAtCVPAOQ6HXvAHImK29h8GSiI +JjtKEDFjIFyQYYXFABEBAAG0IVRvbWFzIEtyaXplayA8dGtyaXpla0ByZWRoYXQu +Y29tPokCUQQwAQgAOxYhBEqLpIwq7ZM71JXFCaH7pffvjEhpBQJaOnWrHR0gZW1w +bG95bWVudCBlbmRlZCAyMDE3LTEyLTIwAAoJEKH7pffvjEhphaYP/2u3wbyZ4Bs9 +W4yu8x3/Ykb1GfY9j5LkscfN92NBWCVhI6I9ZapWN4SAZAlfl6L0UpJ92JHGMw3R +vAIKXvSk3YTpVTQHIn366r4Pfp7DizO4JGmPMKzzqexfrfXiVuqKSSAXhtPuzmJK +bYbQmiVybz2exUGkudkdJTk3ald1w+8yIoP6CbbGiuylAkPqke1vn1EvovyfnGr5 +vS15HK4PSqgsQ94UKnT8mlFS111JH0YfHdGcbxRRt2sk+mfcJfUKnx7LSuJHxizc +kQKoIh8LWpaIO6pLQfQa2h4O2dikWm6Hl3RGw0qZ3/Sgg2AsljvwTYtA8jZNuwDS +oplfsEK/kWIwWG47MyyjHtGpwVhCQT9WGo8GEgdHM0MH2hQV2keELrIiShoW2ntk +B++IVraEtwtH6zlNxw91E0l1NRmIbnXglbivP1b8ZQyZCMOmnFXkhKaTdJWtJ+OV +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 +=Q4P/ -----END PGP PUBLIC KEY BLOCK----- diff -Nru knot-resolver-3.0.0/distro/arch/PKGBUILD knot-resolver-3.1.0/distro/arch/PKGBUILD --- knot-resolver-3.0.0/distro/arch/PKGBUILD 2018-08-20 08:17:12.000000000 +0000 +++ knot-resolver-3.1.0/distro/arch/PKGBUILD 2018-11-02 15:29:58.000000000 +0000 @@ -13,7 +13,7 @@ install=install depends=('cmocka' 'gnutls' - 'knot>=2.7.1' + 'knot>=2.7.2' 'libedit' 'libsystemd' 'libuv' diff -Nru knot-resolver-3.0.0/distro/common/systemd/kresd.target knot-resolver-3.1.0/distro/common/systemd/kresd.target --- knot-resolver-3.0.0/distro/common/systemd/kresd.target 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/distro/common/systemd/kresd.target 2018-11-02 15:29:58.000000000 +0000 @@ -2,7 +2,7 @@ Description=Knot Resolver daemons Documentation=man:kresd.systemd(7) Documentation=man:kresd(8) -After=syslog.target network-online.target +After=network-online.target [Install] WantedBy=multi-user.target diff -Nru knot-resolver-3.0.0/distro/deb/control knot-resolver-3.1.0/distro/deb/control --- knot-resolver-3.0.0/distro/deb/control 2018-08-17 12:13:39.000000000 +0000 +++ knot-resolver-3.1.0/distro/deb/control 2018-11-02 15:29:58.000000000 +0000 @@ -16,7 +16,7 @@ libedit-dev, libgeoip-dev, libgnutls28-dev, - libknot-dev (>= 2.7.1), + libknot-dev (>= 2.7.2), liblmdb-dev, libluajit-5.1-dev, libsystemd-dev (>= 227) [linux-any], diff -Nru knot-resolver-3.0.0/distro/deb/libkres8.symbols knot-resolver-3.1.0/distro/deb/libkres8.symbols --- knot-resolver-3.0.0/distro/deb/libkres8.symbols 2018-08-17 12:13:39.000000000 +0000 +++ knot-resolver-3.1.0/distro/deb/libkres8.symbols 2018-11-02 15:29:58.000000000 +0000 @@ -4,10 +4,15 @@ kr_bitcmp@Base 2.1.0 kr_cache_clear@Base 2.1.0 kr_cache_close@Base 2.1.0 + kr_cache_closest_apex@Base 3.1.0 + kr_cache_emergency_file_to_remove@Base 3.1.0 kr_cache_insert_rr@Base 3.0.0 + kr_cache_match@Base 3.1.0 kr_cache_materialize@Base 2.1.0 kr_cache_open@Base 2.1.0 kr_cache_peek_exact@Base 2.1.0 + kr_cache_remove@Base 3.1.0 + kr_cache_remove_subtree@Base 3.1.0 kr_cache_sync@Base 2.1.0 kr_cache_ttl@Base 2.1.0 kr_cdb_lmdb@Base 2.1.0 @@ -24,6 +29,7 @@ kr_inaddr_family@Base 2.1.0 kr_inaddr_len@Base 2.1.0 kr_inaddr_port@Base 2.1.0 + kr_inaddr_set_port@Base 3.1.0 kr_inaddr_str@Base 2.1.0 kr_log_trace@Base 2.1.0 kr_log_verbose@Base 2.1.0 @@ -87,6 +93,7 @@ kr_ta_del@Base 2.1.0 kr_ta_get@Base 2.1.0 kr_ta_get_longest_name@Base 2.1.0 + kr_unpack_cache_key@Base 3.1.0 kr_verbose_set@Base 2.1.0 kr_verbose_status@Base 2.1.0 kr_zonecut_add@Base 2.1.0 @@ -111,11 +118,18 @@ map_get@Base 2.1.0 map_set@Base 2.1.0 map_walk_prefixed@Base 2.1.0 + queue_deinit_impl@Base 3.1.0 + queue_init_impl@Base 3.1.0 + queue_push_head_impl@Base 3.1.0 + queue_push_impl@Base 3.1.0 trie_clear@Base 3.0.0 trie_create@Base 3.0.0 trie_del@Base 3.0.0 + trie_del_first@Base 3.1.0 trie_free@Base 3.0.0 + trie_get_first@Base 3.1.0 trie_get_ins@Base 3.0.0 + trie_get_leq@Base 3.1.0 trie_get_try@Base 3.0.0 trie_it_begin@Base 3.0.0 trie_it_finished@Base 3.0.0 diff -Nru knot-resolver-3.0.0/distro/rpm/knot-resolver.spec knot-resolver-3.1.0/distro/rpm/knot-resolver.spec --- knot-resolver-3.0.0/distro/rpm/knot-resolver.spec 2018-08-20 08:17:12.000000000 +0000 +++ knot-resolver-3.1.0/distro/rpm/knot-resolver.spec 2018-11-02 15:29:58.000000000 +0000 @@ -1,4 +1,5 @@ %global _hardened_build 1 +%{!?_pkgdocdir: %global _pkgdocdir %{_docdir}/%{name}} %define GPG_CHECK 0 %define VERSION __VERSION__ @@ -37,35 +38,45 @@ BuildRequires: pkgconfig(cmocka) BuildRequires: pkgconfig(gnutls) BuildRequires: pkgconfig(libedit) -BuildRequires: pkgconfig(libknot) >= 2.7.1 -BuildRequires: pkgconfig(libzscanner) >= 2.4.2 -BuildRequires: pkgconfig(libdnssec) >= 2.3.1 +BuildRequires: pkgconfig(libknot) >= 2.7.2 +BuildRequires: pkgconfig(libzscanner) >= 2.7.2 +BuildRequires: pkgconfig(libdnssec) >= 2.7.2 BuildRequires: pkgconfig(libsystemd) BuildRequires: pkgconfig(libuv) BuildRequires: pkgconfig(luajit) >= 2.0 BuildRequires: pkgconfig(systemd) +# Distro-dependent dependencies %if 0%{?rhel} BuildRequires: lmdb-devel # Lua 5.1 version of the libraries have different package names Requires: lua-socket Requires: lua-sec -%else +Requires(pre): shadow-utils +%endif +%if 0%{?fedora} BuildRequires: pkgconfig(lmdb) +BuildRequires: python3-sphinx Requires: lua-socket-compat Requires: lua-sec-compat +Requires(pre): shadow-utils +%endif +%if 0%{?suse_version} +BuildRequires: lmdb-devel +BuildRequires: python3-Sphinx +Requires: lua51-luasocket +Requires: lua51-luasec +Requires(pre): shadow %endif -%if 0%{?fedora} +%if "x%{?rhel}" == "x" # dependencies for doc package; disable in EPEL (missing fonts) # https://bugzilla.redhat.com/show_bug.cgi?id=1492884 BuildRequires: doxygen BuildRequires: python3-breathe -BuildRequires: python3-sphinx BuildRequires: python3-sphinx_rtd_theme %endif -Requires(pre): shadow-utils Requires(post): systemd Requires(preun): systemd Requires(postun): systemd @@ -87,7 +98,7 @@ %description devel The package contains development headers for Knot Resolver. -%if 0%{?fedora} +%if "x%{?rhel}" == "x" %package doc Summary: Documentation for Knot Resolver BuildArch: noarch @@ -110,10 +121,10 @@ %build %global build_paths PREFIX=%{_prefix} BINDIR=%{_bindir} LIBDIR=%{_libdir} INCLUDEDIR=%{_includedir} ETCDIR=%{_sysconfdir}/knot-resolver -%global build_flags V=1 CFLAGS="%{optflags}" LDFLAGS="%{__global_ldflags}" %{build_paths} HAS_go=no +%global build_flags V=1 CFLAGS="%{optflags}" LDFLAGS="%{?__global_ldflags}" %{build_paths} HAS_go=no %make_build %{build_flags} -%if 0%{?fedora} +%if "x%{?rhel}" == "x" # build documentation make doc %endif @@ -149,7 +160,7 @@ mkdir -p %{buildroot}%{_unitdir}/kresd@.service.d install -m 0644 -p %{repodir}/distro/common/systemd/drop-in/systemd-compat.conf %{buildroot}%{_unitdir}/kresd@.service.d/override.conf %endif -%if 0%{?fedora} +%if "x%{?rhel}" == "x" install -m 0644 -p %{repodir}/distro/common/systemd/kresd.socket %{buildroot}%{_unitdir}/kresd.socket install -m 0644 -p %{repodir}/distro/common/systemd/kresd-control@.socket %{buildroot}%{_unitdir}/kresd-control@.socket install -m 0644 -p %{repodir}/distro/common/systemd/kresd-tls.socket %{buildroot}%{_unitdir}/kresd-tls.socket @@ -221,7 +232,7 @@ %if 0%{?rhel} %{_unitdir}/kresd@.service.d/override.conf %endif -%if 0%{?fedora} +%if "x%{?rhel}" == "x" %{_unitdir}/kresd*.socket %endif %{_tmpfilesdir}/knot-resolver.conf @@ -237,7 +248,7 @@ %{_libdir}/pkgconfig/libkres.pc %{_libdir}/libkres.so -%if 0%{?fedora} +%if "x%{?rhel}" == "x" %files doc %doc doc/html %endif diff -Nru knot-resolver-3.0.0/distro/tests/fedora27/Vagrantfile knot-resolver-3.1.0/distro/tests/fedora27/Vagrantfile --- knot-resolver-3.0.0/distro/tests/fedora27/Vagrantfile 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/distro/tests/fedora27/Vagrantfile 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : -# - -Vagrant.configure(2) do |config| - - config.vm.box = "fedora/27-cloud-base" - config.vm.synced_folder ".", "/vagrant", disabled: true - - config.vm.define "fedora27_knot-resolver" do |machine| - machine.vm.provision "ansible" do |ansible| - ansible.playbook = "../knot-resolver-test.yaml" - end - end - -end diff -Nru knot-resolver-3.0.0/distro/tests/fedora29/Vagrantfile knot-resolver-3.1.0/distro/tests/fedora29/Vagrantfile --- knot-resolver-3.0.0/distro/tests/fedora29/Vagrantfile 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/distro/tests/fedora29/Vagrantfile 2018-11-02 15:29:58.000000000 +0000 @@ -0,0 +1,16 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : +# + +Vagrant.configure(2) do |config| + + config.vm.box = "fedora/29-cloud-base" + config.vm.synced_folder ".", "/vagrant", disabled: true + + config.vm.define "fedora29_knot-resolver" do |machine| + machine.vm.provision "ansible" do |ansible| + ansible.playbook = "../knot-resolver-test.yaml" + end + end + +end diff -Nru knot-resolver-3.0.0/distro/tests/knot-resolver-test.yaml knot-resolver-3.1.0/distro/tests/knot-resolver-test.yaml --- knot-resolver-3.0.0/distro/tests/knot-resolver-test.yaml 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/distro/tests/knot-resolver-test.yaml 2018-11-02 15:29:58.000000000 +0000 @@ -11,6 +11,8 @@ Ubuntu: dnsutils Fedora: bind-utils CentOS: bind-utils + openSUSE Leap: bind-utils + openSUSE Tumbleweed: bind-utils Archlinux: bind-tools configure_obs_repo: Fedora: | @@ -28,13 +30,20 @@ wget -nv https://download.opensuse.org/repositories/home:CZ-NIC:{{ item }}/xUbuntu_{{ ansible_distribution_version }}/Release.key -O Release.key && apt-key add - < Release.key && apt-get update + openSUSE Tumbleweed: | + zypper addrepo https://download.opensuse.org/repositories/home:CZ-NIC:{{ item }}/openSUSE_Tumbleweed/home:CZ-NIC:{{ item }}.repo && + zypper --gpg-auto-import-keys refresh + openSUSE Leap: | + zypper addrepo https://download.opensuse.org/repositories/home:CZ-NIC:{{ item }}/openSUSE_Leap_15.0/home:CZ-NIC:{{ item }}.repo && + zypper --gpg-auto-import-keys refresh show_package_version: Archlinux: pacman -Qi knot-resolver | grep '^Version' - Fedora: | - rpm -qi knot-resolver | grep '^Version' - CentOS: | + Fedora: &pkg_version_rpm | rpm -qi knot-resolver | grep '^Version' + CentOS: *pkg_version_rpm + openSUSE Leap: *pkg_version_rpm + openSUSE Tumbleweed: *pkg_version_rpm Debian: dpkg -s knot-resolver | grep '^Version' Ubuntu: | @@ -49,7 +58,8 @@ raw: | yum install -y python2 python2-dnf libselinux-python || \ pacman -Sy python2 --noconfirm || \ - apt-get install -y python || \ + (zypper --gpg-auto-import-keys refresh && zypper install -y python) || \ + (apt-get update && apt-get install -y python) || \ : ignore_errors: true - name: gather facts @@ -96,12 +106,6 @@ name: "{{ dig_package[ansible_distribution] }}" state: present - - name: update selinux-policy - package: - name: selinux-policy - state: latest - when: ansible_distribution in ['RedHat', 'Fedora'] - - name: testing block block: - name: start kresd@1.service diff -Nru knot-resolver-3.0.0/distro/tests/leap15/Vagrantfile knot-resolver-3.1.0/distro/tests/leap15/Vagrantfile --- knot-resolver-3.0.0/distro/tests/leap15/Vagrantfile 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/distro/tests/leap15/Vagrantfile 2018-11-02 15:29:58.000000000 +0000 @@ -0,0 +1,16 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : +# + +Vagrant.configure(2) do |config| + + config.vm.box = "opensuse/openSUSE-15.0-x86_64" + config.vm.synced_folder ".", "/vagrant", disabled: true + + config.vm.define "leap15_knot-resolver" do |machine| + machine.vm.provision "ansible" do |ansible| + ansible.playbook = "../knot-resolver-test.yaml" + end + end + +end diff -Nru knot-resolver-3.0.0/distro/tests/tumbleweed/Vagrantfile knot-resolver-3.1.0/distro/tests/tumbleweed/Vagrantfile --- knot-resolver-3.0.0/distro/tests/tumbleweed/Vagrantfile 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/distro/tests/tumbleweed/Vagrantfile 2018-11-02 15:29:58.000000000 +0000 @@ -0,0 +1,16 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : +# + +Vagrant.configure(2) do |config| + + config.vm.box = "opensuse/openSUSE-Tumbleweed-x86_64" + config.vm.synced_folder ".", "/vagrant", disabled: true + + config.vm.define "tumbleweed_knot-resolver" do |machine| + machine.vm.provision "ansible" do |ansible| + ansible.playbook = "../knot-resolver-test.yaml" + end + end + +end diff -Nru knot-resolver-3.0.0/distro/tests/ubuntu1810/Vagrantfile knot-resolver-3.1.0/distro/tests/ubuntu1810/Vagrantfile --- knot-resolver-3.0.0/distro/tests/ubuntu1810/Vagrantfile 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/distro/tests/ubuntu1810/Vagrantfile 2018-11-02 15:29:58.000000000 +0000 @@ -0,0 +1,16 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : +# + +Vagrant.configure(2) do |config| + + config.vm.box = "generic/ubuntu1810" + config.vm.synced_folder ".", "/vagrant", disabled: true + + config.vm.define "ubuntu1810_knot-resolver" do |machine| + machine.vm.provision "ansible" do |ansible| + ansible.playbook = "../knot-resolver-test.yaml" + end + end + +end diff -Nru knot-resolver-3.0.0/doc/build.rst knot-resolver-3.1.0/doc/build.rst --- knot-resolver-3.0.0/doc/build.rst 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/doc/build.rst 2018-11-02 15:29:58.000000000 +0000 @@ -36,7 +36,7 @@ "C and C++ compiler", "*all*", "*(build only)* [#]_" "`pkg-config`_", "*all*", "*(build only)* [#]_" "hexdump or xxd", "``daemon``", "*(build only)*" - "libknot_ 2.7.1+", "*all*", "Knot DNS libraries - requires autotools, GnuTLS, ..." + "libknot_ 2.7.2+", "*all*", "Knot DNS libraries - requires autotools, GnuTLS, ..." "LuaJIT_ 2.0+", "``daemon``", "Embedded scripting language." "libuv_ 1.7+", "``daemon``", "Multiplatform I/O and services (libuv_ 1.0 with limitations [#]_)." "lmdb", "``daemon``", "If missing, a static version is embedded." diff -Nru knot-resolver-3.0.0/.gitlab-ci.yml knot-resolver-3.1.0/.gitlab-ci.yml --- knot-resolver-3.0.0/.gitlab-ci.yml 2018-08-17 12:13:40.000000000 +0000 +++ knot-resolver-3.1.0/.gitlab-ci.yml 2018-11-02 15:29:58.000000000 +0000 @@ -7,6 +7,10 @@ GIT_STRATEGY: clone # sometimes unclean submodule dirs otherwise PREFIX: $CI_PROJECT_DIR/.local LD_LIBRARY_PATH: $CI_PROJECT_DIR/.local/lib + RESPDIFF_PRIORITY: 5 + RESPDIFF_COUNT: 1 + RESPDIFF_FORCE: 0 + RESPERF_FORCE: 0 stages: - build @@ -18,7 +22,7 @@ build:linux:amd64: stage: build except: - - master@knot/knot-resolver + - master script: - rm daemon/lua/kres-gen.lua - make -k all CFLAGS="-Werror -ggdb" @@ -35,7 +39,7 @@ build:clang:linux:amd64: stage: build except: - - master@knot/knot-resolver + - master image: $CI_REGISTRY/knot/knot-resolver/ci/debian-unstable:knot-2.7 # newer Debian for newer Clang script: - rm daemon/lua/kres-gen.lua @@ -51,7 +55,7 @@ srpm: stage: build except: - - master@knot/knot-resolver + - master allow_failure: true # don't block testing pipeline in case of failure image: $CI_REGISTRY/knot/knot-resolver/ci/fedora script: @@ -69,7 +73,7 @@ lint:lua: stage: test except: - - master@knot/knot-resolver + - master dependencies: [] # do not download build artifacts script: - make lint-lua @@ -79,7 +83,7 @@ lint:c: stage: test except: - - master@knot/knot-resolver + - master image: $CI_REGISTRY/knot/knot-resolver/ci/debian-unstable:knot-2.7 # newer Debian for newer Clang dependencies: [] # do not download build artifacts script: @@ -91,7 +95,7 @@ allow_failure: true # for now it is just informative stage: test except: - - master@knot/knot-resolver + - master image: $CI_REGISTRY/knot/knot-resolver/ci/debian-unstable:knot-2.7 # newer Debian for newer Clang dependencies: [] # do not download build artifacts script: @@ -107,7 +111,7 @@ test:linux:amd64: stage: test except: - - master@knot/knot-resolver + - master script: # recompile everything otherwise lcov will bark because Git files will be "newer" than gcda files # this is caused by interaction between Git approach to timestamps and Gitlab artifacts @@ -128,7 +132,7 @@ installcheck:linux:amd64: stage: test except: - - master@knot/knot-resolver + - master script: # recompile everything otherwise lcov will bark because Git files will be "newer" than gcda files # this is caused by interaction between Git approach to timestamps and Gitlab artifacts @@ -149,7 +153,7 @@ doc: stage: test except: - - master@knot/knot-resolver + - master script: - SPHINXFLAGS="-W" make doc dependencies: [] @@ -164,7 +168,7 @@ stage: test except: refs: - - master@knot/knot-resolver + - master variables: # prevent unstable test from cancelling nightly OBS build - $SKIP_DECKARD == "1" @@ -190,7 +194,7 @@ installcheck:valgrind:linux:amd64: stage: test except: - - master@knot/knot-resolver + - master script: - DEBUGGER="valgrind --leak-check=full --trace-children=yes --quiet --suppressions=/lj.supp" make -k installcheck dependencies: @@ -222,7 +226,7 @@ test:linux:amd64:valgrind: stage: test except: - - master@knot/knot-resolver + - master variables: TMPDIR: $CI_PROJECT_DIR script: @@ -237,84 +241,77 @@ .respdiff: &respdiff stage: respdiff dependencies: [] - only: - - branches@knot/knot-resolver # do not trigger job for forks - except: - - master@knot/knot-resolver - script: - - git diff-index --name-only origin/master | grep -qEv '^(AUTHORS|ci/|config.mk|COPYING|distro/|doc/|etc/|NEWS|README.md|scripts/|tests/|\.gitignore|\.gitlab-ci\.yml|\.travis\.yml)' || exit 0 - - export TESTDIR="/var/tmp/respdiff-jobs/$(git rev-parse --short HEAD)-gitlab/$RESPDIFF_TEST" + only: # trigger job only in repos under our control + - branches@knot/knot-resolver + - branches@knot/knot-resolver-security + except: + - master + script: + - git diff-index --name-only origin/master | grep -qEv '^(AUTHORS|ci/|config.mk|COPYING|distro/|doc/|etc/|NEWS|README.md|scripts/|tests/|\.gitignore|\.gitlab-ci\.yml|\.travis\.yml)' || test $RESPDIFF_FORCE -gt 0 || exit 0 + - export LABEL=gl$(date +%s) + - export COMMITDIR="/var/tmp/respdiff-jobs/$(git rev-parse --short HEAD)-$LABEL" + - export TESTDIR="$COMMITDIR/$RESPDIFF_TEST" + - ln -s $COMMITDIR respdiff_commitdir - > sudo -u respdiff /var/opt/respdiff/contrib/job_manager/submit.py -w - -p $PRIORITY + -p $RESPDIFF_PRIORITY + -c $RESPDIFF_COUNT $(sudo -u respdiff /var/opt/respdiff/contrib/job_manager/create.py - "$(git rev-parse --short HEAD)" -l gitlab --clean -t $RESPDIFF_TEST - --knot-branch 2.7) - - cp -v $TESTDIR/j* ./ - - cat $TESTDIR/*_report.diffrepro.txt - - grep -q "^target disagrees.*$TARGET_DISAGREES %" $TESTDIR/*_report.diffrepro.txt + "$(git rev-parse --short HEAD)" -l $LABEL -t $RESPDIFF_TEST) + - for f in $TESTDIR/*.json; do test -s "$f" || (cat $TESTDIR/*stderr*; exit 1); done + - sudo -u respdiff /var/opt/respdiff/contrib/job_manager/plot_ref.sh $TESTDIR/.. /var/tmp/respdiff-jobs/ref_current $RESPDIFF_TEST + after_script: + - 'cp -t . respdiff_commitdir/$RESPDIFF_TEST/j* ||:' + - 'cp -t . respdiff_commitdir/*$RESPDIFF_TEST*.png ||:' artifacts: when: always expire_in: 1 week paths: - ./j* + - ./*.png tags: - respdiff respdiff:fwd-tls6-kresd.udp6: <<: *respdiff variables: - RESPDIFF_TEST: shortlist.fwd-tls6-kresd.udp6.j128 - PRIORITY: 6 - TARGET_DISAGREES: 0\.0[0-9] + RESPDIFF_TEST: shortlist.fwd-tls6-kresd.udp6.j256 respdiff:fwd-udp6-kresd.udp6: <<: *respdiff variables: RESPDIFF_TEST: shortlist.fwd-udp6-kresd.udp6.j384 - PRIORITY: 5 - TARGET_DISAGREES: 0\.[0-1][0-9] respdiff:iter.udp6: <<: *respdiff variables: RESPDIFF_TEST: shortlist.iter.udp6.j384 - PRIORITY: 5 - TARGET_DISAGREES: 0\.[0-8][0-9] respdiff:iter.tls6: <<: *respdiff variables: RESPDIFF_TEST: shortlist.iter.tls6.j384 - PRIORITY: 5 - TARGET_DISAGREES: 0\.[0-8][0-9] respdiff:fwd-udp6-unbound.udp6: <<: *respdiff variables: - RESPDIFF_TEST: shortlist.fwd-udp6-unbound.udp6.j384 - PRIORITY: 5 - TARGET_DISAGREES: 0\.0[0-9] + RESPDIFF_TEST: shortlist.fwd-udp6-unbound.udp6.j256 respdiff:fwd-udp6-unbound.tcp6: <<: *respdiff variables: - RESPDIFF_TEST: shortlist.fwd-udp6-unbound.tcp6.j384 - PRIORITY: 5 - TARGET_DISAGREES: 0\.0[0-9] + RESPDIFF_TEST: shortlist.fwd-udp6-unbound.tcp6.j256 respdiff:fwd-udp6-unbound.tls6: <<: *respdiff variables: - RESPDIFF_TEST: shortlist.fwd-udp6-unbound.tls6.j384 - PRIORITY: 5 - TARGET_DISAGREES: 0\.0[0-9] + RESPDIFF_TEST: shortlist.fwd-udp6-unbound.tls6.j256 respdiff:iter:udp:linux:amd64: stage: test except: - - master@knot/knot-resolver + - master script: - source <(./scripts/coverage_env.sh "$(pwd)" "$(pwd)/coverage.stats/respdiff" "iter/udp" --export) - ulimit -n "$(ulimit -Hn)" # applies only for kresd ATM @@ -333,7 +330,7 @@ paths: - kresd.log.xz - results/*.txt - - results/*.svg + - results/*.png - results/respdiff.db/data.mdb.xz - ./*.info tags: @@ -341,106 +338,87 @@ - linux - amd64 -respdiff:iter:tcp:linux:amd64: - stage: test - except: - - master@knot/knot-resolver - script: - - source <(./scripts/coverage_env.sh "$(pwd)" "$(pwd)/coverage.stats/respdiff" "iter/tcp" --export) - - ./ci/respdiff/start-resolvers.sh - - ./ci/respdiff/run-respdiff-tests.sh tcp - - cat results/respdiff.txt - - echo 'test if mismatch rate < 1.0 %' - - grep -q '^target disagrees.*0\.[0-9][0-9] %' results/respdiff.txt - - killall --wait kresd - - MAKEFLAGS="--jobs $(nproc)" test "${COVERAGE:-0}" -eq 1 && make coverage-c coverage-lua COVERAGE_STAGE=gcov-respdiff-iter-tcp | grep -vE '(source file is newer than notes file)|(the message is displayed only once per source file)' || echo "code coverage skipped" - dependencies: - - build:linux:amd64 +.resperf: &resperf + stage: respdiff + dependencies: [] + only: # trigger job only in repos under our control + - branches@knot/knot-resolver + - branches@knot/knot-resolver-security + except: + - master + script: + - git diff-index --name-only origin/master | grep -qEv '^(AUTHORS|ci/|config.mk|COPYING|distro/|doc/|etc/|NEWS|README.md|scripts/|tests/|\.gitignore|\.gitlab-ci\.yml|\.travis\.yml)' || test $RESPERF_FORCE -gt 0 || exit 0 + - export LABEL=gl$(date +%s) + - export COMMITDIR="/var/tmp/respdiff-jobs/$(git rev-parse --short HEAD)-$LABEL" + - export TESTDIR="$COMMITDIR/$RESPERF_TEST" + - ln -s $COMMITDIR resperf_commitdir + - > + sudo -u respdiff /var/opt/respdiff/contrib/job_manager/submit.py -w + $(sudo -u respdiff /var/opt/respdiff/contrib/job_manager/create.py + "$(git rev-parse --short HEAD)" -l $LABEL --asan -t $RESPERF_TEST) + - export EXITCODE=$(cat $TESTDIR/j*_exitcode) + - if [[ "$EXITCODE" == "0" ]]; then cat $TESTDIR/j*_resperf.txt; else cat $TESTDIR/j*_kresd.docker.txt; fi + - exit $EXITCODE + after_script: + - 'cp -t . resperf_commitdir/$RESPERF_TEST/j* ||:' artifacts: when: always - expire_in: '1 week' + expire_in: 1 week paths: - - kresd.log.xz - - results/*.txt - - results/*.svg - - results/respdiff.db/data.mdb.xz - - ./*.info + - ./j* tags: - - docker - - linux - - amd64 + - respdiff -respdiff:iter:tls:linux:amd64: - stage: test - except: - - master@knot/knot-resolver - script: - - source <(./scripts/coverage_env.sh "$(pwd)" "$(pwd)/coverage.stats/respdiff" "iter/tls" --export) - - ./ci/respdiff/start-resolvers.sh - - ./ci/respdiff/run-respdiff-tests.sh tls - - cat results/respdiff.txt - - echo 'test if mismatch rate < 1.0 %' - - grep -q '^target disagrees.*0\.[0-9][0-9] %' results/respdiff.txt - - killall --wait kresd - - MAKEFLAGS="--jobs $(nproc)" test "${COVERAGE:-0}" -eq 1 && make coverage-c coverage-lua COVERAGE_STAGE=gcov-respdiff-iter-tls | grep -vE '(source file is newer than notes file)|(the message is displayed only once per source file)' || echo "code coverage skipped" - dependencies: - - build:linux:amd64 - artifacts: - when: always - expire_in: '1 week' - paths: - - kresd.log.xz - - results/*.txt - - results/*.svg - - results/respdiff.db/data.mdb.xz - - ./*.info - tags: - - docker - - linux - - amd64 +resperf:fwd-tls6.udp-asan: + <<: *resperf + variables: + RESPERF_TEST: resperf.fwd-tls6.udp -distro:fedora-27: +resperf:fwd-udp6.udp-asan: + <<: *resperf + variables: + RESPERF_TEST: resperf.fwd-udp6.udp + +resperf:iter.udp-asan: + <<: *resperf + variables: + RESPERF_TEST: resperf.iter.udp + + +distro:fedora-29: stage: test except: - - master@knot/knot-resolver + - master image: $CI_REGISTRY/knot/knot-resolver/ci/fedora - only: - - branches@knot/knot-resolver # do not trigger job for forks (no privileged runners) + only: # trigger job only in repos under our control + - branches@knot/knot-resolver + - branches@knot/knot-resolver-security dependencies: - srpm script: - # TODO remove once Knot DNS 2.7.1 packages are available from official distro repos - - curl -Lo knot-devel-2.7.1-1.1.x86_64.rpm https://gitlab.labs.nic.cz/knot/knot-resolver/uploads/a22685bd0c737be97af11351c099fc2d/knot-devel-2.7.1-1.1.x86_64.rpm - - curl -Lo knot-2.7.1-1.1.x86_64.rpm https://gitlab.labs.nic.cz/knot/knot-resolver/uploads/ed349a36e8b6aca6fc5fc8fd6eef699a/knot-2.7.1-1.1.x86_64.rpm - - curl -Lo knot-libs-2.7.1-1.1.x86_64.rpm https://gitlab.labs.nic.cz/knot/knot-resolver/uploads/4960c36e94053a8aaf0f237bb5310b53/knot-libs-2.7.1-1.1.x86_64.rpm - - mock --init --old-chroot -i knot-devel-2.7.1-1.1.x86_64.rpm -i knot-2.7.1-1.1.x86_64.rpm -i knot-libs-2.7.1-1.1.x86_64.rpm -r fedora-27-x86_64 - - mock --no-clean --old-chroot -r fedora-27-x86_64 --rebuild *.src.rpm + - mock --no-clean --old-chroot -r fedora-29-x86_64 --rebuild *.src.rpm || (cat /var/lib/mock/fedora-29-x86_64/result/build.log; false) after_script: - - mv /var/lib/mock/fedora-27-x86_64/result fedora-27-x86_64 + - mv /var/lib/mock/fedora-29-x86_64/result fedora-29-x86_64 artifacts: when: always expire_in: '1 week' paths: - - fedora-27-x86_64/ + - fedora-29-x86_64/ tags: - privileged # mock requires additional capabilities (e.g. mount) distro:epel-7: stage: test except: - - master@knot/knot-resolver + - master image: $CI_REGISTRY/knot/knot-resolver/ci/fedora - only: - - branches@knot/knot-resolver # do not trigger job for forks (no privileged runners) + only: # trigger job only in repos under our control + - branches@knot/knot-resolver + - branches@knot/knot-resolver-security dependencies: - srpm script: - # TODO remove once Knot DNS 2.7 packages are available from official distro repos - - curl -Lo knot-devel-2.7.1-1.1.x86_64.rpm https://gitlab.labs.nic.cz/knot/knot-resolver/uploads/780d01725c2d95f63251d32b5c81d571/knot-devel-2.7.1-1.1.x86_64.rpm - - curl -Lo knot-2.7.1-1.1.x86_64.rpm https://gitlab.labs.nic.cz/knot/knot-resolver/uploads/6abdad1de5e76b413f3089bce45efbed/knot-2.7.1-1.1.x86_64.rpm - - curl -Lo knot-libs-2.7.1-1.1.x86_64.rpm https://gitlab.labs.nic.cz/knot/knot-resolver/uploads/e80b25f25e379472530ea5b2ea00fac1/knot-libs-2.7.1-1.1.x86_64.rpm - - mock --init --dnf --old-chroot -i knot-devel-2.7.1-1.1.x86_64.rpm -i knot-2.7.1-1.1.x86_64.rpm -i knot-libs-2.7.1-1.1.x86_64.rpm -r epel-7-x86_64 - mock --no-clean --dnf --old-chroot -r epel-7-x86_64 --rebuild *.src.rpm || (cat /var/lib/mock/epel-7-x86_64/result/build.log; false) after_script: - mv /var/lib/mock/epel-7-x86_64/result epel-7-x86_64 @@ -456,7 +434,8 @@ coverage: stage: coverage except: - - master@knot/knot-resolver + - master + - branches@knot/knot-resolver-security only: variables: - $COVERAGE == "1" @@ -473,8 +452,6 @@ - installcheck:linux:amd64 - deckard:linux:amd64 - respdiff:iter:udp:linux:amd64 - - respdiff:iter:tcp:linux:amd64 - - respdiff:iter:tls:linux:amd64 tags: - docker - linux @@ -524,7 +501,7 @@ refs: - nightly@knot/knot-resolver except: - - master@knot/knot-resolver + - master script: - ln -s distro/deb debian - sed -i "s/__VERSION__/99/g" distro/deb/changelog diff -Nru knot-resolver-3.0.0/lib/cache/api.c knot-resolver-3.1.0/lib/cache/api.c --- knot-resolver-3.0.0/lib/cache/api.c 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/lib/cache/api.c 2018-11-02 15:29:58.000000000 +0000 @@ -130,10 +130,20 @@ cache->ttl_max = KR_CACHE_DEFAULT_TTL_MAX; /* Check cache ABI version */ kr_cache_make_checkpoint(cache); - (void) assert_right_version(cache); + (void)assert_right_version(cache); + + char *fpath; + ret = asprintf(&fpath, "%s/data.mdb", opts->path); + if (ret > 0) { + kr_cache_emergency_file_to_remove = fpath; + } else { + assert(false); /* non-critical, but still */ + } return 0; } +const char *kr_cache_emergency_file_to_remove = NULL; + #define cache_isvalid(cache) ((cache) && (cache)->api && (cache)->db) @@ -143,6 +153,8 @@ cache_op(cache, close); cache->db = NULL; } + free(/*const-cast*/(char*)kr_cache_emergency_file_to_remove); + kr_cache_emergency_file_to_remove = NULL; } int kr_cache_sync(struct kr_cache *cache) @@ -303,7 +315,8 @@ struct kr_query *qry = req->current_query; /* We first check various exit-conditions and then call the _real function. */ - if (ctx->state & (KR_STATE_FAIL|KR_STATE_DONE) || qry->flags.NO_CACHE + if (!kr_cache_is_open(&req->ctx->cache) + || ctx->state & (KR_STATE_FAIL|KR_STATE_DONE) || qry->flags.NO_CACHE || (qry->flags.CACHE_TRIED && !qry->stale_cb) || !check_rrtype(qry->stype, qry) /* LATER: some other behavior for some of these? */ || qry->sclass != KNOT_CLASS_IN) { @@ -346,7 +359,8 @@ /* Note: we cache even in KR_STATE_FAIL. For example, * BOGUS answer can go to +cd cache even without +cd request. */ - if (!qry || qry->flags.CACHED || !check_rrtype(knot_pkt_qtype(pkt), qry) + if (!kr_cache_is_open(cache) || !qry + || qry->flags.CACHED || !check_rrtype(knot_pkt_qtype(pkt), qry) || qry->sclass != KNOT_CLASS_IN) { return ctx->state; } @@ -602,7 +616,8 @@ ssize_t written = stash_rrset(cache, qry, rr, rr_sigs, qry->timestamp.tv_sec, entry->rank, nsec_pmap, has_optout); if (written < 0) { - kr_log_error("[%5hu][cach] stash failed, ret = %d\n", qry->id, ret); + kr_log_error("[%05u.%02u][cach] stash failed, ret = %d\n", qry->request->uid, + qry->uid, ret); return (int) written; } diff -Nru knot-resolver-3.0.0/lib/cache/api.h knot-resolver-3.1.0/lib/cache/api.h --- knot-resolver-3.0.0/lib/cache/api.h 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/lib/cache/api.h 2018-11-02 15:29:58.000000000 +0000 @@ -66,6 +66,12 @@ int kr_cache_open(struct kr_cache *cache, const struct kr_cdb_api *api, struct kr_cdb_opts *opts, knot_mm_t *mm); /** + * Path to cache file to remove on critical out-of-space error. (do NOT modify it) + */ +KR_EXPORT extern +const char *kr_cache_emergency_file_to_remove; + +/** * Close persistent cache. * @note This doesn't clear the data, just closes the connection to the database. * @param cache structure diff -Nru knot-resolver-3.0.0/lib/defines.h knot-resolver-3.1.0/lib/defines.h --- knot-resolver-3.0.0/lib/defines.h 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/lib/defines.h 2018-11-02 15:29:58.000000000 +0000 @@ -91,8 +91,12 @@ void __asan_unpoison_memory_region(void const volatile *addr, size_t size); #define kr_asan_poison(addr, size) __asan_poison_memory_region((addr), (size)) #define kr_asan_unpoison(addr, size) __asan_unpoison_memory_region((addr), (size)) +#define kr_asan_custom_poison(fn, addr) fn ##_poison((addr)) +#define kr_asan_custom_unpoison(fn, addr) fn ##_unpoison((addr)) #else #define kr_asan_poison(addr, size) #define kr_asan_unpoison(addr, size) +#define kr_asan_custom_poison(fn, addr) +#define kr_asan_custom_unpoison(fn, addr) #endif /* @endcond */ diff -Nru knot-resolver-3.0.0/lib/dnssec/nsec3.c knot-resolver-3.1.0/lib/dnssec/nsec3.c --- knot-resolver-3.0.0/lib/dnssec/nsec3.c 2018-08-17 12:13:39.000000000 +0000 +++ knot-resolver-3.1.0/lib/dnssec/nsec3.c 2018-11-02 15:29:58.000000000 +0000 @@ -708,11 +708,11 @@ if (!bm) { return kr_error(EINVAL); } - if (kr_nsec_bitmap_contains_type(bm, bm_size, + if (dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_NS) && - !kr_nsec_bitmap_contains_type(bm, bm_size, + !dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_DS) && - !kr_nsec_bitmap_contains_type(bm, bm_size, + !dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_SOA)) { /* Satisfies rfc5155, 8.9. paragraph 2 */ return kr_ok(); @@ -768,7 +768,7 @@ if (!bm) { return kr_error(EINVAL); } - if (kr_nsec_bitmap_contains_type(bm, bm_size, type)) { + if (dnssec_nsec_bitmap_contains(bm, bm_size, type)) { return kr_ok(); } else { return kr_error(ENOENT); diff -Nru knot-resolver-3.0.0/lib/dnssec/nsec.c knot-resolver-3.1.0/lib/dnssec/nsec.c --- knot-resolver-3.0.0/lib/dnssec/nsec.c 2018-08-17 12:13:39.000000000 +0000 +++ knot-resolver-3.1.0/lib/dnssec/nsec.c 2018-11-02 15:29:58.000000000 +0000 @@ -24,42 +24,11 @@ #include #include #include +#include #include "lib/defines.h" #include "lib/dnssec/nsec.h" -bool kr_nsec_bitmap_contains_type(const uint8_t *bm, uint16_t bm_size, uint16_t type) -{ - if (!bm || bm_size == 0) { - assert(bm); - return false; - } - - const uint8_t type_hi = (type >> 8); - const uint8_t type_lo = (type & 0xff); - const uint8_t bitmap_idx = (type_lo >> 3); - const uint8_t bitmap_bit_mask = 1 << (7 - (type_lo & 0x07)); - - size_t bm_pos = 0; - while (bm_pos + 3 <= bm_size) { - uint8_t win = bm[bm_pos++]; - uint8_t win_size = bm[bm_pos++]; - /* Check remaining window length. */ - if (win_size < 1 || bm_pos + win_size > bm_size) - return false; - /* Check that we have a correct window. */ - if (win == type_hi) { - if (bitmap_idx < win_size) { - return bm[bm_pos + bitmap_idx] & bitmap_bit_mask; - } - return false; - } else { - bm_pos += win_size; - } - } - - return false; -} int kr_nsec_children_in_zone_check(const uint8_t *bm, uint16_t bm_size) { @@ -67,9 +36,9 @@ return kr_error(EINVAL); } const bool parent_side = - kr_nsec_bitmap_contains_type(bm, bm_size, KNOT_RRTYPE_DNAME) - || (kr_nsec_bitmap_contains_type(bm, bm_size, KNOT_RRTYPE_NS) - && !kr_nsec_bitmap_contains_type(bm, bm_size, KNOT_RRTYPE_SOA) + dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_DNAME) + || (dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_NS) + && !dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_SOA) ); return parent_side ? abs(ENOENT) : kr_ok(); /* LATER: after refactoring, probably also check if signer name equals owner, @@ -262,12 +231,12 @@ if (!bm || !owner) { return kr_error(EINVAL); } - if (kr_nsec_bitmap_contains_type(bm, bm_size, type)) { + if (dnssec_nsec_bitmap_contains(bm, bm_size, type)) { return NO_PROOF; } if (type != KNOT_RRTYPE_CNAME - && kr_nsec_bitmap_contains_type(bm, bm_size, KNOT_RRTYPE_CNAME)) { + && dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_CNAME)) { return NO_PROOF; } /* Special behavior around zone cuts. */ @@ -279,7 +248,7 @@ * See RFC4035 5.2, next-to-last paragraph. * This doesn't apply for root DS as it doesn't exist in DNS hierarchy. */ - if (owner[0] != '\0' && kr_nsec_bitmap_contains_type(bm, bm_size, KNOT_RRTYPE_SOA)) { + if (owner[0] != '\0' && dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_SOA)) { return NO_PROOF; } break; @@ -291,8 +260,8 @@ default: /* Parent-side delegation record isn't authoritative for non-DS; * see RFC6840 4.1. */ - if (kr_nsec_bitmap_contains_type(bm, bm_size, KNOT_RRTYPE_NS) - && !kr_nsec_bitmap_contains_type(bm, bm_size, KNOT_RRTYPE_SOA)) { + if (dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_NS) + && !dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_SOA)) { return NO_PROOF; } /* LATER(opt): perhaps short-circuit test if we repeat it here. */ @@ -520,11 +489,11 @@ if (!bm) { return kr_error(EINVAL); } - if (kr_nsec_bitmap_contains_type(bm, bm_size, + if (dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_NS) && - !kr_nsec_bitmap_contains_type(bm, bm_size, + !dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_DS) && - !kr_nsec_bitmap_contains_type(bm, bm_size, + !dnssec_nsec_bitmap_contains(bm, bm_size, KNOT_RRTYPE_SOA)) { /* rfc4035, 5.2 */ return kr_ok(); @@ -563,7 +532,7 @@ if (!bm) { return kr_error(EINVAL); } - if (kr_nsec_bitmap_contains_type(bm, bm_size, type)) { + if (dnssec_nsec_bitmap_contains(bm, bm_size, type)) { return kr_ok(); } else { return kr_error(ENOENT); diff -Nru knot-resolver-3.0.0/lib/dnssec/nsec.h knot-resolver-3.1.0/lib/dnssec/nsec.h --- knot-resolver-3.0.0/lib/dnssec/nsec.h 2018-08-17 12:13:39.000000000 +0000 +++ knot-resolver-3.1.0/lib/dnssec/nsec.h 2018-11-02 15:29:58.000000000 +0000 @@ -19,15 +19,6 @@ #include /** - * Check whether bitmap contains given type. - * @param bm Bitmap from NSEC or NSEC3. - * @param bm_size Bitmap size. - * @param type RR type to search for. - * @return True if bitmap contains type. - */ -bool kr_nsec_bitmap_contains_type(const uint8_t *bm, uint16_t bm_size, uint16_t type); - -/** * Check bitmap that child names are contained in the same zone. * @note see RFC6840 4.1. * @param bm Bitmap from NSEC or NSEC3. diff -Nru knot-resolver-3.0.0/lib/generic/lru.c knot-resolver-3.1.0/lib/generic/lru.c --- knot-resolver-3.0.0/lib/generic/lru.c 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/lib/generic/lru.c 2018-11-02 15:29:58.000000000 +0000 @@ -21,7 +21,15 @@ struct lru_item { uint16_t key_len, val_len; /**< Two bytes should be enough for our purposes. */ - char data[]; /**< Place for both key and value. */ + char data[]; + /**< Place for both key and value. + * + * We use "char" to satisfy the C99+ aliasing rules. + * See C99 section 6.5 Expressions, paragraph 7. + * Any type can be accessed through char-pointer, + * so we can use a common struct definition + * for all types being held. + */ }; /** @internal Compute offset of value in struct lru_item. */ diff -Nru knot-resolver-3.0.0/lib/generic/lru.h knot-resolver-3.1.0/lib/generic/lru.h --- knot-resolver-3.0.0/lib/generic/lru.h 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/lib/generic/lru.h 2018-11-02 15:29:58.000000000 +0000 @@ -24,32 +24,31 @@ * most frequent keys/hashes. This tracking is done for *more* keys than * those that are actually stored. * - * # Example usage: - * + * Example usage: * @code{.c} * // Define new LRU type * typedef lru_t(int) lru_int_t; * * // Create LRU * lru_int_t *lru; - * lru_create(&lru, 5, NULL); + * lru_create(&lru, 5, NULL, NULL); * * // Insert some values - * int *pi = lru_get_new(lru, "luke", strlen("luke")); + * int *pi = lru_get_new(lru, "luke", strlen("luke"), NULL); * if (pi) * *pi = 42; - * pi = lru_get_new(lru, "leia", strlen("leia")); + * pi = lru_get_new(lru, "leia", strlen("leia"), NULL); * if (pi) * *pi = 24; * * // Retrieve values - * int *ret = lru_get_try(lru, "luke", strlen("luke")); + * int *ret = lru_get_try(lru, "luke", strlen("luke"), NULL); * if (!ret) printf("luke dropped out!\n"); * else printf("luke's number is %d\n", *ret); * * char *enemies[] = {"goro", "raiden", "subzero", "scorpion"}; * for (int i = 0; i < 4; ++i) { - * int *val = lru_get_new(lru, enemies[i], strlen(enemies[i])); + * int *val = lru_get_new(lru, enemies[i], strlen(enemies[i]), NULL); * if (val) * *val = i; * } diff -Nru knot-resolver-3.0.0/lib/generic/queue.c knot-resolver-3.1.0/lib/generic/queue.c --- knot-resolver-3.0.0/lib/generic/queue.c 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/lib/generic/queue.c 2018-11-02 15:29:58.000000000 +0000 @@ -0,0 +1,124 @@ +/* Copyright (C) 2018 CZ.NIC, z.s.p.o. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "lib/generic/queue.h" +#include + +KR_EXPORT void queue_init_impl(struct queue *q, size_t item_size) +{ + q->len = 0; + q->item_size = item_size; + q->head = q->tail = NULL; + /* Take 128 B (two x86 cache lines), except a small margin + * that the allocator can use for its overhead. + * Normally (64-bit pointers) this means 16 B header + 13*8 B data. */ + q->chunk_cap = (128 - offsetof(struct queue_chunk, data) + - sizeof(size_t) + ) / item_size; + if (!q->chunk_cap) q->chunk_cap = 1; /* item_size big enough by itself */ +} + +KR_EXPORT void queue_deinit_impl(struct queue *q) +{ + assert(q); + struct queue_chunk *p = q->head; + while (p != NULL) { + struct queue_chunk *pf = p; + p = p->next; + free(pf); + } +#ifndef NDEBUG + memset(q, 0, sizeof(*q)); +#endif +} + +static struct queue_chunk * queue_chunk_new(const struct queue *q) +{ + struct queue_chunk *c = malloc(offsetof(struct queue_chunk, data) + + q->chunk_cap * q->item_size); + if (unlikely(!c)) abort(); // simplify stuff + memset(c, 0, offsetof(struct queue_chunk, data)); + c->cap = q->chunk_cap; + /* ->begin and ->end are zero, i.e. we optimize for _push + * and not _push_head, by default. */ + return c; +} + +/* Return pointer to the space for the new element. */ +KR_EXPORT void * queue_push_impl(struct queue *q) +{ + assert(q); + struct queue_chunk *t = q->tail; // shorthand + if (unlikely(!t)) { + assert(!q->head && !q->len); + q->head = q->tail = t = queue_chunk_new(q); + } else + if (t->end == t->cap) { + if (t->begin * 2 >= t->cap) { + /* Utilization is below 50%, so let's shift (no overlap). */ + memcpy(t->data, t->data + t->begin * q->item_size, + (t->end - t->begin) * q->item_size); + t->end -= t->begin; + t->begin = 0; + } else { + /* Let's grow the tail by another chunk. */ + assert(!t->next); + t->next = queue_chunk_new(q); + t = q->tail = t->next; + } + } + assert(t->end < t->cap); + ++(q->len); + ++(t->end); + return t->data + q->item_size * (t->end - 1); +} + +/* Return pointer to the space for the new element. */ +KR_EXPORT void * queue_push_head_impl(struct queue *q) +{ + /* When we have choice, we optimize for further _push_head, + * i.e. when shifting or allocating a chunk, + * we store items on the tail-end of the chunk. */ + assert(q); + struct queue_chunk *h = q->head; // shorthand + if (unlikely(!h)) { + assert(!q->tail && !q->len); + h = q->head = q->tail = queue_chunk_new(q); + h->begin = h->end = h->cap; + } else + if (h->begin == 0) { + if (h->end * 2 <= h->cap) { + /* Utilization is below 50%, so let's shift (no overlap). + * Computations here are simplified due to h->begin == 0. */ + const int cnt = h->end; + memcpy(h->data + (h->cap - cnt) * q->item_size, h->data, + cnt * q->item_size); + h->begin = h->cap - cnt; + h->end = h->cap; + } else { + /* Let's grow the head by another chunk. */ + h = queue_chunk_new(q); + h->next = q->head; + q->head = h; + h->begin = h->end = h->cap; + } + } + assert(h->begin > 0); + --(h->begin); + ++(q->len); + return h->data + q->item_size * h->begin; +} + diff -Nru knot-resolver-3.0.0/lib/generic/queue.h knot-resolver-3.1.0/lib/generic/queue.h --- knot-resolver-3.0.0/lib/generic/queue.h 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/lib/generic/queue.h 2018-11-02 15:29:58.000000000 +0000 @@ -0,0 +1,257 @@ +/* Copyright (C) 2018 CZ.NIC, z.s.p.o. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +/** + * @file queue.h + * @brief A queue, usable for FIFO and LIFO simultaneously. + * + * Both the head and tail of the queue can be accessed and pushed to, + * but only the head can be popped from. + * + * @note The implementation uses a singly linked list of blocks + * where each block stores an array of values (for better efficiency). + * + * Example usage: + * @code{.c} + // define new queue type, and init a new queue instance + typedef queue_t(int) queue_int_t; + queue_int_t q; + queue_init(q); + // do some operations + queue_push(q, 1); + queue_push(q, 2); + queue_push(q, 3); + queue_push(q, 4); + queue_pop(q); + assert(queue_head(q) == 2); + assert(queue_tail(q) == 4); + + // you may iterate + typedef queue_it_t(int) queue_it_int_t; + for (queue_it_int_t it = queue_it_begin(q); !queue_it_finished(it); + queue_it_next(it)) { + ++queue_it_val(it); + } + assert(queue_tail(q) == 5); + + queue_push_head(q, 0); + ++queue_tail(q); + assert(queue_tail(q) == 6); + // free it up + queue_deinit(q); + + // you may use dynamic allocation for the type itself + queue_int_t *qm = malloc(sizeof(queue_int_t)); + queue_init(*qm); + queue_deinit(*qm); + free(qm); + * @endcode + * + * \addtogroup generics + * @{ + */ + +#pragma once + +#include "lib/defines.h" +#include "contrib/ucw/lib.h" +#include +#include +#include +#include +#include + +/** @brief The type for queue, parametrized by value type. */ +#define queue_t(type) \ + union { \ + type *pdata_t; /* only the *type* information is used */ \ + struct queue queue; \ + } + +/** @brief Initialize a queue. You can malloc() it the usual way. */ +#define queue_init(q) do { \ + (void)(((__typeof__(((q).pdata_t)))0) == (void *)0); /* typecheck queue_t */ \ + queue_init_impl(&(q).queue, sizeof(*(q).pdata_t)); \ + } while (false) + +/** @brief De-initialize a queue: make it invalid and free any inner allocations. */ +#define queue_deinit(q) \ + queue_deinit_impl(&(q).queue) + +/** @brief Push data to queue's tail. (Type-safe version; use _impl() otherwise.) */ +#define queue_push(q, data) \ + *((__typeof__((q).pdata_t)) queue_push_impl(&(q).queue)) = data + +/** @brief Push data to queue's head. (Type-safe version; use _impl() otherwise.) */ +#define queue_push_head(q, data) \ + *((__typeof__((q).pdata_t)) queue_push_head_impl(&(q).queue)) = data + +/** @brief Remove the element at the head. */ +#define queue_pop(q) \ + queue_pop_impl(&(q).queue) + +/** @brief Return a "reference" to the element at the head (it's an L-value) . */ +#define queue_head(q) \ + ( *(__typeof__((q).pdata_t)) queue_head_impl(&(q).queue) ) + +/** @brief Return a "reference" to the element at the tail (it's an L-value) . */ +#define queue_tail(q) \ + ( *(__typeof__((q).pdata_t)) queue_tail_impl(&(q).queue) ) + +/** @brief Return the number of elements in the queue. */ +#define queue_len(q) \ + ((const size_t)(q).queue.len) + + +/** @brief Type for queue iterator, parametrized by value type. + * It's a simple structure that owns no other resources. + * You may NOT use it after doing any push or pop (without _begin again). */ +#define queue_it_t(type) \ + union { \ + type *pdata_t; /* only the *type* information is used */ \ + struct queue_it iter; \ + } + +/** @brief Initialize a queue iterator at the head of the queue. + * If you use this in assignment (instead of initialization), + * you will unfortunately need to add corresponding type-cast in front. + * Beware: there's no type-check between queue and iterator! */ +#define queue_it_begin(q) \ + { .iter = queue_it_begin_impl(&(q).queue) } + +/** @brief Return a "reference" to the current element (it's an L-value) . */ +#define queue_it_val(it) \ + ( *(__typeof__((it).pdata_t)) queue_it_val_impl(&(it).iter) ) + +/** @brief Test if the iterator has gone past the last element. + * If it has, you may not use _val or _next. */ +#define queue_it_finished(it) \ + queue_it_finished_impl(&(it).iter) + +/** @brief Advance the iterator to the next element. */ +#define queue_it_next(it) \ + queue_it_next_impl(&(it).iter) + + + +/* ====================== Internal for the implementation ================== */ +/** @cond internal */ + +struct queue; +/* Non-inline functions are exported to be usable from daemon. */ +void queue_init_impl(struct queue *q, size_t item_size); +void queue_deinit_impl(struct queue *q); +void * queue_push_impl(struct queue *q); +void * queue_push_head_impl(struct queue *q); + +struct queue_chunk; +struct queue { + size_t len; + uint16_t chunk_cap, item_size; + struct queue_chunk *head, *tail; +}; + +struct queue_chunk { + struct queue_chunk *next; /*< head -> ... -> tail */ + int16_t begin, end, cap, pad_; /*< indices: zero is closest to head */ + /*< We could fit into uint8_t for example, but the choice of (3+1)*2 bytes + * is a compromise between wasting space and getting a good alignment. + * In particular, queue_t(type*) will store the pointers on addresses + * aligned to the pointer size, in both 64-bit and 32-bit platforms. + */ + char data[]; + /**< The item data. We use "char" to satisfy the C99+ aliasing rules. + * See C99 section 6.5 Expressions, paragraph 7. + * Any type can be accessed through char-pointer, + * so we can use a common struct definition + * for all types being held. + */ +}; + +static inline void * queue_head_impl(const struct queue *q) +{ + assert(q); + struct queue_chunk *h = q->head; + if (unlikely(!h)) + return NULL; + assert(h->end > h->begin); + return h->data + h->begin * q->item_size; +} + +static inline void * queue_tail_impl(const struct queue *q) +{ + assert(q); + struct queue_chunk *t = q->tail; + if (unlikely(!t)) + return NULL; + assert(t->end > t->begin); + return t->data + (t->end - 1) * q->item_size; +} + +static inline void queue_pop_impl(struct queue *q) +{ + assert(q); + struct queue_chunk *h = q->head; + assert(h && h->end > h->begin); + if (h->end - h->begin == 1) { + /* removing the last element in the chunk */ + q->head = h->next; + free(h); + } else { + ++(h->begin); + } + --(q->len); +} + + +struct queue_it { + struct queue_chunk *chunk; + int16_t pos, item_size; +}; + +static inline struct queue_it queue_it_begin_impl(struct queue *q) +{ + assert(q); + return (struct queue_it){ + .chunk = q->head, + .pos = q->head ? q->head->begin : -1, + .item_size = q->item_size, + }; +} + +static inline bool queue_it_finished_impl(struct queue_it *it) +{ + return it->chunk == NULL || it->pos >= it->chunk->end; +} + +static inline void * queue_it_val_impl(struct queue_it *it) +{ + assert(!queue_it_finished_impl(it)); + return it->chunk->data + it->pos * it->item_size; +} + +static inline void queue_it_next_impl(struct queue_it *it) +{ + assert(!queue_it_finished_impl(it)); + ++(it->pos); + if (it->pos < it->chunk->end) + return; + it->chunk = it->chunk->next; + it->pos = it->chunk ? it->chunk->begin : -1; +} + +/** @endcond (internal) */ +/** @} (addtogroup generics) */ + diff -Nru knot-resolver-3.0.0/lib/generic/README.rst knot-resolver-3.1.0/lib/generic/README.rst --- knot-resolver-3.0.0/lib/generic/README.rst 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/lib/generic/README.rst 2018-11-02 15:29:58.000000000 +0000 @@ -7,6 +7,7 @@ as long as it comes with a test case in `tests/test_generics.c`. * array_ - a set of simple macros to make working with dynamic arrays easier. +* queue_ - a FIFO + LIFO queue. * map_ - a `Crit-bit tree`_ key-value map implementation (public domain) that comes with tests. * set_ - set abstraction implemented on top of ``map`` (unused now). * pack_ - length-prefixed list of objects (i.e. array-list). @@ -19,6 +20,12 @@ .. doxygenfile:: array.h :project: libkres +queue +~~~~~ + +.. doxygenfile:: queue.h + :project: libkres + map ~~~ diff -Nru knot-resolver-3.0.0/lib/generic/trie.c knot-resolver-3.1.0/lib/generic/trie.c --- knot-resolver-3.0.0/lib/generic/trie.c 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/lib/generic/trie.c 2018-11-02 15:29:58.000000000 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2016 CZ.NIC, z.s.p.o. +/* Copyright (C) 2016-2018 CZ.NIC, z.s.p.o. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -154,6 +154,13 @@ return __builtin_popcount(w); } +/*! \brief Only keep the lowest bit in the bitmap (least significant -> twigs[0]). */ +static bitmap_t bitmap_lowest_bit(bitmap_t w) +{ + assert((w & ~((1 << 17) - 1)) == 0); // using the least-important 17 bits + return 1 << __builtin_ctz(w); +} + /*! \brief Test flags to determine type of this node. */ static bool isbranch(const node_t *t) { @@ -171,7 +178,7 @@ } /*! \brief Extract a nibble from a key and turn it into a bitmask. */ -static bitmap_t twigbit(node_t *t, const char *key, uint32_t len) +static bitmap_t twigbit(const node_t *t, const char *key, uint32_t len) { assert(isbranch(t)); uint i = t->branch.index; @@ -183,14 +190,14 @@ } /*! \brief Test if a branch node has a child indicated by a bitmask. */ -static bool hastwig(node_t *t, bitmap_t bit) +static bool hastwig(const node_t *t, bitmap_t bit) { assert(isbranch(t)); return t->branch.bitmap & bit; } /*! \brief Compute offset of an existing child in a branch node. */ -static uint twigoff(node_t *t, bitmap_t b) +static uint twigoff(const node_t *t, bitmap_t b) { assert(isbranch(t)); return bitmap_weight(t->branch.bitmap & (b - 1)); @@ -285,64 +292,108 @@ return tbl->weight; } -trie_val_t* trie_get_try(trie_t *tbl, const char *key, uint32_t len) +struct found { + leaf_t *l; /**< the found leaf (NULL if not found) */ + branch_t *p; /**< the leaf's parent (if exists) */ + bitmap_t b; /**< bit-mask with a single bit marking l under p */ +}; +/** Search trie for an item with the given key (equality only). */ +static struct found find_equal(trie_t *tbl, const char *key, uint32_t len) { assert(tbl); + struct found ret0; + memset(&ret0, 0, sizeof(ret0)); if (!tbl->weight) - return NULL; + return ret0; + /* Current node and parent while descending (returned values basically). */ node_t *t = &tbl->root; + branch_t *p = NULL; + bitmap_t b = 0; while (isbranch(t)) { __builtin_prefetch(t->branch.twigs); - bitmap_t b = twigbit(t, key, len); + b = twigbit(t, key, len); if (!hastwig(t, b)) - return NULL; + return ret0; + p = &t->branch; t = twig(t, twigoff(t, b)); } if (key_cmp(key, len, t->leaf.key->chars, t->leaf.key->len) != 0) - return NULL; - return &t->leaf.val; + return ret0; + return (struct found) { + .l = &t->leaf, + .p = p, + .b = b, + }; } - -int trie_del(trie_t *tbl, const char *key, uint32_t len, trie_val_t *val) +/** Find item with the first key (lexicographical order). */ +static struct found find_first(trie_t *tbl) { assert(tbl); - if (!tbl->weight) - return KNOT_ENOENT; - node_t *t = &tbl->root; // current and parent node + if (!tbl->weight) { + struct found ret0; + memset(&ret0, 0, sizeof(ret0)); + return ret0; + } + /* Current node and parent while descending (returned values basically). */ + node_t *t = &tbl->root; branch_t *p = NULL; - bitmap_t b = 0; while (isbranch(t)) { - __builtin_prefetch(t->branch.twigs); - b = twigbit(t, key, len); - if (!hastwig(t, b)) - return KNOT_ENOENT; p = &t->branch; - t = twig(t, twigoff(t, b)); + t = &p->twigs[0]; } - if (key_cmp(key, len, t->leaf.key->chars, t->leaf.key->len) != 0) + return (struct found) { + .l = &t->leaf, + .p = p, + .b = p ? bitmap_lowest_bit(p->bitmap) : 0, + }; +} + +trie_val_t* trie_get_try(trie_t *tbl, const char *key, uint32_t len) +{ + struct found found = find_equal(tbl, key, len); + return found.l ? &found.l->val : NULL; +} + +trie_val_t* trie_get_first(trie_t *tbl, char **key, uint32_t *len) +{ + struct found found = find_first(tbl); + if (!found.l) + return NULL; + if (key) + *key = found.l->key->chars; + if (len) + *len = found.l->key->len; + return &found.l->val; +} + +/** Delete the found element (if any) and return value (unless NULL is passed) */ +static int del_found(trie_t *tbl, struct found found, trie_val_t *val) +{ + if (!found.l) return KNOT_ENOENT; - mm_free(&tbl->mm, t->leaf.key); + mm_free(&tbl->mm, found.l->key); if (val != NULL) - *val = t->leaf.val; // we return trie_val_t directly when deleting + *val = found.l->val; // we return trie_val_t directly when deleting --tbl->weight; + branch_t * const p = found.p; // short-hand if (unlikely(!p)) { // whole trie was a single leaf assert(tbl->weight == 0); empty_root(&tbl->root); return KNOT_EOK; } - // remove leaf t as child of p - int ci = t - p->twigs, // child index via pointer arithmetic + // remove leaf t as child of p; get child index via pointer arithmetic + int ci = ((union node *)found.l) - p->twigs, cc = bitmap_weight(p->bitmap); // child count assert(ci >= 0 && ci < cc); if (cc == 2) { // collapse binary node p: move the other child to this node node_t *twigs = p->twigs; - (*(node_t *)p) = twigs[1 - ci]; // it might be a leaf or branch + (*(union node *)p) = twigs[1 - ci]; // it might be a leaf or branch mm_free(&tbl->mm, twigs); return KNOT_EOK; } memmove(p->twigs + ci, p->twigs + ci + 1, sizeof(node_t) * (cc - ci - 1)); - p->bitmap &= ~b; + p->bitmap &= ~found.b; node_t *twigs = mm_realloc(&tbl->mm, p->twigs, sizeof(node_t) * (cc - 1), sizeof(node_t) * cc); if (likely(twigs != NULL)) @@ -352,6 +403,30 @@ return KNOT_EOK; } +int trie_del(trie_t *tbl, const char *key, uint32_t len, trie_val_t *val) +{ + struct found found = find_equal(tbl, key, len); + return del_found(tbl, found, val); +} + +int trie_del_first(trie_t *tbl, char *key, uint32_t *len, trie_val_t *val) +{ + struct found found = find_first(tbl); + if (!found.l) + return KNOT_ENOENT; + if (key) { + if (!len) + return KNOT_EINVAL; + if (*len < found.l->key->len) + return kr_error(ENOSPC); + memcpy(key, found.l->key->chars, found.l->key->len); + } + if (len) { // makes sense even with key == NULL + *len = found.l->key->len; + } + return del_found(tbl, found, val); +} + /*! * \brief Stack of nodes, storing a path down a trie. * @@ -363,8 +438,8 @@ node_t* *stack; /*!< The stack; malloc is used directly instead of mm. */ uint32_t len; /*!< Current length of the stack. */ uint32_t alen; /*!< Allocated/available length of the stack. */ - /*! \brief Initial storage for \a stack; it should fit in most use cases. */ - node_t* stack_init[2000 / sizeof(node_t *)]; + /*! \brief Initial storage for \a stack; it should fit in many use cases. */ + node_t* stack_init[60]; } nstack_t; /*! \brief Create a node stack containing just the root (or empty). */ @@ -434,6 +509,8 @@ * \param info Set position of the point of first mismatch (in index and flags). * \param first Set the value of the first non-matching character (from trie), * optionally; end-of-string character has value -256 (that's why it's int). + * Note: the character is converted to *unsigned* char (i.e. 0..255), + * as that's the ordering used in the trie. * * \return KNOT_EOK or KNOT_ENOMEM. */ @@ -466,7 +543,7 @@ } info->index = index; if (first) - *first = lkey->len > index ? lkey->chars[index] : -256; + *first = lkey->len > index ? (unsigned char)lkey->chars[index] : -256; // Find flags: which half-byte has matched. uint flags; if (index == len && len == lkey->len) { // found equivalent key @@ -622,7 +699,7 @@ branch_t bp; int un_leaf; // first unmatched character in the leaf ERR_RETURN(ns_find_branch(ns, key, len, &bp, &un_leaf)); - int un_key = bp.index < len ? key[bp.index] : -256; + int un_key = bp.index < len ? (unsigned char)key[bp.index] : -256; node_t *t = ns->stack[ns->len - 1]; if (bp.flags == 0) { // found exact match *val = &t->leaf.val; diff -Nru knot-resolver-3.0.0/lib/generic/trie.h knot-resolver-3.1.0/lib/generic/trie.h --- knot-resolver-3.0.0/lib/generic/trie.h 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/lib/generic/trie.h 2018-11-02 15:29:58.000000000 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2017 CZ.NIC, z.s.p.o. +/* Copyright (C) 2017-2018 CZ.NIC, z.s.p.o. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,7 +44,7 @@ /*! \brief Opaque type for holding a QP-trie iterator. */ typedef struct trie_it trie_it_t; -/*! \brief Create a trie instance. */ +/*! \brief Create a trie instance. Pass NULL to use malloc+free. */ KR_EXPORT trie_t* trie_create(knot_mm_t *mm); @@ -64,6 +64,11 @@ KR_EXPORT trie_val_t* trie_get_try(trie_t *tbl, const char *key, uint32_t len); +/*! + * \brief Return pointer to the minimum. Optionally with key and its length. */ +KR_EXPORT +trie_val_t* trie_get_first(trie_t *tbl, char **key, uint32_t *len); + /*! \brief Search the trie, inserting NULL trie_val_t on failure. */ KR_EXPORT trie_val_t* trie_get_ins(trie_t *tbl, const char *key, uint32_t len); @@ -78,6 +83,7 @@ * \return KNOT_EOK for exact match, 1 for previous, KNOT_ENOENT for not-found, * or KNOT_E*. */ +KR_EXPORT int trie_get_leq(trie_t *tbl, const char *key, uint32_t len, trie_val_t **val); /*! @@ -96,6 +102,16 @@ KR_EXPORT int trie_del(trie_t *tbl, const char *key, uint32_t len, trie_val_t *val); +/*! + * \brief Remove the first item, returning KNOT_EOK on success. + * + * You may optionally get the key and/or value. + * The key is copied, so you need to pass sufficient len, + * otherwise kr_error(ENOSPC) is returned. + */ +KR_EXPORT +int trie_del_first(trie_t *tbl, char *key, uint32_t *len, trie_val_t *val); + /*! \brief Create a new iterator pointing to the first element (if any). */ KR_EXPORT trie_it_t* trie_it_begin(trie_t *tbl); @@ -105,6 +121,9 @@ * * Iteration is in ascending lexicographical order. * In particular, the empty string would be considered as the very first. + * + * \note You may not use this function if the trie's key-set has been modified + * during the lifetime of the iterator (modifying values only is OK). */ KR_EXPORT void trie_it_next(trie_it_t *it); diff -Nru knot-resolver-3.0.0/lib/layer/iterate.c knot-resolver-3.1.0/lib/layer/iterate.c --- knot-resolver-3.0.0/lib/layer/iterate.c 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/lib/layer/iterate.c 2018-11-02 15:29:58.000000000 +0000 @@ -910,15 +910,18 @@ /* Query built, expect answer. */ uint32_t rnd = kr_rand_uint(0); + /* We must respect https://tools.ietf.org/html/rfc7766#section-6.2.1 + * - When sending multiple queries over a TCP connection, clients MUST NOT + * reuse the DNS Message ID of an in-flight query on that connection. + * + * So, if query is going to be sent over TCP connection + * this id can be changed to avoid duplication with query that already was sent + * but didn't receive answer yet. + */ query->id = rnd ^ (rnd >> 16); /* cheap way to strengthen unpredictability */ knot_wire_set_id(pkt->wire, query->id); pkt->parsed = pkt->size; - WITH_VERBOSE(query) { - KR_DNAME_GET_STR(name_str, query->sname); - KR_RRTYPE_GET_STR(type_str, query->stype); - QVERBOSE_MSG(query, "'%s' type '%s' id was assigned, parent id %u\n", - name_str, type_str, query->parent ? query->parent->id : 0); - } + return kr_ok(); } @@ -937,6 +940,14 @@ return KR_STATE_FAIL; } + WITH_VERBOSE(query) { + KR_DNAME_GET_STR(name_str, query->sname); + KR_RRTYPE_GET_STR(type_str, query->stype); + QVERBOSE_MSG(query, "'%s' type '%s' new uid was assigned .%02u, parent uid .%02u\n", + name_str, type_str, req->rplan.next_uid, + query->parent ? query->parent->uid : 0); + } + query->uid = req->rplan.next_uid; req->rplan.next_uid += 1; diff -Nru knot-resolver-3.0.0/lib/layer.h knot-resolver-3.1.0/lib/layer.h --- knot-resolver-3.0.0/lib/layer.h 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/lib/layer.h 2018-11-02 15:29:58.000000000 +0000 @@ -27,9 +27,10 @@ kr_log_trace(q, cls, fmt, ## __VA_ARGS__); \ } else WITH_VERBOSE(q) { \ unsigned _ind = 0; \ - uint16_t _id = q ? q->id : 0; \ + uint32_t _q_uid = q ? q->uid : 0; \ + uint32_t _req_uid = q && q->request ? q->request->uid : 0; \ for (; q; q = q->parent, _ind += 2); \ - kr_log_verbose("[%5hu][%s] %*s" fmt, _id, cls, _ind, "", ## __VA_ARGS__); \ + kr_log_verbose("[%05u.%02u][%s] %*s" fmt, _req_uid, _q_uid, cls, _ind, "", ## __VA_ARGS__); \ } \ } #else diff -Nru knot-resolver-3.0.0/lib/lib.mk knot-resolver-3.1.0/lib/lib.mk --- knot-resolver-3.0.0/lib/lib.mk 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/lib/lib.mk 2018-11-02 15:29:58.000000000 +0000 @@ -15,6 +15,7 @@ lib/dnssec/ta.c \ lib/generic/lru.c \ lib/generic/map.c \ + lib/generic/queue.c \ lib/generic/trie.c \ lib/layer/cache.c \ lib/layer/iterate.c \ @@ -41,6 +42,7 @@ lib/generic/lru.h \ lib/generic/map.h \ lib/generic/pack.h \ + lib/generic/queue.h \ lib/generic/trie.h \ lib/layer.h \ lib/layer/iterate.h \ diff -Nru knot-resolver-3.0.0/lib/nsrep.c knot-resolver-3.1.0/lib/nsrep.c --- knot-resolver-3.0.0/lib/nsrep.c 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/lib/nsrep.c 2018-11-02 15:29:58.000000000 +0000 @@ -82,6 +82,8 @@ #undef ADDR_SET +/** + * \param addr_set pack with one IP address per element */ static unsigned eval_addr_set(const pack_t *addr_set, struct kr_context *ctx, struct kr_qflags opts, unsigned score, uint8_t *addr[]) { @@ -165,7 +167,7 @@ break; } } -get_next_iterator : + get_next_iterator: it = pack_obj_next(it); } @@ -326,6 +328,7 @@ int kr_nsrep_elect(struct kr_query *qry, struct kr_context *ctx) { if (!qry || !ctx) { + //assert(!EINVAL); return kr_error(EINVAL); } @@ -354,6 +357,7 @@ int kr_nsrep_elect_addr(struct kr_query *qry, struct kr_context *ctx) { if (!qry || !ctx) { + //assert(!EINVAL); return kr_error(EINVAL); } diff -Nru knot-resolver-3.0.0/lib/nsrep.h knot-resolver-3.1.0/lib/nsrep.h --- knot-resolver-3.0.0/lib/nsrep.h 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/lib/nsrep.h 2018-11-02 15:29:58.000000000 +0000 @@ -36,7 +36,7 @@ KR_NS_LONG = (3 * KR_NS_TIMEOUT) / 4, KR_NS_UNKNOWN = KR_NS_TIMEOUT / 2, KR_NS_PENALTY = 100, - KR_NS_GLUED = 10 + KR_NS_GLUED = 10, }; /** @@ -145,7 +145,7 @@ * @param addr chosen address (NULL for first) * @param score new score (i.e. RTT), see enum kr_ns_score * after two calls with score = KR_NS_DEAD and umode = KR_NS_UPDATE - * server will be guaranteed to have KR_NS_TIMEOUTED score + * server will be guaranteed to have score >= KR_NS_TIMEOUT * @param cache RTT LRU cache * @param umode update mode (KR_NS_UPDATE or KR_NS_RESET or KR_NS_ADD) * @return 0 on success, error code on failure diff -Nru knot-resolver-3.0.0/lib/resolve.c knot-resolver-3.1.0/lib/resolve.c --- knot-resolver-3.0.0/lib/resolve.c 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/lib/resolve.c 2018-11-02 15:29:58.000000000 +0000 @@ -668,7 +668,7 @@ /* No detailed analysis ATM, just _SECURE or not. * LATER: request->rank might better be computed in validator's finish phase. */ - VERBOSE_MSG(NULL, " AD: request%s classified as SECURE\n", secure ? "" : " NOT"); + VERBOSE_MSG(last, "AD: request%s classified as SECURE\n", secure ? "" : " NOT"); request->rank = secure ? KR_RANK_SECURE : KR_RANK_INITIAL; /* Clear AD if not secure. ATM answer has AD=1 if requested secured answer. */ @@ -1581,8 +1581,10 @@ } inet_ntop(addr->sa_family, kr_inaddr(&qry->ns.addr[i].ip), ns_str, sizeof(ns_str)); VERBOSE_MSG(qry, - "=> querying: '%s' score: %u zone cut: '%s' qname: '%s' qtype: '%s' proto: '%s'\n", - ns_str, qry->ns.score, zonecut_str, qname_str, type_str, (qry->flags.TCP) ? "tcp" : "udp"); + "=> id: '%05u' querying: '%s' score: %u zone cut: '%s' " + "qname: '%s' qtype: '%s' proto: '%s'\n", + qry->id, ns_str, qry->ns.score, zonecut_str, + qname_str, type_str, (qry->flags.TCP) ? "tcp" : "udp"); break; }} diff -Nru knot-resolver-3.0.0/lib/resolve.h knot-resolver-3.1.0/lib/resolve.h --- knot-resolver-3.0.0/lib/resolve.h 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/lib/resolve.h 2018-11-02 15:29:58.000000000 +0000 @@ -227,6 +227,7 @@ trace_callback_f trace_finish; /**< Request finish tracepoint */ int vars_ref; /**< Reference to per-request variable table. LUA_NOREF if not set. */ knot_mm_t pool; + unsigned int uid; /** for logging purposes only */ }; /** Initializer for an array of *_selected. */ diff -Nru knot-resolver-3.0.0/lib/rplan.c knot-resolver-3.1.0/lib/rplan.c --- knot-resolver-3.0.0/lib/rplan.c 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/lib/rplan.c 2018-11-02 15:29:58.000000000 +0000 @@ -207,7 +207,8 @@ } WITH_VERBOSE(qry) { - VERBOSE_MSG(qry, "plan '%s' type '%s'\n", "", ""); + VERBOSE_MSG(qry, "plan '%s' type '%s' uid [%05u.%02u]\n", "", "", + qry->request ? qry->request->uid : 0, qry->uid); } return qry; } @@ -230,7 +231,9 @@ WITH_VERBOSE(qry) { KR_DNAME_GET_STR(name_str, name); KR_RRTYPE_GET_STR(type_str, type); - VERBOSE_MSG(parent, "plan '%s' type '%s'\n", name_str, type_str); + VERBOSE_MSG(parent, "plan '%s' type '%s' uid [%05u.%02u]\n", + name_str, type_str, + qry->request ? qry->request->uid : 0, qry->uid); } return qry; } diff -Nru knot-resolver-3.0.0/lib/utils.c knot-resolver-3.1.0/lib/utils.c --- knot-resolver-3.0.0/lib/utils.c 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/lib/utils.c 2018-11-02 15:29:58.000000000 +0000 @@ -410,6 +410,18 @@ } } +void kr_inaddr_set_port(struct sockaddr *addr, uint16_t port) +{ + if (!addr) { + return; + } + switch (addr->sa_family) { + case AF_INET: ((struct sockaddr_in *)addr)->sin_port = htons(port); + case AF_INET6: ((struct sockaddr_in6 *)addr)->sin6_port = htons(port); + default: break; + } +} + int kr_inaddr_str(const struct sockaddr *addr, char *buf, size_t *buflen) { int ret = kr_ok(); diff -Nru knot-resolver-3.0.0/lib/utils.h knot-resolver-3.1.0/lib/utils.h --- knot-resolver-3.0.0/lib/utils.h 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/lib/utils.h 2018-11-02 15:29:58.000000000 +0000 @@ -247,6 +247,9 @@ /** Port. */ KR_EXPORT KR_PURE uint16_t kr_inaddr_port(const struct sockaddr *addr); +/** Set port. */ +KR_EXPORT +void kr_inaddr_set_port(struct sockaddr *addr, uint16_t port); /** String representation for given address as "#" */ KR_EXPORT int kr_inaddr_str(const struct sockaddr *addr, char *buf, size_t *buflen); diff -Nru knot-resolver-3.0.0/lib/zonecut.c knot-resolver-3.1.0/lib/zonecut.c --- knot-resolver-3.0.0/lib/zonecut.c 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/lib/zonecut.c 2018-11-02 15:29:58.000000000 +0000 @@ -14,29 +14,34 @@ along with this program. If not, see . */ -#include -#include -#include -#include - #include "lib/zonecut.h" -#include "lib/rplan.h" + #include "contrib/cleanup.h" #include "lib/defines.h" +#include "lib/generic/pack.h" #include "lib/layer.h" #include "lib/resolve.h" -#include "lib/generic/pack.h" +#include "lib/rplan.h" + +#include +#include +#include #define VERBOSE_MSG(qry, fmt...) QRVERBOSE(qry, "zcut", fmt) -/* Root hint descriptor. */ -struct hint_info { - const knot_dname_t *name; - size_t len; - const uint8_t *addr; -}; +/** Information for one NS name + address type. */ +typedef enum { + AI_UNINITED = 0, + AI_REPUT, /**< Don't use this addrset, due to: cache_rep, NO_IPV6, ... + * cache_rep approximates various problems when fetching the RRset. */ + AI_CYCLED, /**< Skipped due to cycle detection; see implementation for details. */ + AI_LAST_BAD = AI_CYCLED, /** bad states: <= AI_LAST_BAD */ + AI_UNKNOWN, /**< Don't know status of this RRset; various reasons. */ + AI_EMPTY, /**< No usable address (may mean e.g. just NODATA). */ + AI_OK, /**< At least one usable address. + * LATER: we might be interested whether it's only glue. */ +} addrset_info_t; -#define U8(x) (const uint8_t *)(x) static void update_cut_name(struct kr_zonecut *cut, const knot_dname_t *name) { @@ -54,11 +59,9 @@ return kr_error(EINVAL); } + memset(cut, 0, sizeof(*cut)); cut->name = knot_dname_copy(name, pool); cut->pool = pool; - cut->key = NULL; - cut->trust_anchor = NULL; - cut->parent = NULL; cut->nsset = trie_create(pool); return cut->name && cut->nsset ? kr_ok() : kr_error(ENOMEM); } @@ -281,37 +284,92 @@ trie_apply(cut->nsset, free_addr_set_cb, cut->pool); trie_clear(cut->nsset); - update_cut_name(cut, U8("")); + const uint8_t *const dname_root = (const uint8_t *)/*sign-cast*/(""); + update_cut_name(cut, dname_root); /* Copy root hints from resolution context. */ return kr_zonecut_copy(cut, &ctx->root_hints); } /** Fetch address for zone cut. Any rank is accepted (i.e. glue as well). */ -static void fetch_addr(struct kr_zonecut *cut, struct kr_cache *cache, - const knot_dname_t *ns, uint16_t rrtype, - const struct kr_query *qry) +static addrset_info_t fetch_addr(pack_t *addrs, const knot_dname_t *ns, uint16_t rrtype, + knot_mm_t *mm_pool, const struct kr_query *qry) // LATER(optim.): excessive data copying { + int rdlen; + switch (rrtype) { + case KNOT_RRTYPE_A: + rdlen = 4; + break; + case KNOT_RRTYPE_AAAA: + rdlen = 16; + break; + default: + assert(!EINVAL); + return AI_UNKNOWN; + } + + struct kr_context *ctx = qry->request->ctx; struct kr_cache_p peek; - if (kr_cache_peek_exact(cache, ns, rrtype, &peek) != 0) { - return; + if (kr_cache_peek_exact(&ctx->cache, ns, rrtype, &peek) != 0) { + return AI_UNKNOWN; } int32_t new_ttl = kr_cache_ttl(&peek, qry, ns, rrtype); if (new_ttl < 0) { - return; + return AI_UNKNOWN; } knot_rrset_t cached_rr; knot_rrset_init(&cached_rr, /*const-cast*/(knot_dname_t *)ns, rrtype, KNOT_CLASS_IN, new_ttl); - if (kr_cache_materialize(&cached_rr.rrs, &peek, cut->pool) < 0) { - return; + if (kr_cache_materialize(&cached_rr.rrs, &peek, mm_pool) < 0) { + return AI_UNKNOWN; } + + /* Reserve memory in *addrs. Implementation detail: + * pack_t cares for lengths, so we don't store those in the data. */ + const size_t pack_extra_size = knot_rdataset_size(&cached_rr.rrs) + - cached_rr.rrs.count * offsetof(knot_rdata_t, len); + int ret = pack_reserve_mm(*addrs, cached_rr.rrs.count, pack_extra_size, + kr_memreserve, mm_pool); + if (ret) abort(); /* ENOMEM "probably" */ + + int usable_cnt = 0; + addrset_info_t result = AI_EMPTY; knot_rdata_t *rd = cached_rr.rrs.rdata; - for (uint16_t i = 0; i < cached_rr.rrs.count; ++i) { - (void) kr_zonecut_add(cut, ns, rd); - rd = knot_rdataset_next(rd); + for (uint16_t i = 0; i < cached_rr.rrs.count; ++i, rd = knot_rdataset_next(rd)) { + if (unlikely(rd->len != rdlen)) { + VERBOSE_MSG(qry, "bad NS address length %d for rrtype %d, skipping\n", + (int)rd->len, (int)rrtype); + continue; + } + /* Check RTT cache - whether the IP is usable or not. */ + kr_nsrep_rtt_lru_entry_t *rtt_e = ctx->cache_rtt + ? lru_get_try(ctx->cache_rtt, (const char *)rd->data, rd->len) + : NULL; + const bool unusable = rtt_e && rtt_e->score >= KR_NS_TIMEOUT + && qry->creation_time_mono + < rtt_e->tout_timestamp + ctx->cache_rtt_tout_retry_interval; + if (!unusable) { + result = AI_OK; + ++usable_cnt; + } + + ret = pack_obj_push(addrs, rd->data, rd->len); + assert(!ret); /* didn't fit because of incorrectly reserved memory */ + /* LATER: for now we lose quite some information here, + * as keeping it would need substantial changes on other places, + * and it turned out to be premature optimization (most likely). + * We might e.g. skip adding unusable addresses, + * and either keep some rtt information associated + * or even finish up choosing the set to send packets to. + * Overall there's some overlap with nsrep.c functionality. + */ + } + if (usable_cnt != cached_rr.rrs.count) { + VERBOSE_MSG(qry, "usable NS addresses: %d/%d\n", + usable_cnt, cached_rr.rrs.count); } + return result; } /** Fetch best NS for zone cut. */ @@ -343,25 +401,80 @@ /* Insert name servers for this zone cut, addresses will be looked up * on-demand (either from cache or iteratively) */ + bool all_bad = true; /**< All NSs (seen so far) are in a bad state. */ knot_rdata_t *rdata_i = ns_rds.rdata; for (unsigned i = 0; i < ns_rds.count; ++i, rdata_i = knot_rdataset_next(rdata_i)) { const knot_dname_t *ns_name = knot_ns_name(rdata_i); - (void) kr_zonecut_add(cut, ns_name, NULL); + const size_t ns_size = knot_dname_size(ns_name); + + /* Get a new pack within the nsset. */ + pack_t **pack = (pack_t **)trie_get_ins(cut->nsset, + (const char *)ns_name, ns_size); + if (!pack) return kr_error(ENOMEM); + assert(!*pack); /* not critical, really */ + *pack = mm_alloc(cut->pool, sizeof(pack_t)); + if (!*pack) return kr_error(ENOMEM); + pack_init(**pack); + + addrset_info_t infos[2]; /* Fetch NS reputation and decide whether to prefetch A/AAAA records. */ unsigned *cached = lru_get_try(ctx->cache_rep, - (const char *)ns_name, knot_dname_size(ns_name)); + (const char *)ns_name, ns_size); unsigned reputation = (cached) ? *cached : 0; - if (!(reputation & KR_NS_NOIP4) && !(qry->flags.NO_IPV4)) { - fetch_addr(cut, &ctx->cache, ns_name, KNOT_RRTYPE_A, qry); + infos[0] = (reputation & KR_NS_NOIP4) || qry->flags.NO_IPV4 + ? AI_REPUT + : fetch_addr(*pack, ns_name, KNOT_RRTYPE_A, cut->pool, qry); + infos[1] = (reputation & KR_NS_NOIP6) || qry->flags.NO_IPV6 + ? AI_REPUT + : fetch_addr(*pack, ns_name, KNOT_RRTYPE_AAAA, cut->pool, qry); + + #if 0 /* rather unlikely to be useful unless changing some zcut code */ + WITH_VERBOSE(qry) { + auto_free char *ns_name_txt = kr_dname_text(ns_name); + VERBOSE_MSG(qry, "NS %s infos: %d, %d\n", + ns_name_txt, (int)infos[0], (int)infos[1]); } - if (!(reputation & KR_NS_NOIP6) && !(qry->flags.NO_IPV6)) { - fetch_addr(cut, &ctx->cache, ns_name, KNOT_RRTYPE_AAAA, qry); + #endif + + /* AI_CYCLED checks. + * If an ancestor query has its zone cut in the state that + * it's looking for name or address(es) of some NS(s), + * we want to avoid doing so with a NS that lies under its cut. + * Instead we need to consider such names unusable in the cut (for now). */ + if (infos[0] != AI_UNKNOWN && infos[1] != AI_UNKNOWN) { + /* Optimization: the following loop would be pointless. */ + all_bad = false; + continue; } + for (const struct kr_query *aq = qry; aq->parent; aq = aq->parent) { + const struct kr_qflags *aqpf = &aq->parent->flags; + if ( (aqpf->AWAIT_CUT && aq->stype == KNOT_RRTYPE_NS) + || (aqpf->AWAIT_IPV4 && aq->stype == KNOT_RRTYPE_A) + || (aqpf->AWAIT_IPV6 && aq->stype == KNOT_RRTYPE_AAAA)) { + if (knot_dname_in_bailiwick(ns_name, + aq->parent->zone_cut.name)) { + for (int i = 0; i < 2; ++i) + if (infos[i] == AI_UNKNOWN) + infos[i] = AI_CYCLED; + break; + } + } else { + /* This ancestor waits for other reason that + * NS name or address, so we're out of a direct cycle. */ + break; + } + } + all_bad = all_bad && infos[0] <= AI_LAST_BAD && infos[1] <= AI_LAST_BAD; } + if (all_bad) { WITH_VERBOSE(qry) { + auto_free char *name_txt = kr_dname_text(name); + VERBOSE_MSG(qry, "cut %s: all NSs bad, count = %d\n", + name_txt, (int)ns_rds.count); + } } knot_rdataset_clear(&ns_rds, cut->pool); - return kr_ok(); + return all_bad ? ELOOP : kr_ok(); } /** @@ -416,22 +529,28 @@ const knot_dname_t *name, const struct kr_query *qry, bool * restrict secured) { - //VERBOSE_MSG(qry, "_find_cached\n"); if (!ctx || !cut || !name) { + //assert(false); return kr_error(EINVAL); } + /* I'm not sure whether the caller always passes a clean state; + * mixing doesn't seem to make sense in any case, so let's clear it. + * We don't bother freeing the packs, as they're on mempool. */ + trie_clear(cut->nsset); /* Copy name as it may overlap with cut name that is to be replaced. */ knot_dname_t *qname = knot_dname_copy(name, cut->pool); if (!qname) { return kr_error(ENOMEM); } - /* Start at QNAME parent. */ + /* Start at QNAME. */ + int ret; const knot_dname_t *label = qname; while (true) { /* Fetch NS first and see if it's insecure. */ uint8_t rank = 0; const bool is_root = (label[0] == '\0'); - if (fetch_ns(ctx, cut, label, qry, &rank) == 0) { + ret = fetch_ns(ctx, cut, label, qry, &rank); + if (ret == 0) { /* Flag as insecure if cached as this */ if (kr_rank_test(rank, KR_RANK_INSECURE)) { *secured = false; @@ -445,24 +564,27 @@ label, KNOT_RRTYPE_DNSKEY, cut->pool, qry); } update_cut_name(cut, label); - mm_free(cut->pool, qname); - kr_cache_sync(&ctx->cache); WITH_VERBOSE(qry) { auto_free char *label_str = kr_dname_text(label); VERBOSE_MSG(qry, "found cut: %s (rank 0%.2o return codes: DS %d, DNSKEY %d)\n", label_str, rank, ret_ds, ret_dnskey); } - return kr_ok(); - } + ret = kr_ok(); + break; + } /* else */ + + trie_clear(cut->nsset); /* Subtract label from QNAME. */ if (!is_root) { label = knot_wire_next_label(label, NULL); } else { + ret = kr_error(ENOENT); break; } } + kr_cache_sync(&ctx->cache); mm_free(cut->pool, qname); - return kr_error(ENOENT); + return ret; } diff -Nru knot-resolver-3.0.0/Makefile knot-resolver-3.1.0/Makefile --- knot-resolver-3.0.0/Makefile 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/Makefile 2018-11-02 15:29:58.000000000 +0000 @@ -18,7 +18,7 @@ .PHONY: all install check clean doc info lint # Dependencies -KNOT_MINVER := 2.7.1 +KNOT_MINVER := 2.7.2 $(eval $(call find_lib,libknot,$(KNOT_MINVER),yes)) $(eval $(call find_lib,libdnssec,$(KNOT_MINVER),yes)) $(eval $(call find_lib,libzscanner,$(KNOT_MINVER),yes)) diff -Nru knot-resolver-3.0.0/modules/hints/hints.c knot-resolver-3.1.0/modules/hints/hints.c --- knot-resolver-3.0.0/modules/hints/hints.c 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/modules/hints/hints.c 2018-11-02 15:29:58.000000000 +0000 @@ -40,7 +40,7 @@ struct hints_data { struct kr_zonecut hints; struct kr_zonecut reverse_hints; - bool use_nodata; + bool use_nodata; /**< See hint_use_nodata() description, exposed via lua. */ }; /** Useful for returning from module properties. */ @@ -627,6 +627,7 @@ } kr_zonecut_init(&data->hints, (const uint8_t *)(""), pool); kr_zonecut_init(&data->reverse_hints, (const uint8_t *)(""), pool); + data->use_nodata = true; module->data = data; return kr_ok(); @@ -675,7 +676,7 @@ { &hint_add_hosts, "add_hosts", "Load a file with hosts-like formatting and add contents into hints.", }, { &hint_root, "root", "Replace root hints set (empty value to return current list).", }, { &hint_root_file, "root_file", "Replace root hints set from a zonefile.", }, - { &hint_use_nodata, "use_nodata", "Synthesise NODATA if name matches, but type doesn't.", }, + { &hint_use_nodata, "use_nodata", "Synthesise NODATA if name matches, but type doesn't. True by default.", }, { NULL, NULL, NULL } }; return prop_list; diff -Nru knot-resolver-3.0.0/modules/hints/README.rst knot-resolver-3.1.0/modules/hints/README.rst --- knot-resolver-3.0.0/modules/hints/README.rst 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/modules/hints/README.rst 2018-11-02 15:29:58.000000000 +0000 @@ -109,5 +109,5 @@ :param bool toggle: true if enabling NODATA synthesis, false if disabling :return: ``{ result: bool }`` - If set to true, NODATA will be synthesised for matching hint name, but mismatching type (e.g. AAAA query when only A hint exists). + If set to true (the default), NODATA will be synthesised for matching hint name, but mismatching type (e.g. AAAA query when only A hint exists). diff -Nru knot-resolver-3.0.0/modules/rfc7706.rst knot-resolver-3.1.0/modules/rfc7706.rst --- knot-resolver-3.0.0/modules/rfc7706.rst 2018-08-02 08:54:30.000000000 +0000 +++ knot-resolver-3.1.0/modules/rfc7706.rst 2018-11-02 15:29:58.000000000 +0000 @@ -1,3 +1,3 @@ -Root on lookback (RFC 7706) +Root on loopback (RFC 7706) --------------------------- Knot Resolver developers decided that pure implementation of :rfc:`7706` is a bad idea so it is not implemented in the form envisioned by the RFC. You can get the very similar effect without its downsides by combining :ref:`prefill ` and :ref:`serve_stale ` modules with Aggressive Use of DNSSEC-Validated Cache (:rfc:`8198`) behavior which is enabled automatically together with DNSSEC validation. diff -Nru knot-resolver-3.0.0/modules/ta_sentinel/ta_sentinel.lua knot-resolver-3.1.0/modules/ta_sentinel/ta_sentinel.lua --- knot-resolver-3.0.0/modules/ta_sentinel/ta_sentinel.lua 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/modules/ta_sentinel/ta_sentinel.lua 2018-11-02 15:29:58.000000000 +0000 @@ -31,6 +31,7 @@ sentype = false keytag = qname:match('^root%-key%-sentinel%-not%-ta%-(%x+)%.') end + if not keytag then return state end if kreq.rank ~= ffi.C.KR_RANK_SECURE or kreq.answer:cd() then if verbose() then diff -Nru knot-resolver-3.0.0/NEWS knot-resolver-3.1.0/NEWS --- knot-resolver-3.0.0/NEWS 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/NEWS 2018-11-02 15:29:58.000000000 +0000 @@ -1,3 +1,23 @@ +Knot Resolver 3.1.0 (2018-11-02) +================================ + +Incompatible changes +-------------------- +- hints.use_nodata(true) by default; that's what most users want +- libknot >= 2.7.2 is required + +Improvements +------------ +- cache: handle out-of-space SIGBUS slightly better (#197) +- daemon: improve TCP timeout handling (!686) + +Bugfixes +-------- +- cache.clear('name'): fix some edge cases in API (#401) +- fix error handling from TLS writes (!669) +- avoid SERVFAILs due to certain kind of NS dependency cycles (#374) + + Knot Resolver 3.0.0 (2018-08-20) ================================ diff -Nru knot-resolver-3.0.0/README.md knot-resolver-3.1.0/README.md --- knot-resolver-3.0.0/README.md 2018-08-15 15:58:21.000000000 +0000 +++ knot-resolver-3.1.0/README.md 2018-11-02 15:29:58.000000000 +0000 @@ -1,7 +1,7 @@ # Knot Resolver -[![Build Status](https://gitlab.labs.nic.cz/knot/knot-resolver/badges/master/pipeline.svg?x)](https://gitlab.labs.nic.cz/knot/knot-resolver/commits/master) -[![Coverage Status](https://gitlab.labs.nic.cz/knot/knot-resolver/badges/master/coverage.svg?x)](https://knot.pages.labs.nic.cz/knot-resolver/) +[![Build Status](https://gitlab.labs.nic.cz/knot/knot-resolver/badges/nightly/pipeline.svg?x)](https://gitlab.labs.nic.cz/knot/knot-resolver/commits/nightly) +[![Coverage Status](https://gitlab.labs.nic.cz/knot/knot-resolver/badges/nightly/coverage.svg?x)](https://knot.pages.labs.nic.cz/knot-resolver/) [![Coverity](https://img.shields.io/coverity/scan/3912.svg)](https://scan.coverity.com/projects/3912) [![Documentation Status](https://readthedocs.org/projects/knot-resolver/badge/?version=latest)](https://readthedocs.org/projects/knot-resolver/?badge=latest) diff -Nru knot-resolver-3.0.0/scripts/bootstrap-depends.sh knot-resolver-3.1.0/scripts/bootstrap-depends.sh --- knot-resolver-3.0.0/scripts/bootstrap-depends.sh 2018-08-17 16:32:40.000000000 +0000 +++ knot-resolver-3.1.0/scripts/bootstrap-depends.sh 2018-11-02 15:29:58.000000000 +0000 @@ -7,7 +7,7 @@ CMOCKA_URL="git://git.cryptomilk.org/projects/cmocka.git" LIBUV_TAG="v1.18.0" LIBUV_URL="https://github.com/libuv/libuv.git" -KNOT_TAG="v2.7.1" +KNOT_TAG="v2.7.2" KNOT_URL="https://github.com/CZ-NIC/knot.git" GMP_TAG="6.1.1" # GMP 6.1.2 is broken on Travis-CI GMP_URL="https://gmplib.org/download/gmp/gmp-${GMP_TAG}.tar.xz" diff -Nru knot-resolver-3.0.0/tests/deckard/conftest.py knot-resolver-3.1.0/tests/deckard/conftest.py --- knot-resolver-3.0.0/tests/deckard/conftest.py 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/conftest.py 2018-09-03 13:11:50.000000000 +0000 @@ -89,13 +89,26 @@ return scenario_list +def rpls(paths): + for path in paths: + if os.path.isfile(path): + filelist = [path] # path to single file, accept it + else: + filelist = sorted(glob.glob(os.path.join(path, "*.rpl"))) + + return filelist + + def pytest_addoption(parser): parser.addoption("--config", action="append", help="path to Deckard configuration .yaml file") parser.addoption("--scenarios", action="append", help="directory with .rpl files") def pytest_generate_tests(metafunc): - """This is pytest weirdness to parametrize the test over all the *.rpl files.""" + """This is pytest weirdness to parametrize the test over all the *.rpl files. + See https://docs.pytest.org/en/latest/parametrize.html#basic-pytest-generate-tests-example + for more info.""" + if 'scenario' in metafunc.fixturenames: if metafunc.config.option.config is None: configs = [] @@ -108,3 +121,6 @@ paths = metafunc.config.option.scenarios metafunc.parametrize("scenario", scenarios(paths, configs), ids=str) + if 'rpl_path' in metafunc.fixturenames: + paths = metafunc.config.option.scenarios + metafunc.parametrize("rpl_path", rpls(paths), ids=str) diff -Nru knot-resolver-3.0.0/tests/deckard/contrib/libswrap/src/socket_wrapper.c knot-resolver-3.1.0/tests/deckard/contrib/libswrap/src/socket_wrapper.c --- knot-resolver-3.0.0/tests/deckard/contrib/libswrap/src/socket_wrapper.c 2018-07-02 13:21:47.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/contrib/libswrap/src/socket_wrapper.c 2018-09-03 13:11:50.000000000 +0000 @@ -1776,17 +1776,17 @@ static const char *swrap_pcap_init_file(void) { - static int initialized = 0; static const char *s = NULL; static const struct swrap_file_hdr h; static const struct swrap_packet_frame f; static const union swrap_packet_ip i; static const union swrap_packet_payload p; - if (initialized == 1) { - return s; - } - initialized = 1; + // if (initialized == 1) { + // printf("return: 1\n"); + // return s; + // } + // initialized = 1; /* * TODO: don't use the structs use plain buffer offsets @@ -2071,9 +2071,9 @@ static int swrap_pcap_get_fd(const char *fname) { - static int fd = -1; + int fd = -1; - if (fd != -1) return fd; + // if (fd != -1) return fd; fd = libc_open(fname, O_WRONLY|O_CREAT|O_EXCL|O_APPEND, 0644); if (fd != -1) { @@ -2400,11 +2400,12 @@ fd = swrap_pcap_get_fd(file_name); if (fd != -1) { if (write(fd, packet, packet_len) != (ssize_t)packet_len) { + close(fd); free(packet); return; } } - + close(fd); free(packet); } diff -Nru knot-resolver-3.0.0/tests/deckard/deckard.py knot-resolver-3.1.0/tests/deckard/deckard.py --- knot-resolver-3.0.0/tests/deckard/deckard.py 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/deckard.py 2018-09-03 13:11:50.000000000 +0000 @@ -10,6 +10,7 @@ import tempfile import time +import dpkt import jinja2 from pydnstest import scenario, testserver @@ -21,6 +22,10 @@ TRUST_ANCHOR_SUBDIR = 'ta' +class DeckardUnderLoadError(Exception): + pass + + class IfaceManager(object): """ Network interface allocation manager @@ -322,6 +327,21 @@ return daemons +def check_for_icmp(): + """ Checks Deckards's PCAP for ICMP packets """ + path = os.environ["SOCKET_WRAPPER_PCAP_FILE"] + with open(path, "rb") as f: + pcap = dpkt.pcap.Reader(f) + for _, packet in pcap: + try: + ip = dpkt.ip.IP(packet) + except dpkt.dpkt.UnpackError: + ip = dpkt.ip6.IP6(packet) + if isinstance(ip.data, dpkt.icmp.ICMP) or isinstance(ip.data, dpkt.icmp6.ICMP6): + return True + return False + + def run_testcase(daemons, case, root_addr, addr_family, prog_under_test_ip): """Run actual test and raise exception if the test failed""" server = testserver.TestServer(case, root_addr, addr_family) @@ -344,4 +364,11 @@ % (daemon['cfg']['name'], daemon['proc'].returncode)) # Do not clear files if the server crashed (for analysis) if server.undefined_answers > 0: + # Deckard's responses to resolvers might be delayed due to load which + # leads the resolver to close the port and to the test failing in the + # end. We partially detect these by checking the PCAP for ICMP packets. + if check_for_icmp(): + logging.error("Deckard is under load.\ +Other errors might be false negatives.\ +Consider retrying the job later.") raise ValueError('the scenario does not define all necessary answers (see error log)') diff -Nru knot-resolver-3.0.0/tests/deckard/deckard_pytest.ini knot-resolver-3.1.0/tests/deckard/deckard_pytest.ini --- knot-resolver-3.0.0/tests/deckard/deckard_pytest.ini 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/deckard_pytest.ini 2018-09-03 13:11:50.000000000 +0000 @@ -1,4 +1,6 @@ [pytest] -log_print = False +log_print = true python_files=deckard_pytest.py norecursedirs=* +log_cli=true + diff -Nru knot-resolver-3.0.0/tests/deckard/doc/scenario_guide.rst knot-resolver-3.1.0/tests/deckard/doc/scenario_guide.rst --- knot-resolver-3.0.0/tests/deckard/doc/scenario_guide.rst 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/doc/scenario_guide.rst 2018-09-03 13:11:50.000000000 +0000 @@ -223,16 +223,14 @@ - *expected* message ``RCODE`` is defined by ``REPLY`` keyword -question whole QUESTION section [sectmatch]_ +question equivalent to ``qtype qname`` answer whole ANSWER section [sectmatch]_ authority whole AUTHORITY section [sectmatch]_ additional whole ADDITIONAL section [sectmatch]_ edns EDNS `version `_ and EDNS `payload `_ size nsid `NSID `_ presence and value -all equivalent to ``flags`` + ``rcode`` + all sections explicitly defined in the ``ENTRY`` - - - sections present in the *received* message but not explicitly defined in the *expected* entry are ignored +all equivalent to ``opcode qtype qname flags rcode answer authority additional`` ============ ========================================================================================= .. [qmatch] *Expected* values are defined by QUESTION section in the entry. If the *expected* QUESTION section is empty, the conditions is ignored. Only values from the first (qname, qclass, qtype) tuple are checked. Question matching is case insensitive (except for ``qcase``). @@ -313,9 +311,7 @@ ========== =========================================================================================== feature default value ========== =========================================================================================== -ADJUST copy_id EDNS version 0 with buffer size 4096 B -MATCH opcode, qtype, qname REPLY QUERY, NOERROR ========== =========================================================================================== diff -Nru knot-resolver-3.0.0/tests/deckard/.gitlab-ci.yml knot-resolver-3.1.0/tests/deckard/.gitlab-ci.yml --- knot-resolver-3.0.0/tests/deckard/.gitlab-ci.yml 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/.gitlab-ci.yml 2018-09-03 13:11:50.000000000 +0000 @@ -1,4 +1,4 @@ -image: $CI_REGISTRY/knot/knot-resolver/ci:debian-stable +image: $CI_REGISTRY/knot/knot-resolver/ci/debian-stable:knot-2.7 variables: LC_ALL: C.UTF-8 diff -Nru knot-resolver-3.0.0/tests/deckard/Makefile knot-resolver-3.1.0/tests/deckard/Makefile --- knot-resolver-3.0.0/tests/deckard/Makefile 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/Makefile 2018-09-03 13:11:50.000000000 +0000 @@ -32,7 +32,8 @@ @echo "To build the dependencies (libfaketime and libcwrap) run 'make depend'." exit 1 depend: $(libfaketime) $(libcwrap) - @echo "export $(preload_syms)" > env.sh + @echo "export DONT_FAKE_MONOTONIC=1" > env.sh + @echo "export $(preload_syms)" >> env.sh # Synchronize submodules submodules: .gitmodules diff -Nru knot-resolver-3.0.0/tests/deckard/pydnstest/deckard.aug knot-resolver-3.1.0/tests/deckard/pydnstest/deckard.aug --- knot-resolver-3.0.0/tests/deckard/pydnstest/deckard.aug 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/pydnstest/deckard.aug 2018-09-03 13:11:50.000000000 +0000 @@ -11,7 +11,7 @@ let comment = del /[;]/ ";" . [label "comment" . store /[^\n]+/] let eol = del /([ \t]*([;][^\n]*)?\n)+/ "\n" . Util.indent -let comment_or_eol = ws . comment? . del_str "\n" . del /([ \t]*([;][^\n]*)?\n)*/ "\n" . Util.indent +let comment_or_eol = ws . comment? . del_str "\n" . del /([ \t]*([;][^\n]*)?\n)*/ "" . Util.indent (*let comment_or_eol = [ label "#comment" . counter "comment" . (ws . [del /[;#]/ ";" . label "" . store /[^\n]*/ ]? . del_str "\n")]+ . Util.indent @@ -32,7 +32,7 @@ let hex_re = /[0-9a-fA-F]+/ -let match_option = "opcode" | "qtype" | "qcase" | "qname" | "subdomain" | "flags" | "rcode" | "question" | "answer" | "authority" | "additional" | "all" | "TCP" | "ttl" +let match_option = "opcode" | "qtype" | "qcase" | "qname" | "subdomain" | "flags" | "rcode" | "question" | "answer" | "authority" | "additional" | "all" | "edns" let adjust_option = "copy_id" | "copy_query" | "raw_id" let reply_option = "QR" | "TC" | "AA" | "AD" | "RD" | "RA" | "CD" | "DO" | "NOERROR" | "FORMERR" | "SERVFAIL" | "NXDOMAIN" | "NOTIMP" | "REFUSED" | "YXDOMAIN" | "YXRRSET" | "NXRRSET" | "NOTAUTH" | "NOTZONE" | "BADVERS" | "BADSIG" | "BADKEY" | "BADTIME" | "BADMODE" | "BADNAME" | "BADALG" | "BADTRUNC" | "BADCOOKIE" let step_option = "REPLY" | "QUERY" | "CHECK_ANSWER" | "CHECK_OUT_QUERY" | /TIME_PASSES[ \t]+ELAPSE/ @@ -40,7 +40,7 @@ let mandatory = [del_str "MANDATORY" . label "mandatory" . value "true" . comment_or_eol] let tsig = [del_str "TSIG" . label "tsig" . space . [label "keyname" . store word] . space . [label "secret" . store word] . comment_or_eol] -let match = (mandatory | tsig)* . del_str "MATCH" . [space . label "match" . store match_option ]+ . comment_or_eol +let match = (mandatory | tsig)* . [ label "match_present" . value "true" . del_str "MATCH" ] . [space . label "match" . store match_option ]+ . comment_or_eol let adjust = (mandatory | tsig)* . del_str "ADJUST" . [space . label "adjust" . store adjust_option ]+ . comment_or_eol let reply = (mandatory | tsig)* . del ("REPLY" | "FLAGS") "REPLY" . [space . label "reply" . store reply_option ]+ . comment_or_eol diff -Nru knot-resolver-3.0.0/tests/deckard/pydnstest/matchpart.py knot-resolver-3.1.0/tests/deckard/pydnstest/matchpart.py --- knot-resolver-3.0.0/tests/deckard/pydnstest/matchpart.py 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/pydnstest/matchpart.py 2018-10-24 11:29:13.000000000 +0000 @@ -98,26 +98,51 @@ raise DataMismatch(exp_types, got_types) +def check_question(question): + if len(question) > 2: + raise NotImplementedError("More than one record in QUESTION SECTION.") + + def match_opcode(exp, got): return compare_val(exp.opcode(), got.opcode()) def match_qtype(exp, got): - if not exp.question: + check_question(exp.question) + check_question(got.question) + if not exp.question and not got.question: return True + if not exp.question: + raise DataMismatch("", got.question[0].rdtype) + if not got.question: + raise DataMismatch(exp.question[0].rdtype, "") return compare_val(exp.question[0].rdtype, got.question[0].rdtype) def match_qname(exp, got): - if not exp.question: + check_question(exp.question) + check_question(got.question) + if not exp.question and not got.question: return True + if not exp.question: + raise DataMismatch("", got.question[0].name) + if not got.question: + raise DataMismatch(exp.question[0].name, "") return compare_val(exp.question[0].name, got.question[0].name) def match_qcase(exp, got): + check_question(exp.question) + check_question(got.question) + if not exp.question and not got.question: + return True + if not exp.question: + raise DataMismatch("", got.question[0].name.labels) + if not got.question: + raise DataMismatch(exp.question[0].name.labels, "") return compare_val(exp.question[0].name.labels, got.question[0].name.labels) @@ -125,7 +150,10 @@ def match_subdomain(exp, got): if not exp.question: return True - qname = dns.name.from_text(got.question[0].name.to_text().lower()) + if got.question: + qname = got.question[0].name + else: + qname = dns.name.root if exp.question[0].name.is_superdomain(qname): return True raise DataMismatch(exp, got) @@ -141,21 +169,11 @@ dns.rcode.to_text(got.rcode())) -def match_question(exp, got): - return compare_rrs(exp.question, - got.question) - - def match_answer(exp, got): return compare_rrs(exp.answer, got.answer) -def match_ttl(exp, got): - return compare_rrs(exp.answer, - got.answer) - - def match_answertypes(exp, got): return compare_rrs_types(exp.answer, got.answer, skip_rrsigs=True) @@ -207,9 +225,9 @@ MATCH = {"opcode": match_opcode, "qtype": match_qtype, "qname": match_qname, "qcase": match_qcase, "subdomain": match_subdomain, "flags": match_flags, "rcode": match_rcode, - "question": match_question, "answer": match_answer, "ttl": match_ttl, - "answertypes": match_answertypes, "answerrrsigs": match_answerrrsigs, - "authority": match_authority, "additional": match_additional, "edns": match_edns, + "answer": match_answer, "answertypes": match_answertypes, + "answerrrsigs": match_answerrrsigs, "authority": match_authority, + "additional": match_additional, "edns": match_edns, "nsid": match_nsid} diff -Nru knot-resolver-3.0.0/tests/deckard/pydnstest/scenario.py knot-resolver-3.1.0/tests/deckard/pydnstest/scenario.py --- knot-resolver-3.0.0/tests/deckard/pydnstest/scenario.py 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/pydnstest/scenario.py 2018-09-03 13:11:50.000000000 +0000 @@ -155,26 +155,17 @@ self.fired = 0 # RAW - try: - self.raw_data = binascii.unhexlify(node["/raw"].value) - self.is_raw_data_entry = True - except KeyError: - self.raw_data = None - self.is_raw_data_entry = False + self.raw_data = None + self.is_raw_data_entry = self.process_raw() # MATCH - self.match_fields = [m.value for m in node.match("/match")] - - if not self.match_fields: - self.match_fields = ['opcode', 'qtype', 'qname'] + self.match_fields = self.process_match() # FLAGS - self.process_reply_line(node) + self.process_reply_line() # ADJUST - self.adjust_fields = [m.value for m in node.match("/adjust")] - if not self.adjust_fields: - self.adjust_fields = ['copy_id'] + self.adjust_fields = {m.value for m in node.match("/adjust")} # MANDATORY try: @@ -183,8 +174,53 @@ self.mandatory = None # TSIG + self.process_tsig() + + # SECTIONS & RECORDS + self.sections = self.process_sections() + + def process_raw(self): + try: + self.raw_data = binascii.unhexlify(self.node["/raw"].value) + return True + except KeyError: + return False + + def process_match(self): + try: + self.node["/match_present"] + except KeyError: + return None + + fields = set(m.value for m in self.node.match("/match")) + + if 'all' in fields: + fields.remove("all") + fields |= set(["opcode", "qtype", "qname", "flags", + "rcode", "answer", "authority", "additional"]) + + if 'question' in fields: + fields.remove("question") + fields |= set(["qtype", "qname"]) + + return fields + + def process_reply_line(self): + """Extracts flags, rcode and opcode from given node and adjust dns message accordingly""" + self.fields = [f.value for f in self.node.match("/reply")] + if 'DO' in self.fields: + self.message.want_dnssec(True) + opcode = self.get_opcode(fields=self.fields) + rcode = self.get_rcode(fields=self.fields) + self.message.flags = self.get_flags(fields=self.fields) + if rcode is not None: + self.message.set_rcode(rcode) + if opcode is not None: + self.message.set_opcode(opcode) + + def process_tsig(self): try: - tsig = list(node.match("/tsig"))[0] + tsig = list(self.node.match("/tsig"))[0] tsig_keyname = tsig["/keyname"].value tsig_secret = tsig["/secret"].value keyring = dns.tsigkeyring.from_text({tsig_keyname: tsig_secret}) @@ -192,11 +228,11 @@ except (KeyError, IndexError): pass - # SECTIONS & RECORDS - self.sections = [] - for section in node.match("/section/*"): + def process_sections(self): + sections = set() + for section in self.node.match("/section/*"): section_name = posixpath.basename(section.path) - self.sections.append(section_name) + sections.add(section_name) for record in section.match("/record"): owner = record['/domain'].value if not owner.endswith("."): @@ -229,6 +265,7 @@ self.message.authority.append(rr) elif section_name == 'additional': self.message.additional.append(rr) + return sections def __str__(self): txt = 'ENTRY_BEGIN\n' @@ -258,19 +295,6 @@ txt += 'ENTRY_END\n' return txt - def process_reply_line(self, node): - """Extracts flags, rcode and opcode from given node and adjust dns message accordingly""" - self.fields = [f.value for f in node.match("/reply")] - if 'DO' in self.fields: - self.message.want_dnssec(True) - opcode = self.get_opcode(fields=self.fields) - rcode = self.get_rcode(fields=self.fields) - self.message.flags = self.get_flags(fields=self.fields) - if rcode is not None: - self.message.set_rcode(rcode) - if opcode is not None: - self.message.set_opcode(opcode) - @classmethod def get_flags(cls, fields): """From `fields` extracts and returns flags""" @@ -321,11 +345,7 @@ def match(self, msg): """ Compare scripted reply to given message based on match criteria. """ - match_fields = self.match_fields - if 'all' in match_fields: - match_fields.remove('all') - match_fields += ['flags'] + ['rcode'] + self.sections - for code in match_fields: + for code in self.match_fields: try: pydnstest.matchpart.match_part(self.message, msg, code) except pydnstest.matchpart.DataMismatch as ex: diff -Nru knot-resolver-3.0.0/tests/deckard/pydnstest/testserver.py knot-resolver-3.1.0/tests/deckard/pydnstest/testserver.py --- knot-resolver-3.0.0/tests/deckard/pydnstest/testserver.py 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/pydnstest/testserver.py 2018-09-03 13:11:50.000000000 +0000 @@ -5,7 +5,7 @@ import logging import os import signal -import select +import selectors import socket import sys import threading @@ -13,6 +13,7 @@ import dns.message import dns.rdatatype +import dpkt from pydnstest import scenario @@ -126,23 +127,30 @@ if not self.active: break objects = self.srv_socks + self.connections - to_read, _, to_error = select.select(objects, [], objects, 0.1) - for sock in to_read: - if sock in self.srv_socks: - if sock.proto == socket.IPPROTO_TCP: - conn, _ = sock.accept() - self.connections.append(conn) + sel = selectors.DefaultSelector() + for obj in objects: + sel.register(obj, selectors.EVENT_READ) + items = sel.select(0.1) + for key, event in items: + sock = key.fileobj + if event & selectors.EVENT_READ: + if sock in self.srv_socks: + if sock.proto == socket.IPPROTO_TCP: + conn, _ = sock.accept() + self.connections.append(conn) + else: + self.handle_query(sock) + elif sock in self.connections: + if not self.handle_query(sock): + sock.close() + self.connections.remove(sock) else: - self.handle_query(sock) - elif sock in self.connections: - if not self.handle_query(sock): - sock.close() - self.connections.remove(sock) + raise Exception( + "[query_io] Socket IO internal error {}, exit" + .format(sock.getsockname())) else: - raise Exception( - "[query_io] Socket IO internal error {}, exit".format(sock.getsockname())) - for sock in to_error: - raise Exception("[query_io] Socket IO error {}, exit".format(sock.getsockname())) + raise Exception("[query_io] Socket IO error {}, exit" + .format(sock.getsockname())) def start_srv(self, address, family, proto=socket.IPPROTO_UDP): """ Starts listening thread if necessary """ diff -Nru knot-resolver-3.0.0/tests/deckard/requirements.txt knot-resolver-3.1.0/tests/deckard/requirements.txt --- knot-resolver-3.0.0/tests/deckard/requirements.txt 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/requirements.txt 2018-09-03 13:11:50.000000000 +0000 @@ -1,6 +1,7 @@ dnspython>=1.15 +dpkt Jinja2>=2.8 PyYAML python-augeas -pytest +pytest>=3.4 pytest-xdist diff -Nru knot-resolver-3.0.0/tests/deckard/rplint.py knot-resolver-3.1.0/tests/deckard/rplint.py --- knot-resolver-3.0.0/tests/deckard/rplint.py 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/rplint.py 2018-10-24 11:29:13.000000000 +0000 @@ -5,6 +5,7 @@ import itertools import os import sys +from typing import Any, Callable, Iterable, Iterator, Optional, List, Union, Set import dns.name @@ -12,6 +13,8 @@ import pydnstest.matchpart import pydnstest.scenario +Element = Union["Entry", "Step", pydnstest.scenario.Range] + RCODES = {"NOERROR", "FORMERR", "SERVFAIL", "NXDOMAIN", "NOTIMP", "REFUSED", "YXDOMAIN", "YXRRSET", "NXRRSET", "NOTAUTH", "NOTZONE", "BADVERS", "BADSIG", "BADKEY", "BADTIME", "BADMODE", "BADNAME", "BADALG", "BADTRUNC", "BADCOOKIE"} @@ -19,15 +22,24 @@ SECTIONS = {"question", "answer", "authority", "additional"} -def get_line_number(file, char_number): +class RplintError(ValueError): + def __init__(self, fails): + msg = "" + for fail in fails: + msg += str(fail) + "\n" + super().__init__(msg) + + +def get_line_number(file: str, char_number: int) -> int: pos = 0 for number, line in enumerate(open(file)): pos += len(line) if pos >= char_number: return number + 2 + return 0 -def is_empty(iterable): +def is_empty(iterable: Iterator[Any]) -> bool: try: next(iterable) except StopIteration: @@ -36,7 +48,7 @@ class Entry: - def __init__(self, node): + def __init__(self, node: pydnstest.augwrap.AugeasNode) -> None: self.match = {m.value for m in node.match("/match")} self.adjust = {a.value for a in node.match("/adjust")} self.authority = list(node.match("/section/authority/record")) @@ -46,17 +58,35 @@ class Step: - def __init__(self, node): + def __init__(self, node: pydnstest.augwrap.AugeasNode) -> None: self.node = node self.type = node["/type"].value try: - self.entry = Entry(node["/entry"]) + self.entry = Entry(node["/entry"]) # type: Optional[Entry] except KeyError: self.entry = None -class Test: - def __init__(self, path): +class RplintFail: + def __init__(self, test: "RplintTest", + element: Optional[Element] = None, + etc: str = "") -> None: + self.path = test.path + self.element = element # type: Optional[Element] + self.line = get_line_number(self.path, element.node.char if element is not None else 0) + self.etc = etc + self.check = None # type: Optional[Callable[[RplintTest], List[RplintFail]]] + + def __str__(self): + if self.etc: + return "{}:{} {}: {} ({})".format(os.path.basename(self.path), self.line, + self.check.__name__, self.check.__doc__, self.etc) + return "{}:{} {}: {}".format(os.path.basename(self.path), self.line, self.check.__name__, + self.check.__doc__) + + +class RplintTest: + def __init__(self, path: str) -> None: aug = pydnstest.augwrap.AugeasWrapper(confpath=os.path.realpath(path), lens='Deckard', loadpath=os.path.join(os.path.dirname(__file__), @@ -73,41 +103,61 @@ self.ranges = [pydnstest.scenario.Range(n) for n in self.node.match("/scenario/range")] - self.checks = [entry_more_than_one_rcode, entry_no_qname_qtype_copy_query, - entry_ns_in_authority, range_overlapping_ips, range_shadowing_match_rules, - step_check_answer_no_match, step_query_match, step_section_unchecked, - step_unchecked_match, step_unchecked_rcode, test_ad_or_rrsig_no_ta, - test_timestamp, test_trust_anchor_trailing_period_missing, - step_duplicate_id] - - def print_results(self): - failed = False + self.fails = None # type: Optional[List[RplintFail]] + self.checks = [ + entry_more_than_one_rcode, + entry_no_qname_qtype_copy_query, + # Commented out for now until we implement selective turning off of checks + # entry_ns_in_authority, + range_overlapping_ips, + range_shadowing_match_rules, + step_check_answer_no_match, + step_query_match, + step_section_unchecked, + step_unchecked_match, + step_unchecked_rcode, + scenario_ad_or_rrsig_no_ta, + scenario_timestamp, + config_trust_anchor_trailing_period_missing, + step_duplicate_id, + ] + + def run_checks(self) -> bool: + """returns True iff all tests passed""" + self.fails = [] for check in self.checks: fails = check(self) - if fails and not failed: - print(self.path) - failed = True for fail in fails: - pos = get_line_number(self.path, fail) - print("\t line " + str(pos), check.__doc__) + fail.check = check + self.fails += fails + + if self.fails == []: + return True + return False + def print_fails(self) -> None: + if self.fails is None: + raise RuntimeError("Maybe you should run some test first…") + for fail in self.fails: + print(fail) -def test_trust_anchor_trailing_period_missing(test): + +def config_trust_anchor_trailing_period_missing(test: RplintTest) -> List[RplintFail]: """Trust-anchor option in configuration contains domain without trailing period""" for conf in test.config: if conf[0] == "trust-anchor": if conf[1].split()[0][-1] != ".": - return [0] + return [RplintFail(test, etc=conf[1])] return [] -def test_timestamp(test): +def scenario_timestamp(test: RplintTest) -> List[RplintFail]: """RRSSIG record present in test but no val-override-date or val-override-timestamp in config""" rrsigs = [] for entry in test.entries: for record in entry.records: if record["/type"].value == "RRSIG": - rrsigs.append(record.char) + rrsigs.append(RplintFail(test, entry)) if rrsigs: for k in test.config: if k[0] == "val-override-date" or k[0] == "val-override-timestamp": @@ -115,46 +165,47 @@ return rrsigs -def entry_no_qname_qtype_copy_query(test): +def entry_no_qname_qtype_copy_query(test: RplintTest) -> List[RplintFail]: """ENTRY without qname and qtype in MATCH and without copy_query in ADJUST""" fails = [] for entry in test.range_entries: - if "qname" not in entry.match or "qtype" not in entry.match: + if "question" not in entry.match and ("qname" not in entry.match or + "qtype" not in entry.match): if "copy_query" not in entry.adjust: - fails.append(entry.node.char) + fails.append(RplintFail(test, entry)) return fails -def entry_ns_in_authority(test): +def entry_ns_in_authority(test: RplintTest) -> List[RplintFail]: """ENTRY has authority section with NS records, consider using MATCH subdomain""" fails = [] for entry in test.range_entries: if entry.authority and "subdomain" not in entry.match: for record in entry.authority: if record["/type"].value == "NS": - fails.append(entry.node.char) + fails.append(RplintFail(test, entry)) return fails -def entry_more_than_one_rcode(test): +def entry_more_than_one_rcode(test: RplintTest) -> List[RplintFail]: """ENTRY has more than one rcode in MATCH""" fails = [] for entry in test.entries: if len(RCODES & entry.reply) > 1: - fails.append(entry.node.char) + fails.append(RplintFail(test, entry)) return fails -def test_ad_or_rrsig_no_ta(test): +def scenario_ad_or_rrsig_no_ta(test: RplintTest) -> List[RplintFail]: """AD or RRSIG present in test but no trust-anchor present in config""" dnssec = [] for entry in test.entries: if "AD" in entry.reply or "AD" in entry.match: - dnssec.append(entry.node.char) + dnssec.append(RplintFail(test, entry)) else: for record in entry.records: if record["/type"].value == "RRSIG": - dnssec.append(entry.node.char) + dnssec.append(RplintFail(test, entry)) if dnssec: for k in test.config: @@ -163,93 +214,92 @@ return dnssec -def step_query_match(test): +def step_query_match(test: RplintTest) -> List[RplintFail]: """STEP QUERY has a MATCH rule""" - return [step.node.char for step in test.steps if step.type == "QUERY" and step.entry.match] + return [RplintFail(test, step) for step in test.steps if step.type == "QUERY" and + step.entry and step.entry.match] -def step_check_answer_no_match(test): +def step_check_answer_no_match(test: RplintTest) -> List[RplintFail]: """ENTRY in STEP CHECK_ANSWER has no MATCH rule""" - return [step.entry.node.char for step in test.steps if step.type == "CHECK_ANSWER" - and not step.entry.match] + return [RplintFail(test, step) for step in test.steps if step.type == "CHECK_ANSWER" and + step.entry and not step.entry.match] -def step_unchecked_rcode(test): +def step_unchecked_rcode(test: RplintTest) -> List[RplintFail]: """ENTRY specifies rcode but STEP MATCH does not check for it.""" fails = [] for step in test.steps: - if step.type == "CHECK_ANSWER" and "all" not in step.entry.match: + if step.type == "CHECK_ANSWER" and step.entry and "all" not in step.entry.match: if step.entry.reply & RCODES and "rcode" not in step.entry.match: - fails.append(step.entry.node.char) + fails.append(RplintFail(test, step.entry)) return fails -def step_unchecked_match(test): +def step_unchecked_match(test: RplintTest) -> List[RplintFail]: """ENTRY specifies flags but MATCH does not check for them""" fails = [] for step in test.steps: if step.type == "CHECK_ANSWER": entry = step.entry - if "all" not in entry.match and entry.reply - RCODES and "flags" not in entry.match: - fails.append(entry.node.char) + if entry and "all" not in entry.match and entry.reply - RCODES and \ + "flags" not in entry.match: + fails.append(RplintFail(test, entry, str(entry.reply - RCODES))) return fails -def step_section_unchecked(test): +def step_section_unchecked(test: RplintTest) -> List[RplintFail]: """ENTRY has non-empty sections but MATCH does not check for all of them""" fails = [] for step in test.steps: - if step.type == "CHECK_ANSWER" and "all" not in step.entry.match: + if step.type == "CHECK_ANSWER" and step.entry and "all" not in step.entry.match: for section in SECTIONS: if not is_empty(step.node.match("/entry/section/" + section + "/*")): if section not in step.entry.match: - fails.append(step.entry.node.char) + fails.append(RplintFail(test, step.entry, section)) return fails -def range_overlapping_ips(test): +def range_overlapping_ips(test: RplintTest) -> List[RplintFail]: """RANGE has common IPs with some previous overlapping RANGE""" fails = [] for r1, r2 in itertools.combinations(test.ranges, 2): # If the ranges overlap if min(r1.b, r2.b) >= max(r1.a, r2.a): if r1.addresses & r2.addresses: - fails.append(r2.node.char) + info = "previous range on line %d" % get_line_number(test.path, r1.node.char) + fails.append(RplintFail(test, r2, info)) return fails -def range_shadowing_match_rules(test): - """ENTRY has no effect since one of previous entries has broader match rules""" +def range_shadowing_match_rules(test: RplintTest) -> List[RplintFail]: + """ENTRY has no effect since one of previous entries has the same or broader match rules""" fails = [] for r in test.ranges: for e1, e2 in itertools.combinations(r.stored, 2): - match1 = set(e1.match_fields) - match2 = set(e2.match_fields) - msg1 = e1.message - msg2 = e2.message - if match1 >= match2: - with suppress(pydnstest.matchpart.DataMismatch): - if pydnstest.matchpart.compare_rrs(msg1.question, msg2.question): - fails.append(e2.node.char) - if "subdomain" in match1: - if msg1.question[0].name.is_superdomain(msg2.question[0].name): - match1.discard("subdomain") - match2.discard("subdomain") - if match1 >= match2: - msg1.question[0].name = dns.name.Name("") - msg2.question[0].name = dns.name.Name("") - with suppress(pydnstest.matchpart.DataMismatch): - if pydnstest.matchpart.compare_rrs(msg1.question, msg2.question): - fails.append(e2.node.char) + try: + e1.match(e2.message) + except ValueError: + pass + else: + info = "previous entry on line %d" % get_line_number(test.path, e1.node.char) + if e1.match_fields > e2.match_fields: + continue + if "subdomain" not in e1.match_fields and "subdomain" in e2.match_fields: + continue + fails.append(RplintFail(test, e2, info)) return fails -def step_duplicate_id(test): +def step_duplicate_id(test: RplintTest) -> List[RplintFail]: """STEP has the same ID as one of previous ones""" fails = [] - for step1, step2 in itertools.combinations(test.steps, 2): - if step1.node.value == step2.node.value: - fails.append(step2.node.char) + step_numbers = set() # type: Set[int] + for step in test.steps: + if step.node.value in step_numbers: + fails.append(RplintFail(test, step)) + else: + step_numbers.add(step.node.value) return fails @@ -258,12 +308,28 @@ # if "copy_id" not in adjust: # entry_error(test, entry, "copy_id should be in ADJUST") +def test_run_rplint(rpl_path: str) -> None: + t = RplintTest(rpl_path) + passed = t.run_checks() + if not passed: + raise RplintError(t.fails) + + if __name__ == '__main__': - tests_path = sys.argv[1] - if tests_path.endswith(".rpl"): - t = Test(tests_path) - t.print_results() - else: - for file_path in sorted(glob.glob(os.path.join(tests_path, "*.rpl"))): - t = Test(file_path) - t.print_results() + try: + test_path = sys.argv[1] + except IndexError: + print("usage: %s " % sys.argv[0]) + sys.exit(2) + if not os.path.isfile(test_path): + print("rplint.py works on single file only.") + print("Use rplint.sh with --scenarios= to run on rpls.") + sys.exit(2) + print("Linting %s" % test_path) + t = RplintTest(test_path) + passed = t.run_checks() + t.print_fails() + + if passed: + sys.exit(0) + sys.exit(1) diff -Nru knot-resolver-3.0.0/tests/deckard/rplint_pytest.ini knot-resolver-3.1.0/tests/deckard/rplint_pytest.ini --- knot-resolver-3.0.0/tests/deckard/rplint_pytest.ini 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/rplint_pytest.ini 2018-09-03 13:11:50.000000000 +0000 @@ -0,0 +1,4 @@ +[pytest] +log_print = False +python_files=rplint.py +norecursedirs=* diff -Nru knot-resolver-3.0.0/tests/deckard/rplint.sh knot-resolver-3.1.0/tests/deckard/rplint.sh --- knot-resolver-3.0.0/tests/deckard/rplint.sh 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/rplint.sh 2018-09-03 13:11:50.000000000 +0000 @@ -0,0 +1,5 @@ +#!/bin/bash +set -x +set -o errexit -o nounset +MAKEDIR="$(dirname "$0")" +python3 -m pytest -c "${MAKEDIR}/rplint_pytest.ini" ${TESTS:+"--scenarios=${TESTS}"} "$@" diff -Nru knot-resolver-3.0.0/tests/deckard/run.sh knot-resolver-3.1.0/tests/deckard/run.sh --- knot-resolver-3.0.0/tests/deckard/run.sh 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/run.sh 2018-09-03 13:11:50.000000000 +0000 @@ -9,4 +9,4 @@ # compatibility with old TESTS= env variable # add --scenarios= only if the variable TESTS is non-empty -python3 -m pytest -c "${MAKEDIR}/deckard_pytest.ini" "${MAKEDIR}" ${DECKARDFLAGS:-} ${TESTS:+"--scenarios=${TESTS}"} "$@" +python3 -m pytest -c "${MAKEDIR}/deckard_pytest.ini" --tb=short -q ${VERBOSE:-"--log-level=40"} ${VERBOSE:+"--log-level=10"} "${MAKEDIR}" ${DECKARDFLAGS:-} ${TESTS:+"--scenarios=${TESTS}"} "$@" diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_badglue.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_badglue.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_badglue.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_badglue.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -49,7 +49,7 @@ ADDRESS 2.2.2.2 ENTRY_BEGIN MATCH opcode qname qtype -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR RD NOERROR SECTION QUESTION com. IN NS diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_badraw.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_badraw.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_badraw.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_badraw.rpl 2018-10-24 11:29:13.000000000 +0000 @@ -286,11 +286,11 @@ b5d3164e5010446209130000000000000000 ENTRY_END -STEP 480 QUERY -ENTRY_BEGIN -RAW -13f6000000010000000000001664696572656e61727473656e6f697374657277696a6b026e6c00000f0001c0 -ENTRY_END +;STEP 480 QUERY +;ENTRY_BEGIN +;RAW +;13f6000000010000000000001664696572656e61727473656e6f697374657277696a6b026e6c00000f0001c0 +;ENTRY_END STEP 490 QUERY ENTRY_BEGIN @@ -448,11 +448,11 @@ 0000000070024000e0de00000204055001010402 ENTRY_END -STEP 750 QUERY -ENTRY_BEGIN -RAW -1f64000000010000000000000e6875676f63617273797374656d73026e6c00000f000100 -ENTRY_END +;STEP 750 QUERY +;ENTRY_BEGIN +;RAW +;1f64000000010000000000000e6875676f63617273797374656d73026e6c00000f000100 +;ENTRY_END STEP 760 QUERY ENTRY_BEGIN @@ -1084,11 +1084,11 @@ b5f2f45c5010fae2f1920000000000000000 ENTRY_END -STEP 1810 QUERY -ENTRY_BEGIN -RAW -076a000000010000000000000e6875676f63617273797374656d73026e6c00000f000100 -ENTRY_END +;STEP 1810 QUERY +;ENTRY_BEGIN +;RAW +;076a000000010000000000000e6875676f63617273797374656d73026e6c00000f000100 +;ENTRY_END STEP 1820 QUERY ENTRY_BEGIN @@ -1570,11 +1570,11 @@ b607bf7f5010fd4e43800000000000000000 ENTRY_END -STEP 2620 QUERY -ENTRY_BEGIN -RAW -0774000000010000000000000b7374617274706167696e61026e6c00000f000100 -ENTRY_END +;STEP 2620 QUERY +;ENTRY_BEGIN +;RAW +;0774000000010000000000000b7374617274706167696e61026e6c00000f000100 +;ENTRY_END STEP 2630 QUERY ENTRY_BEGIN @@ -1672,11 +1672,11 @@ b60b1da65010446218340000000000000000 ENTRY_END -STEP 2790 QUERY -ENTRY_BEGIN -RAW -2bfa01000001000000000000056b6f726e6f026e6c00000f000100 -ENTRY_END +;STEP 2790 QUERY +;ENTRY_BEGIN +;RAW +;2bfa01000001000000000000056b6f726e6f026e6c00000f000100 +;ENTRY_END STEP 2800 QUERY ENTRY_BEGIN @@ -1948,11 +1948,11 @@ b620f85c5018faf073ec00000095ab9c000000010001000000000f313036353135313838393432362d330000f900010f313036353135313838393432362d330000f900ff00000000005903677373096d6963726f736f667403636f6d00403afc88403c4e080003000000364e544c4d535350000100000097b208e0080008002e0000000e000e002000000050484149522d52544d2d4d41494e504841495252544d0000 ENTRY_END -STEP 3250 QUERY -ENTRY_BEGIN -RAW -00780000000100000000000007736d756c776562026e6c00000f0001c0 -ENTRY_END +;STEP 3250 QUERY +;ENTRY_BEGIN +;RAW +;00780000000100000000000007736d756c776562026e6c00000f0001c0 +;ENTRY_END STEP 3260 QUERY ENTRY_BEGIN @@ -2248,11 +2248,11 @@ b6234caa50112da099670000000000000000 ENTRY_END -STEP 3750 QUERY -ENTRY_BEGIN -RAW -17a00000000100000000000009726f7a656e62757267026e6c00000f000100 -ENTRY_END +;STEP 3750 QUERY +;ENTRY_BEGIN +;RAW +;17a00000000100000000000009726f7a656e62757267026e6c00000f000100 +;ENTRY_END STEP 3760 QUERY ENTRY_BEGIN @@ -2548,11 +2548,11 @@ b6392e195018ff0004e90000008fedfc000000010001000000000f313034373937323032303234322d330000f900010f313034373937323032303234322d330000f900ff00000000005303677373096d6963726f736f667403636f6d00403afdf0403c4f700003000000304e544c4d535350000100000097b208e0060006002a0000000a000a0020000000524f4353455256455232524f435655450000 ENTRY_END -STEP 4250 QUERY -ENTRY_BEGIN -RAW -044f00000001000000000000076275726d656573026e6c00000f000100 -ENTRY_END +;STEP 4250 QUERY +;ENTRY_BEGIN +;RAW +;044f00000001000000000000076275726d656573026e6c00000f000100 +;ENTRY_END STEP 4260 QUERY ENTRY_BEGIN @@ -4642,11 +4642,11 @@ b69105ee50114462c2650000000000000000 ENTRY_END -STEP 7740 QUERY -ENTRY_BEGIN -RAW -2c0901000001000000000000056b6f726e6f026e6c00000f000100 -ENTRY_END +;STEP 7740 QUERY +;ENTRY_BEGIN +;RAW +;2c0901000001000000000000056b6f726e6f026e6c00000f000100 +;ENTRY_END STEP 7750 QUERY ENTRY_BEGIN @@ -12688,11 +12688,11 @@ b7bf058350104462e9330000000000000000 ENTRY_END -STEP 21150 QUERY -ENTRY_BEGIN -RAW -2c2a01000001000000000000056b6f726e6f026e6c00000f000100 -ENTRY_END +;STEP 21150 QUERY +;ENTRY_BEGIN +;RAW +;2c2a01000001000000000000056b6f726e6f026e6c00000f000100 +;ENTRY_END STEP 21160 QUERY ENTRY_BEGIN @@ -15826,11 +15826,11 @@ b82b27518010859879ee00000101080a11235f8a0128080f ENTRY_END -STEP 26380 QUERY -ENTRY_BEGIN -RAW -2c3901000001000000000000056b6f726e6f026e6c00000f000100 -ENTRY_END +;STEP 26380 QUERY +;ENTRY_BEGIN +;RAW +;2c3901000001000000000000056b6f726e6f026e6c00000f000100 +;ENTRY_END STEP 26390 QUERY ENTRY_BEGIN @@ -18232,11 +18232,11 @@ b893d5cb5010fef2fb820000000000000000 ENTRY_END -STEP 30390 QUERY -ENTRY_BEGIN -RAW -2c4801000001000000000000056b6f726e6f026e6c00000f000100 -ENTRY_END +;STEP 30390 QUERY +;ENTRY_BEGIN +;RAW +;2c4801000001000000000000056b6f726e6f026e6c00000f000100 +;ENTRY_END STEP 30400 QUERY ENTRY_BEGIN @@ -18670,7 +18670,7 @@ ENTRY_END ; this is the correct answer -STEP 40060 REPLY +STEP 40070 REPLY ENTRY_BEGIN MATCH opcode qtype qname ADJUST copy_id diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_cname_badauth.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_cname_badauth.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_cname_badauth.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_cname_badauth.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -102,6 +102,16 @@ ENTRY_END ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +ncfphywebgtm01-c.ingdirect.com.au. IN AAAA +SECTION AUTHORITY +. SOA bla bla 1 2 3 4 5 +ENTRY_END + +ENTRY_BEGIN MATCH opcode subdomain ADJUST copy_id copy_query REPLY QR AA NOERROR @@ -132,16 +142,6 @@ SECTION AUTHORITY . SOA bla bla 1 2 3 4 5 ENTRY_END - -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -ncfphywebgtm01-c.ingdirect.com.au. IN AAAA -SECTION AUTHORITY -. SOA bla bla 1 2 3 4 5 -ENTRY_END RANGE_END diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_cname_double.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_cname_double.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_cname_double.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_cname_double.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -91,7 +91,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A @@ -135,7 +135,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_cname_nx.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_cname_nx.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_cname_nx.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_cname_nx.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -89,7 +89,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A @@ -133,7 +133,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_cname_qnamecopy.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_cname_qnamecopy.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_cname_qnamecopy.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_cname_qnamecopy.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -35,7 +35,7 @@ ENTRY_BEGIN MATCH opcode subdomain -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION com. IN A @@ -90,7 +90,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A @@ -133,7 +133,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_cycle_noh.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_cycle_noh.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_cycle_noh.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_cycle_noh.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -37,11 +37,11 @@ ENTRY_END ENTRY_BEGIN -MATCH opcode subdomain -ADJUST copy_id copy_query +MATCH opcode qtype qname +ADJUST copy_id REPLY QR NOERROR SECTION QUESTION -net. IN A +ns.example.net. IN AAAA SECTION AUTHORITY net. IN NS e.gtld-servers.net. SECTION ADDITIONAL @@ -49,16 +49,17 @@ ENTRY_END ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id +MATCH opcode subdomain +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION -ns.example.net. IN AAAA +net. IN A SECTION AUTHORITY net. IN NS e.gtld-servers.net. SECTION ADDITIONAL e.gtld-servers.net. IN A 192.12.94.30 ENTRY_END + RANGE_END ; a.gtld-servers.net. @@ -105,7 +106,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A @@ -171,7 +172,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A @@ -246,7 +247,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A @@ -313,7 +314,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_cycle.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_cycle.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_cycle.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_cycle.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -73,11 +73,11 @@ ENTRY_END ENTRY_BEGIN -MATCH opcode subdomain -ADJUST copy_id copy_query +MATCH opcode qtype qname +ADJUST copy_id REPLY QR NOERROR SECTION QUESTION -example.com. IN A +ns.example.com. IN AAAA SECTION AUTHORITY example.com. IN NS ns.example.net. SECTION ADDITIONAL @@ -86,17 +86,18 @@ ENTRY_END ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id +MATCH opcode subdomain +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION -ns.example.com. IN AAAA +example.com. IN A SECTION AUTHORITY example.com. IN NS ns.example.net. SECTION ADDITIONAL ; note this will be scrubbed off ns.example.net. IN A 1.2.3.1 ENTRY_END + RANGE_END ; e.gtld-servers.net. @@ -129,7 +130,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A @@ -173,7 +174,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A @@ -223,8 +224,6 @@ gtld-servers.net. IN SOA . . 0 0 0 0 0 ENTRY_END - - ENTRY_BEGIN MATCH opcode subdomain ADJUST copy_id copy_query @@ -234,19 +233,6 @@ SECTION AUTHORITY example.net. IN NS ns.example.com. SECTION ADDITIONAL -; note this will be scrubbed off -ns.example.com. IN A 1.2.3.2 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR NOERROR -SECTION QUESTION -ns.example.net. IN AAAA -SECTION AUTHORITY -example.net. IN NS ns.example.com. -SECTION ADDITIONAL ; note this will be scrubbed off ns.example.com. IN A 1.2.3.2 ENTRY_END diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_escape_bailiwick.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_escape_bailiwick.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_escape_bailiwick.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_escape_bailiwick.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -44,7 +44,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A @@ -88,7 +88,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_formerr.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_formerr.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_formerr.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_formerr.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -54,7 +54,7 @@ ENTRY_END ; this is the correct answer -STEP 60 REPLY +STEP 70 REPLY ENTRY_BEGIN MATCH opcode qtype qname ADJUST copy_id diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_hint_lame.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_hint_lame.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_hint_lame.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_hint_lame.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -145,7 +145,7 @@ ; recursion happens here. STEP 10 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question REPLY QR RD RA NOERROR SECTION QUESTION www.example.com. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_lame_aaaa.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_lame_aaaa.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_lame_aaaa.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_lame_aaaa.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -142,7 +142,6 @@ ; Now try the A type, which works, and is not LAME. STEP 1 QUERY ENTRY_BEGIN -MATCH TCP REPLY RD SECTION QUESTION example.com. IN A @@ -162,7 +161,6 @@ ; this fails; it is LAME STEP 20 QUERY ENTRY_BEGIN -MATCH TCP REPLY RD SECTION QUESTION example.com. IN AAAA diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_minim_ns.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_minim_ns.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_minim_ns.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_minim_ns.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -71,6 +71,7 @@ ENTRY_BEGIN MATCH opcode +ADJUST copy_id copy_query REPLY QR SERVFAIL ENTRY_END diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_mod.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_mod.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_mod.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_mod.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -48,7 +48,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A @@ -92,7 +92,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_ns_badaa.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_ns_badaa.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_ns_badaa.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_ns_badaa.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -47,7 +47,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A @@ -91,7 +91,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A @@ -133,27 +133,6 @@ a.gtld-servers.net. IN A 192.5.6.30 ENTRY_END - -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -a.gtld-servers.net. IN A -SECTION ANSWER -a.gtld-servers.net. IN A 192.5.6.30 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -a.gtld-servers.net. IN AAAA -SECTION AUTHORITY -. SOA bla bla 1 2 3 4 5 -ENTRY_END - RANGE_END ; a.gtld-servers.net. diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_ns_badglue.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_ns_badglue.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_ns_badglue.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_ns_badglue.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -47,7 +47,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A @@ -156,25 +156,6 @@ x.gtld-servers.net. IN A 192.5.6.31 ENTRY_END -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -a.gtld-servers.net. IN A -SECTION ANSWER -a.gtld-servers.net. IN A 192.5.6.30 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -a.gtld-servers.net. IN AAAA -SECTION AUTHORITY -. SOA bla bla 1 2 3 4 5 -ENTRY_END RANGE_END ; a.gtld-servers.net. diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_ns_badip.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_ns_badip.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_ns_badip.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_ns_badip.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -186,6 +186,7 @@ ; foo.com contents. ENTRY_BEGIN +ADJUST copy_id MATCH opcode qtype qname REPLY QR NOERROR SECTION QUESTION @@ -221,7 +222,7 @@ ; recursion happens here. STEP 10 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION www.foo.com. IN A @@ -246,7 +247,7 @@ ; recursion happens here. STEP 40 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION www.foo.com. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_ns_noglue.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_ns_noglue.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_ns_noglue.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_ns_noglue.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -60,7 +60,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A @@ -104,7 +104,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A @@ -147,25 +147,6 @@ a.gtld-servers.net. IN A 192.5.6.30 ENTRY_END -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -a.gtld-servers.net. IN A -SECTION ANSWER -a.gtld-servers.net. IN A 192.5.6.30 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -a.gtld-servers.net. IN AAAA -SECTION AUTHORITY -. SOA bla bla 1 2 3 4 5 -ENTRY_END RANGE_END ; a.gtld-servers.net. diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_ns_spoof.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_ns_spoof.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_ns_spoof.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_ns_spoof.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -234,12 +234,10 @@ ENTRY_END ; recursion happens here. +; resolver gets address to spoofed server here STEP 30 CHECK_ANSWER ENTRY_BEGIN -; no matching here, just accept the answer to the spoofed query. -; it is wrong, but only one query ... -; this test is to check further on, that we still have the right nameserver. -;MATCH all +MATCH all REPLY QR RD RA NOERROR SECTION QUESTION bad123.example.com. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_pcdirect.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_pcdirect.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_pcdirect.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_pcdirect.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -63,7 +63,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A @@ -107,7 +107,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_pclame.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_pclame.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_pclame.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_pclame.rpl 1970-01-01 00:00:00.000000000 +0000 @@ -1,190 +0,0 @@ -; config options -; target-fetch-policy: "0 0 0 0 0" -; name: "." - stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. -CONFIG_END - -;test from testbound - -SCENARIO_BEGIN Test resolution with recursion, parent child differ, lame domain -; make sure it stops probing once is has cached all the badness. - -; K.ROOT-SERVERS.NET. -RANGE_BEGIN 0 100 - ADDRESS 193.0.14.129 -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR NOERROR -SECTION QUESTION -. IN NS -SECTION ANSWER -. IN NS K.ROOT-SERVERS.NET. -SECTION ADDITIONAL -K.ROOT-SERVERS.NET. IN A 193.0.14.129 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode subdomain -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -com. IN NS -SECTION AUTHORITY -com. IN NS a.gtld-servers.net. -SECTION ADDITIONAL -a.gtld-servers.net. IN A 192.5.6.30 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode subdomain -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -net. IN NS -SECTION AUTHORITY -net. IN NS e.gtld-servers.net. -SECTION ADDITIONAL -e.gtld-servers.net. IN A 192.12.94.30 -ENTRY_END - -RANGE_END - -; a.gtld-servers.net. -RANGE_BEGIN 0 100 - ADDRESS 192.5.6.30 -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR NOERROR -SECTION QUESTION -com. IN NS -SECTION ANSWER -com. IN NS a.gtld-servers.net. -SECTION ADDITIONAL -a.gtld-servers.net. IN A 192.5.6.30 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode subdomain -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -example.com. IN NS -SECTION AUTHORITY -example.com. IN NS ns.example.net. -ENTRY_END -RANGE_END - -; e.gtld-servers.net. -RANGE_BEGIN 0 100 - ADDRESS 192.12.94.30 -ENTRY_BEGIN -MATCH opcode subdomain -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -net. IN NS -SECTION ANSWER -net. IN NS e.gtld-servers.net. -SECTION ADDITIONAL -e.gtld-servers.net. IN A 192.12.94.30 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode subdomain -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -example.net. IN NS -SECTION AUTHORITY -example.net. IN NS ns.example.net. -SECTION ADDITIONAL -ns.example.net. IN A 1.2.3.44 -ENTRY_END - -RANGE_END - -RANGE_BEGIN 0 200 - ADDRESS 1.2.3.44 -ENTRY_BEGIN -MATCH opcode -ADJUST copy_id copy_query -REPLY QR SERVFAIL -SECTION QUESTION -example.net. IN NS -SECTION ANSWER -ENTRY_END - -RANGE_END - -; Does not respond to anything (servfail instead -; of timeouts since this is easier to encode in .rpl file format). -RANGE_BEGIN 0 200 - ADDRESS 1.2.3.55 -ENTRY_BEGIN -MATCH opcode -ADJUST copy_id copy_query -REPLY QR SERVFAIL -SECTION QUESTION -example.net. IN NS -SECTION ANSWER -ENTRY_END - -RANGE_END - -STEP 1 QUERY -ENTRY_BEGIN -REPLY RD -SECTION QUESTION -www.example.com. IN A -ENTRY_END - -; recursion happens here. -STEP 20 CHECK_ANSWER -ENTRY_BEGIN -MATCH all -REPLY QR RD RA SERVFAIL -SECTION QUESTION -www.example.com. IN A -SECTION ANSWER -ENTRY_END - -STEP 30 QUERY -ENTRY_BEGIN -REPLY RD -SECTION QUESTION -ftp.example.com. IN A -ENTRY_END - -; recursion happens here. -STEP 40 CHECK_ANSWER -ENTRY_BEGIN -MATCH all -REPLY QR RD RA SERVFAIL -SECTION QUESTION -ftp.example.com. IN A -SECTION ANSWER -ENTRY_END - - -; no more outgoing queries to .com or .net, all should be cached. -; kresd does not cache SERVFAILs so it is commented out for now to avoid error messages from Deckard -; STEP 101 QUERY -; ENTRY_BEGIN -; REPLY RD -; SECTION QUESTION -; mail.example.com. IN A -; ENTRY_END -; -; ; recursion happens here. -; STEP 120 CHECK_ANSWER -; ENTRY_BEGIN -; MATCH all -; REPLY QR RD RA SERVFAIL -; SECTION QUESTION -; mail.example.com. IN A -; SECTION ANSWER -; ENTRY_END - -SCENARIO_END diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_pcnamech.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_pcnamech.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_pcnamech.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_pcnamech.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -359,7 +359,7 @@ ; recursion happens here. STEP 20 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION www.example.com. IN A @@ -383,7 +383,7 @@ STEP 60 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION mail.example.com. IN A @@ -406,7 +406,7 @@ STEP 71 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION ns.example.net. IN AAAA diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_pcttl.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_pcttl.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_pcttl.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_pcttl.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -120,7 +120,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A @@ -185,7 +185,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_reclame_one.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_reclame_one.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_reclame_one.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_reclame_one.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -50,7 +50,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A @@ -94,7 +94,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_reclame_two.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_reclame_two.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_reclame_two.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_reclame_two.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -49,7 +49,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A @@ -93,7 +93,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A @@ -114,7 +114,7 @@ ENTRY_BEGIN MATCH opcode qtype qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION a.gtld-servers.net. IN AAAA diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_recurse.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_recurse.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_recurse.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_recurse.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -44,18 +44,6 @@ SECTION ADDITIONAL e.gtld-servers.net. IN A 192.12.94.30 ENTRY_END - -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR NOERROR -SECTION QUESTION -ns.example.net. IN AAAA -SECTION AUTHORITY -net. IN NS e.gtld-servers.net. -SECTION ADDITIONAL -e.gtld-servers.net. IN A 192.12.94.30 -ENTRY_END RANGE_END ; a.gtld-servers.net. @@ -116,7 +104,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A @@ -160,7 +148,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A @@ -222,17 +210,6 @@ ns.example.net. IN A 1.2.3.44 ENTRY_END -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR NOERROR -SECTION QUESTION -ns.example.net. IN AAAA -SECTION AUTHORITY -example.net. IN NS ns.example.net. -SECTION ADDITIONAL -ns.example.net. IN A 1.2.3.44 -ENTRY_END RANGE_END ; ns.example.net. diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_resolve.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_resolve.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_resolve.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_resolve.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -59,7 +59,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION root-servers.net. IN A @@ -103,7 +103,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION gtld-servers.net. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_soamin.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_soamin.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_soamin.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_soamin.rpl 1970-01-01 00:00:00.000000000 +0000 @@ -1,216 +0,0 @@ -; config options -; target-fetch-policy: "0 0 0 0 0" -; name: "." - stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. -CONFIG_END - -SCENARIO_BEGIN Test cache of SOA with minimum ttl and normal ttl. - -; K.ROOT-SERVERS.NET. -RANGE_BEGIN 0 100 - ADDRESS 193.0.14.129 -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR NOERROR -SECTION QUESTION -. IN NS -SECTION ANSWER -. IN NS K.ROOT-SERVERS.NET. -SECTION ADDITIONAL -K.ROOT-SERVERS.NET. IN A 193.0.14.129 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode subdomain -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -com. IN NS -SECTION AUTHORITY -com. IN NS a.gtld-servers.net. -SECTION ADDITIONAL -a.gtld-servers.net. IN A 192.5.6.30 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -a.gtld-servers.net. IN AAAA -SECTION AUTHORITY -. SOA bla bla 1 2 3 4 5 -ENTRY_END - -RANGE_END - -; a.gtld-servers.net. -RANGE_BEGIN 0 100 - ADDRESS 192.5.6.30 -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR NOERROR -SECTION QUESTION -com. IN NS -SECTION ANSWER -com. IN NS a.gtld-servers.net. -SECTION ADDITIONAL -a.gtld-servers.net. IN A 192.5.6.30 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode subdomain -ADJUST copy_id copy_query -REPLY QR NOERROR -SECTION QUESTION -example.com. IN NS -SECTION AUTHORITY -example.com. IN NS ns.example.com. -SECTION ADDITIONAL -ns.example.com. IN A 1.2.3.4 -ENTRY_END -RANGE_END - -; ns.example.com. -RANGE_BEGIN 0 100 - ADDRESS 1.2.3.4 -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR NOERROR -SECTION QUESTION -example.com. IN NS -SECTION ANSWER -example.com. IN NS ns.example.com. -SECTION ADDITIONAL -ns.example.com. IN A 1.2.3.4 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR NOERROR -SECTION QUESTION -www.example.com. IN A -SECTION ANSWER -www.example.com. IN A 10.20.30.40 -SECTION AUTHORITY -example.com. IN NS ns.example.com. -SECTION ADDITIONAL -ns.example.com. IN A 1.2.3.4 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR AA NOERROR -SECTION QUESTION -example.com. IN SOA -SECTION ANSWER -example.com. 86400 IN SOA dns1.icann.org. hostmaster.icann.org. 2010074630 7200 3600 1209600 3600 -SECTION AUTHORITY -example.com. 3600 IN NS ns.example.com. -SECTION ADDITIONAL -ns.example.com. 3600 IN A 1.2.3.4 -ENTRY_END - -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR AA NXDOMAIN -SECTION QUESTION -nx.example.com. IN A -SECTION AUTHORITY -example.com. 3600 IN SOA dns1.icann.org. hostmaster.icann.org. 2010074630 7200 3600 1209600 3600 -ENTRY_END - -RANGE_END - -; put both queries with SOA records into the cache and then query them from -; the cache. -; first the nxdomain, so that the positive SOA answer later overrides the -; SOA from the authority section from that nxdomain. - -STEP 1 QUERY -ENTRY_BEGIN -REPLY RD -SECTION QUESTION -nx.example.com. IN A -ENTRY_END - -; recursion happens here. -STEP 10 CHECK_ANSWER -ENTRY_BEGIN -MATCH all ttl -REPLY QR RD RA NXDOMAIN -SECTION QUESTION -nx.example.com. IN A -SECTION AUTHORITY -example.com. 3600 IN SOA dns1.icann.org. hostmaster.icann.org. 2010074630 7200 3600 1209600 3600 -ENTRY_END - -STEP 20 QUERY -ENTRY_BEGIN -REPLY RD -SECTION QUESTION -example.com. IN SOA -ENTRY_END - -; recursion happens here. -STEP 30 CHECK_ANSWER -ENTRY_BEGIN -MATCH all ttl -REPLY QR RD RA NOERROR -SECTION QUESTION -example.com. IN SOA -SECTION ANSWER -example.com. 86400 IN SOA dns1.icann.org. hostmaster.icann.org. 2010074630 7200 3600 1209600 3600 -;SECTION AUTHORITY -;example.com. 3600 IN NS ns.example.com. -;SECTION ADDITIONAL -;ns.example.com. 3600 IN A 1.2.3.4 -ENTRY_END - -; now check them from the cache (no seconds elapsed). - -STEP 110 QUERY -ENTRY_BEGIN -REPLY RD -SECTION QUESTION -nx.example.com. IN A -ENTRY_END - -STEP 120 CHECK_ANSWER -ENTRY_BEGIN -MATCH all ttl -REPLY QR RD RA NXDOMAIN -SECTION QUESTION -nx.example.com. IN A -SECTION AUTHORITY -example.com. 3600 IN SOA dns1.icann.org. hostmaster.icann.org. 2010074630 7200 3600 1209600 3600 -ENTRY_END - -STEP 130 QUERY -ENTRY_BEGIN -REPLY RD -SECTION QUESTION -example.com. IN SOA -ENTRY_END - -STEP 140 CHECK_ANSWER -ENTRY_BEGIN -MATCH all ttl -REPLY QR RD RA NOERROR -SECTION QUESTION -example.com. IN SOA -SECTION ANSWER -example.com. 86400 IN SOA dns1.icann.org. hostmaster.icann.org. 2010074630 7200 3600 1209600 3600 -;SECTION AUTHORITY -;example.com. 3600 IN NS ns.example.com. -;SECTION ADDITIONAL -;ns.example.com. 3600 IN A 1.2.3.4 -ENTRY_END - -SCENARIO_END diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_tcbit.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_tcbit.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/iter_tcbit.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/iter_tcbit.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -56,7 +56,7 @@ ENTRY_END ; this is the correct answer -STEP 60 REPLY +STEP 70 REPLY ENTRY_BEGIN MATCH opcode qtype qname ADJUST copy_id diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/module_dns64.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/module_dns64.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/module_dns64.rpl 2018-07-02 15:47:18.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/module_dns64.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -118,7 +118,7 @@ STEP 11 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION www.example.cz. IN AAAA @@ -137,7 +137,7 @@ STEP 13 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer authority REPLY QR RD RA DO CD NOERROR SECTION QUESTION www.example.cz. IN AAAA @@ -156,7 +156,7 @@ STEP 15 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION www6.example.cz. IN AAAA @@ -174,7 +174,7 @@ STEP 17 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION cname.example.cz. IN AAAA @@ -194,7 +194,7 @@ STEP 19 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA SERVFAIL SECTION QUESTION fail6.example.cz. IN AAAA diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/module_hint_static.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/module_hint_static.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/module_hint_static.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/module_hint_static.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -30,7 +30,7 @@ 4.3.2.1.in-addr.arpa. IN PTR ENTRY_END -STEP 20 CHECK_ANSWER +STEP 40 CHECK_ANSWER ENTRY_BEGIN MATCH all REPLY QR RD RA NOERROR diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/module_policy_deny_all.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/module_policy_deny_all.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/module_policy_deny_all.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/module_policy_deny_all.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -38,7 +38,7 @@ STEP 20 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION example.cz. IN A @@ -54,7 +54,7 @@ STEP 40 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION dummy.example.cz. IN A @@ -70,7 +70,7 @@ STEP 60 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION nic.cz. IN A @@ -86,7 +86,7 @@ STEP 80 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION dummy.nic.cz. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/module_policy_deny_suff_comm.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/module_policy_deny_suff_comm.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/module_policy_deny_suff_comm.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/module_policy_deny_suff_comm.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -70,7 +70,7 @@ STEP 20 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION example.cz. IN A @@ -87,7 +87,7 @@ STEP 40 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION dummy.example.cz. IN A @@ -104,7 +104,7 @@ STEP 60 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION nic.cz. IN A @@ -121,7 +121,7 @@ STEP 80 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION dummy.nic.cz. IN A @@ -138,7 +138,7 @@ STEP 100 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION example.com. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/module_policy_deny_suff_patt.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/module_policy_deny_suff_patt.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/module_policy_deny_suff_patt.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/module_policy_deny_suff_patt.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -70,7 +70,7 @@ STEP 20 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION nic.cz. IN A @@ -87,7 +87,7 @@ STEP 40 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION dummy.nic.cz. IN A @@ -104,7 +104,7 @@ STEP 60 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION example0.cz. IN A @@ -121,7 +121,7 @@ STEP 80 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION dummy.example0.cz. IN A @@ -138,7 +138,7 @@ STEP 100 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION example9.cz. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/module_policy_pass_deny.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/module_policy_pass_deny.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/module_policy_pass_deny.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/module_policy_pass_deny.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -39,7 +39,7 @@ STEP 20 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION fake.example.cz. IN A @@ -55,7 +55,7 @@ STEP 40 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION dummy.example.cz. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/module_policy_rpz.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/module_policy_rpz.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/module_policy_rpz.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/module_policy_rpz.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -70,7 +70,7 @@ STEP 20 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION example.cz. IN A @@ -88,7 +88,7 @@ STEP 40 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION dummy.example.cz. IN A @@ -104,9 +104,9 @@ nic.cz. IN A ENTRY_END -STEP 60 CHECK_ANSWER +STEP 55 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA SERVFAIL SECTION QUESTION nic.cz. IN A @@ -115,16 +115,16 @@ ; matches *.nic.cz CNAME rpz-tcp-only. ; TC flag expected -STEP 50 QUERY +STEP 60 QUERY ENTRY_BEGIN REPLY RD SECTION QUESTION dummy.nic.cz. IN A ENTRY_END -STEP 60 CHECK_ANSWER +STEP 65 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR TC RD RA NOERROR SECTION QUESTION dummy.nic.cz. IN A @@ -142,7 +142,7 @@ STEP 80 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION example.com. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/module_view_addr.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/module_view_addr.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/module_view_addr.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/module_view_addr.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -40,7 +40,7 @@ STEP 20 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION example.cz. IN A @@ -59,7 +59,7 @@ STEP 40 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION example.com. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/module_view_tsig.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/module_view_tsig.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/module_view_tsig.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/module_view_tsig.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -41,7 +41,7 @@ STEP 20 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION example.cz. IN A @@ -61,7 +61,7 @@ STEP 40 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA AA NXDOMAIN SECTION QUESTION example.com. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/module_workarounds_disable_0x20.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/module_workarounds_disable_0x20.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/module_workarounds_disable_0x20.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/module_workarounds_disable_0x20.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -8,7 +8,7 @@ ADDRESS 1.1.1.1 ENTRY_BEGIN MATCH opcode qtype qcase ; case sensitive comparison -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR RD NOERROR SECTION QUESTION b-0.19-23003008.1481.1518.19cf.3ea1.410.0.ekzijnekvvvg7gb38qcwur561b.avqs.mcafee.com. IN A ; all lowercase diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/nsec3_aggr_cache.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/nsec3_aggr_cache.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/nsec3_aggr_cache.rpl 2018-08-06 11:46:09.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/nsec3_aggr_cache.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -5084,7 +5084,7 @@ STEP 11 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags question rcode REPLY QR RD RA NOERROR SECTION QUESTION knot-resolver.cz. IN NULL @@ -5101,7 +5101,7 @@ STEP 21 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question REPLY QR RD RA NXDOMAIN SECTION QUESTION nonexistent1123.knot-resolver.cz. IN A @@ -5118,7 +5118,7 @@ STEP 32 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION nonexistent7.labs.nic.cz. IN A @@ -5142,7 +5142,7 @@ STEP 1011 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH rcode flags question REPLY QR RD RA NOERROR SECTION QUESTION knot-resolver.cz. IN TYPE65534 @@ -5160,7 +5160,7 @@ STEP 1021 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH rcode flags question REPLY QR RD RA AD NXDOMAIN SECTION QUESTION nonexistent2.knot-resolver.cz. IN A @@ -5177,7 +5177,7 @@ STEP 1023 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH rcode flags question authority REPLY QR RD RA DO AD NXDOMAIN SECTION QUESTION deep.nonexistent5.knot-resolver.cz. IN A @@ -5199,7 +5199,7 @@ STEP 1025 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH rcode flags question authority REPLY QR RD RA DO AD NXDOMAIN SECTION QUESTION deeper.deep.nonexistent5.knot-resolver.cz. IN A @@ -5224,7 +5224,7 @@ STEP 1032 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH rcode flags question answer REPLY QR RD RA AD DO NOERROR SECTION QUESTION nonexistent899.labs.nic.cz. IN A @@ -5246,7 +5246,7 @@ STEP 1034 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH rcode flags question answer REPLY QR RD RA AD DO NOERROR SECTION QUESTION deep.nonexistent47.labs.nic.cz. IN A @@ -5266,7 +5266,7 @@ STEP 1036 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH rcode flags question answer REPLY QR RD RA AD DO NOERROR SECTION QUESTION deeper.deep.nonexistent73.labs.nic.cz. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/nsec_aggr_cache.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/nsec_aggr_cache.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/nsec_aggr_cache.rpl 2018-08-06 11:46:09.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/nsec_aggr_cache.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -6109,10 +6109,11 @@ STEP 101 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer authority REPLY QR RD RA AD DO NOERROR SECTION QUESTION hm. IN DS +SECTION ANSWER SECTION AUTHORITY . 86400 IN RRSIG SOA 8 0 86400 20180809050000 20180727040000 41656 . zo+cNHA1N9Av53qwpB/bCmnTxAWj6ubo 58W4VkEPk9jzrOKvCm9dVJv7P+JJOX5C t5yx4zch+DBRSRR1U9mmrbegEX4hXtec L3Ev9ZpxYAYUFd7gQ/oM5ZyrUZ08wLYg pYV6vE4qYdxP58dtknbpGUQKz4H3l0SQ eWoSyhOtYK9nNovCNN0swXdkmogEhDxP gY1nhEZiLXFH8W8/G96IgAa2hineMnqV 0z8/K2m7EGjwszDOyCD05Z77cMAryvjL X6Jm7I83+D8UwtfAck8ZGDJFz3l+w08G oeB9ntD1OicidpLtHmeSsN+1nuEL3s1M U47kwIJMAHu8bcyvm4HGRw== . 86400 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2018072700 1800 900 604800 86400 @@ -6130,7 +6131,7 @@ STEP 103 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION hm. IN SOA @@ -6149,7 +6150,7 @@ STEP 201 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question authority REPLY QR RD RA AD DO NXDOMAIN SECTION QUESTION sk2. IN DS @@ -6172,7 +6173,7 @@ STEP 203 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question authority REPLY QR RD RA AD DO NXDOMAIN SECTION QUESTION deep.sk2. IN A @@ -6194,7 +6195,7 @@ STEP 205 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question authority REPLY QR RD RA AD DO NXDOMAIN SECTION QUESTION deeper.deep.sk2. IN DS @@ -6217,7 +6218,7 @@ STEP 207 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question authority REPLY QR RD RA AD DO NOERROR SECTION QUESTION sk. IN DS @@ -6239,7 +6240,7 @@ STEP 401 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question REPLY QR RD RA NOERROR SECTION QUESTION root.cz. IN TYPE65535 @@ -6256,7 +6257,7 @@ STEP 403 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer authority REPLY QR RD RA AD DO NOERROR SECTION QUESTION root.cz. IN TYPE65530 @@ -6278,7 +6279,7 @@ STEP 406 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION root.cz. IN A @@ -6296,7 +6297,7 @@ STEP 502 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION random1.blog.root.cz. IN A @@ -6316,7 +6317,7 @@ STEP 504 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer REPLY QR RD RA NOERROR SECTION QUESTION random1.blog.root.cz. IN TYPE65535 @@ -6335,7 +6336,7 @@ STEP 506 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer authority REPLY QR RD RA AD DO NOERROR SECTION QUESTION random2.blog.root.cz. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/rfc5011.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/rfc5011.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/rfc5011.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/rfc5011.rpl 1970-01-01 00:00:00.000000000 +0000 @@ -1,5754 +0,0 @@ -stub-addr: 2001:503:ba3e::2:30 -trust-anchor: . IN DS 1867 8 2 EBF6C553C9DDABFB3522DFD4E62A857D9E00E373686C3479064B46BF6E43AC5E -val-override-date: 20170701000000 -query-minimization: off -CONFIG_END - -SCENARIO_BEGIN Successfull RFC 5011 KSK roll-over simulator for 2017 - - -RANGE_BEGIN 20170701000000 20170710999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20170715000000 20170701000000 37284 . MXzziCbaLNyN/I6vS5rNpEua0moTNYjG ICy9SgiSs4yNvyZ+Kn/1puEbaxLJ2M6J vVjVCbJMVTrINvLmgVcG3UphIFBdrgfo FZkav2nHbybKao5WafStZzGpKQJkBTeA fqKMXuPtKwM1g9Tzwr2YxdLVoGzBYA/t s41uKHI0/1YcU9nMadlmY/3rJPFOUIrl iCwskFGmLVickcRnp/z0FmTd1k67wSrn z16Ys7xeQknHOlr5DqBtezicRE63srvv j8QuOL5wLhknmmqnntVYkYXHKsZpWsEE OWxLc4PwbDvVI5LDZ3NmCAH0k7ygc5/s WsnAKKvzDfT5lXtudOkCWg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAeh0qmH7cGmSjplVMqU27YkofOHp tt6deTnAprIDS5lws0Y3vFm+NNEDaZHB SHqIbxEFW5uX33rQ5EfCFQI1gdfjCtCi obwPvu04P6t2cuP9qSusTXGlr9qaqNCh ntErj1oK+2QH1S86ttgepzv4kF9y/Ee4 B4YQttSLuTcWO9bZR3v5QWT4581bPlMO Oj3Yo2Ubs81qtOoiI2grq7Yn7x/sTt43 pDstuS7wwaOnKb36S5BAMBDwZCXRFeDV sm0EseG5qeu0K6E8AOVE3wjOePetzpDE 6O0k0BM6QlPZ3EttnNgqVyZFZwHZu8vM Yoo5zypyH58AAGAONZKwQeg3nak= -. 1814400 IN DNSKEY 256 3 8 AwEAAe1udmhwaWyg6PD00YReHeT6nYeN hKAy6oKMc7X5NXXJq6baVZT5p3AnFm7B 0ReT1dOpOjZuArydSdASupCQwRPVja+m 8PQSaAdThTifIBbP0Y2TeeA3yfGbHubo scMezJAXr7FGDQ8XIfyUYBDBoDaINi6j V/oI+aSnwm0uWdxHqfonzioTYenuTsax OGLYYuCMn9soxIuXatO53MpqfsJgh7UK FDCDGKA9pFts1vTQdCMPGgEsuYHjsYF0 /kUoRAQJM3jh0t3wE3JQ/HjFIyR37NCM w+i20b1v6/Xo86gy2nhXq2BopawLPEh0 Fv2UCCI7f8k2JvvF2o9udq/N+FE= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170722000000 20170701000000 1867 . aCKUdEnbwdvfHHiGS4xzUB/H+wdSgyqs 2YiGyLAnd8R/u1LpQ2hqEzSMqSr7blfL OLMIy/SA3PulAdPbBub5aM9qAveqc+Mc +vOIugZrWHYOECPXmJsmNBj8VT5FEOuw N+PzReRG4P6SzyZ4DckIcfpIjikCHPS/ 6JEkkYCzktx/DcKmI0kQtGIUHXrwvaTn 7G8fjZpZUUBwG0IKYg629vo5IgVlmPPr kvsLWgQuKu6pu30iA3DmIAI6AX0O2xnh HsUzliRPdt7WgJCCX+knJr4d9rv3FsGi /VvCeQhBxjWVQBKMlfvnWagp820muw0X UwHnzEkIRQyv9JDabdJtQg== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170722000000 20170701000000 37284 . KpkR9ceTqCxkKT7Gbq0poQhiv19qI1BD ahGsTJheWlruVH3wSQ2OsAl4pkmS+ich 1065M/OsL/3EHAbYsZ9yskhPJwyeZVDP cgfEusQxMekz+0s98jHt/QqgKBJdiF2F uu/krrYctAJos4i6P93paKHmuji7tiL2 JBuENw5G+WfqGBUciI3ca9QMDPbHWS4z bgW6ViSFdVC/D3l+ZULoAB/FBQykAESn /hGGbDBfG1wfkngfXkByTLKzWzSQsIOr krbJ38W3Sm/1GjAZdesJBJQcxm6e2dyN N3j51hZTH23dvEzqCcRCVqkeCDRlzxPc YGteAaRAnMNh/gB4r7AUbw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20170715000000 20170701000000 37284 . TV/Ad1roCxCazfDEk1UvRiGIelQDmQIx yHEtce3db9fTcag3fvSj+swbAiHoYaV8 gm7ZWaI/rBuoi4WIeHPGmtc5WF8uTpgK EmIO5DzVYubZQ9o3KdYxe4fqHm0LZovX H+7eLsUcMHavzhrRx0KvrHQQ3mxMGIGv cxwO1WDhAAj1tlkkix1Rwxwf59lIBB6s Y+eXI2TKVe9gnVSjx/YHkVeRxB4lHhWy cCWiqYjgKmeu+tlGorcI9gwvjc0/CFnL fnk3cnWD3RdnNyg4qnqpziqkCWrZ0Vae KJ/nDWmObViBKclYVSGMMv/O1HCQS6/M rYo2HKURPYvWqjUr+JOq3Q== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20170715000000 20170701000000 37284 . bqmvP3LjtKK+owiC+MpcZeYM3xmHUpEX YEMqCQmFL7Pa7dOBJIedO9ZXNBV6RjTI 3MY1VEtQxsUu0QbdCsjHksZw6N1ovHoq PyPssQF1WZsNZan8fMPdtvByKBjbM5qL AGF3IeAnIMYEaPDovDBaBXFh3JqLBrV2 kDM5/ddyI0NgFr/XFcrEyCCSXzEqzEFC J0Bps1+cleRZT4ypUA0UYH2/feoBHV// jhG1BQqoGFQwvQnTUVNxcmZpJa+jNCnL YrDwUmbRx0drh++9uFhdWL7nElWKejcj 3tt02FnAwASKz6VpFGVk0Iu7r/OFAf3a r/KB3beYk+ahMbHl53+gJg== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170715000000 20170701000000 37284 . 0VMyTLgwifNoeM9EWiRRD5m4I6Hmg/va vRnhLSv4l3+v7l1FakRjGQ1Ov9bEs5sR vyzFlr0D9TwCQyMD9pnE3kiWpwtFYLaS RRSM9rPbSQ9+UnZ0OMvg5k1g+wQ/ssS4 vLduDlTXPXrwdg8NrAM3RhI2lAanPrGU MSu+eWNOvv2hu9x1L+I5orbMELJfjSvu 30hEa1HUJmvC6oyshWBIbQtiWWPRqXo2 AuwT+IpZrR87FsCQxxrAX8ptxnKI8A19 SOLfiHMXXAoHxF3xZvTR5ZO1zpx6YL8O cwXkln+6OMIPlrlQ60vrRIXmBiJcJq9q Bn2ER5//+J3fzmmeRWhodQ== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20170715000000 20170701000000 37284 . MXzziCbaLNyN/I6vS5rNpEua0moTNYjG ICy9SgiSs4yNvyZ+Kn/1puEbaxLJ2M6J vVjVCbJMVTrINvLmgVcG3UphIFBdrgfo FZkav2nHbybKao5WafStZzGpKQJkBTeA fqKMXuPtKwM1g9Tzwr2YxdLVoGzBYA/t s41uKHI0/1YcU9nMadlmY/3rJPFOUIrl iCwskFGmLVickcRnp/z0FmTd1k67wSrn z16Ys7xeQknHOlr5DqBtezicRE63srvv j8QuOL5wLhknmmqnntVYkYXHKsZpWsEE OWxLc4PwbDvVI5LDZ3NmCAH0k7ygc5/s WsnAKKvzDfT5lXtudOkCWg== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20170715000000 20170701000000 37284 . Umcn1NDbjEEmeIjK2V5JgIjD45fh+CMw ry834Q7hCK838ePxPVGt3eqXsD/evlk4 WD72Ir49kb7P2rtPqPSdYZBJy0qRiznZ +9+IoXSwezSfMYAze4rb2Qng2TjPEgan ptrFAFBNrRyQB83QLqhUKMHoqINyX+yJ WhMmO/KoEYzg+VdttS1VOi61TL6CivjL 5WFwO5oBHyj91kudvt0LQ58wSndlXzJ2 NwX8tjJcBfyp2tMItFn7c4mMjZyHKxrt tnJkP743NH4Og84ie4QSu4PaVWk+T3+Y n9pg0Dxc2URqbI2OXN0Ggi5i17zdyAeC 6mjA60qAJEKfacqJrqh4nA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20170715000000 20170701000000 37284 . bqmvP3LjtKK+owiC+MpcZeYM3xmHUpEX YEMqCQmFL7Pa7dOBJIedO9ZXNBV6RjTI 3MY1VEtQxsUu0QbdCsjHksZw6N1ovHoq PyPssQF1WZsNZan8fMPdtvByKBjbM5qL AGF3IeAnIMYEaPDovDBaBXFh3JqLBrV2 kDM5/ddyI0NgFr/XFcrEyCCSXzEqzEFC J0Bps1+cleRZT4ypUA0UYH2/feoBHV// jhG1BQqoGFQwvQnTUVNxcmZpJa+jNCnL YrDwUmbRx0drh++9uFhdWL7nElWKejcj 3tt02FnAwASKz6VpFGVk0Iu7r/OFAf3a r/KB3beYk+ahMbHl53+gJg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170715000000 20170701000000 37284 . 0VMyTLgwifNoeM9EWiRRD5m4I6Hmg/va vRnhLSv4l3+v7l1FakRjGQ1Ov9bEs5sR vyzFlr0D9TwCQyMD9pnE3kiWpwtFYLaS RRSM9rPbSQ9+UnZ0OMvg5k1g+wQ/ssS4 vLduDlTXPXrwdg8NrAM3RhI2lAanPrGU MSu+eWNOvv2hu9x1L+I5orbMELJfjSvu 30hEa1HUJmvC6oyshWBIbQtiWWPRqXo2 AuwT+IpZrR87FsCQxxrAX8ptxnKI8A19 SOLfiHMXXAoHxF3xZvTR5ZO1zpx6YL8O cwXkln+6OMIPlrlQ60vrRIXmBiJcJq9q Bn2ER5//+J3fzmmeRWhodQ== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20170715000000 20170701000000 37284 . h9R23s9ZHXVX5wcCV7ToIE4dTQ1fAGqw ehpmzvbblti8phOdm+/u2ActSH4VMLo1 ze1U7vVuSuNMII4l27vARn6XFwhdHYqh lril9Yu6iyx/sKyqbLoyzQ0aD9E1SnO2 aRNWdpjeIYvw7cwvqFaH4bj854eB2clc 7s1olLEkQmZ7oBWKx9+v73Pg587Ky3Z1 Cw5f+iLa0ld/t6m8BtAmRjYc9hj1s0ph 65SzaU4KZKNikG0QVsNC1AnpFbrYSbWD MAEyp6cU/KfF7VrKGaIgWu+Z8eU1v0fN BOsPkfBooSJj2v5nded2W+yCV+plZGVj pdTESXNoZYLyvgsX6DoDYQ== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20170711000000 20170720999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20170725000000 20170711000000 37284 . 2OY96fDuZ/ZCQxiryCYeSknlLFG3btVH W15h88UgKw5z0eLmBMUO95tPlSjF5A/Z PgQT6+qXXJMoLNxPGeTsNGl+oPxXCeFq 7+egtR1KLNafoYb8TgpW9I/lsKi8KwY9 tL1ySvoultD8Vd4RYx5MD/T+NI1f5rk7 y7UxPngi5zIw+GMZnGWSdJW3qhevUGLN l5wFjFhSleLXO1JkCzM+fxQJgR+qLJk0 0YfFK6TCEPwMBybwWN6/NuRWotfc57au 7ZavTEPDDLpWivElJyMH1/BSUviHbJI5 brQsdc91jADXp+W9lCpwNDNs5iU5WdJv rN8tqpp/MHJedmYMW67jdg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAe1udmhwaWyg6PD00YReHeT6nYeN hKAy6oKMc7X5NXXJq6baVZT5p3AnFm7B 0ReT1dOpOjZuArydSdASupCQwRPVja+m 8PQSaAdThTifIBbP0Y2TeeA3yfGbHubo scMezJAXr7FGDQ8XIfyUYBDBoDaINi6j V/oI+aSnwm0uWdxHqfonzioTYenuTsax OGLYYuCMn9soxIuXatO53MpqfsJgh7UK FDCDGKA9pFts1vTQdCMPGgEsuYHjsYF0 /kUoRAQJM3jh0t3wE3JQ/HjFIyR37NCM w+i20b1v6/Xo86gy2nhXq2BopawLPEh0 Fv2UCCI7f8k2JvvF2o9udq/N+FE= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170801000000 20170711000000 1867 . FyApZOPhk7K90BGdNryD4EbpD/0bB6th 8rztEnRZV8dmtILZOaFmkoTweyJGpZZU HoVjsffD+wr1FlngJy7mYwZRIctK6NYJ 3aocw1BXNeSZdvmaQnPOI2TBbHhb8bhG GHzpsmFMNmD5lMDMbjZWzJKfv5pCboun pbyowlGNz9uX/x2uSGkTa0m4XkCEQLYT lHLntHu07Y834yfmcIUsQC2Z0ZWTdumh /RXWrw4dwTPT8+ldiUOcVwGsjaKGkyq2 +qCohuU7wrjJoWFTqZg2kbCfSP+4/kLk x7/AetbXAXyZaFRofo/3Lxuz+5lUs/p6 NoLBniZG6mxR5t7B4brVsg== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170801000000 20170711000000 37284 . wDk28IaSAi/tIgARka5b8CyyC8fcj092 GMhS6wFy7M1rBfuALvcD+Tx/PpCmWFiq bv5zmomvWzMfV80fYGngc2zOpuQfrSfM GN0JnR2PVh84B1x6H1jpnnxE4Q3fYNBi jNHRwAuuACAaSv98vcNt964v8eZypCrS t+yLz5AQUMciG0PNP15UbgF9gyWGfIW4 dgGOT8R23vxPdaXcRMltF6lW9IUTU46i 4gC345GYwrJw5BW1cVLg5YL3VtEUFJFM K0A21HwJgm2IH26AHvyuxOnOlwSO6AXu Cxg983nxABMz0ek6hXAFYkMAT2yINUrO 2nQisL+40gnq3hEUoNZUKA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20170725000000 20170711000000 37284 . H8r2rvoxyCYAlajIv4puL97JwYg141+F uqXAchdx9Ko0P/7ynaRVttOIAQ1WtCha REXryEctxIp+sfOTzZBJSfQklRrYZuwh TWl9w7Ly1HcSu4NJG30Tg0rfKpPLHbsP dYee6tuJgqK+ZYU06bVd4ZySZ7WHLBMh gf3kjk2QbArp/+wtvbzhELXEw2fj2SD7 GKjvifUa3EymG7NyzFtd6+eJX7/88r8V qa176g7ueukqjnt2Yyiw+mKbYAsr3Ob3 Yx+x8tWUF6/depiB33jNfxhQJBD824kz c3o+hKWI/Dq+9WNRjm/hSGZZqtjdpdNa WF1Iq25nMg/G7oWezFIS+g== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20170725000000 20170711000000 37284 . KJYdNDfdqXwtTQrU7Rwe0mN5mG90GfSm Uu7w10wZhFr/Vi0yXdbVbs3yBOmlPMEI vQ3TFjfMfdyNGxBxoJ4gX4w47GIXXX1W uIN6g+xt0pIfYo/+aKY8776akfRjBNOk Un825x9HArLiA64QkOZya1ESWFKzx9uL dIwxHm53QkmtAPU0D12xrZmamdLKANQu rHUDDxZYg49sraLDZQxTIP+jSA7pge9K 5iNdCs9RuJfW43J1hpaM7tNjq34w9Je8 LnLEUDsN0VD2w375wXEznwx3CQk2lpLP hjTHHp/fs51GwAjVD2v8GHYOi+3CBjkK 1c70SE9ARujlpDzybbGv3Q== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170725000000 20170711000000 37284 . QQQI7Bnp7H3UXzhlybA1UfJxyUmtCFO/ Syv/GVoQfmHuCpTye9COUaqwC1d6H9+K 59L7zKMZ8Vpn9OMmuYD/w47qwPLR/0LK Ni+AuHqi4Yjv8ADSqOXzXNl+isWWvOJd 4hR11ZuRoZW5tgWu5o3Ih0Ec5Y/VPpLj JtKBRTBk5xccSgGIk8GSovu7hyMEKamI wMIO1rIfIKSYFrp09YCIc66nrU6/hyg2 0tUtsZNjZwg9c2O/NIH8VYSATw0ppFnO LMoR6CpRZyCrxCB1FsrnyVuzRTYvAdO6 +7UuDiliPQ4GPHFb1wdhTr/W+TGh0UIQ JI02FsITRsf2BNjE6DXk6Q== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20170725000000 20170711000000 37284 . 2OY96fDuZ/ZCQxiryCYeSknlLFG3btVH W15h88UgKw5z0eLmBMUO95tPlSjF5A/Z PgQT6+qXXJMoLNxPGeTsNGl+oPxXCeFq 7+egtR1KLNafoYb8TgpW9I/lsKi8KwY9 tL1ySvoultD8Vd4RYx5MD/T+NI1f5rk7 y7UxPngi5zIw+GMZnGWSdJW3qhevUGLN l5wFjFhSleLXO1JkCzM+fxQJgR+qLJk0 0YfFK6TCEPwMBybwWN6/NuRWotfc57au 7ZavTEPDDLpWivElJyMH1/BSUviHbJI5 brQsdc91jADXp+W9lCpwNDNs5iU5WdJv rN8tqpp/MHJedmYMW67jdg== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20170725000000 20170711000000 37284 . v5dTMrchkwFBx30aWw+I3IrZB/rH79Ar zfnX337y5PlocwWGl31QXxl8JXjt14wU zRTGebGceKeYpuSl4KcR/zxPaP/Y/wtf o9HnxsuAja9vlQh2b2nY5TWRHf4ZqCkA c41SPAAn59O2HKEE4/9TPn1W47n4IZsJ 4mb/x7G6pL7jUykaVnLtlnEv3RrQxxbp hJe+JW2bk8Gj8ih+fYavO23pxUIR5vEb CSM9yAFJ+is4X6d6UqCOgvy+qHzHcTAu 6PJzmI1fX2mNkn0Zj//DaQg+cRkggEsE FJGSxvZBb7pvOIy7khMNB+NuwSHkcGyp OVplGjchbkLY59kOYKRQNA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20170725000000 20170711000000 37284 . KJYdNDfdqXwtTQrU7Rwe0mN5mG90GfSm Uu7w10wZhFr/Vi0yXdbVbs3yBOmlPMEI vQ3TFjfMfdyNGxBxoJ4gX4w47GIXXX1W uIN6g+xt0pIfYo/+aKY8776akfRjBNOk Un825x9HArLiA64QkOZya1ESWFKzx9uL dIwxHm53QkmtAPU0D12xrZmamdLKANQu rHUDDxZYg49sraLDZQxTIP+jSA7pge9K 5iNdCs9RuJfW43J1hpaM7tNjq34w9Je8 LnLEUDsN0VD2w375wXEznwx3CQk2lpLP hjTHHp/fs51GwAjVD2v8GHYOi+3CBjkK 1c70SE9ARujlpDzybbGv3Q== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170725000000 20170711000000 37284 . QQQI7Bnp7H3UXzhlybA1UfJxyUmtCFO/ Syv/GVoQfmHuCpTye9COUaqwC1d6H9+K 59L7zKMZ8Vpn9OMmuYD/w47qwPLR/0LK Ni+AuHqi4Yjv8ADSqOXzXNl+isWWvOJd 4hR11ZuRoZW5tgWu5o3Ih0Ec5Y/VPpLj JtKBRTBk5xccSgGIk8GSovu7hyMEKamI wMIO1rIfIKSYFrp09YCIc66nrU6/hyg2 0tUtsZNjZwg9c2O/NIH8VYSATw0ppFnO LMoR6CpRZyCrxCB1FsrnyVuzRTYvAdO6 +7UuDiliPQ4GPHFb1wdhTr/W+TGh0UIQ JI02FsITRsf2BNjE6DXk6Q== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20170725000000 20170711000000 37284 . YryqMdq2kUnFyGH+m2iUSdQDu2W2W/Oc tWia7RSvPKzL+W9QdxQi3D/HX3/jXEXj vsIRJQiupIkKOLwXcugV0qdAK04pEnWp NgqKKmNzsjzp+CPy5VfFrfWuZ/GelsSh NbD2lPaNFZ/PBVk5dlyJJJerG+CiT0w8 l+uoxdwQ88OpNoXf+vTchnFBJmcuKkW0 +eXOM8R0nt1lt9pQxycxExiJgw2wEv64 vVPdDCytzJ43XTwKlpjPaX4j5Ga13N6K kLf/wltyB0ucLe+ERFaHuQBEs2buQ7zm UF6l7LfjAlepU1UwE7Zk8dXrKbWmD7oP kXx/6U6E51RRyB8w66qsWA== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20170721000000 20170730999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20170804000000 20170721000000 37284 . St+fTzqEpu/Sq4oQwNZY9YaEkD4+Oqgy LFW4JNxYuwM0vMZnhAgMxrHZKI4Vg+I2 +85inalP5mYJm0kEYm7QF4FeRk1xWKWb f8GRIYSo3eWsd4FHlfGtLkLm9MIcopzY 4N6v/tHPVanhT61ppqXPg9A8DyjPrDKp tw/aMyV7ewV8GFpip/YHT5imMChbyfyM Gg74MhqREpO+LpCFeXseH4O+1d4gw2nI ewX7sEnb5CqZlKHf/eas5MpwyUysZ0y+ UPerUDPc7NDo/zZkA032BeqMFXAcwdy8 vN+UANTJHWFLhnPtCHX0Imc6rW9Zlopo TqCrXW25bMLByViigbZwIQ== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAe1udmhwaWyg6PD00YReHeT6nYeN hKAy6oKMc7X5NXXJq6baVZT5p3AnFm7B 0ReT1dOpOjZuArydSdASupCQwRPVja+m 8PQSaAdThTifIBbP0Y2TeeA3yfGbHubo scMezJAXr7FGDQ8XIfyUYBDBoDaINi6j V/oI+aSnwm0uWdxHqfonzioTYenuTsax OGLYYuCMn9soxIuXatO53MpqfsJgh7UK FDCDGKA9pFts1vTQdCMPGgEsuYHjsYF0 /kUoRAQJM3jh0t3wE3JQ/HjFIyR37NCM w+i20b1v6/Xo86gy2nhXq2BopawLPEh0 Fv2UCCI7f8k2JvvF2o9udq/N+FE= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170811000000 20170721000000 1867 . Xy4GIqglfhPKFoO7bbK/FzQwbWYw/e/d MwYYHGzjvui3MykT53WTP0qQk08Pr+Ae zF8Z05Bv4j7QTY3+l0W1NVMQD1akc0Tp purQRzqgv/PzoTzMm0g7h2mGHP3R17pV kWAb7tv1ha6oO6cx8TQfMeKfuI0Z9vPd N20BYUd1FwLLITnbXrpCRvNMJw7mf3fN 1SbTJrMquQhcN6EA3pdDxYGktabYBnRv DCeWluSHTBlqym0Hq3afphc0zYwfwgUq ZPKcuxXjXbxO0yZCeJjQ49u7z55nw6yc 1qSJEjPtQPKHjcJSdbB60rNIdg5osKqz iApC63Ug8VTP18eIugRSjA== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170811000000 20170721000000 37284 . S2cOcWa3/a/y5udmWgsXal3a0SlnUpnV Wr7eJCdkQ8Au4V+nOdaBj0ZFg0RscC/I QHrNoKaY2H0QpuLtX+wtav/CyL36Uhse xP4MzY+KPJkPzCq8AsReHeFWFV1PSiAo 6PlF81QgLeO5AytRu9dEPhgOc0k9q7cQ np+STJqoD7+j0C8rKclJmAa4qsrFgIk4 45pgwgbHhmbnWHCpKLJXK326K1x9yP1W DZIwX9U+UEDyZxvdoiwrXcytehvae6Fs FdQ1WlP+SLdrQC4NrQUeTHBlveYlL0o2 gW9+M/lljq+Tb+3T2eoBRCev+CW4E9jc UEV+v0rGHW7Oqivcb9yoiA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20170804000000 20170721000000 37284 . CRMahktbnKGSnjLeg1KOUHLql++CLK7C A3v6y6h04COVZcq7IojE/woy1yOGY2cK 1oyFvhvYn0fN9DTmsGnoNojY4kiyOvg0 egbizLiHHsy2QJTM5sQOKy2L7me5LDjO eGlgVAOAs531ITPnGXM0MGO9yz0Oib0p ShQ+HQVUzHGSFYj9VCWLodPKuMYm6wPJ gkpzIT3Vd2QkHvMOc4tW07FQMNpNGUsm 369fnbkHcHiwjw/uKoZdPV9XQJvlQNsz xgF99hhth2Ix2zDYFYP6X6D9uIjD4KC1 Mpr6AFEq/Gp/DJt5soQNrO3z3D1qfxBy NoraHiRPzZ5HXh9Zlg7pDw== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20170804000000 20170721000000 37284 . 2SPmEVXrEp4xGnYvrk6r1Mz4NKC5t9E4 nV3NA9fWQRkld7URF4ryKA2y6GxlYHig nY9guQ7diD9jV8oQUL/9d/wcPIzqGvWC Q32LTki3BTwky25kNIByRKiXrSEpNMLt 1eaonaNhb0BFSoZGw4l7A34TJ/3JjM35 1R/F/PdEyrGE1Yme3xb8YgfQQuOS8Ymq 09iWA8zOI9vw403Ksk1t6739Mtc+j7Ht lxGtA+Nb4Y+6jZc2bK3TzGgkmdxfaYYM Zs+rIhS2OFE2tmAsHK/A1VBTuEc4m/OM X6UOWZDPavDmFgYjrfPn/fQ/v1WLgcJu NpI049g5FAKLuzd8qjvKoA== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170804000000 20170721000000 37284 . XSyzOTwPB9zTlOCKdDm52NyuSsLoOxTw owOD072MFxbGXautWxnnDUmKGr2+lWe9 hmXtSOQCxDtL1fQGhdPZAqwL9lSoWUEX t5SMJ9muqI7KzPiwXHAcyXJJ3xxh5i60 UD+8EF5pcgwhTtzcrRgKwRizDpA1b3gv 3kWO49DFOh6wkqj1NUfUCSNgvG0nMta1 y52vpElqD81dPdrd6DZ9a5QCdbuyuLSN w0825JVj5GK1chdS8wp7PiPYLCrndAHl Tzm9o4Oejfi7jeszPZFhze/2NsQeADDc tzDD9fVXPI63pM721DbJXZCAsg7ekyW0 BOSUd2xSWgZ9WPP8xDE8yA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20170804000000 20170721000000 37284 . St+fTzqEpu/Sq4oQwNZY9YaEkD4+Oqgy LFW4JNxYuwM0vMZnhAgMxrHZKI4Vg+I2 +85inalP5mYJm0kEYm7QF4FeRk1xWKWb f8GRIYSo3eWsd4FHlfGtLkLm9MIcopzY 4N6v/tHPVanhT61ppqXPg9A8DyjPrDKp tw/aMyV7ewV8GFpip/YHT5imMChbyfyM Gg74MhqREpO+LpCFeXseH4O+1d4gw2nI ewX7sEnb5CqZlKHf/eas5MpwyUysZ0y+ UPerUDPc7NDo/zZkA032BeqMFXAcwdy8 vN+UANTJHWFLhnPtCHX0Imc6rW9Zlopo TqCrXW25bMLByViigbZwIQ== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20170804000000 20170721000000 37284 . VkUQMiyde/Q7I4g+cgTWu13y0RT4VWlu Rf+/4CZu+huIDyhpsKNggG0Y7JEqKo9p FHDds//kvFsMQuhRTUvt/Jrnxwig+p1C RwQ9tYbZIkWCI1wOCQ/mjB1F+8iq4uOM OdGh86xtiCaWWDUPkZr5Bi+AQqA9mU3p ksaoI+fWs8rjTNr1SOH9Hp8s+hxBAPJs DRXrAGcpIMbmfr5pPJPtX0D+qDW2m8eA Vopl0YLyMkK7dj1PEV/zGvv222oht//0 mXFVse7ceaI+izSggDsr23CI3tCdAhSO RiEQMa/XeDWv7OLXIy5KEsjgf9DGL1bI SdX2U7DNB0ZdSY9VzUpCRA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20170804000000 20170721000000 37284 . 2SPmEVXrEp4xGnYvrk6r1Mz4NKC5t9E4 nV3NA9fWQRkld7URF4ryKA2y6GxlYHig nY9guQ7diD9jV8oQUL/9d/wcPIzqGvWC Q32LTki3BTwky25kNIByRKiXrSEpNMLt 1eaonaNhb0BFSoZGw4l7A34TJ/3JjM35 1R/F/PdEyrGE1Yme3xb8YgfQQuOS8Ymq 09iWA8zOI9vw403Ksk1t6739Mtc+j7Ht lxGtA+Nb4Y+6jZc2bK3TzGgkmdxfaYYM Zs+rIhS2OFE2tmAsHK/A1VBTuEc4m/OM X6UOWZDPavDmFgYjrfPn/fQ/v1WLgcJu NpI049g5FAKLuzd8qjvKoA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170804000000 20170721000000 37284 . XSyzOTwPB9zTlOCKdDm52NyuSsLoOxTw owOD072MFxbGXautWxnnDUmKGr2+lWe9 hmXtSOQCxDtL1fQGhdPZAqwL9lSoWUEX t5SMJ9muqI7KzPiwXHAcyXJJ3xxh5i60 UD+8EF5pcgwhTtzcrRgKwRizDpA1b3gv 3kWO49DFOh6wkqj1NUfUCSNgvG0nMta1 y52vpElqD81dPdrd6DZ9a5QCdbuyuLSN w0825JVj5GK1chdS8wp7PiPYLCrndAHl Tzm9o4Oejfi7jeszPZFhze/2NsQeADDc tzDD9fVXPI63pM721DbJXZCAsg7ekyW0 BOSUd2xSWgZ9WPP8xDE8yA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20170804000000 20170721000000 37284 . yz3cwQjabEPPuuTjJwVW5ORb/PiJsB/6 2TEvBkpRyLvQUHr6Q6d4HosmIEExmrdq N/iNj6SiZ0upa4SyftzRbyYcoGeAWonV yha4FxCSy7T/0E1FlBNCfrdjCKoMJtOD rmzJmVRA63HbxcSyhYLSB+sN8LBhoLve iQkMJU9iBNV59qvoztgUnPi+Ky5y24vN S4Bg7oCgqWvA4L3JKAvcek3fymPj9/2q E9jPn7i2jtTJmAVH1cNKHX1i5YCVuNK3 oXHD22HJ3wxCumT2c2GWepx71dvrgjGv 5a53iSSOQ9aVzD5JSwf5rSytKPGdb98e Y2jkgCXYTedrm0UctRktNg== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20170731000000 20170809999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20170814000000 20170731000000 37284 . xmUjSrpl9mlXOv44w7/rSXtlhoZeVVLU o96YJ2RoSa3OStDW6NrvsC5xG2TW+Ow0 Z+DU2y5G1hGLQkcT6KXbEoGAHBGOXI4M ZmgjLxD6hf5ttlTEZMZY7+y/wXzZnNMZ OJTCYkVht1+uZkI3GWtETmxNvLbNnRQt TSjrp20i692OmUi61utqEBR/wyiZj8Qz iCG4FvSWETf/XrjjuKpD7EWfn30RWnmE iB5Se/FbGtPVsHgPLsEiDLEMMRVjqgGh GGZQg9UVZmyHY+h2iTVryB8DK0IINNDs doIvs2ywFLTC2LhHVTmPvz2p9KFR4RIc 4Ci2Mz09N8D9umQRIekU2w== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAe1udmhwaWyg6PD00YReHeT6nYeN hKAy6oKMc7X5NXXJq6baVZT5p3AnFm7B 0ReT1dOpOjZuArydSdASupCQwRPVja+m 8PQSaAdThTifIBbP0Y2TeeA3yfGbHubo scMezJAXr7FGDQ8XIfyUYBDBoDaINi6j V/oI+aSnwm0uWdxHqfonzioTYenuTsax OGLYYuCMn9soxIuXatO53MpqfsJgh7UK FDCDGKA9pFts1vTQdCMPGgEsuYHjsYF0 /kUoRAQJM3jh0t3wE3JQ/HjFIyR37NCM w+i20b1v6/Xo86gy2nhXq2BopawLPEh0 Fv2UCCI7f8k2JvvF2o9udq/N+FE= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170821000000 20170731000000 1867 . Z3qb2ZevT0tfFrjLk+zVHYcEG7uU/lWD DMVZydBTABQqSEzRee/neEeme5MU/V1e D5nrYf6XJVqsj3O781vB/0OYiqbPcxgU m1tqelVDH0NcBSB0UIaADl4TqA72OnNR kBUa9U0pBJ/4e70rubuxieO6WuyPRzti UGaydhR8CREMr+r8FAItdjJWPFukIvrt ju+brh6xZKl5Xuxw/dklaZp+Dd6u2jRW 9tH79rh5N8rTdHdxHjn3JQs02wzx4iD4 OHd70QOW6avgvg2x2RnzS4Q7n1iU8hcR aYgvk0+FToMFlxhFW82M3xRDCjTrktF+ bUKyxz/frYKuS17pxRS1gw== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170821000000 20170731000000 37284 . gF++btbXlsLxe02aeytRLug6tJN994B/ F9LigfvZGjC/GE47VIlUmS8qgPWA4Sqd yUHiforLg5aMLO/CMe5WxqmEzSoU03Ka +PXW2R+q5k6tsTuowVDvM6W8P72f4epk XwEK27dmVJXeTbYVoREV186Sk0fowavm Hqdo8AX2XXB09pkBto8kgjH9otXnB3jA 2BRZKNicP3wJoH6S9Oy+nRSzyWRyBDjX Apv2h+quzWBNYux1GePJol5V/wem176Q kHUolQtCcRB4XIJG0BOHm+6P5nHRZ7iU JqsQJJ5PnnzH4sBO1ZBSJgDCzvIb1bLb Ixd3VGg3ZrEjrWda/OR8ww== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20170814000000 20170731000000 37284 . tGGr2W4HHWtFIdziLL0066dn1UKLSfv0 L0l8OyvX9fDPUNgKtVRMo91kNMm2Mp7o /pHiEDL8ZxxGsm1WKBmANjIQ2BBKzb0S TXmRrMmeuGtMiI+8PGQ4ZnlU32PtePyC /6WNh1+5PIg6cPkMJPx0+h7Mj7mdtKDi We2Ha56Fm9lMuEo+igAmO4rKLSrkjqVS QH1xwTwie+KPBHTK7rIannW96KYfzAEI ybN+CGTCgPawXuYxKcmiq2ZmNSoU4bJp YkZdVoFPr4btnO1Ai1Mh2QhcPlnDuN0M OWNzlJ7DaObEK7oCHMkb5tvBNTu9CsGO SZvGA603Md2D0YZfRKpQ1Q== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20170814000000 20170731000000 37284 . ykmbNQ7VSbpkumK9V7pECrxiws53YIKM O+OaKde/OHaQCVPIXgbVf3fc+Rk5e630 zHxZdwwpOcVJKr9RSCLylRnZY6ocDySy 10qeqVV7QCgwYN60/68DAPz2WjIQWGN4 UH8mtr+KyCa0Fj8SOzhPf9VBZ4u5w+1z lOLhWqc+lmelm8VjgWbyo6dn+/IokwKU Ks37sTh3sa+qk9zREwv0Ut6YEo//DOcT WdXxt1+MvmM0jssuWaCGqHiEQZlnVmJ5 7puQIiPUCj+YMEbX+rZB5CnP4eA14FD3 /L/Nq8cwb+0+yd0BjNS5bHfE1eIQawbL e7LrztJSYeNvS9TIZzRKww== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170814000000 20170731000000 37284 . PY5wleVbShlse11/pOPJMYiFBsNnWfE1 dUcPrAnLEZE7fTF5uFF/mAdkfLLIMG0Z mx4d63ilbMWJXBwmSk5nDsaDxbYLjqGW 7kitDATwiNUKtP3MXZ3jPl7qIq4GjlHn Hm4sRdsuo5OXO28mHCBhKVUCgjK9+Tg1 nxPqhc0V7momil5Tpl6I/h+gX6saMOsb 2wgcVV0wHwI2dOztgNOpqgQda3VqHVRd LN+sq1k1bDeZt4YdIonPwhPY45tZ44VH VPpjbJcyhJSzvQte6gCrARK9/MUx/1sJ bdP1o+cXJxzOn7TgfETYUS9QCP+7pbpL 55s1uno8nV88D5dMAuCI2Q== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20170814000000 20170731000000 37284 . xmUjSrpl9mlXOv44w7/rSXtlhoZeVVLU o96YJ2RoSa3OStDW6NrvsC5xG2TW+Ow0 Z+DU2y5G1hGLQkcT6KXbEoGAHBGOXI4M ZmgjLxD6hf5ttlTEZMZY7+y/wXzZnNMZ OJTCYkVht1+uZkI3GWtETmxNvLbNnRQt TSjrp20i692OmUi61utqEBR/wyiZj8Qz iCG4FvSWETf/XrjjuKpD7EWfn30RWnmE iB5Se/FbGtPVsHgPLsEiDLEMMRVjqgGh GGZQg9UVZmyHY+h2iTVryB8DK0IINNDs doIvs2ywFLTC2LhHVTmPvz2p9KFR4RIc 4Ci2Mz09N8D9umQRIekU2w== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20170814000000 20170731000000 37284 . hKhEcL2qwpjPZNsyTLnqTytfuTgEyHeN k3N+xhhy8nFWu1CiQLcdrsSUlG58h4I0 eFQw7bwZR6anymWx3nJGQe1UnH0ugbcd UlP2JstzqYuMa4+mpaA5IMzKe8vflEYl nas1j2I3tq59qXnRq+/XLAE22Lm2IDY6 Np/3E9zRT8plr+baWcY/E7E1xJcyDY+v id7gXwQa3EQxvOIKj0Q17xyJ2g1t/7SY vvJUDmEHZ/OKknqgdzwskAzUreld41qm LILE3TH8bfWGC25JSKxR9qU7c6sU0oGs 6pR7//IpTWRUH+tskFVmY8Jfx/ot11+H +mPqViBvNhXl2l20HJ635Q== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20170814000000 20170731000000 37284 . ykmbNQ7VSbpkumK9V7pECrxiws53YIKM O+OaKde/OHaQCVPIXgbVf3fc+Rk5e630 zHxZdwwpOcVJKr9RSCLylRnZY6ocDySy 10qeqVV7QCgwYN60/68DAPz2WjIQWGN4 UH8mtr+KyCa0Fj8SOzhPf9VBZ4u5w+1z lOLhWqc+lmelm8VjgWbyo6dn+/IokwKU Ks37sTh3sa+qk9zREwv0Ut6YEo//DOcT WdXxt1+MvmM0jssuWaCGqHiEQZlnVmJ5 7puQIiPUCj+YMEbX+rZB5CnP4eA14FD3 /L/Nq8cwb+0+yd0BjNS5bHfE1eIQawbL e7LrztJSYeNvS9TIZzRKww== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170814000000 20170731000000 37284 . PY5wleVbShlse11/pOPJMYiFBsNnWfE1 dUcPrAnLEZE7fTF5uFF/mAdkfLLIMG0Z mx4d63ilbMWJXBwmSk5nDsaDxbYLjqGW 7kitDATwiNUKtP3MXZ3jPl7qIq4GjlHn Hm4sRdsuo5OXO28mHCBhKVUCgjK9+Tg1 nxPqhc0V7momil5Tpl6I/h+gX6saMOsb 2wgcVV0wHwI2dOztgNOpqgQda3VqHVRd LN+sq1k1bDeZt4YdIonPwhPY45tZ44VH VPpjbJcyhJSzvQte6gCrARK9/MUx/1sJ bdP1o+cXJxzOn7TgfETYUS9QCP+7pbpL 55s1uno8nV88D5dMAuCI2Q== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20170814000000 20170731000000 37284 . y+EKJ2utPXopOSD29GZvwZOAx7ICHszl ia8LbeT6jAUF9oTVm0YKC30VQULQfskc oWwPssD9ZsGLUi/8GOsE4cropD5lk/AD Df021TAv/tgQTvIvNggpu4u4fpOopxz4 1E9P/rf7nROayVTo2dsgIg+zabkhb96i yIr/nhoxkvEYFcYTucfZTlVhOwjYGqvr FE/Ro4Gl4axf5FN+CK8CNebd43Ep3yJ/ 3UvecFYMofMEytguBLNsHFIrOtKGLQfr YfttDOl9Dr2h9txDAVXIWrdvYEuLnYR9 I7vBBfgBMwkyDfhmG90xFt51E8KSDcgQ lDMMiPrnLTBjIa3d21Bt6w== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20170810000000 20170819999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20170824000000 20170810000000 37284 . E3PCc79NFLHFfnf2+WYF1PvcIPYEF7cf CghVd0wWcP5B1Bh+vEdo6gsJaYD9/QtM q68IW4bPm49dI0zRvkRGG4NjE8zU8bO2 wGf3Ky61F4Xm1fwq9TYYCT29ofkm0NpE 12fP5P/ahA6K7cw7BfDPjLPhlqw+/iwO IlEKWbeg6CT33eMBfhQC1B/47bLon/AU 4AAd+sy50sMhkTeId7Zy5BAHg6V09Qg/ FV8PlgiSUgmSiEa22gITJOEu2LtRYPFe cJHEGZAtKAt30sQ0o5dR6m48mWdOo/4B GFoC1HfrpsCyGtpi9Ab3jFjwtpGFqu7X wzQS8OlqBPFYA33OJq4f+A== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAe1udmhwaWyg6PD00YReHeT6nYeN hKAy6oKMc7X5NXXJq6baVZT5p3AnFm7B 0ReT1dOpOjZuArydSdASupCQwRPVja+m 8PQSaAdThTifIBbP0Y2TeeA3yfGbHubo scMezJAXr7FGDQ8XIfyUYBDBoDaINi6j V/oI+aSnwm0uWdxHqfonzioTYenuTsax OGLYYuCMn9soxIuXatO53MpqfsJgh7UK FDCDGKA9pFts1vTQdCMPGgEsuYHjsYF0 /kUoRAQJM3jh0t3wE3JQ/HjFIyR37NCM w+i20b1v6/Xo86gy2nhXq2BopawLPEh0 Fv2UCCI7f8k2JvvF2o9udq/N+FE= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170831000000 20170810000000 1867 . NvCmbFb31NahFemdIPwno85Uzjwj3QbB bdo1NsGTIMU9IODLqRDBR/6i5XFoqOWE +SS0W8urCtb+dwg8Z0iJD3isVGOzDtnG tjoZq19S3E6UU28MehpOh9u6dJoZqlSr 0jvinZsVSKtd784O4IHBFDLhaMtGsTab PIEc/jY3XeHSQu3a0O1SWZaYy9/tn89v mWdHsYNmyR1EC6JhXf5pb3yPjgHhUg9v 5tS7poOWpYJMkLqNfIWKyciCLpc7IW/g kvuE+GI89qBVfFBQmhyKINHHIouwexqC qdTqrEL2VKPyqsiWjJ2jT9JZW/K2zvgH /WoCneDpHokp04wS1dQwpg== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170831000000 20170810000000 37284 . Igc1ImQmud5Oj4KrdnY6fFBJKK5T7DF0 lULf/IsYtNruJUmP9h/5JNaqZTfhCrbH SOFwlm01qeuZb39X91FMZbCegRowGL+n 3DTzwl6w6USRd4MhVVtTJjvP4+lB8rwm Xkw0k1sWK3RqnJ9vmINhKu/HHxLGG+qT VgjtMJ27DmIum6IPt53c8waqbVnbNzL4 LThPEEEzt1gMv+FKmMlIQw6GbdFrYatD JfXAu0+B9UhgZtkPzjq5sMgvkmKonmHp qXuuRnbzxehv+Wq09cBQwu9xHfnJxGHy i1vsVGIxPttLwYhGxnOvzOJEylmlOCLP 3PCXFuu3B5l6b5LFM7ssxg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20170824000000 20170810000000 37284 . LmgEtpDF4tZPcrrnqdFJHNay9PUwVupw xLjeDIZyzX1LTtrbHfiAS/luCAvHcZGh h9WJkxfulM5nthpxWFu/qEiBljjBXTKr YUAoCnV05VLjBjjrV473O197CwPCMWzh RE4v0Z+0nenW+zi4ckTT66h88UjGzq65 uHnjmp2X+0M7R+SHY3JhYalFo4Lo9PrW 26gnbDTvNRbV+XMLD0YS3YWIZdMRaEWG 23f39ZrCZF1P8AP7pbsfRjchQJz6ApIl KWj9Uyl9oXL434ClQGArKnXrX3eMVnKl 0I4uVUK4ILF9oz/ckxBPPzJRl+fqrleF 2YeB810tgu9qNWkQRcsczQ== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20170824000000 20170810000000 37284 . WjEAJUBZwFd9q4mq2n4hTf8itP5EjcZe 8LmggAJ/eUlHzram+owSwIo5IoYeEdNU y9b0yyXwQWa0DZH7zALKiSi9gW/Bglft Ejfdw8u+XXHgCcI17naRdEawVIWaQCuk Hnn4Rp8aapfQRSqcxCPa42W5BDy8cEXe rhi3yGr6tyAsrya+8ZrIM9U5c1+1fXvR G+wWQ8q4TP1SsuG3G55pSbY+N8VMa96c IhM9PlmZ8H1OtMokvKPYL6tZi3DQfN+f PJbT7ej7OcfogbhoYkRAWibgMM7R/dee M9zIEhBJlaU4KmuFthu++Fe2Tbj6Sp5r ooTLb65UnkoWbGOYhgSamg== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170824000000 20170810000000 37284 . ypCP7WbleHUNZI9xB+3weFFWqM2Ery6f +bic9OtSyFjAkTmAb4z2B737fAhEALNe CFr5NgEvG+9aRrETUac+vs7ljA6jj/gQ PgVE8cE4bXXl3sWnwzgSrG3HUyxYFNJm n16Joj9RA84ldgsxsZ5mDML1uH2GtyZe AvIqsCdtIKI/WD6QnqUQyCPibYyXbGLf NNh0K8wosKKrA/hx2y4oIHEXEwf0yA0f PzQQtn6/bHEzWYpvzkl3HT7gYxSBmH0h v0av1Q4MUjhnUBNwayYAmeXd0xfKV7DN yGqr2pzLuziC0RkLBiC85qt/14kN90ZH +aKeSeeRxx6YaGU1T1IVcg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20170824000000 20170810000000 37284 . E3PCc79NFLHFfnf2+WYF1PvcIPYEF7cf CghVd0wWcP5B1Bh+vEdo6gsJaYD9/QtM q68IW4bPm49dI0zRvkRGG4NjE8zU8bO2 wGf3Ky61F4Xm1fwq9TYYCT29ofkm0NpE 12fP5P/ahA6K7cw7BfDPjLPhlqw+/iwO IlEKWbeg6CT33eMBfhQC1B/47bLon/AU 4AAd+sy50sMhkTeId7Zy5BAHg6V09Qg/ FV8PlgiSUgmSiEa22gITJOEu2LtRYPFe cJHEGZAtKAt30sQ0o5dR6m48mWdOo/4B GFoC1HfrpsCyGtpi9Ab3jFjwtpGFqu7X wzQS8OlqBPFYA33OJq4f+A== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20170824000000 20170810000000 37284 . ut9CvNq5yKmhwZXGInuB6eVW8FPmKixM Lr9Vi4wbLo42Qr+nGNlhAKuDM160tZ9V 2D38DskRYwucSZ06UWb5zuuQ+LEMr7np Q2J8Ydt/ecXLsIvLYs45S5W8ovJmTnss qkU0fZIb9ySwdWW2rYqE9Hy1PadKS53m zFyqIA7OtsHcear83X1P4Jwzp/s1PA+N fiNePt+UoyRJXCgLJjNAI4Ay5T0HMD4n 00S6aQS7VmKWsJmQ7Uzyd/Q79pLo5mIQ MAQjowlcYSMcOen4JFKeQyiEEDfq0/Kp yvEP//mVgnzANm1QqALHwJuuHKRvg4Sw 3En8feCAesJLjx86GMelxg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20170824000000 20170810000000 37284 . WjEAJUBZwFd9q4mq2n4hTf8itP5EjcZe 8LmggAJ/eUlHzram+owSwIo5IoYeEdNU y9b0yyXwQWa0DZH7zALKiSi9gW/Bglft Ejfdw8u+XXHgCcI17naRdEawVIWaQCuk Hnn4Rp8aapfQRSqcxCPa42W5BDy8cEXe rhi3yGr6tyAsrya+8ZrIM9U5c1+1fXvR G+wWQ8q4TP1SsuG3G55pSbY+N8VMa96c IhM9PlmZ8H1OtMokvKPYL6tZi3DQfN+f PJbT7ej7OcfogbhoYkRAWibgMM7R/dee M9zIEhBJlaU4KmuFthu++Fe2Tbj6Sp5r ooTLb65UnkoWbGOYhgSamg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170824000000 20170810000000 37284 . ypCP7WbleHUNZI9xB+3weFFWqM2Ery6f +bic9OtSyFjAkTmAb4z2B737fAhEALNe CFr5NgEvG+9aRrETUac+vs7ljA6jj/gQ PgVE8cE4bXXl3sWnwzgSrG3HUyxYFNJm n16Joj9RA84ldgsxsZ5mDML1uH2GtyZe AvIqsCdtIKI/WD6QnqUQyCPibYyXbGLf NNh0K8wosKKrA/hx2y4oIHEXEwf0yA0f PzQQtn6/bHEzWYpvzkl3HT7gYxSBmH0h v0av1Q4MUjhnUBNwayYAmeXd0xfKV7DN yGqr2pzLuziC0RkLBiC85qt/14kN90ZH +aKeSeeRxx6YaGU1T1IVcg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20170824000000 20170810000000 37284 . KdU8rLyDvoUejIT/W0O/jldfOdQQgEbj lNkK5OzdqgGCa5ohaOB+7EDk4+ycrClP NzOYc9+W7wR7il0eCzAqabxzm6NBHCJ1 Q7Oci1TQXnx7q3Y2IXKycCk+95qAMEMB h9OmmMLJNc5wGGgxh+4ARR//bIw2sv/L gABeXIQ2T1Iug06r/lBBP+4sTdMOAgTE Y+uLPF4K8iK4JIKZWTPmPlEgrzPiqEFf znjSCXavIyWgsHjFNqrAnGHcdVbz7GNP vVwBfcjjhwBWm1LIY68yQtIBWlUyXUgS 3ieegfiz4GET13SXEM6SZIDPrstJ2qhx Zeu4NlBA0zgspOtCwJzO4Q== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20170820000000 20170829999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20170903000000 20170820000000 37284 . VwR/AJaqwjI1aDnB0x0KyuUZW/AA0RkD XRHFiyLWs3z5rYSMHVietUAoS1gEqd1+ UHhfwzhdKNwtINfqBQEvALqD/Dl0p0Zb XrwMvf2gk8Cdotgh6vbDwafcySr5/xyv ryy4S+6tVm4APLejzBN7Qsnpi9FusNvE 9Y+d9yKHnHTLTpAihKEbokcsACu4Jwo1 QAJk5LxlM6a72iUlg/Ce/hYUxZrbyt+n QtZhP5sK4cX5v7GeblV9BWsA2JGRQ/IX oGY6T9BqjNi7CA4oxIaurbdrOuAXv9Bq t6vmue/PaIN+eEaqCvHMn2wj5+bgJ5T+ dMSMxgpbg/kIE5n3qYv/nQ== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAe1udmhwaWyg6PD00YReHeT6nYeN hKAy6oKMc7X5NXXJq6baVZT5p3AnFm7B 0ReT1dOpOjZuArydSdASupCQwRPVja+m 8PQSaAdThTifIBbP0Y2TeeA3yfGbHubo scMezJAXr7FGDQ8XIfyUYBDBoDaINi6j V/oI+aSnwm0uWdxHqfonzioTYenuTsax OGLYYuCMn9soxIuXatO53MpqfsJgh7UK FDCDGKA9pFts1vTQdCMPGgEsuYHjsYF0 /kUoRAQJM3jh0t3wE3JQ/HjFIyR37NCM w+i20b1v6/Xo86gy2nhXq2BopawLPEh0 Fv2UCCI7f8k2JvvF2o9udq/N+FE= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170910000000 20170820000000 1867 . BX86vECnGwrEZUK/uEaActkHGytrF6G1 2bgGFiWWBjpf3pqaPodMP3P4n2vvYejg bSoHf0SIlV9no1iYMZWZon3uTZcgjbuD UYppPBhcT2O3dlv0EF8Wwmp7NEEp0HN+ 6GRyK50kGlRbQpkmrLSIlMkPiev0kAYd wzt9OzIxMfGrAPiOLgF561rIYZC0mJi2 MkvDJyr+D0cUE7jOWFchMqUxHjal+jY0 aWcM53Kf7XBi/58dzct/rp8m7bedgKtF 8mCNCeKPMpsjtRbFsiehjl8oF/EKvLCI PSie9a4D7N/eRAuIqIpcjWz2ncPlyKT4 2ueX6/NjJaBVEFSuORWdNQ== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170910000000 20170820000000 37284 . Z+qzNq341hMzghshwHURDxy96C0zSup+ f5Wa2p0OVlvfmQvxhGPLi0cMAVUib8IP PM9oAfK7C5/Gj0hZnVjoEnc2psZu4GdN GKc0c3SybJoY1l3gDM1llRMctdorllVx vE2WZJh2PSlA+9kW7s3QWMCsAjddyQUf dsz4C9cNY9hb+dSQAcLeodwvbWSANvBV wiP0+qSdNuT0Fbqbz/dvJOHVBVUDLaHD tVcI+q3Lw0GzzvAZuV9eMGizCW6XJ6Ed JSsfTAkuZ325wiLz2GDTAB1QP8i5IEFN 0GqmuNj8n7U1loqNNd+Dj+bsSb9g7k6e JjPE9N7UP17eu/R1zXfu+w== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20170903000000 20170820000000 37284 . UowTPtGOKWyFFHehAXDf8r89LasrvoSx MXuWBpk6/zvXBLJQiNTKLpkVEe6yPqtj B4sdI3BvvP1Vi1Kk/oXUgmsQVC+fhlFI 0lLXDoXcjzCI3IEju+l9YyzAqSfhtzIY i0an070u8WUtyN6onlislSlM1uGi3mrQ rq2Rca5atwEop1cAo1Merl0Ll9yI4vVp FR4YbMaj0JI/cixrFZ5n5srDhq9s9h4F n7h4thWvyA5SujXPW1bPHEtOW7hx5hl3 Zi3xmRQAuzzsKsj5ID+t6JVtTcm6u064 kSrvWOwWHYsEHCmuZ/p4TyNnDtjFnVE5 DOedv3vxR8GUUCf1IfQ4+Q== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20170903000000 20170820000000 37284 . WiRICxAPQ1iK7B5hPT8TEK6PMhZauoFj qtw8sR922TGye2CPMgBWGAmqF1wjnJAH SWYgz1r6vx+QcI/HGwVxbnfjVUq8JmZx EFxbChlcDOxqv2YdLud0wkDlrP/nTwjF CNcY+OkqMDtUg/3LUcbJfGFO2b5vhCDS w+ETff6ZZS4wg7Joy86xojcRb6hWhDFm ei075+N06io2T+RX9YH7LNPXfPpC3OaH cn/4neNoxDe05YkqubB4pjLQanrIF64z 9fqPxDp2T+Ln0TDezMRR+dKBOK+c1VIm mfRMEeEHk6tmH72outgEDVUXxV9stjN3 /YfLs7kv3KRaqYLe8D3hvw== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170903000000 20170820000000 37284 . TQthucelRM5g+wAyl7sbwXfHZLZsozys ppIkTZV4mrbprZfqPxP8Jks7Be/Zcvy5 nftAOwD+RXOA6K16qTR6V76zpuBnfUEs emufRjCmbb41GOTBFcn00zp13u0q+x7T VEBMeM/1AwJR85cArTU1f0GZhLCYxino 9U6n9RlKy0b60tduK42z6B7px9wok35U 5MmkXop6NVxM0LR97ox6EAPOzUZZkUgC D20mx9gwhu7szDIMY2jgjWg7V+QDOaoB /JYncYAdy4O6sPGtL88vj6l3A25mvAe3 86c2SZmmiYBc20Fg6sq9qbH9XH1GFK/M iJrNX4FT6+fn2XAIcWOj+g== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20170903000000 20170820000000 37284 . VwR/AJaqwjI1aDnB0x0KyuUZW/AA0RkD XRHFiyLWs3z5rYSMHVietUAoS1gEqd1+ UHhfwzhdKNwtINfqBQEvALqD/Dl0p0Zb XrwMvf2gk8Cdotgh6vbDwafcySr5/xyv ryy4S+6tVm4APLejzBN7Qsnpi9FusNvE 9Y+d9yKHnHTLTpAihKEbokcsACu4Jwo1 QAJk5LxlM6a72iUlg/Ce/hYUxZrbyt+n QtZhP5sK4cX5v7GeblV9BWsA2JGRQ/IX oGY6T9BqjNi7CA4oxIaurbdrOuAXv9Bq t6vmue/PaIN+eEaqCvHMn2wj5+bgJ5T+ dMSMxgpbg/kIE5n3qYv/nQ== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20170903000000 20170820000000 37284 . tQAEQyOmVLpxqHu2JCh18vsX6dy5B8a2 KfuwvoIBtTTSqZkJb7X0nHukqnKMnKR9 /IIfgyH8gi5gMJcaDAxqNzwiZWndstJF z/d7VfXUdIKDu5mIxDlylVNO6OOYRe9R RkZ256e4i4IoWsyYS8temy58+j4/+ohV PTIZe0rPmhgH7YEBioWnUd4HKbeQnMnO qwICbPWzlPiNTNH74DOYQS8hF41FDkDl /c7zjjwWaNHYLGFOSQR7aeg0uQajZk2V 3jVmv0wTLlivF3Z3T+Yl4OLuW4jm0e12 rsYX6kwdEZ49PQWOaMd5eyR5MWBbFja5 tHuZ6czAV5NzBD4NY17z2Q== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20170903000000 20170820000000 37284 . WiRICxAPQ1iK7B5hPT8TEK6PMhZauoFj qtw8sR922TGye2CPMgBWGAmqF1wjnJAH SWYgz1r6vx+QcI/HGwVxbnfjVUq8JmZx EFxbChlcDOxqv2YdLud0wkDlrP/nTwjF CNcY+OkqMDtUg/3LUcbJfGFO2b5vhCDS w+ETff6ZZS4wg7Joy86xojcRb6hWhDFm ei075+N06io2T+RX9YH7LNPXfPpC3OaH cn/4neNoxDe05YkqubB4pjLQanrIF64z 9fqPxDp2T+Ln0TDezMRR+dKBOK+c1VIm mfRMEeEHk6tmH72outgEDVUXxV9stjN3 /YfLs7kv3KRaqYLe8D3hvw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170903000000 20170820000000 37284 . TQthucelRM5g+wAyl7sbwXfHZLZsozys ppIkTZV4mrbprZfqPxP8Jks7Be/Zcvy5 nftAOwD+RXOA6K16qTR6V76zpuBnfUEs emufRjCmbb41GOTBFcn00zp13u0q+x7T VEBMeM/1AwJR85cArTU1f0GZhLCYxino 9U6n9RlKy0b60tduK42z6B7px9wok35U 5MmkXop6NVxM0LR97ox6EAPOzUZZkUgC D20mx9gwhu7szDIMY2jgjWg7V+QDOaoB /JYncYAdy4O6sPGtL88vj6l3A25mvAe3 86c2SZmmiYBc20Fg6sq9qbH9XH1GFK/M iJrNX4FT6+fn2XAIcWOj+g== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20170903000000 20170820000000 37284 . IdGsiFPBibUlbjGQcsm0y6HzVk1bpKhe odSvmA3r8si+1AkAzyGbLC7Cd1gmQJfO pMLQ7AHZFcQptp07oexFqqCI9HPVoj1M ItMZK9eFUPiZKM1pXnUuuxremUQuOPnJ NMfECR2qicVkd+K+383gd0I+qyfeyVkl VbdZzGe+2sPRkj+9h7rvWAPU77JMb6To dS0TJhWb/kH7k7+DXXcT0315IqnjKn71 2xoNN8rb2afYdgV0kMXUvQCd9JqtsIBT RnjrB8Vru32jc4TyKCrm6YT3kZb2MzWn hMLEkZfi+OBiOeVpULqkliLUH1os1pH7 u/Kdsizxl1GdpzuVv2TC0g== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20170830000000 20170908999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20170913000000 20170830000000 37284 . hGcp4EeAF4ETIwVvhdM47CKT7ePfuiI1 l/bEWXwsYfd0XHUgORkdfPouInN40vIj VXtO/rE8HU6FvfisBTcC23GCH3sMFDYT HEcEDXAR9FczdXtDIPXYnRL/TUCIo/f8 /3iNis/QUO4LRedG+dgSclYhvOQqIcbZ I0crF/JugXrrckXhkM3JQhjbK3DSMy5/ srY63HkAKV42kVLJPTcTeZ6Jse4wej1U t46mqkB+YfjM9Cnkc/UjGFgaaq5+XPIz UIZ7oLBbdtfTR4hMCGpAjLtpxqICdvbE 6pKGxqPBGtBYDkupWzZV08X4Lmr1bdwf CCgAIqCwy0xiBbk/zG/Ufw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAe1udmhwaWyg6PD00YReHeT6nYeN hKAy6oKMc7X5NXXJq6baVZT5p3AnFm7B 0ReT1dOpOjZuArydSdASupCQwRPVja+m 8PQSaAdThTifIBbP0Y2TeeA3yfGbHubo scMezJAXr7FGDQ8XIfyUYBDBoDaINi6j V/oI+aSnwm0uWdxHqfonzioTYenuTsax OGLYYuCMn9soxIuXatO53MpqfsJgh7UK FDCDGKA9pFts1vTQdCMPGgEsuYHjsYF0 /kUoRAQJM3jh0t3wE3JQ/HjFIyR37NCM w+i20b1v6/Xo86gy2nhXq2BopawLPEh0 Fv2UCCI7f8k2JvvF2o9udq/N+FE= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170920000000 20170830000000 1867 . o7N+8dSYDD37wWTtz8ISO3Z2C6Jrill+ r94YmxQQWimsbJ3LEihrjGyXL7Lr+Kgw rpbYUgjwzx5JvDOIUSqmM2SBxsg76Rhj 5NAARoNjR4GQDQJ8U6txxXVO1X6Llgly mBTi0ImUu0p5YZz3HxWpPJEoYE1goiIl xE7G6AFN+nd+riO1tbaMG0X1+9xw5NYt ImuErToPcc0ylMzpvXBLZqUg/s7bJHyL HdoGghslRLz2W1DXWiAnBvICBB/HHPpJ 5LSncL5h/d2HSwVUT30NkS08Vse1aBBX YZpAoupxeYsZ6KPPsdY8Y3xary1mASdw 0RYC6AzGMjuhtevYEPmRsg== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170920000000 20170830000000 37284 . UkQ4HtPbhAKw5BP64OqiZO+xKisJzIA5 YfTAnriF3MiUSMlcx9BYAkrUNkJYWzlZ YgWtAsuE7k/wCYGDxg8CHGTLTx4gCErh gKxAZu5HIz3tyUYZghPT+OIDV0X+hYVZ ZgAO+8w8oSDab3sS1j0ye1weDldhjt9o qEbVhy7gZo0MZpTz7n96TbLgjSF0uT+h Xpp00H/10hgDbvjimI64D5KuHUusL964 h9XIcoZ0vQW6aO3Ufve4/9ma7n+MDGna Ci4/uUGcYA6aNqi+hF518Yi/A2v/tBnq QK2mbnF3POV+kpmQH4iQJ07X4aaeu0cX PsgIYi991e0SFZ6jBWX9Lg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20170913000000 20170830000000 37284 . oHsPF5SHum+uJ0JboRPVvwPXPWlcrfW3 sp0MYYsdVVy/H4EetBzVl8I7xEmSI6c2 LY4rlxYtWKxUuDr7mcvlwbPIRG7Rs+C2 f737cCNlm8mBVNEpCcxExnf4swVssIwM bFfLfr8hZjQ5YhU+3Y0L2/YiCBwugRBb vLpbrmuI4th1a+wb0fDF2WYS5GdUzinI pRBF3ZQdoZIMXFdbCvDVGxwd7yBkXxq3 l7u7UK1QBWZdutS+RhHvG3Am3lnKaF1+ tEzseXWDPh/KD4BX1oDrxROdATif3FtJ ktD/1nb/DgIxy12fLx3+NMtCRV6Q+iOa FyFZn6PkltoMEa8CdY1tiA== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20170913000000 20170830000000 37284 . iBK2d08iy7leYXYJKClLj5glo+fxB+zT bRuqnF0qIHEhEDHqo+i+9wI0c5hq6mWL PXmPUrjZkdkmeQF8xreI3GcXATbV49yu v7d7RkmnoiyMqRSEZODx0tH0JugZROUv to4KBweniM9JNCo/iwXJqUcrtawdY4Uz hYn/fvpsHw7DhdEh4o634WSFEgsPvW2H +DcL+xJ4GMfdF2RV35kd/hI40ILMqbbU cFRzcXX1r3ZK+2JOJ/InkjYmusnShB/8 oL3BIXW9g6d7EXA1qjDlc3TD1zOC0tPW G0cTOWpRZydvnLq5yEFVpbNbquXOfB6D 3u+kHoEQ1T5a1EYkOdQSQw== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170913000000 20170830000000 37284 . eMd6DeVqe/USIOeZ5MBNfxArFmnmEpnk +Kl9yrnLBISN2PkkcrOY/D/zOQ7jMfbd MB0HUt6R3a7uQNMYhsuLnIQoTPeZdflu I6QNPFCntf53KZKtvr7AcnTex0yx4IJI n/2+xbrdROLbe5deFccKsGvIXA6MkTQd zP8vmOg/1ltpN66bMSNouaCbDC6aDoMs ABBneHYaGnYlxA4aTByRtJzUh+IGEMvB 3eNwbuQ2vbkJhkKrSsJubIqhjSEhNEdK oYmgzUsFL0M3vUsTFbhTASr/ngISJN69 fMJ3yrDPdjlJBXkkSlPZUWnfKHfxjDbR /6Ul50cpb6wcP3ll++u7Qg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20170913000000 20170830000000 37284 . hGcp4EeAF4ETIwVvhdM47CKT7ePfuiI1 l/bEWXwsYfd0XHUgORkdfPouInN40vIj VXtO/rE8HU6FvfisBTcC23GCH3sMFDYT HEcEDXAR9FczdXtDIPXYnRL/TUCIo/f8 /3iNis/QUO4LRedG+dgSclYhvOQqIcbZ I0crF/JugXrrckXhkM3JQhjbK3DSMy5/ srY63HkAKV42kVLJPTcTeZ6Jse4wej1U t46mqkB+YfjM9Cnkc/UjGFgaaq5+XPIz UIZ7oLBbdtfTR4hMCGpAjLtpxqICdvbE 6pKGxqPBGtBYDkupWzZV08X4Lmr1bdwf CCgAIqCwy0xiBbk/zG/Ufw== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20170913000000 20170830000000 37284 . bUh3BmbXKHB8ahKfaXzpOSdof0MAR/Qe U97k8jR5CDK3LFWF9JaCiSA9QHVSl8Mb dK/yPQmZCG5//jhW7rddOGo7TSmG+fqC oZtwJS9/HsySuvpBmxiHVjwvmJsbtCqu Ob8hxJO1S0LkAKEN0n5zUrY9wjbzXvSd Vr8sVzpJY2r+T8MD1lewERQtb97bzvGV LYK6lnNJoH6KZwAJd6krcVJWVt4ENj51 6sOiGslAG8FdTuLU4DJSr85y1hag8sJl l3gJWpPfrEJN1cgrWWs91VI365rIW5ZQ zb/vAauB3s6dQ2BrWOWJnepSA9tF4GES siWsiE1feIUsWVaOYCmCSg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20170913000000 20170830000000 37284 . iBK2d08iy7leYXYJKClLj5glo+fxB+zT bRuqnF0qIHEhEDHqo+i+9wI0c5hq6mWL PXmPUrjZkdkmeQF8xreI3GcXATbV49yu v7d7RkmnoiyMqRSEZODx0tH0JugZROUv to4KBweniM9JNCo/iwXJqUcrtawdY4Uz hYn/fvpsHw7DhdEh4o634WSFEgsPvW2H +DcL+xJ4GMfdF2RV35kd/hI40ILMqbbU cFRzcXX1r3ZK+2JOJ/InkjYmusnShB/8 oL3BIXW9g6d7EXA1qjDlc3TD1zOC0tPW G0cTOWpRZydvnLq5yEFVpbNbquXOfB6D 3u+kHoEQ1T5a1EYkOdQSQw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170913000000 20170830000000 37284 . eMd6DeVqe/USIOeZ5MBNfxArFmnmEpnk +Kl9yrnLBISN2PkkcrOY/D/zOQ7jMfbd MB0HUt6R3a7uQNMYhsuLnIQoTPeZdflu I6QNPFCntf53KZKtvr7AcnTex0yx4IJI n/2+xbrdROLbe5deFccKsGvIXA6MkTQd zP8vmOg/1ltpN66bMSNouaCbDC6aDoMs ABBneHYaGnYlxA4aTByRtJzUh+IGEMvB 3eNwbuQ2vbkJhkKrSsJubIqhjSEhNEdK oYmgzUsFL0M3vUsTFbhTASr/ngISJN69 fMJ3yrDPdjlJBXkkSlPZUWnfKHfxjDbR /6Ul50cpb6wcP3ll++u7Qg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20170913000000 20170830000000 37284 . Z7ZBkT7afpWPO2bxz/mItkegNlUuRZIe BcBx+AYTAvs8ffIhm0EYS62j2AVIZwwj S/WnenaOgEvQDtoKi4c2vD8SvOM3n6Ia g6GagJrDTFhVcd0moZdzPNiIukfSg2RS xvO7SckRlp7ILApY6P6EfvgT5tjA39O6 VlgtKcwa8h49PsFdPwpqH2FtkG0i0iUr v4gR/JqzG/ZB+07KF7AtbxLfvvj3o7/t Imal3xl0OAscxAN8hKYRQhRKs4snryXY y9ar5Wf2JVHoyRPJ/rE00UK7/zYr9qIx 4QcTKKdes0prgtu7xyiouXzOSkXE+4KU 6E1tHxRip8Skk1r1XVZwwg== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20170909000000 20170918999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20170923000000 20170909000000 37284 . 4sVe391XlvS128uzSEJZuV+LxGPJutXl UpZs3zvvI5LYJH0ivfIMq/ju8wyuVMXx tppwUz2chDoVF4VG9U09R/OXX35EFtn+ 1b77QwoGdciYZ+BTB7mdvY8Ft1M9GOmn 7G+bUOmdQ5DBY6DxgrqnCtnPHtXbsbnU 07PahqotEPXpPntxN9QG/F9i7bLm6O0j qRGFeAHA37aEjkjCKLkAQ6mV3u9zoLY7 UAS+/eE2QwzvitGjaRprbnS3djb6vG2B s0c6/udgypOCY/Ocs7nTRAstBLnRhTXO dmLxaQIviCNs84/gD9ZHa66n5lyqpM3p xwkly7gophmpaad2Z6sG4g== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAe1udmhwaWyg6PD00YReHeT6nYeN hKAy6oKMc7X5NXXJq6baVZT5p3AnFm7B 0ReT1dOpOjZuArydSdASupCQwRPVja+m 8PQSaAdThTifIBbP0Y2TeeA3yfGbHubo scMezJAXr7FGDQ8XIfyUYBDBoDaINi6j V/oI+aSnwm0uWdxHqfonzioTYenuTsax OGLYYuCMn9soxIuXatO53MpqfsJgh7UK FDCDGKA9pFts1vTQdCMPGgEsuYHjsYF0 /kUoRAQJM3jh0t3wE3JQ/HjFIyR37NCM w+i20b1v6/Xo86gy2nhXq2BopawLPEh0 Fv2UCCI7f8k2JvvF2o9udq/N+FE= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170930000000 20170909000000 1867 . nYKCrIGWK/cioGfdAArMBL1Xw4JTRSnl 9hWCY26Ib7ogWnkJd5zp0WIbjNNJiNO/ XRDUZEXC7anjXzSt8ZrncqMsFI+fQD++ ZJpmEZpz4FkNrGN0yooO5uPJNxznf8Rz /Zz4i+DUWCJWyiUSOVZ/zFTgv7oTOuat bqYuXNp0mLk1ue093M5pOYTLuzuGDWlZ s08ZhO6VPV+9nfEjnqKgRyNKSiQz4juS GMBQE0nLF9oWv8Wl4h8XKuXPPYAgg4Hf J54ZGckuDXLG1UU3/d7iLmbKWRsPFyRn e3Jm6bWQ51C9BJhTjRmQYKdEPPTUhVnE wNsn9VekiSAeRNt6Fv/e8A== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20170930000000 20170909000000 37284 . jQ4JxIi9y6o9RG+pqB9OXt6XWKNU082y v/tDJH4O6XwaeAcM9lq75K62u0jVc7iF ZOxOBglei/rMC0JwnBDmU27gn1vWmpwy cUtlqK5b7n+EgydfLpAru9bCgUD8Cn8M qQ3gpsClpZY2l1fRAsk3BQa/OpjBCjmX +LvikL1t+bzgH0198BQrNbgNjBi7kr28 8YxH4K+MqcLA2t+uoHNoGxygectBMURG 7luS0Cy+Y1dN4YUERrX0F31toLfo+Qpn KVtxrA2Aw0iHhWChBsVn1IHGYvnmbN7A u6IbaggzrNru6t3OqG6sxLZd6gKSuY1d SfOU0RwM4f6dhZKz0Cyiwg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20170923000000 20170909000000 37284 . nUcSfFQOC46LyoBiQSVWoUUop3AU/sQa FjqJKG3aL9sTk2Rm+VzbKbpzlFyBCxcg nChFWq7m5EjzmeG379dTCM/6Imge+npQ jhsgz7yHh4jwfYqgOaGFp84fduBFlbLc XvJvZvjmnxsPlB6fYOlBKuXEANzLJgob tlle84oGusjWpbPW/eNtvMAhPG9Ct0CF zoL2UkqO3wp2V/gxPiEPmNs3lr7ov95J kltL2AbL4SmxQ9T94FLqrJWmUCKAHjdF bF27F4zfwCVu1f3Qrwa/77H6o9KAtvZm tevGo/lsO2xEWK0QV2Olex6KHQx1NWKy cR/7GH11NBnsjYmiglLIUA== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20170923000000 20170909000000 37284 . g8bM4iGPuB1ZyAjP39aGVi21hUhdrsxu gqHBb3xRne4L79U8rHc1SHpA5BupowTl LQJV+3pM5KnX/eBVenWf/4y6gjI7aj/l u1chVmUfRKeI4kTXd+Bhhv/9SJXEvHqw 10fcWavusnuHs/qNCZlZCs0RmZaaEuhl EJF6Vat2x56/dEGw08KToo05OR4esdq1 r7ARQlARYZocINyQgB5JqgxV3CJ87LEz IwGu3pOJGwBA/Lqg6LOqv/TCREwWJITs 2cfFpwRyKmiGd7Qo0k4+0Dw9nIupR4rj KM1EXklx5YwAG1dNTQUu6lmQ7BJbSXs6 x7uOjdl2id2RQfysiTNokw== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170923000000 20170909000000 37284 . 6u3jOiK1+7BoFdnFwHWHDGRYfmTAeQV7 X2yCqBtBiaAUbeTrH14ycJdyd++jL/fa w3nZa+xkdxACrsMu+0rWzH0zNtP2gbg0 iI3FyxExBWnlJfzK7fRAfzE6i7OCTjJo 4dTa0VxV/lJN4v2criQ3QdmJgw+Yzpmu Aac35W53zHioliK1gEhqZRAyNLXVvfXq zJYxgAzmIdGwoS6QyJXx1Sxsd7HGrosw HdhQPPY9rI2ZXzZjat68bpDXw/jqTdi5 vw+lD9STlXg1ZrWWAN7Nip19JEteUnC6 EyoUPggFdu4hG6GUIIJKjbM0SKcUGBjn F8HZJH8LIOap2UoVUkVvQA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20170923000000 20170909000000 37284 . 4sVe391XlvS128uzSEJZuV+LxGPJutXl UpZs3zvvI5LYJH0ivfIMq/ju8wyuVMXx tppwUz2chDoVF4VG9U09R/OXX35EFtn+ 1b77QwoGdciYZ+BTB7mdvY8Ft1M9GOmn 7G+bUOmdQ5DBY6DxgrqnCtnPHtXbsbnU 07PahqotEPXpPntxN9QG/F9i7bLm6O0j qRGFeAHA37aEjkjCKLkAQ6mV3u9zoLY7 UAS+/eE2QwzvitGjaRprbnS3djb6vG2B s0c6/udgypOCY/Ocs7nTRAstBLnRhTXO dmLxaQIviCNs84/gD9ZHa66n5lyqpM3p xwkly7gophmpaad2Z6sG4g== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20170923000000 20170909000000 37284 . co+5dOhcVlu7rKvhWgJY2te7PNFQnvt8 DFn2xKP5ZV1qDtId/qepvY4FHEYzTJua DLD4efHBL0uY3R0VONqnHS/DppUBRXHt 1JcjFETuMt2pZszEDyEimFDLNCtclmnP 13A3fwDObFZxxqHmcQXV8pb4ZBInJuCs 5SCU1NE0XmBjAbpgB//Nfllht+G1SQlD 3XHNvlNBQ6D7Ma1qs1w0XIse5ekS09nq QRAJbgu6ob1Yb9b3zuvcFyU357h4MJPb ligrO4HrPY7Q4w6M2GUKgnCUVlPG9Wrk vgnNNMOIzVAwWY95vr5K/bANTjI6Mh6b Cr61MpLk5Y7JTPIsyMJgrA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20170923000000 20170909000000 37284 . g8bM4iGPuB1ZyAjP39aGVi21hUhdrsxu gqHBb3xRne4L79U8rHc1SHpA5BupowTl LQJV+3pM5KnX/eBVenWf/4y6gjI7aj/l u1chVmUfRKeI4kTXd+Bhhv/9SJXEvHqw 10fcWavusnuHs/qNCZlZCs0RmZaaEuhl EJF6Vat2x56/dEGw08KToo05OR4esdq1 r7ARQlARYZocINyQgB5JqgxV3CJ87LEz IwGu3pOJGwBA/Lqg6LOqv/TCREwWJITs 2cfFpwRyKmiGd7Qo0k4+0Dw9nIupR4rj KM1EXklx5YwAG1dNTQUu6lmQ7BJbSXs6 x7uOjdl2id2RQfysiTNokw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20170923000000 20170909000000 37284 . 6u3jOiK1+7BoFdnFwHWHDGRYfmTAeQV7 X2yCqBtBiaAUbeTrH14ycJdyd++jL/fa w3nZa+xkdxACrsMu+0rWzH0zNtP2gbg0 iI3FyxExBWnlJfzK7fRAfzE6i7OCTjJo 4dTa0VxV/lJN4v2criQ3QdmJgw+Yzpmu Aac35W53zHioliK1gEhqZRAyNLXVvfXq zJYxgAzmIdGwoS6QyJXx1Sxsd7HGrosw HdhQPPY9rI2ZXzZjat68bpDXw/jqTdi5 vw+lD9STlXg1ZrWWAN7Nip19JEteUnC6 EyoUPggFdu4hG6GUIIJKjbM0SKcUGBjn F8HZJH8LIOap2UoVUkVvQA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20170923000000 20170909000000 37284 . ENRCRlKqQ6DYCQTD41xWMM7vfU+vIsem i5S243UV7pWEb3f67JQyM8ynCPvINQq9 pZE6oruuPlp9HHixMiEdNwyFGPbKTCsr 0o8CTsuRZWKOmVjMtKWOg5F+cmU+uWr6 sWjfQ4ON64Zez8ED5i9p5ZBgTRN4sFAy TC7/xSidQ2+D9tN3EjrUkgECkujGvErP NBFOUukZ18l6IgeboDF9GpJ20xxsnMkT I1NtQ1g5v13M45ct/XYrUeuT913/wdVf HwUjptkF5127XEc4vyRZ02Cy7hv+x5Rf RK0V2IjuTN1MgxvTDsCAbxiNJKesx9lJ DFFD9P6UDQiMr5USjMuAwQ== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20170919000000 20171000999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20171003000000 20170919000000 37284 . zIsYbxp2lc9mFdhHsUmvb12AM8fIcHem 6YgkRu4Owgv/NkRo4yQ2GvfkuSmXb9EU fsHKaJ1CrDQRckXTGtKLvWvFnUuxJtrO DkxKdTUG+yBwL4Sma1xhsj11JFu57Hm7 hQemP9LdYGXxntRh24kNG/ILuj4qk6Oj k+l87JcMnrG8SzOvykliSPriywagnvl/ bEMWzbFRFwEdxr9hkwMNxK4XbAAeEBJ0 j475+LS0FYiijsvqhkU5sjkTPkHzVtTI Ks1POK9cerSOJPm8GtWrduGYvIJjSwmH qVvzKBG5RfUZiAigW/VrqYcPn/8lpYqI kz6lAFl/pGsEd6v2gSo43g== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAbS4LSbmieIk96i3AK8IEZXlLRdM YLoEp4QSRMrdtJ0VcZKsjHWF6g9Q50T/ 1XKBxY/+6j71//cFRi1cViqoNsPd3LEb txWa3Jx/1HBINOkAPdHMBc3SQQ5qEIar PObq98RLnQ22ske1xZtbzNRZogPNi7zM HwQ3GYf0sUVCnYTmv8en5yYfSh8mY9Ez 8okorK7UN2RlHx9B8S5DRtBphO61mSI8 MXRj91aC3iRTbYZndTWorVkj4UvCBBr9 qh7oNpRbprIvAmRzRK6IaxpYDS6iGtSq 05WbGRtQRXkngOzFZO1BBDHgj9Agtx2S HBxAKuX4wF+w8I8xO7m5z0MOIF0= -. 1814400 IN DNSKEY 256 3 8 AwEAAe1udmhwaWyg6PD00YReHeT6nYeN hKAy6oKMc7X5NXXJq6baVZT5p3AnFm7B 0ReT1dOpOjZuArydSdASupCQwRPVja+m 8PQSaAdThTifIBbP0Y2TeeA3yfGbHubo scMezJAXr7FGDQ8XIfyUYBDBoDaINi6j V/oI+aSnwm0uWdxHqfonzioTYenuTsax OGLYYuCMn9soxIuXatO53MpqfsJgh7UK FDCDGKA9pFts1vTQdCMPGgEsuYHjsYF0 /kUoRAQJM3jh0t3wE3JQ/HjFIyR37NCM w+i20b1v6/Xo86gy2nhXq2BopawLPEh0 Fv2UCCI7f8k2JvvF2o9udq/N+FE= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171010000000 20170919000000 1867 . LMUm+N+voM+56KcWjWsPGklkKiyFbgtX Ay/Ji/tJf0a2uh2mdlkXUWAVjPOkafQx 5Tq4zjw+/pWvVwisLiYSn8m+m+hdxcSg viy9etd6dfrsVZNwgsMG3K6LdHfsbuC4 Ydrv6yZoZTUFyfHyQRCfATHJch0piSLL /LMFObaDBC3MWLra6WtdirrYnNTP011S y9tbfC/V7wtDrlIFtkK3zJIsHurm4BGW M9oFfMg7VDBgJef0LbZhhU+4yjTaWRaG VVcSBeqmXqhqlqLxDsqj5mrdIHwW2vF+ Hb9D+F0bwCswKrsKixXOnkCFIrhT1RZQ 0CB9BZH/QGDCDtWUGXueRw== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171010000000 20170919000000 37284 . pOG+720+4AOjs6Fif7BUPGOGxGXilWFh z+YeXx6C/IIk08i9DqW4WvGG1o9CMX/+ NN5OyuecUFJp8n22xwfckf3RORs6LhQ2 megC4ihkWAcxXHqyqjqkUx4P7DVAAAGn yzVyXY7KMpuMO7ionGgZk04RxdKeeoT8 8AXKdwNwTUQ61+rNdsUU8Fygg7DLvB3b zT9QkjYTi+QPo6ALwgjHcr6l97hGs5cp U9FCAZXu5oTp9eqjXAmI5eyrDRDRK7nq hSjnbbXTT7GzPvTswda+o906PYkB2gW7 qkGofxD4Ciu8siz3vy9ALUQTT4eeNm7Y WtoCrJbhsZ0/7FacD3L8jw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20171003000000 20170919000000 37284 . uZ3lgEsJfhMjLnVepQJ9SyRoIRJZZhM/ GSl9T1WfxljeWcVuH0OqxOaCGCK27Vpj PWjJ/n6l1zjy3lz1s34/XZ8WmcfbrLdg zZ+9sZsGVXqxT+npo3IeFUXD5a2LgB3d oIidRs/IbkKDaKw7U8FF0SPXS8h1St7V 4/ENnq54WPdh8BZC2f0C9VU+xsnDlp5z NsrqDeMwPZ1yPdnlxJA6koL0F3p1/VYT DP/Mriyzjt+dmvhojkkQnWG2rnnXGWh4 ewlZwlR68mB+DCQ/WhnMHq9RffCTIygC F3Drb6482XR7ANtmXDsNA/Y2iQjADZpb cjb7yyogu5yPHw0SJHfPPA== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20171003000000 20170919000000 37284 . 4OZ8eS+IN3twUhfuk78BkQbVehkxz4x4 EeEoPfL24Vex9AMnIj+DlwgYsErcczgK HgJpoTUZqlGGn2kNzZ03RX3RoAyoBMoW C+1lpVpkv3x6RdNQO0RMtFVRieh1viuQ cd6oFXUsNETjVEJS/spzPEF37xx3lJKl bOLvY65YhfnFtngfYuPTQQ/SEn5mr8jZ r/0iuFs8XAH6I2frpd7h48rD96OeXQV0 Uppw5M3ClEKBSHU+f71M3SWue07HJuBx jKaAZMJYfYhci4vm9NqZe0V/dQWHwRRG OpHwPQNaI0tJBUlHTddKE2pPjxnQXS5t W+o7hHZrH3SI1GsE5Ugsrw== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171003000000 20170919000000 37284 . oqdH8h+fUxn9TSNLtANXQxUiRHUEraOv GuOZ4hdbEs6K65QY4P4fj/fO7Qi6hlCF O+N2FgG4CTc0lNLQzQ4+FGtpwiczSN5I SCw6lunF53F6ljWl4IheBtvYfdcDgKG6 Oqms9N7cj6eigTejag8qr+mL1/QNe+UI bVGntou/NBdA7B/Co91en6A0jdB8w2CE PRh3FshPPaAvjybZ7vhpaObZf6Q/a27P fFt9o3udlESHx4d8wUhCovfDiXPYBRNd ZOTYfXozedUmwVB9uZ29GR/8cxq8SJhq D69VIL2eqThBK9EbaEyIDhvSDXxbExFi vgvOKzd2/1CLrnCjF3pC+A== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20171003000000 20170919000000 37284 . zIsYbxp2lc9mFdhHsUmvb12AM8fIcHem 6YgkRu4Owgv/NkRo4yQ2GvfkuSmXb9EU fsHKaJ1CrDQRckXTGtKLvWvFnUuxJtrO DkxKdTUG+yBwL4Sma1xhsj11JFu57Hm7 hQemP9LdYGXxntRh24kNG/ILuj4qk6Oj k+l87JcMnrG8SzOvykliSPriywagnvl/ bEMWzbFRFwEdxr9hkwMNxK4XbAAeEBJ0 j475+LS0FYiijsvqhkU5sjkTPkHzVtTI Ks1POK9cerSOJPm8GtWrduGYvIJjSwmH qVvzKBG5RfUZiAigW/VrqYcPn/8lpYqI kz6lAFl/pGsEd6v2gSo43g== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20171003000000 20170919000000 37284 . FYT56I3bIBcEPdHW7pvndYI3Wvw6uElt j8aRh97PR5UsTuwR/ldnYlaPZORD7HXo ia+bKlkHJArJIX49ZrKfCf+/bdLHD6ai AbPzUm0f+jfcPpZ5WO/cXXv97sfOL2Ob mRpQ6jUOmm0fSIU5gnE+V+EIWSgHuWEP w4cy4O6whqI290ktNaDJbLwIoKzuWa4+ WcSAjtikkgkqLejHVWlftT+/5y3d8c9F fWjj3YvCy9J4HPpfCfrgX5dMCeyUTnVb iGwYp50xJJDeaPcXc9HxGfmdJOnzo1se /UGfqjw3J68RHjokzgo/w1Ny56IbgtC7 4rDxGIHjInmeM1+svCbJHQ== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20171003000000 20170919000000 37284 . 4OZ8eS+IN3twUhfuk78BkQbVehkxz4x4 EeEoPfL24Vex9AMnIj+DlwgYsErcczgK HgJpoTUZqlGGn2kNzZ03RX3RoAyoBMoW C+1lpVpkv3x6RdNQO0RMtFVRieh1viuQ cd6oFXUsNETjVEJS/spzPEF37xx3lJKl bOLvY65YhfnFtngfYuPTQQ/SEn5mr8jZ r/0iuFs8XAH6I2frpd7h48rD96OeXQV0 Uppw5M3ClEKBSHU+f71M3SWue07HJuBx jKaAZMJYfYhci4vm9NqZe0V/dQWHwRRG OpHwPQNaI0tJBUlHTddKE2pPjxnQXS5t W+o7hHZrH3SI1GsE5Ugsrw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171003000000 20170919000000 37284 . oqdH8h+fUxn9TSNLtANXQxUiRHUEraOv GuOZ4hdbEs6K65QY4P4fj/fO7Qi6hlCF O+N2FgG4CTc0lNLQzQ4+FGtpwiczSN5I SCw6lunF53F6ljWl4IheBtvYfdcDgKG6 Oqms9N7cj6eigTejag8qr+mL1/QNe+UI bVGntou/NBdA7B/Co91en6A0jdB8w2CE PRh3FshPPaAvjybZ7vhpaObZf6Q/a27P fFt9o3udlESHx4d8wUhCovfDiXPYBRNd ZOTYfXozedUmwVB9uZ29GR/8cxq8SJhq D69VIL2eqThBK9EbaEyIDhvSDXxbExFi vgvOKzd2/1CLrnCjF3pC+A== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20171003000000 20170919000000 37284 . SIetFloLSKUteCyhAROcwKu97x30Yjev Xjuo/iCpTSQwPD9Hkw3o6w4Jg4MFI51/ T/TOhr/x3V4AFIon7FyRjYzbe8FBtTCO k2B393CMp4TgcQUDYtdGYwZX37NN7YGr clF5PY5ejLNTT4HauuTObzPB3ZaNLRMd zQK7sTSCWQmjdQYXumL6rYBYLrCD6R52 Tnh8YDL0k2al9bD8FCiQJoqMqHqXYFAE GD0lxBKJrRfubzRmpk7u1zDhfwaP7TfT owkW3V9k8e1UBFkbyBtHaBzRQrnxuCvv BsuEoAx/1q3gItRvj5APM/4Qkmb8oiC3 l0j6fev46O9SQeCREPPXVw== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20171001000000 20171010999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20171015000000 20171001000000 43863 . NqLOBYw5S0U6TN0X70UZv1V45vVbiDSp 1qpD4Sb+dNaCRuz9xxAWyQ4hfAcRh1GB 7L9w5HBviGwqfHQYZQqWvqEjXl5Dcgu7 h0pGQnNfEh2Eq/v16MEVf9XSR4C6ngK8 qtjigNahjsVNYz8COoooQuP5plu1LDzs myTcldGM3EbW9oYEZS5gpPXrMjFn/j7Z 6q87y/1uhJh4hiv5THl5kL416YVQzZdK fVS+oJxJe2B70H7PIOtOuKD2wIuMLXCk MWQz/Zmciz53i8/WicTHnGlWU7xKVH8m ZIFEzzhtcR71NVkHrMVuESKuJp1fm3lR 6FgC4KReLduGXcqDVCZNwg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAbS4LSbmieIk96i3AK8IEZXlLRdM YLoEp4QSRMrdtJ0VcZKsjHWF6g9Q50T/ 1XKBxY/+6j71//cFRi1cViqoNsPd3LEb txWa3Jx/1HBINOkAPdHMBc3SQQ5qEIar PObq98RLnQ22ske1xZtbzNRZogPNi7zM HwQ3GYf0sUVCnYTmv8en5yYfSh8mY9Ez 8okorK7UN2RlHx9B8S5DRtBphO61mSI8 MXRj91aC3iRTbYZndTWorVkj4UvCBBr9 qh7oNpRbprIvAmRzRK6IaxpYDS6iGtSq 05WbGRtQRXkngOzFZO1BBDHgj9Agtx2S HBxAKuX4wF+w8I8xO7m5z0MOIF0= -. 1814400 IN DNSKEY 256 3 8 AwEAAe1udmhwaWyg6PD00YReHeT6nYeN hKAy6oKMc7X5NXXJq6baVZT5p3AnFm7B 0ReT1dOpOjZuArydSdASupCQwRPVja+m 8PQSaAdThTifIBbP0Y2TeeA3yfGbHubo scMezJAXr7FGDQ8XIfyUYBDBoDaINi6j V/oI+aSnwm0uWdxHqfonzioTYenuTsax OGLYYuCMn9soxIuXatO53MpqfsJgh7UK FDCDGKA9pFts1vTQdCMPGgEsuYHjsYF0 /kUoRAQJM3jh0t3wE3JQ/HjFIyR37NCM w+i20b1v6/Xo86gy2nhXq2BopawLPEh0 Fv2UCCI7f8k2JvvF2o9udq/N+FE= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171022000000 20171001000000 1867 . SLUfyBPUVaIp+yzafCz6VdqrSFGI8XA4 4Yh1m5g33CTjHLHYdtprsZbOmU1DkcJf zeQpHrMwStfDycnvwCbtN7QV3hzVIsOS +4npL6l1nn8ORi4x3dklHrks2rl/L+ju vsI1KE5dLuTEPLKxcrt0SRd+JsxhzewR WZwAxFFYVeXNWoKQeuFPH3BSeqC1hcJ9 p54vcoOYvwm4h+x+R93QZ6j3ePmj6wih x0haMVJ1tbPxoCYJK+LZoRynnWmhEm2p Wivw5TlYE5eGWPK2NYSO2te7cOH2y8Py taiWTE/VOpKEFJVHyXDQfffONLbTRFaV MCC4eDAVi4LTYt1gejgx+w== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171022000000 20171001000000 43863 . sWLCuaV0WZTEAIjXVuAC6jV18aQubTO4 Cs2wA9hLJQyPFIN+cKVrwMP0PXHrVNs/ 3k8UIBg/4BcgWCT7BbypiaaJjiXhKDxn hIk0oJRHzE7sGE5mvsKlqk4XBeLNnuCN NykshvAbpbh7lsFBqQ7JjtaZeRTu6JW+ CJixWFb9E9QYyJ3jfKDwLhiytpiWmr3Y ny8y4a2pOwYnuAiz2XzZP7I8dHXdPHaA sfitx1HSLpFwGUvfe3GdcAZRpoTKmtL5 gz4Uy+4HIawROTtnptir5OyAvCqeU1T4 BfnrMuYt28Zj1CzbF0H4vCjTyBWYC7gj GEehw4AutnhxoFlgFIFx3Q== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20171015000000 20171001000000 43863 . UUCE+pmAPxa4t+LyPxbpjtVEq7F2DU7d 5tGfvJcNhFmbgEcl/7/PvaoPRTHOtnKI J6zLb8068Q/Y/rziAgW1vjuvmmIScefi nEcASJAkczBMQLDzyqLYnOfhORPRQyTo MRG0fGnsw03+qjOo4lfsdqvLvzSzkiMe idplhFpQ65Wpc4ARKRc0AHzde9rdD9uU BAFAUg23A8Z0p6+WuVi5lwS/TCnFbT/Y bBx9/wcOK1Be4nzvtR6KiwxZVk2DHVyV 8DqgGCQxLWbd/4sIftHG+URJlXi1ZGeG eFQLs9wY1ES5fSCdot3yRfAGRnLzBxN8 2SoCIGo7VfhRK6/Z00/K8A== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20171015000000 20171001000000 43863 . WhLjFUV6O/CeESF8322BZSdt32YTh7uh H2wJNLJnvtkJu/4QoPGx3AvgiLquC52m r3PFFcD6ZPC1iqKRieLqEfyH0B8iS1Oq iADBUjdLC1e5mKsEc+bwb5P5heaWdu6g FrhoPPL98QtswwXFfsmhOwoQomplIDlu gNLUyCjfvCSjX6raEKbuBn6pn65OlT4s sZh6nCT9YOYma5QL5FxFlaFzUfJn0qGQ 2k341M6sS6U84rhiFKWyRtSqShPzCnfB Q06Rcx47fabVpcUJ2rS1DE3jc9bIszeZ n8IK4TlxkkQ6CbaahKAUeXQ6iVdAEaZ8 Ut2XVbPlTnkCGbBQQbismw== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171015000000 20171001000000 43863 . VfbolsQWe3CmwrnWRsdmx2k5gaQmSt7Q oKv6b11iLn+oY1gpQL9fz4YRU8z5HzTv XFvgtdLDnN/7jmo6ECgKU43ToOgRlNBv nu7FijQ0iBj34Lxl0D9geAJ12lakVHHG pbzokVSTVyIduoOhhMT5ZEPmQ3e3ru1B xArn4MFUH97cWnfFkGobDz+nas1Z9E0i kZ510rYpKB8MVyhO7l79txsxwK8Y/ut4 4jg6bfGTwTSk9ILWalsSMYy0CVkQHUgE Cm8MracEG7D8TTBWipvoT5WD/qA4usyx 7nXUeQH/wM5q/9U4iRY4Vf+1iPk3d6+h gK/MteVeDPZYTOS+IwzWVw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20171015000000 20171001000000 43863 . NqLOBYw5S0U6TN0X70UZv1V45vVbiDSp 1qpD4Sb+dNaCRuz9xxAWyQ4hfAcRh1GB 7L9w5HBviGwqfHQYZQqWvqEjXl5Dcgu7 h0pGQnNfEh2Eq/v16MEVf9XSR4C6ngK8 qtjigNahjsVNYz8COoooQuP5plu1LDzs myTcldGM3EbW9oYEZS5gpPXrMjFn/j7Z 6q87y/1uhJh4hiv5THl5kL416YVQzZdK fVS+oJxJe2B70H7PIOtOuKD2wIuMLXCk MWQz/Zmciz53i8/WicTHnGlWU7xKVH8m ZIFEzzhtcR71NVkHrMVuESKuJp1fm3lR 6FgC4KReLduGXcqDVCZNwg== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20171015000000 20171001000000 43863 . js4jobso3JzElwlF+PAw4W9No9vgyaJm l9EdFtRCdGyixA6bLL+mAdZESbpMvUpR 4t+DBd+zbOeHlJUnmtTib/eU7stYM1LT T4s1UZUh7HZh1RYQ/ujZsn48+eKCShKG OGdidugQyIreLm55qvj51yro0Ie03juN jag88naOfvS5mbq8OmN82apeGxjwiISG u+VegiXchOiDeHZAT/dxlXF2lJQ+fodN pmGrMo6y5jm1EW2hpDNqW3DcM0rWJ1fY AkiBxiwRnkpdR5ckqfVXT18xKoZfEy+3 bXbdh0Cd40IipkuwjmOh5ZXGma15CU7D BgGJzmP/60pJdMAAD7rjsg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20171015000000 20171001000000 43863 . WhLjFUV6O/CeESF8322BZSdt32YTh7uh H2wJNLJnvtkJu/4QoPGx3AvgiLquC52m r3PFFcD6ZPC1iqKRieLqEfyH0B8iS1Oq iADBUjdLC1e5mKsEc+bwb5P5heaWdu6g FrhoPPL98QtswwXFfsmhOwoQomplIDlu gNLUyCjfvCSjX6raEKbuBn6pn65OlT4s sZh6nCT9YOYma5QL5FxFlaFzUfJn0qGQ 2k341M6sS6U84rhiFKWyRtSqShPzCnfB Q06Rcx47fabVpcUJ2rS1DE3jc9bIszeZ n8IK4TlxkkQ6CbaahKAUeXQ6iVdAEaZ8 Ut2XVbPlTnkCGbBQQbismw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171015000000 20171001000000 43863 . VfbolsQWe3CmwrnWRsdmx2k5gaQmSt7Q oKv6b11iLn+oY1gpQL9fz4YRU8z5HzTv XFvgtdLDnN/7jmo6ECgKU43ToOgRlNBv nu7FijQ0iBj34Lxl0D9geAJ12lakVHHG pbzokVSTVyIduoOhhMT5ZEPmQ3e3ru1B xArn4MFUH97cWnfFkGobDz+nas1Z9E0i kZ510rYpKB8MVyhO7l79txsxwK8Y/ut4 4jg6bfGTwTSk9ILWalsSMYy0CVkQHUgE Cm8MracEG7D8TTBWipvoT5WD/qA4usyx 7nXUeQH/wM5q/9U4iRY4Vf+1iPk3d6+h gK/MteVeDPZYTOS+IwzWVw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20171015000000 20171001000000 43863 . nkmiASU/GeSZEoCScItfXTCRJHCkCGsr fYarRDxNDH2hegzh2XHT2l/bEhDoaV+b gaPNVGg/nTcKsQ3zUKg9ufhnpSNE3tMd zlo5PPpPz/2+8hKrd4m7n8HwKilVaruk FC9pTCu46QzBCiz2TDj87ADf3vaamJVj iEmZQEiVu3TDUi1M3wjj6E7Pbl1i08AF ejYcYXex7gjen4kyQhLZ9CpxgdJb8n3U Z6eXRjBNo8r57XZr37vDGlVDcQB7w2sV APFsiQBNTQyY+t+B8T2AK3JPK7ipn08T gdqrO6XhkLalMZo5wF0UNmEHTOKznt+Q Rt1eEgUReLPxhWDz4tQnxA== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20171011000000 20171020999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20171025000000 20171011000000 43863 . j84QURP9YH3d3RDmH+1/hTcF3oDAwQx6 1aorcrvDubtKljRL+fD/lPpdTDqa0IT8 tQv+N4AyHe2M/CguEoQLe7//Mckn0oxB 2fW8FRsXBg2ROroG3LHo1Fr7vMwJdT1u s+ybnUUO1yIwmC9WgDZ7X0alRtsV1kqB w18tcpsgoFR7S5pyO6iQ15nJCP9+dXNT 0OMIR6IF9jAxju39zSMHd8sx6WHvYgYK gEBpxHBqHspqupopbaDFvLGyYM5Sl1dQ KBI0HxVTPkL5xg36Ds9mK2AImWltHRMw oYdTOCvzrvXIH8U3z1gv38dMbvyHBKyE qCKQmG5bSdlYZEN56Ds9TA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAbS4LSbmieIk96i3AK8IEZXlLRdM YLoEp4QSRMrdtJ0VcZKsjHWF6g9Q50T/ 1XKBxY/+6j71//cFRi1cViqoNsPd3LEb txWa3Jx/1HBINOkAPdHMBc3SQQ5qEIar PObq98RLnQ22ske1xZtbzNRZogPNi7zM HwQ3GYf0sUVCnYTmv8en5yYfSh8mY9Ez 8okorK7UN2RlHx9B8S5DRtBphO61mSI8 MXRj91aC3iRTbYZndTWorVkj4UvCBBr9 qh7oNpRbprIvAmRzRK6IaxpYDS6iGtSq 05WbGRtQRXkngOzFZO1BBDHgj9Agtx2S HBxAKuX4wF+w8I8xO7m5z0MOIF0= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171101000000 20171011000000 43306 . prNbOqQOWhxL1tTDnVFk0IiHBmFZfYGf L/1jC0gcC7r20aODKHGXsxzNfacx+ohB Jr1b8s5UOk9Y6L7R9FwYNDAGC8W80F1A qp7d6CKKAUcnmiGYLbr/YaxZa/dLRLSM MYxSbKjCu7dEtZPp1RHhn4Mm9F9LatdF wP+Gt/tsKM41Rp2yaev7MyzlQmzKeRuk q4+nOOlGoreVCxr7gTedX2aOAlU0dy7V 90UKkmoQT2/qG770n1nT6SZLO+3gzahJ 4qog+N4nj3v33YLVCep6sbQApQdrIScU cqCQLh8+b+ZZSwFQ5exS9EQ3Vn/Qq6Vv oHvvdgDhHN5it3hN+KwaAw== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171101000000 20171011000000 43863 . RnQlmuJYsevQtDCaROBK2EhRYg4a6VQU Mml2ACLppliraGaCYrZ3Md1QG2NYx3jv LrqYLXCPOL1gYTQ+cviT6vzltvPqaATB oZvqfoxTlv0Ue72SZixxFJpphv/KkxaI Amer++W3j24AcsYFJRtgMejjQAoZuoou GfYiF+STZKUv0atrfA+ff1Bccc8qPB8A fXW9W7VdAQj0oizKDUr2++XaAL7w06pl 9EEK50JhhFiQT7ycxJdwXwq1quQCxAYK hlGyOGcolAbSnyMMqSvAnuEmdQ4xViLn aA3qSlm+MwCAQof6CRZKQykMIubo2ADf qcjLwxIsiezhnFs2GPV1Tg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20171025000000 20171011000000 43863 . rpQpv1g2i6O3oeePRi5/rFU3IxV3mn5v fmHgrmx90DSrD+sIqJmZccH6HywkvB3/ oNsYlub6X6+ynHaKXLwjEcqF5W1Vx9+d 8mY7Bb5ncT8zICJA8ey4whQ53xaBZiMT NI0IsH49QfO9ni7oS2BXzZfzT3VJFbWW xTa/n2Ptw54IlODyiRWiZa6pmMPvSC0O 3CpxD2nKN4wbmR8CicyVfqbBzqlb4et7 z630ydAVMKnm9lZu3o5ILI+TzYww4dNO diUBUR3H4ui/U6x390S/ymdgn05PL+xs nHq1/yAjrbDLAKlgr7mxTnxUMXq+MIPR aMeR0WHZMjl1jZH22Cjz9Q== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20171025000000 20171011000000 43863 . DhvuKaow+/abfok7XV/keFr6vx/5OBV4 P1k9XtNmg9BZ3E+7NRvyJUWj8MEqAKYX GhVbVU8L7ByLVOC7GBzpuJg1Ics8vP/H 5vSXJGfc4C1gGnPt2SvhcPrWTNKdFsT6 PnO7J7YWNzCJOvbNkT398vi20nZTF7Wq V8XDEr6sg50X5b3BqAncvnj2ZzIC9ONg InX0F/R1CxUS84DAitqHmwRpZ5Ci215G 0Ho1LPPPe7ENzpLRAtGNVjmk0y08+/re TcqoRPxV+1puXvFDr7x2y1dwE7U/EL+i BIM+mZmDv57BrqilmaEASqk6JjBb3jxS 13m6pS4AK7x6kvlEtWp6bw== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171025000000 20171011000000 43863 . A8wCWy4vpVHqbcBeHinc1gzt9ox6FcRo kSLwswv2SRCAgG/U9iyZHT9fI3K2EjRL VdQycBQrEdp7TiXx1kfFYqvBkgN4IDBr F72HNr47O00reAQs7TAy4E4rtiNkqS/Y 8TJ+ifvaMVJhUGTGzNPOBJcvSRag3Lf8 slr5m53ZM7Cqjt+lV0yF2OAlb85Mi1VM 7iW1gX+OAIu9i6pxbDyJy7HKI6RVvZ/C 5f0dYlBz6WMEfT7CQ1ai21y6hrMZZMAv wRO6msou52aSfpcs9Gt56R8TJ8ZAG4mx wHSDJESBEL8HZPrnwDTUkgWtgMasvLa1 7Y9b4J0QfyWKFJqF9qCAJg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20171025000000 20171011000000 43863 . j84QURP9YH3d3RDmH+1/hTcF3oDAwQx6 1aorcrvDubtKljRL+fD/lPpdTDqa0IT8 tQv+N4AyHe2M/CguEoQLe7//Mckn0oxB 2fW8FRsXBg2ROroG3LHo1Fr7vMwJdT1u s+ybnUUO1yIwmC9WgDZ7X0alRtsV1kqB w18tcpsgoFR7S5pyO6iQ15nJCP9+dXNT 0OMIR6IF9jAxju39zSMHd8sx6WHvYgYK gEBpxHBqHspqupopbaDFvLGyYM5Sl1dQ KBI0HxVTPkL5xg36Ds9mK2AImWltHRMw oYdTOCvzrvXIH8U3z1gv38dMbvyHBKyE qCKQmG5bSdlYZEN56Ds9TA== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20171025000000 20171011000000 43863 . V7uXPeHovcCZXfST0psQLPNfg22S1Kq2 Vzk5wihwlwIAhAYOjVDFvFhItZzf9yQ3 WYzJXfDOh4oy8bb2WKMJkOTlA+5q78cX 6iWlp3eqx57Vs6J7n+FlvO4mVdod372+ yRh2XhjKwfTK58dhSm70cTtVP4wxcQ5d ZjPvhK79LJuHU8WbrputA0W9BSv/in3L amf+wYEsKEMEKZC1bsMBPWLDdlUyjaHQ mqxR+UxODtAzl1JLXo1T3dNKeqspbIZU IEhcKSUuFGF4sqYPhPh77wc5cD4jXJcY /qgSDvjUtiK1cyFDhw4JWK/rRsisxgt0 +wIN8FVVt0TCCZFVmC6BfA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20171025000000 20171011000000 43863 . DhvuKaow+/abfok7XV/keFr6vx/5OBV4 P1k9XtNmg9BZ3E+7NRvyJUWj8MEqAKYX GhVbVU8L7ByLVOC7GBzpuJg1Ics8vP/H 5vSXJGfc4C1gGnPt2SvhcPrWTNKdFsT6 PnO7J7YWNzCJOvbNkT398vi20nZTF7Wq V8XDEr6sg50X5b3BqAncvnj2ZzIC9ONg InX0F/R1CxUS84DAitqHmwRpZ5Ci215G 0Ho1LPPPe7ENzpLRAtGNVjmk0y08+/re TcqoRPxV+1puXvFDr7x2y1dwE7U/EL+i BIM+mZmDv57BrqilmaEASqk6JjBb3jxS 13m6pS4AK7x6kvlEtWp6bw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171025000000 20171011000000 43863 . A8wCWy4vpVHqbcBeHinc1gzt9ox6FcRo kSLwswv2SRCAgG/U9iyZHT9fI3K2EjRL VdQycBQrEdp7TiXx1kfFYqvBkgN4IDBr F72HNr47O00reAQs7TAy4E4rtiNkqS/Y 8TJ+ifvaMVJhUGTGzNPOBJcvSRag3Lf8 slr5m53ZM7Cqjt+lV0yF2OAlb85Mi1VM 7iW1gX+OAIu9i6pxbDyJy7HKI6RVvZ/C 5f0dYlBz6WMEfT7CQ1ai21y6hrMZZMAv wRO6msou52aSfpcs9Gt56R8TJ8ZAG4mx wHSDJESBEL8HZPrnwDTUkgWtgMasvLa1 7Y9b4J0QfyWKFJqF9qCAJg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20171025000000 20171011000000 43863 . jou6HluOgT2jv6k74V4tJZcstOdYnTl4 kWV+x4NZbYYCNrVoeNf91yeX45ABSIB1 PZZppw9aR27m6GiOqQ9I6jSWmpVV99Cy u6KbsK52xc21S4dVhamv47wz8o82JtqY FPYz2GhidDKezf944ggoti2lTteeZl+M zbxpEq5Oq/9138wawGEePBuWsMp/ObNe FQycIfICMkm7Ng0qww/0jiwQB2LvYvak x6O1c4C45AYOsHt5U3DFu1XVbqDQKC/i WW2LOdn+RD94QRudjFxt1AVyn0UA55KP sUuoZq4eBQLY3Tp0QQPn/5XAhrT+iA41 PaBL/0kuNyhygHm+pmi7Cg== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20171021000000 20171030999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20171104000000 20171021000000 43863 . QooElIIDCY4Jam07Bii596BBCb2TiGUY TmbV60FaeBfBXWRkkT+mCuWe5PpBx3/A gdMbB2/OrvDi7CrGOehWyiT4gUkgAO37 BgVG0JEwEt5S4SOCDRz7lUgedB1KdoTw FhWTJDJSXZfQYVE3ksh9Chi+ySUaoPUk dEk6MTw4F1CEOMAXJ+ST9sG88kg6E+YY 00GmZGR32ALaCx07FOaUE6JESbhRdF92 6NlS+VVMGw/v5B0lxvlyneQJWZ4mBDGL MxvNhwwC6ElwJBO09sgg1UOP18A1zpkn dSInPzXP+qS+P63QuUlFuE+1DhfNP4WW 7ISPuytZyMIVSGB9b7igUA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAbS4LSbmieIk96i3AK8IEZXlLRdM YLoEp4QSRMrdtJ0VcZKsjHWF6g9Q50T/ 1XKBxY/+6j71//cFRi1cViqoNsPd3LEb txWa3Jx/1HBINOkAPdHMBc3SQQ5qEIar PObq98RLnQ22ske1xZtbzNRZogPNi7zM HwQ3GYf0sUVCnYTmv8en5yYfSh8mY9Ez 8okorK7UN2RlHx9B8S5DRtBphO61mSI8 MXRj91aC3iRTbYZndTWorVkj4UvCBBr9 qh7oNpRbprIvAmRzRK6IaxpYDS6iGtSq 05WbGRtQRXkngOzFZO1BBDHgj9Agtx2S HBxAKuX4wF+w8I8xO7m5z0MOIF0= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171111000000 20171021000000 43306 . shYCeDVHCCBc+HDxr3Sdl1IlnbqpqR+P BDt1j8U37iGqHMfa9tAHUtUU5a2hlDbY N7xBPA2ZWJwksW1MGhgJO9bDrK0Pi1MH mfk1S2shqOmz8Z2VrDaO+RWzxDDh/b0R 0tVrcVrYOPR7C2QD0tsjhxDFZlE2TC9I 6WIXllAjOckxVqKidjzbKmOGgvlNHYJg uU333Tg+clWLlJVTghwHsTe7lZ6BiVqS 7frKNg2CaJg/XKkqH8mNkiAjfc8hc4Wo Yr3fDklX5p9leylrkq8TIYA6jTHK/v/d wUpK7mevN3PViuB+CSmqIGyHRTqbajBl euN9iRNAAaAHGyXo5jqqkQ== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171111000000 20171021000000 43863 . Yz7jMz1gE04oN+qZgNTiWABeemxA5+V1 QkWcIVvHqGOHzoFllKVIGoKu5MqEINXQ qJ3Mta5stkDHHQqbSGVAf1zwZwt/rJ/7 37Vi+dfP7rVyhRiyqr7blXQU9aOGXirK mDl9QyiTos3O3XJzu62Tlf1KeotOa0bO UAKN/Fo3u/9qLQT1KAQ0mmcuE2hmXE9f 1oJgmL7C2cduMhPIy9BbpSuF1KEWwO0J KrXggSwVV2Sj5C/LAHuAQOzDjPIhsQQw sYGiZLnY2A7GIm9jNfFrlidrgM9awNvK O1k2owB+Ocf1n0GIMsq9d/PkFdqfrDh3 rL/fjtbcHoWnvAK+ZGeXAw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20171104000000 20171021000000 43863 . fINfuCHxhSG/AkiA0+qA+9XixCDk0vRD W75jOQdvgrSCb5KpGcYCEYUTf4gmKB3A 9uxkTkLnozBXRr0RiYY9Cyzm4bWgyMo3 5QIY/zr78Ovtw4/DHobM3Pi2ZJuXPSk2 HfOs8paP9xoFvc+56oU4C/uGdbb2c45G Fenet3RDZEIEIWODChQn6Fr6Nf4NTrQV Y7oMggzDnNXpjUPHwcywzuBsd55D3rJc 80IwMGvaXzIh9pjth/i92WfiVk01pfM0 B9+uBQAjeF7VQXVH9iTpdiErm6jX0fUD M46wZQQgW63q81lGGeXgyU5QU/KchqL2 ZdwOUGJzIFWLZIh9C0efdQ== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20171104000000 20171021000000 43863 . o9EjGTFdfjfKCsZ2gd++IKzw1PjLeOLN 9ImHCTfPt228hOIToC46/JC5kNlFUpbT 5ojeEBqgQYHASBk9iSrOIBTL6m4aFReJ a+dl+xWHc9+hAXi/7ygZBrQ+FHQ9rF7t wIHn+EQPCjw29yxxgyUGsOE7mbeU3BX3 +EbPIdxxsldq3lasHPPOQVJPazxAVMa8 PTZhNMTzVg2s2yxwZjHfyINwkR0SyUub bEW9g47U1c0vspJi+1gsjfq9Rls3Tzta cIk6n7vICYx9lrGEUrBGktO2ODtiOdXu ffL0z/zOVl8e3rzNRm/PRzyWpQvIqis8 3ehJq7S1OaNV7XqE9oetdg== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171104000000 20171021000000 43863 . jIFv95ONRDAGEW5HuwBA5wC+vIRb6p7u mTuDoY3IgJPP1etrVi7bf/HlTL9Y/6O3 DXrqq+WaBN0MC7unImWssydpMHN/3U8e HDPybfeHC+XqoRLnz0TJ3Ue24tuzEU5Q LyqumAHyfeEAdIdIIff+RKqTLoGbY3+j W8zBsXbWe5c4yc5ywiGcheCIuJXzJEQf vxFtdyHdkoWgNkK8P8h5SVhZiocWOjnM pjbxVOnehVJtqBfwCQNGU+0ZuSlUUD9D EG0U7D5K5VndP9ccyEhPk9nLc37cp9Ho PRmxPb0y7nW+4L0oW82veAz4XFab+lYM 0oiRDz3Oytrxp1dwUATC6A== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20171104000000 20171021000000 43863 . QooElIIDCY4Jam07Bii596BBCb2TiGUY TmbV60FaeBfBXWRkkT+mCuWe5PpBx3/A gdMbB2/OrvDi7CrGOehWyiT4gUkgAO37 BgVG0JEwEt5S4SOCDRz7lUgedB1KdoTw FhWTJDJSXZfQYVE3ksh9Chi+ySUaoPUk dEk6MTw4F1CEOMAXJ+ST9sG88kg6E+YY 00GmZGR32ALaCx07FOaUE6JESbhRdF92 6NlS+VVMGw/v5B0lxvlyneQJWZ4mBDGL MxvNhwwC6ElwJBO09sgg1UOP18A1zpkn dSInPzXP+qS+P63QuUlFuE+1DhfNP4WW 7ISPuytZyMIVSGB9b7igUA== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20171104000000 20171021000000 43863 . azjrdB6MPXt1MBU4N24js2WxcHllrqPZ NCTkEJXqHgdTrkUIHwkaNvIqbqpPQEfk 3KSmVzelKQ+IvQyi++skRUJdXgo8AQ// iM5P06RoNjIorjMCnF+ttYK6LCy7Sk0A d/r+nYsn+uVU6WF8/SKzb4CXntv/pIDr 4qdIF5zt0W3ear2/m0q8k0ET0abncL3U QJKU/1y9IC3Xe9L4z8Ivp8h1pQk0+kda TW7RYNao4O+XOsT5FFARvLCRUIu+J2yC NUwqa9qmfwd2a0HFxQ5xmCAD6sH7n5gp isEBlg6lp7RpuqzgMpQU4PzbH/yQ6XJj huU2sB4zkYogd5F1f0b1sw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20171104000000 20171021000000 43863 . o9EjGTFdfjfKCsZ2gd++IKzw1PjLeOLN 9ImHCTfPt228hOIToC46/JC5kNlFUpbT 5ojeEBqgQYHASBk9iSrOIBTL6m4aFReJ a+dl+xWHc9+hAXi/7ygZBrQ+FHQ9rF7t wIHn+EQPCjw29yxxgyUGsOE7mbeU3BX3 +EbPIdxxsldq3lasHPPOQVJPazxAVMa8 PTZhNMTzVg2s2yxwZjHfyINwkR0SyUub bEW9g47U1c0vspJi+1gsjfq9Rls3Tzta cIk6n7vICYx9lrGEUrBGktO2ODtiOdXu ffL0z/zOVl8e3rzNRm/PRzyWpQvIqis8 3ehJq7S1OaNV7XqE9oetdg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171104000000 20171021000000 43863 . jIFv95ONRDAGEW5HuwBA5wC+vIRb6p7u mTuDoY3IgJPP1etrVi7bf/HlTL9Y/6O3 DXrqq+WaBN0MC7unImWssydpMHN/3U8e HDPybfeHC+XqoRLnz0TJ3Ue24tuzEU5Q LyqumAHyfeEAdIdIIff+RKqTLoGbY3+j W8zBsXbWe5c4yc5ywiGcheCIuJXzJEQf vxFtdyHdkoWgNkK8P8h5SVhZiocWOjnM pjbxVOnehVJtqBfwCQNGU+0ZuSlUUD9D EG0U7D5K5VndP9ccyEhPk9nLc37cp9Ho PRmxPb0y7nW+4L0oW82veAz4XFab+lYM 0oiRDz3Oytrxp1dwUATC6A== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20171104000000 20171021000000 43863 . R0doO41QT7TCbRhaJNymCye+QTEbSMKY XPE/hp62sZm4zQaXuALDdMz9L+4dyDJ0 sp0HK+1hiLZQeWxG36gPMXcsfBB63wlv 4yWyqJWlzbRMJjI60BAhqaYDVz/6x3gi Y1zgzWtw0NFcrXJLysS5a8JCzAWMqW9b IITITWqz8Cv6WA9qqSxHI7HdQkbSg+0t LWq0hECZmRsZUrJviqCRs7Mf2rQyNKBE 8637RRq8MFBW3GKuK6Z3eXSn3fLsbWQd 3Mvcr8lmBAtlpvbZw4JZdvL9xwhqxMBr 5kkHL1zeGVJx/8ibrXZTMvlEcrwNV5ap 1fjJ8Ecu7o/Bits0jYC3Lg== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20171031000000 20171109999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20171114000000 20171031000000 43863 . pDeid0DvLx90cUWzAnUqCLV8XehmC5Ks VyGws6GCHwW4m8/9E8XXKcQFMVITO2yn MbOeIFs/OXMG+TnOuJfckXAyais6/TxO iiQg22r1ZdlZtv3szzoirJl4/+HXqCuU dm6esFje5djjrwAW82dHkt/FTu+Kly5x 0pwltZ2Qz2JvlIypExZoI6OxedNsv2v8 IMllSsTEJ2/w28ALGNvpyTN/LAX0cP1z IAOHd5r3UMraMS9CyRqVXNESj3g2Mhpi JM51+funl5ZEE8s4TzYjuqeQqP92jWfZ 6ViiK6sKGcM63+TRMVLW8DE07YDHREu0 JUsSPwtrD4hpHbfXSIiNEQ== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAbS4LSbmieIk96i3AK8IEZXlLRdM YLoEp4QSRMrdtJ0VcZKsjHWF6g9Q50T/ 1XKBxY/+6j71//cFRi1cViqoNsPd3LEb txWa3Jx/1HBINOkAPdHMBc3SQQ5qEIar PObq98RLnQ22ske1xZtbzNRZogPNi7zM HwQ3GYf0sUVCnYTmv8en5yYfSh8mY9Ez 8okorK7UN2RlHx9B8S5DRtBphO61mSI8 MXRj91aC3iRTbYZndTWorVkj4UvCBBr9 qh7oNpRbprIvAmRzRK6IaxpYDS6iGtSq 05WbGRtQRXkngOzFZO1BBDHgj9Agtx2S HBxAKuX4wF+w8I8xO7m5z0MOIF0= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171121000000 20171031000000 43306 . V9PYEXyiskggl3JXqBuvAqgp4v6yQaJS swlbgCQSS84BI+nuJ+QgSpaRj89OS3rt We5VXJRe6OP4uD0bgfqggv8u4nLvjGcn bM/UWNb/u+cE5d7sX4P7/ANkSAHBiSC2 VVMwIYJwfQD//t+vMhZ1rjicX2S/p7tg zCn0VqG2RD8m2ZM2QfUrMWFB/hbVOftL TduQpPEy9N4GPo0VDOpZQ/Qn9/VcQIEu yVk0TRHkrCtkYEG7pngWKgyxQF3rVN+P enVrMuEVOdBjKImqDVvsgcvBSqgx5i82 BQkI2b1QvwKOj5QM2qSX38bNqpuTrkpR RgJV8DG7tI6ocHcEPtA0Zg== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171121000000 20171031000000 43863 . N1IXPtQQvfwqYmVPM4fWqewZjn9JXrav C88m44i6ng6UNIawuFC89Wy9eU7JrCxZ mgCCfBWfQUAS1MCj8J/AERRhm5Q6Wgy3 RCDKgsPO2ZmIfDELXd63e3VY6xUcjFOA 6eb5OuMeiL5yKL7EmPm7veIb5ggVWHj3 ViQTxICYpxiDdZqg03gtXSLrRObVLCi1 8We1RYsPbA2PgXbmHSgbV9P5ThVsla/C FAbynsOllBdefqrKtlQVBYwfHpZDkBKG 4DFkZgh8ugePcC4hF6zLajAH7ql8T9Jx ENQCZdlqkym4M2HUH0RWj74zR9qdaBix HpR27cnmMDhj5nkR/7Nyjg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20171114000000 20171031000000 43863 . KSnCPuiaTPZcw68L4x8jKg9Y3pABRzI8 yF7d0E/HFjXCp78Ika/qeD+AMKOhmgnr 5FbqeKQ+lw+M4ir81i4/GviGvovAu/ak 1M8+n8bTqfeoh071+xaOWP2orJIMCgH2 rdNaU8wJ5DdAmiT/wjWU4KqR1ghnTFaa GGSsWhbuECzbmxilgDN1Nm183w8g5B+B 0dAPNDXQd9oOeYIFb7lKnB/cbJtftgGJ Kmt8DEerfW3j4OKtcLKfvsk+bVRu5yPu /Vfz2yV6hqcIXguwTv5cswiy6gzPx7mB kjG6eiW9+WwoJBZoqkUZ2z7T8sUDDc1U Qodd9HG1pQL1iQBw6D5rlg== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20171114000000 20171031000000 43863 . Q2f22oIR9AT33oXvIJLO0dfO3wtMXp7W J9HVugc4XkY2unjuFjX5zsdTsx7UiVwp eGF8EFaRXo7LFQUdu2mqZN1dh/V44srC e5GGDsWrjJUXYZZbXxVGMni3RQNCzRgf 6o9zTJhl0Q/uQVjbRz3720J7C6dZY8ph qxt9cPuf2w6o5I7suCjFKGbdMm7X35Fb m2Hm52mKMdtWRfCpFSp7rLymINnJYyiP 7m5k+2LryfzX7/LUGKBQdaKB5eYysnss U6S0gMLNhCeDM0vBQeGKGa83WV2G1VAo 0jxySyFZJAWH54MJh65X8WiSz5tM/gZE FxfeQmnSJATDPzz+muWROw== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171114000000 20171031000000 43863 . K336HxxLMygdaKlNABZQ1KTmVLCdFtCO iJSoarH3+hDnk5bJ9oPNcFP3F9maVomj KXkLCbOYu36w9OwsY2nSqkYef+lwiRH5 5S3ngGo71uQG4lyvX9xGO6/KDjhFdlwA TptdlemBNtbAa2AwHI/xXTNLeM/I17Yo 4l8z8lztKZSoQynBio09jk3tsw8b1E8c Vvbodg+JoLrIRY+7yHsfxZ5CASCtxpnp Re3UV/6OEZqnbdI5Z2kxBTzGPBY7MpYF S0rLRL3uiNaTRUtngfiGXiSvbM1jynQg wM9v3LwfuDyL+DWHyuJV6Zg9Nvs5EVZH PsgSbYKGjD0dRFtK0kUFqw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20171114000000 20171031000000 43863 . pDeid0DvLx90cUWzAnUqCLV8XehmC5Ks VyGws6GCHwW4m8/9E8XXKcQFMVITO2yn MbOeIFs/OXMG+TnOuJfckXAyais6/TxO iiQg22r1ZdlZtv3szzoirJl4/+HXqCuU dm6esFje5djjrwAW82dHkt/FTu+Kly5x 0pwltZ2Qz2JvlIypExZoI6OxedNsv2v8 IMllSsTEJ2/w28ALGNvpyTN/LAX0cP1z IAOHd5r3UMraMS9CyRqVXNESj3g2Mhpi JM51+funl5ZEE8s4TzYjuqeQqP92jWfZ 6ViiK6sKGcM63+TRMVLW8DE07YDHREu0 JUsSPwtrD4hpHbfXSIiNEQ== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20171114000000 20171031000000 43863 . fAkq3vxra8l/AN3x8kt8XYT0wXpPdESj M7FR7EKFAPCFL2BAelt3Hkfj+HPKqgCO 78iVXdIDfiFTzTIqG9JbUWtpTJF08P9R 76qFPoRRJ1vrmLC5d9LW5OG5MgGcFkQT OkKNN0LbKiE76W31f7ZFuFTZOHo/RJ1K vMG/ls0F+k29ZZHtyktLqr6tD5kkKJ6m QopzlejJTBkeFSHqQGFuJ/v76uSySa67 31cK0YiAYgIJBKmUP2cZu3jalYJ0JaTv eAJObpg/t2n0aKdclJHL/+2neqVCqTvw PYJ/eDYK/r2i8mioviysNOM8BKv2v3PO SBpKfaQ4P0tadHmqimZL4g== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20171114000000 20171031000000 43863 . Q2f22oIR9AT33oXvIJLO0dfO3wtMXp7W J9HVugc4XkY2unjuFjX5zsdTsx7UiVwp eGF8EFaRXo7LFQUdu2mqZN1dh/V44srC e5GGDsWrjJUXYZZbXxVGMni3RQNCzRgf 6o9zTJhl0Q/uQVjbRz3720J7C6dZY8ph qxt9cPuf2w6o5I7suCjFKGbdMm7X35Fb m2Hm52mKMdtWRfCpFSp7rLymINnJYyiP 7m5k+2LryfzX7/LUGKBQdaKB5eYysnss U6S0gMLNhCeDM0vBQeGKGa83WV2G1VAo 0jxySyFZJAWH54MJh65X8WiSz5tM/gZE FxfeQmnSJATDPzz+muWROw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171114000000 20171031000000 43863 . K336HxxLMygdaKlNABZQ1KTmVLCdFtCO iJSoarH3+hDnk5bJ9oPNcFP3F9maVomj KXkLCbOYu36w9OwsY2nSqkYef+lwiRH5 5S3ngGo71uQG4lyvX9xGO6/KDjhFdlwA TptdlemBNtbAa2AwHI/xXTNLeM/I17Yo 4l8z8lztKZSoQynBio09jk3tsw8b1E8c Vvbodg+JoLrIRY+7yHsfxZ5CASCtxpnp Re3UV/6OEZqnbdI5Z2kxBTzGPBY7MpYF S0rLRL3uiNaTRUtngfiGXiSvbM1jynQg wM9v3LwfuDyL+DWHyuJV6Zg9Nvs5EVZH PsgSbYKGjD0dRFtK0kUFqw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20171114000000 20171031000000 43863 . GBgRHIHToQAAAn8VfGAPZwEO7YsOr0Kq wHtKcBlSdbj5y76sz/gfd0BE4ApyzCbL qo/RwOk/oxmTa7C/h2mRx6CXBzgLB317 LmAZWfm+/FxRZrHeaoH9/bTGeiwbhFJe aoq9wYa9D9oYBTUM+z9GFh72MHEc0Udd 7pPH+mEYdWO08h2Sx1lRpoi/ktLeH3Su y6ti1BNiH1pk9dm0JKduxmrlUTfmWmAv sWxTJihr71coNRHXXPavoH1nyKfc1rWc fmtrasozpZh1ddmcXn4YZAyxD/BZr2Vw 0GA+lcchfsRII3dPAOS2mz/XZoZxguf6 DEhdlERVGfmAOR2iyE9XZQ== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20171110000000 20171119999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20171124000000 20171110000000 43863 . Kg/cVNP2kAPJa/Tv5d3X8pPpq/oZgdh7 8NzEhZN7ZeHCcI39r4f6e40RdUGNzLI5 k2bZa9ncfCfA0au1s24Ctxl207X1ZDZ3 Q0jRIz6XgP3wI0ZoEzZwYbaBv0Tpuhr3 0Wg6nU2KJZ0avRhahKVAzmj164+JbFQg yDN+dOj0npJ45vdnK9kwos9ymdC/c6Ae uXgHoF188EpTs7xTtImBvNVQwONrduNs qkKfpsl+V1PdFl1f1NWDzzMrwKYGCyBt 3idLeRkqWODb0r1O3m8B7hrZnk5ASsRJ ERDMLIrfZvw91lYcSVzgV+GL++hG8oc+ 8pq68C1rJjBBHeqNodbHmQ== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAbS4LSbmieIk96i3AK8IEZXlLRdM YLoEp4QSRMrdtJ0VcZKsjHWF6g9Q50T/ 1XKBxY/+6j71//cFRi1cViqoNsPd3LEb txWa3Jx/1HBINOkAPdHMBc3SQQ5qEIar PObq98RLnQ22ske1xZtbzNRZogPNi7zM HwQ3GYf0sUVCnYTmv8en5yYfSh8mY9Ez 8okorK7UN2RlHx9B8S5DRtBphO61mSI8 MXRj91aC3iRTbYZndTWorVkj4UvCBBr9 qh7oNpRbprIvAmRzRK6IaxpYDS6iGtSq 05WbGRtQRXkngOzFZO1BBDHgj9Agtx2S HBxAKuX4wF+w8I8xO7m5z0MOIF0= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171201000000 20171110000000 43306 . TFUGDmiPAAixO77X5cFmU3Sx5eeMIdR3 8x3+fNGKkx0Fk4ZYsqLqI3pcihF7iNCM aOVqVkQkBrvWGd1T8SwPnDNoplS1y5Mw hA9uY+8npAKd0O4FOCalI73UW6aSvrRE PgjbUJO9BkAsj6QO0+ejdOA21XkCplm9 giQTRX26fWw37C0C7v75R69w8C9X0Dkj nymc3TmoHaCtsEWT+1MpreK/c/3obqNm 071jo8q6Pwo6acFjCRGu+qBWfdk0VuMS zoxO7VoI4DacE0xcfrd4gg+XVw7F45JV xeL+m3/EMOFqFizVWNmmIyAgYV1qCre2 nME7E+FdVgt6pS27DtphEg== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171201000000 20171110000000 43863 . agbQ597bBZCy0sTArlwjA7SS1Q5vrC4w tN3UPB2gTW+qysLL+S5gXMUfltyZ0MIa cJXDgxzXr2NkSn1zn399422uHyIvYmF1 +nOj6nvnYGbTUU0S69j0nUjdFxgulHsk HbrmK96N0nBIv6hvbresZ1jdzQvsRFhw v7s5x1hgKACz3VOMNt+n25feRrZanzGf YXr6jw+EXG2RjtH4tdu7uxcIsGlqsZwC F0KUTnpU2GX8Cj3RZ9HJ9oh+yQq1tJFx x+a+ystolVcQFPPJSFlTSc3KmBaP/uGI 3gJ/JvGqh3BvMGefkK6QYUCm6uBoc/V1 TUJf2X7qL7fORt7Lq/yXUg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20171124000000 20171110000000 43863 . pXHd/1pTHynpuquF1pHha2eFKyCu08mH 1+4A41rlauVzAibvKylmVvhxcwIA0CKI pjTh1STFFNc+7L61tNcLlOqUdAEwutNJ mUh2RtRFZF1kxTbRvZRGgUfL/+nD7M7G db3j6XsTQTdyKcytNc9+e1FH8lYV5E+s +aH6J50Y00XKK3pMxa5DkZcNTTzZDHpr WzZmFqvtE+ZefIawvjmX0Qol8fOfDeOi xEDwvwwWR4O/0PLdizQeYnzusxLL+wlp QxkbZ8tMYvG+vnhR/IW2o8ZddNeLU6Pg r7vjp61Oxb4lRvRzJdzIN1rGfvqq+eiT cMdbQ326wmTyhdxxkwkP7w== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20171124000000 20171110000000 43863 . l2h5+ktnsD5G+obFbqe3jTV96AowrBBk GFwAbwHuRujkp92YC+iY55CU4cTjozZI e5nYpgvE83ZHEewC44eN4mkZ0iGDkUYS 7ifh5QLiWTHaZDiEKxbqqiIay2c5jq6f uDmT9dJGin8aOwrWTaLHEXvX5VBAy9ym Q48kZl7rONOU3Amsxh2fdfW7qrl04RG+ XZVATT9mFuP8yJeXdFFr6HLb4PkscBXn IgJle0HaV2ZZ+RPUVigKwNlBnTDq4UtZ zZ7JxzLopxkxSSIZrmunCHRayVjCO4So ZBlYRjflAbZOWtG4pFwi+/fyY+y4/NGA fULau0RBP9phug4HGsDslA== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171124000000 20171110000000 43863 . hTNNClNXX6qsoopTGHMiRGkBSVcR9W7F xNvy/e9nYbS79wcNWzYdweXp1AFtEm4t /l55IucR2c+n5Cm/i4ahQCrduGVDdKAy LfIm8tKf6MAMlEu6JxIWQ8r4z+dsmtml ATIffXshG3IPeS/htNAuxkwU7j23JW65 o321VNVvIGVJ1mPcyM1Z6n4xjvGmj40O Vj14vib/LA5ItQ/pWVl7U7Y8QoeMG45s FU8N4+TibInsJo8hnV3GM3t3B61QsziA gEvwvgD3gFRn4W1czvdxWQuQyyQVr8z4 Q3O78QHh5crzMgqlbnwrBr7q3a5+ltWb pAoEhCE7uccLmCIdde+bXg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20171124000000 20171110000000 43863 . Kg/cVNP2kAPJa/Tv5d3X8pPpq/oZgdh7 8NzEhZN7ZeHCcI39r4f6e40RdUGNzLI5 k2bZa9ncfCfA0au1s24Ctxl207X1ZDZ3 Q0jRIz6XgP3wI0ZoEzZwYbaBv0Tpuhr3 0Wg6nU2KJZ0avRhahKVAzmj164+JbFQg yDN+dOj0npJ45vdnK9kwos9ymdC/c6Ae uXgHoF188EpTs7xTtImBvNVQwONrduNs qkKfpsl+V1PdFl1f1NWDzzMrwKYGCyBt 3idLeRkqWODb0r1O3m8B7hrZnk5ASsRJ ERDMLIrfZvw91lYcSVzgV+GL++hG8oc+ 8pq68C1rJjBBHeqNodbHmQ== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20171124000000 20171110000000 43863 . aXTGM1DUbge++aq6a7SODevS+g/GaqEn wiyUpCzl5/mBo0HbIQSop4iP+j5A1Gv5 keW9+Jm23Nsa87KlsCkem5O25HseTo3c sIvMgEBrqalLJRC1R/lEVH1lmfz08gwd jWkc/zWgU9WiWVqC5fp+4rM2cIbtCMrt vCioYGTxPhQaEG9jm8RRMCS+mV5lPibY lq3f1S7iz/ZvzPPiA0JMshdBWOzRNCIH noTQ80eVX87yaBr9KWbbVezZa4jqP9yN +8IWwnvghcWBH2Tz7BujrqidRSyc1aVy bI1oCA8ykOcTqdJSUcl541ei72IVG0XO Mdu/qTOpqkw2d7aJBzRkqw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20171124000000 20171110000000 43863 . l2h5+ktnsD5G+obFbqe3jTV96AowrBBk GFwAbwHuRujkp92YC+iY55CU4cTjozZI e5nYpgvE83ZHEewC44eN4mkZ0iGDkUYS 7ifh5QLiWTHaZDiEKxbqqiIay2c5jq6f uDmT9dJGin8aOwrWTaLHEXvX5VBAy9ym Q48kZl7rONOU3Amsxh2fdfW7qrl04RG+ XZVATT9mFuP8yJeXdFFr6HLb4PkscBXn IgJle0HaV2ZZ+RPUVigKwNlBnTDq4UtZ zZ7JxzLopxkxSSIZrmunCHRayVjCO4So ZBlYRjflAbZOWtG4pFwi+/fyY+y4/NGA fULau0RBP9phug4HGsDslA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171124000000 20171110000000 43863 . hTNNClNXX6qsoopTGHMiRGkBSVcR9W7F xNvy/e9nYbS79wcNWzYdweXp1AFtEm4t /l55IucR2c+n5Cm/i4ahQCrduGVDdKAy LfIm8tKf6MAMlEu6JxIWQ8r4z+dsmtml ATIffXshG3IPeS/htNAuxkwU7j23JW65 o321VNVvIGVJ1mPcyM1Z6n4xjvGmj40O Vj14vib/LA5ItQ/pWVl7U7Y8QoeMG45s FU8N4+TibInsJo8hnV3GM3t3B61QsziA gEvwvgD3gFRn4W1czvdxWQuQyyQVr8z4 Q3O78QHh5crzMgqlbnwrBr7q3a5+ltWb pAoEhCE7uccLmCIdde+bXg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20171124000000 20171110000000 43863 . YBZuPs+ERzW1BLvmihMVYebVLgSn/EeF L+R4S8RMgvYdPAHCqDjQy6vpT6JW9YUh r1JVbCw6gq2Wp6UqgHnYcTzDKCe8sodz yXUotZrUY8u0MEmcWMoeTR9goAq3EznW LPWvuE0jqB6qIV+1xFg21fkVaSR5g0Ex j/JT238NUIABu7xEoOkWIt1H15/CnRgk 9QSD575ERP3ksfNtoonO5B2cvgn2Rlxp PKZ12uP/bQC2Xxr3n6TVOkBiFs7RNm5H yxf3HXvb+K4JlYiC1VkrXlBX7dnbFUEk NLK/BVwFPZYmbJlTT+VrlvgbeWLkfEYK CKPhnMU5ZBRalkFQGqfAEQ== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20171120000000 20171129999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20171204000000 20171120000000 43863 . ijEdh2wgt4tTeSZRus0IBsndUKIa41u4 LmVEhXyi85hcsvkSt/FrTqZiZAm34f6A FcmtPt8Tk+mUq+c6PoBArVvt6Tr9FE4P haMCzKrNruthWe3+ch54l/yBbn93A+Xd hQB9KSn8IWMUMEjg+9Gnc08v2UavBo4L IKHRUyM0lSx0UX4gdrauW7XimWDwioSD 7VOFrcCmPTLs4JdEqd+LEOm7/qodYaX1 fWzIARcw+0fk8jHq0OqeJh7B4xiRSr+N 73bL9d39ljs6HK3A4gipoWhCab+F7ewI WZZ6BGHy1jIvm9+rPSKfFct8+0B2uApc xEyyz4gJZooFVgrP7uT4Lw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAbS4LSbmieIk96i3AK8IEZXlLRdM YLoEp4QSRMrdtJ0VcZKsjHWF6g9Q50T/ 1XKBxY/+6j71//cFRi1cViqoNsPd3LEb txWa3Jx/1HBINOkAPdHMBc3SQQ5qEIar PObq98RLnQ22ske1xZtbzNRZogPNi7zM HwQ3GYf0sUVCnYTmv8en5yYfSh8mY9Ez 8okorK7UN2RlHx9B8S5DRtBphO61mSI8 MXRj91aC3iRTbYZndTWorVkj4UvCBBr9 qh7oNpRbprIvAmRzRK6IaxpYDS6iGtSq 05WbGRtQRXkngOzFZO1BBDHgj9Agtx2S HBxAKuX4wF+w8I8xO7m5z0MOIF0= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171211000000 20171120000000 43306 . OFuHLGCCYvssVgObtX4ugAG68DDhCEIi nLTe5rZfhPc0cYoZbRkheyyeMeyV6xuV x4JVah4k5C6vabPK3sVbEWiWVgRhtPMD 8cZVBMb4EZHmqbXCRV8NYZQ62JNwhsBx pgFWLTd1Fg9kpxS2opDvj/86w6JuOX60 KJ0ASWJsqujbH+nPfxKZEsddImXfu98Q czav9cw3fN1PQqt/UBjrwglDPz3YpkFs ce21EwgAd46p4CboEl8LGzU4QWrz4ndR OdG1vdgFCLq1bhwOYXciXT1PNGPnkMUT 9mpAtNOgR/ufIT+XYNfM3C9MJI7ukmUx Wo5VkH0GN2Ogo72t3BkGYw== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171211000000 20171120000000 43863 . rVYGkFuBpbElsJzwG4y2LOZvmTPLFXV6 /3jh6G4b951ILKhLTc9kl/Ecc6X09Pow 0pZtMgvZlQt+zfgHRaYaZ+cG05mbpw5C ojOJRycXgxVrzhPI2KtDu12iD1Uov2P0 ytE5msd57PDq8uwdvtj3e/7Vfyx9qVr5 QEEXqtV0EBAMIrNLRpRPav3jViGodY8v kfDP0YbJh1fTz0LFFmzP8I1WlSi665Q4 HT1KO6TdTrlZl1fbMlbJmop+zcZ7wWft 8M+PolxhwPpT0LIctA93mrCr1t+jTx/Y 3TeA/vYb3KHgpypNYfPImbnrxSuruyJ/ 7+lwmLKbuxb15NHUrDaeHw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20171204000000 20171120000000 43863 . ZRzL9+U8+HkObgmmCNGJEhL4lwbgVJYV EY6qin9F2xvq68t4H57D2d8+7jjCmmnm +GhzrjckeHVOrRO9ujt18NTpfhR86n/D eNLK+NfsLCW2i7l8lAj6LJoYZnPcdSeD KWC1U6HjYrzsuQRSKDkPEHPARgYfceM4 WcHnb+QhTgEueSMkikEQI8w3wQByWIlD kAZxcE0wrzHxxnFyqav5UsmJX0Jscb+h kZSTCwK+YMcrAyo8/t3O+7wP6XRb+MTs LnmXUo/53FtLPjDxX+3p6e2aPvEuOgXi rySMuE3+o5SIWgP/cD6yrHJjmdTelWMe vjXQ0NXILFy/+2/iTi/DCg== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20171204000000 20171120000000 43863 . pbyOQnscKVBkn4Ik1VwX7tPt/1i0W9hO AOg/X9WHDdQLJBaaElCRc0njtT8HqBYe PJ1E6+tG0MLNbznGpjUaJ8FwInjbzqug 70WuDyZxS6GW5GPtP3PaK+cv+Kwc+sj6 OimX67TmCIrkA8aza51RfdfuSccY/MLx HwEgzfKBWOzbnECd92P86D901Fyr9xWj bNlQVj20SxvkTaQ8wgTnaslG5kSRJCbv 8gNG0WFYVVUoDU2oMS0xx/Rr+qWMf6+f ZXG0B/T0QJm/84ov0BYibVXwJTwLIJC7 8GB9RBdO2lzpiSvhl+PCt7cgpsQyoM9y jhV1iVeYccqf6+aQ0lEr/w== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171204000000 20171120000000 43863 . Ge7dUr1EmWWJ9/rleiFkH1M+2GqwIufx y6OdMww2tvQV0R6lfcz8VWXz4xGfVG4L HJIdYVTnVLV+xnVafxGBJVfWcqfcvKHp 3qeskzgl118QPAgf9SY53U+bKwg32qWq GyGp5XK1LWnVAMAqilEbI+KnP/sMOB4T d0c6BEdpGi3hV+ZC/Mf/vGf0FSJjBOcS 5OsC/wl+1BnM7vmuMAaoPU4mOrF8f0mK Z3gjaZijU47TGfl3K/Yayr12nOtjs3hh 0f4er+3UhxglBYVCJzxaZj8GGT9oqSKy 9LCrK9ZqeBg9QgxB+57RBwEG/KlqdQe0 PWPHGjhzRJSMF+T6SMdxDw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20171204000000 20171120000000 43863 . ijEdh2wgt4tTeSZRus0IBsndUKIa41u4 LmVEhXyi85hcsvkSt/FrTqZiZAm34f6A FcmtPt8Tk+mUq+c6PoBArVvt6Tr9FE4P haMCzKrNruthWe3+ch54l/yBbn93A+Xd hQB9KSn8IWMUMEjg+9Gnc08v2UavBo4L IKHRUyM0lSx0UX4gdrauW7XimWDwioSD 7VOFrcCmPTLs4JdEqd+LEOm7/qodYaX1 fWzIARcw+0fk8jHq0OqeJh7B4xiRSr+N 73bL9d39ljs6HK3A4gipoWhCab+F7ewI WZZ6BGHy1jIvm9+rPSKfFct8+0B2uApc xEyyz4gJZooFVgrP7uT4Lw== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20171204000000 20171120000000 43863 . UByOkUebyZ68uVjCkAC/yAJSkAosnKMr hIsV428f844njgazLWSq6KjsfCo0WTLz peH9rwQGzure/8Dd2/vxpYjxvT/85jEC LuBAAInNYt7GIz+UrPDCpfe43pE0L0cK XStz/x0R9mNGH5/sq5MfQOxaVWWWZtuV 5S0MVpoNCnNkBlPcCrJT9tV3uL89lptT tiQ07PYCeEkB7nmC7E96jDpopMlo/PC5 zK2bXBh9LuG8UjlvNzSeelE72CkhId1+ 8FrXO/1lpCX4Cegp8gHtTiVEr6ZQMz+d dmLLl9MvPczXXAf4W1Rqa0BG94BU3ZwN ivElxk1UXlxV64WNAQSFsQ== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20171204000000 20171120000000 43863 . pbyOQnscKVBkn4Ik1VwX7tPt/1i0W9hO AOg/X9WHDdQLJBaaElCRc0njtT8HqBYe PJ1E6+tG0MLNbznGpjUaJ8FwInjbzqug 70WuDyZxS6GW5GPtP3PaK+cv+Kwc+sj6 OimX67TmCIrkA8aza51RfdfuSccY/MLx HwEgzfKBWOzbnECd92P86D901Fyr9xWj bNlQVj20SxvkTaQ8wgTnaslG5kSRJCbv 8gNG0WFYVVUoDU2oMS0xx/Rr+qWMf6+f ZXG0B/T0QJm/84ov0BYibVXwJTwLIJC7 8GB9RBdO2lzpiSvhl+PCt7cgpsQyoM9y jhV1iVeYccqf6+aQ0lEr/w== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171204000000 20171120000000 43863 . Ge7dUr1EmWWJ9/rleiFkH1M+2GqwIufx y6OdMww2tvQV0R6lfcz8VWXz4xGfVG4L HJIdYVTnVLV+xnVafxGBJVfWcqfcvKHp 3qeskzgl118QPAgf9SY53U+bKwg32qWq GyGp5XK1LWnVAMAqilEbI+KnP/sMOB4T d0c6BEdpGi3hV+ZC/Mf/vGf0FSJjBOcS 5OsC/wl+1BnM7vmuMAaoPU4mOrF8f0mK Z3gjaZijU47TGfl3K/Yayr12nOtjs3hh 0f4er+3UhxglBYVCJzxaZj8GGT9oqSKy 9LCrK9ZqeBg9QgxB+57RBwEG/KlqdQe0 PWPHGjhzRJSMF+T6SMdxDw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20171204000000 20171120000000 43863 . SlxNxV5dq19/lFcTpRpqn6ux/KwAQV87 0YKUjQxS//BXgkd65+hGRfnBLEIrF3JA 0GGpVqzVuIlVvNIUTq82QitgYBqO283H EwJTvH0ObcKVTMD+snHcQs3IL6bbwRCD uJabvcIQh4Id1uT6S1kYjkGqii5HgRAN 34boOGku9thUBByXW2XX+daPTLYD2yK8 KPzgaaWssaqZ9w7Ef1jr1ijcPQNlAraO nS5CZVT4+jLFSOSPPKRkR1sGGUry9NAl GDoaWp8Fr3D6AI38NZ1vtMdE2b66yb4I gjy/3TrHfqOIeIoJ39EA8hCB+bHRURO2 bcsI/t7U/aYzdTlU4fguWw== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20171130000000 20171209999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20171214000000 20171130000000 43863 . UCxuHrfdTZiT4SdJ7i8hcVu7NVyI07CE BkA856ZsxXq0R/GM2MqJu+QugBJARBE8 QNues+v+FqWMfaMMQ8mSOq1QfqChCjx1 eeLahhBPEY+H+d3zE/IXzxHs2eJr9voB 8U5hSznwhJu2kLR3Q6M6SisKME1/IO5V lEV34XMScd6Ys5jVGVwu+6rZt3oSksVh t8g0k+MOVnPFQvA6lcd4sDY5rpMHqQ0h 8nd4OaidLaYM2cbGUtsjJTZdmLIj60Ah 22HIv69gxy7C8sg2/2nz8VHtklOpOLxL uxWWt+4gLR3oNsg+HR3ospSMBfidmu4X /K3aUK7e6fg/khI5kibXIg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAbS4LSbmieIk96i3AK8IEZXlLRdM YLoEp4QSRMrdtJ0VcZKsjHWF6g9Q50T/ 1XKBxY/+6j71//cFRi1cViqoNsPd3LEb txWa3Jx/1HBINOkAPdHMBc3SQQ5qEIar PObq98RLnQ22ske1xZtbzNRZogPNi7zM HwQ3GYf0sUVCnYTmv8en5yYfSh8mY9Ez 8okorK7UN2RlHx9B8S5DRtBphO61mSI8 MXRj91aC3iRTbYZndTWorVkj4UvCBBr9 qh7oNpRbprIvAmRzRK6IaxpYDS6iGtSq 05WbGRtQRXkngOzFZO1BBDHgj9Agtx2S HBxAKuX4wF+w8I8xO7m5z0MOIF0= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171221000000 20171130000000 43306 . KWzRB5lrZNkjIYKcZAWMvbQyadre36hz UhSr/lJAvRUvpWotDhgTzr0wezKHtgyH vh6zUhGn4bJVKWU13ikum9+X6IgjALy0 GU+teeNhq+6v3rL1fCUSYaG5uxsutGZH QQF76XcVXMwmE9zU8ksFP45SQnjbhJW0 j1UPrH8YnUzlX2ElvdcZvJmF61xYt5dt S1wPk0qBsTpKvh0tY0nOpY4bHVkm/uG9 notsyRbxzZHGb2hGjAFVL6fRDFGLltBN l5OpJ50ml/wVcTcSbXV+at1oxZsBCXhK Knchw8FBRBoIC+X88UXdoN410QE8qYXC u/aDb2lWOr7nJCTa6GPTGw== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171221000000 20171130000000 43863 . hmNpauPne5OdaR9AmO0F8RugnhM1zyEQ +Xd3rzcW0YmQtf/ZkDuJJExr+4zWePvo ABf85e9KoOjHKA3gIh1Cvu+KYIJWGHzi jBGA6QAI/xcrPlA/1HpI93PjJM4wvGrO Lu6sOMTGg9HTtXP6tlx7/ynl2Ap28W5Q b0MS2I4q5aklMC1JTPUAyRTO68WoqT1c n7RH1PPrq0f5UWOPzc8htCDf66UGhjDm EEM678tF9wNIKQxavny/hKHYk5ulj6Yj clbsATUlCV++V55eg+mpQAGE+LFVdwNU 8oEgLX+wCpSI1tgPZEi28qPIufKn16Y/ wK3UBWMjHEt8ZrTQGUVF6Q== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20171214000000 20171130000000 43863 . l0g5TXXkZS/8gRZTabMisId2gKjEOX+S Zf/rsZDISgFwgGHiXiHl2AF9Xt1oXNa8 eQ6jgfyrb3blorYxnKLpPHvQgGmlQYGj +DQvprLE+2WEfuqNUJJiyS6YQt1PUG9W 7Js6oupPzmpKsJFmQJCrc9gqu2FaTBau TK+8hBF92vJT71Lz+aSytByAilMYeOiZ kk7tJOaVKI7j2yl6D5ymzi234XHg/UxE pODae+XWbDp/7cQrSpDmAqrIf4BhhCZf jdNn5ZPrKWYqMRQhzU8fNNLcLFe6TsRP eVf1S4cZXJaje+qFHRwPjB2eqH9ZFnft ReTDezSHakHbdFOvPFKP4Q== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20171214000000 20171130000000 43863 . kaKieodcrDtLvvgfxLbZzx5heRAxrWIt 4DprkLP0l7nR2n5gPB4TX9toRqAART1X iWl06iDVXa9P8fqwCfpJa36mkI4WEecq 8AbRT6UxXpAVso4/uvR+UG8c79kueXkF 6TpZoaKs+4S1IwO9P2nefiyaQ+AJ9D7a KpBjcSfF+zKY3fIj/ck+fc3Owz2XNtJ5 qWRtppnRQ5t4gzYAIJeULC+622k8QSpL qb/1rhOCm5aGTxIOGVjvW8Zt5wGlJEd/ xvM6hW0NcnQU/4w8gOBJuraklWXTnG6q GKtdZtTJ4P6xTOiKG3kROrSIBwQ1iUR2 7qlmLabMHrTZC+cOcUXA+w== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171214000000 20171130000000 43863 . XZROZxFmRY6FygyYribn7/xFRRke0M+s Q76DiSDdL6R1/NlActeocZ6RjG/l9icS Ca9GZqczS9qcjs7dhQtvyeK84cV31YlW Lv3LiQGmHP07+4Yv6Lq/BPUaRcbbQldw dgwKXDgC8P+z8PocjBA84dyIVV8q7yRm niusMJNDpA5r7rwHfM1JUzaj2e6tsRjX IkXzReSul7Z0DZ8yQuPL0vh16XigbkO3 ZANdKw2flCynvcI/8tV8Ni+lPIlH4+E5 1SMJ/485NKmjPDK4AsS4Ic3u6eonen6v I+jq3xii0cWjzM3IEma1oin8ZzL/NWXl hSodAhBe5eMgV5zx+SeQDA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20171214000000 20171130000000 43863 . UCxuHrfdTZiT4SdJ7i8hcVu7NVyI07CE BkA856ZsxXq0R/GM2MqJu+QugBJARBE8 QNues+v+FqWMfaMMQ8mSOq1QfqChCjx1 eeLahhBPEY+H+d3zE/IXzxHs2eJr9voB 8U5hSznwhJu2kLR3Q6M6SisKME1/IO5V lEV34XMScd6Ys5jVGVwu+6rZt3oSksVh t8g0k+MOVnPFQvA6lcd4sDY5rpMHqQ0h 8nd4OaidLaYM2cbGUtsjJTZdmLIj60Ah 22HIv69gxy7C8sg2/2nz8VHtklOpOLxL uxWWt+4gLR3oNsg+HR3ospSMBfidmu4X /K3aUK7e6fg/khI5kibXIg== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20171214000000 20171130000000 43863 . OmAfGDmBR47KWGoXaW9u+WIj3zqBg8ia ASd+SywAflqH2cvx9St9lBmN/g4hzof1 l/2O1mMDU/8XlAcZ3slpnTt5XE0NNnDr 5GQpPlVhrbvYnriSpl7LGamgf/i5BtJ9 eu5jP3wBb7Ra79EGT60QgcwbHPyFCUbh EUW31Ak2Kupai3LWc/3vXdgf2DWk5MXv C9g9QEpE/6Zcn2H9hxLgXghlEGighcZP a+sPcOacytQpSi/ggMX0ztLj20DM7Hes 3YUwG84SlcDhLpLN5M009hFlPu2+pVjC CmFywB4dtyUS62014UIR+PAByFcFEGOS MreqUAs/wj3RnpevarcaBg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20171214000000 20171130000000 43863 . kaKieodcrDtLvvgfxLbZzx5heRAxrWIt 4DprkLP0l7nR2n5gPB4TX9toRqAART1X iWl06iDVXa9P8fqwCfpJa36mkI4WEecq 8AbRT6UxXpAVso4/uvR+UG8c79kueXkF 6TpZoaKs+4S1IwO9P2nefiyaQ+AJ9D7a KpBjcSfF+zKY3fIj/ck+fc3Owz2XNtJ5 qWRtppnRQ5t4gzYAIJeULC+622k8QSpL qb/1rhOCm5aGTxIOGVjvW8Zt5wGlJEd/ xvM6hW0NcnQU/4w8gOBJuraklWXTnG6q GKtdZtTJ4P6xTOiKG3kROrSIBwQ1iUR2 7qlmLabMHrTZC+cOcUXA+w== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171214000000 20171130000000 43863 . XZROZxFmRY6FygyYribn7/xFRRke0M+s Q76DiSDdL6R1/NlActeocZ6RjG/l9icS Ca9GZqczS9qcjs7dhQtvyeK84cV31YlW Lv3LiQGmHP07+4Yv6Lq/BPUaRcbbQldw dgwKXDgC8P+z8PocjBA84dyIVV8q7yRm niusMJNDpA5r7rwHfM1JUzaj2e6tsRjX IkXzReSul7Z0DZ8yQuPL0vh16XigbkO3 ZANdKw2flCynvcI/8tV8Ni+lPIlH4+E5 1SMJ/485NKmjPDK4AsS4Ic3u6eonen6v I+jq3xii0cWjzM3IEma1oin8ZzL/NWXl hSodAhBe5eMgV5zx+SeQDA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20171214000000 20171130000000 43863 . LwubT77ebb9kYgMvgQIIR7/V0t9IgY2y fEXhCbK2nQ/ugSInCMb2zpoF6t6JswR6 07lvjKGaG/B/V7p4cKfJXdW6O/+ke/ub YA+MNVJ8tg2/sC244ATvH+rk+K7qvFWs TuBL77AaRRKU1z8V3AQPbka7pV+2myTL NlIEgd0Dh2dr823rEqgqnKxpTpobJpPv Z2HWQvPT7n7MSDsKyzYNaVINxwYo84Nb 5vit+Nh5WU/g+1gmsVhxfNSO+XPSEQE7 7YGfc/IaOoqQzSKo3q7mcLrTMA5RbmAO DMoJl5xaHpxHz5kYZvb4XOlDC+gWChj3 t99u7aun2VHpcaUyqdfk3g== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20171210000000 20171219999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20171224000000 20171210000000 43863 . TWYLfFkfkhzVbdQwXVasQj0RUQZsDiMU HJyRzISnRIL+6hoSi6+imw8z2PcvSQne 6QKGrab1cEZgDFiyzOcjYO5I0FGfQta1 IKrITe5n+l04r3WlqZL3r4acXaX8Pb3R tC02hYb+oIjxgTmauL9qkNHiISNaSi6S wjVEaeXC4kOvSPNBKaB/aXRp/DKU1FVi R+l2fofpIai4HpVxOAbJ2+qzDfG0vfzQ S8+RMfJ3s9hyqwluc/6loC9eABjve6Su ukRgoRzw5CmAKw2trUNLlcnLhLFt4YUG Qhpgzo3/FsTJiT2Eu15eO+zp03RhTv1Q KpnVPjhOhXH8aiVGLzHF1w== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAbS4LSbmieIk96i3AK8IEZXlLRdM YLoEp4QSRMrdtJ0VcZKsjHWF6g9Q50T/ 1XKBxY/+6j71//cFRi1cViqoNsPd3LEb txWa3Jx/1HBINOkAPdHMBc3SQQ5qEIar PObq98RLnQ22ske1xZtbzNRZogPNi7zM HwQ3GYf0sUVCnYTmv8en5yYfSh8mY9Ez 8okorK7UN2RlHx9B8S5DRtBphO61mSI8 MXRj91aC3iRTbYZndTWorVkj4UvCBBr9 qh7oNpRbprIvAmRzRK6IaxpYDS6iGtSq 05WbGRtQRXkngOzFZO1BBDHgj9Agtx2S HBxAKuX4wF+w8I8xO7m5z0MOIF0= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171231000000 20171210000000 43306 . j7fn3Wmksge84eUfePg/6iOXBNnx04hD s996uSsqG5oqXC4VOtLR9mfPN99xHGfO swEhDgV3EMyutxBAnPqk+d3mHVQQDOld MQ4KASoLaGrzmovSRiw/ne4ozgDnfrMV JFozXV+P9HhQ+tRWF3x01vx3H8m+aCIK NaRUSNjs8bTJ8JvDEa4PxuD3uPgcJ7Qe UtMsQjaotPbenA1zTVx/E9LtI/wX1Tzs UOa89+dXWZDuny8mBKWD7KOIi63Upsnd zGbogel+QuLsF7E0AlinjTZD8FzaAujt hUUw66TGyEfciv888tyK/7nOhLmf+7qt X5LN+qfX5VBxt/wrN8SEjQ== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20171231000000 20171210000000 43863 . sk7zKGpiNflz5vQUiBM/tGH4cCEwfv2E y/DGmjaa8DWHlui+GepsaRl1t7dDWBW7 JxqDm1cESd0uU3BOqEDv+zGBbCYuhM5p WTqb2Fm3r98uH8jhXpXkpj2xMZw9D3Fo fnsotjc3a7mMLPYf4G/WyCJDYXSFOI76 dsUXwNB0vbu0vpwbPzDLFxNbwIU2cAnW rFATn8yhUU4qZyuiZyfIJFMBExfoXSiy oHa6sDvngz8Ve83eIom+B6hN1IndD5i0 C+d0uZ+tZSu2lJA6yXXPiztu2w8RsJRE qpCvBHZEZeSVz59yfY9sM+5xYgC7O492 xdiHCDZy0S/7inugSZVq4A== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20171224000000 20171210000000 43863 . FcAn2lVVdJ0QH3oYR+3YS/ReGs6pEdJU Wzmb68N7OG7V4bHovlCBVY3bGaC4+a1k Ye5t4uImqSTAygc/Ih8Nh4zUP+Ypmg57 XkQPAizWW/pc3yMVAxnGiF++do7CTf9W L9ZKknNsfhKN4L7+49BdPk3zbi8taj8L IUl9Oxic2F5QoTxb9MJ6Aetb8HXFMd9Y cmGa1/SLwDu74F1vXXZ5Br73RzTh3J4m y30T1uWvcVf76fTgsDVnj93sc/pSXQVk MARPd6OpGp6x4wGjN9LPOTAG8uV/g51y wJCdOcXikuWxX59dXIp6fnY+5GLyPyRt wmb3v54kwnXUHe5IyIT73w== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20171224000000 20171210000000 43863 . JVTjFY4Dsa4jcl2lNy178dO/4XuXzM12 do4ddbz80Zri18P6JW4ro/fUAN142jtl ybwrt3MRUpZQUXKhQijQpmiEYIfHPrc8 Gl4gitSnEPFjemyN6tOWJH8tzOPhkmm0 IqpdtLKG1MRuDsE50MAoVxA/C82ZzHza JExrCZxnRYMVkZSd19DacE2yHMDSXSMC OhPSEft1Jc5Sk5bUk9Jh27zQ59ZoccUq fE2nCeApt4d9WSRMAPRUlvZC8NHYZ8Sd WY/7/eX5XB2pw0xExtTwTQFPyPXxv1kt L5F+vrdwPrVgHXI3XD5lDRY8J80uyfo2 YwX3mGxAENwXPu0B+/GuAw== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171224000000 20171210000000 43863 . JI/lzbKGeJ2b25hqnJlrJ6SYZhkIiti4 pJs9F1dTa+xuYGv/rj7E6/g3H/sRxfS1 OKwOUfB5jTuhrbEmjffqHB7f+5+kNleE EJiDwwKW5KROtPhmwcYmTFnH+sjyotKB Wh3MHqbSTdKjtH1oZ0y1c2c4se2R+nE1 DKhjCPr2+cznWgraZld68aQ/anGktEr/ ib9zw0gH9cy88WMqV6g/vrTQOLM1Zl9F PM/zvuveDqrVbATRSEeAieK5tVlRXc+0 3ReWMme2kYQrnxik8UZA8VXZpzwakcFi HJagYURn/ZZtbXgyDkrvJN3S+EXrZ4TI C+jX3OlwAIOvMZUr0uIWug== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20171224000000 20171210000000 43863 . TWYLfFkfkhzVbdQwXVasQj0RUQZsDiMU HJyRzISnRIL+6hoSi6+imw8z2PcvSQne 6QKGrab1cEZgDFiyzOcjYO5I0FGfQta1 IKrITe5n+l04r3WlqZL3r4acXaX8Pb3R tC02hYb+oIjxgTmauL9qkNHiISNaSi6S wjVEaeXC4kOvSPNBKaB/aXRp/DKU1FVi R+l2fofpIai4HpVxOAbJ2+qzDfG0vfzQ S8+RMfJ3s9hyqwluc/6loC9eABjve6Su ukRgoRzw5CmAKw2trUNLlcnLhLFt4YUG Qhpgzo3/FsTJiT2Eu15eO+zp03RhTv1Q KpnVPjhOhXH8aiVGLzHF1w== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20171224000000 20171210000000 43863 . sS3OI7gVoxtgc15H83an5b1KRhZyqF7U f2uAnSdy+dVqOpGbcnI98dVJ7n0SGZR9 snpfl0mMTNd5aVM57FEigkcOVjN6h2+b JgXmIsxPCIoKLJ9fCBz8GC/6UvBaDt9K h66FrkWz7IXBXBqkGyAjoeN4hyelisun wAgo1CfpAHcwWjc8IknfM6T606RMD+03 QuPqlzdXs4L2Kp5ozyuQH5MiP0to7Cvd bBj35zvGrNLs5IAK74rQJaLr7N5WVvpQ IXFNslDboc/PY/0UotPq34oSgfOUdy5V SesteyEziztLJgWpb/4F7FJrtDaRcTzM +0xpQKrk0toob/02m5yccg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20171224000000 20171210000000 43863 . JVTjFY4Dsa4jcl2lNy178dO/4XuXzM12 do4ddbz80Zri18P6JW4ro/fUAN142jtl ybwrt3MRUpZQUXKhQijQpmiEYIfHPrc8 Gl4gitSnEPFjemyN6tOWJH8tzOPhkmm0 IqpdtLKG1MRuDsE50MAoVxA/C82ZzHza JExrCZxnRYMVkZSd19DacE2yHMDSXSMC OhPSEft1Jc5Sk5bUk9Jh27zQ59ZoccUq fE2nCeApt4d9WSRMAPRUlvZC8NHYZ8Sd WY/7/eX5XB2pw0xExtTwTQFPyPXxv1kt L5F+vrdwPrVgHXI3XD5lDRY8J80uyfo2 YwX3mGxAENwXPu0B+/GuAw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20171224000000 20171210000000 43863 . JI/lzbKGeJ2b25hqnJlrJ6SYZhkIiti4 pJs9F1dTa+xuYGv/rj7E6/g3H/sRxfS1 OKwOUfB5jTuhrbEmjffqHB7f+5+kNleE EJiDwwKW5KROtPhmwcYmTFnH+sjyotKB Wh3MHqbSTdKjtH1oZ0y1c2c4se2R+nE1 DKhjCPr2+cznWgraZld68aQ/anGktEr/ ib9zw0gH9cy88WMqV6g/vrTQOLM1Zl9F PM/zvuveDqrVbATRSEeAieK5tVlRXc+0 3ReWMme2kYQrnxik8UZA8VXZpzwakcFi HJagYURn/ZZtbXgyDkrvJN3S+EXrZ4TI C+jX3OlwAIOvMZUr0uIWug== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20171224000000 20171210000000 43863 . bI93JmKmTuyDeGyek/OL4FsoK0wcr2DT enIf9HiEuLhsffQQAyfa2l4rEstTgBAP w75VDITGASJpar4qjtmCkYnXvljA+P5y MvgyOH8QmDIEc2795D4RkgAdvi5f7U4d tVMPqaFpSe36w1g/89ubn11Emn2Izq3w QnIkCpfAj6E9Hsq7SsXogUbt5vNc15aV jnG98LgrRaUtjCWWLQ72H4SXJtsM3T1H 8SvHYfNFCY49fmbhFubWa6Ai4SJzUZ0A p0vK/ecuSuUxZofYASkNRiu4pZqzKrY7 L9DMI53EE6/fPqPBNb01XakvNff9mn5Q tGL0o3GQN0xmxMwu2rXUJQ== -ENTRY_END -RANGE_END - - - -RANGE_BEGIN 20171220000000 99999999999999 - ADDRESS 198.41.0.4 - ADDRESS 2001:503:ba3e::2:30 - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN SOA -SECTION ANSWER -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -. 86400 IN RRSIG SOA 8 0 86400 20180103000000 20171220000000 43863 . oUqoqEdKMlNikXS+IfDF99twoBLkQeMp FNH8xdI7bN+CJ3asb+Zm/VvPNXjhu3fd +4HMwRJVT1Ar9IWI5CYKvhMPuTuiCgXO Nx7tTIYD0xGtIPeRwRBI1+M5v7iOdtwD CyCb9IUtAQu6Jcg4hC8LUFTpo53PWBD5 V7b3EC18aKOqpn5C6YwoXSal1LlNgTcr wIYs1OjAtDWgKtFbK/YVOOavgfEYs6eg Fwqtn1xNAhpSDc5CnMUdl2gg/ejUvUvs 28/e2Wcp4xg5B6pB0mbHs1RjBYES2Vo/ OMyKqY1/1GJhqLm5Gal7h8nW6LHJSkjH K6YenULi+qMDAaC4kCFtqw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN DNSKEY -SECTION ANSWER -. 1814400 IN DNSKEY 256 3 8 AwEAAbS4LSbmieIk96i3AK8IEZXlLRdM YLoEp4QSRMrdtJ0VcZKsjHWF6g9Q50T/ 1XKBxY/+6j71//cFRi1cViqoNsPd3LEb txWa3Jx/1HBINOkAPdHMBc3SQQ5qEIar PObq98RLnQ22ske1xZtbzNRZogPNi7zM HwQ3GYf0sUVCnYTmv8en5yYfSh8mY9Ez 8okorK7UN2RlHx9B8S5DRtBphO61mSI8 MXRj91aC3iRTbYZndTWorVkj4UvCBBr9 qh7oNpRbprIvAmRzRK6IaxpYDS6iGtSq 05WbGRtQRXkngOzFZO1BBDHgj9Agtx2S HBxAKuX4wF+w8I8xO7m5z0MOIF0= -. 1814400 IN DNSKEY 256 3 8 AwEAAbgig4A5ky59AgWQLv02ZWvrP/PE +7D6PaQuOgbdmhdFqTQerNTEu1AztTaC 0QpMsG9HuhHi5rcOYGHHyxDagghZa4mQ Z08XWA+6Q2xBo5CMRh6+XTACY/N8ZoGU Si53XiVVh12t+BfbREXnT5zH45BBhPe1 dXYn8tolXXfK8oFhl8K0dvU4xhmOC1xD bDCeX1vyP0WyKtQzBU3tLHRIQQvss8vb iY+y3yTdJu062inDpGC+grJcY2nd4x16 ydcCUVRg8teLO0uuvfa0sdKLaoKJWWy7 CGWZX7lA4Nnb2CKWm0/ZySKIeSqOYW1B hr5MjdlzbyotJPhbxvBUUr3T+Kk= -. 1814400 IN DNSKEY 257 3 8 AwEAAcgeCFZiwMD0S6TVgSK3Ob/MKFo+ dHYeNgoOjxH3JoxV09WShBXID/LwKs/e sYAIzTOBB8Fu9IDoVuQe5prOEcGZRp6u zF7JLnqrgOzoaSPRmKsvXh8DfipA56qE AqNwYBCqzlbGIGjHOQ8t+Xonp4fSBYbN MLmh7o8+u55k7PxemKTCiAnY7Bjx0g3m J1HuFvQXDDdvyletuoS3NKqrkjqdOHRB 3p3GKrKgw+zVb05UEyotCEKjqqi+BOmg cm8rmUIeaNQREjxrUyr8/Ry67h5NJLfq LAqAnSePf1PyhQcl8XjGHXN7w1tLLyJu Gy5B3zLSW1P6jIjon77PSn+cXi0= -. 1814400 IN DNSKEY 257 3 8 AwEAAfX4eSO5BEPXggvx4jL5HkEjbA+5 QD8Acnh4wOHNv/OJX4QhKnpoMDOrpp38 n0Rgcr8qZ0XUqiJWl8eEH//wrQDHoO5/ JHRmibVrcA6UqfhUa25D1BfeMtTgMCSS +W3/heB/YhyXOJtOdWDmJutDY1nfJUSK rF6XwBj4us7U5jvwXwq+l36AeI4q7I87 Std0GNgRdA6/cJtApPoGv/0oNE0iNTyu IBcAR+AeWu32+JavhTycmtMfZ+KOIShq uI9RHzChZ9yLikAT+gclJGLLlxIr6HDr SLChCG90/yvmc57dLn8qhRWRJtJeLT2V HSxeP7oREb6RSdkxET6OTf9GYHE= -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20180110000000 20171220000000 43306 . iBsFCS0+aXyL+rLqQ45jBe1l6LSXyzFF w4kkB3opgU5o7TdaSnclpvGlabO2W1fR v9WrVDFPFYfWsMBH6TebraLm2do5HkWi bEaA8sZVKCv5Cew0FMRKtmcCYwFC5rRi MBY1ftWm1smyMEo4cU3ZvdH2Nd134Vmj xjN6LXJNJ/cx5TGp+AI0OSkdxIkVcPHr 6oQXM23WyTYp4QALnfEoh33jVlgiG9YQ 3OJ4IiKOVaeYZd1HyLaUVrreViuBCyWs S/tIScwBxKo+XImuqnNMRbun/jmkoTS/ 6BqUNxzjSq+jS7ayzXgnHsTKlXFPSDg4 bBelCv1A+DA2NG9NE4624g== -. 1209600 IN RRSIG DNSKEY 8 0 1814400 20180110000000 20171220000000 43863 . HOvNMA8EiqTdQR3kuRm1Djf0hyphC5WM DffZbEQ0S3/PiXCUYqt/8WhGgs9NDj7l engBOouhNrmahtIM6W6Q4egeZjRX6hrf +Oe9hXa8EyStHZEdM3Bt9eAiptxliBfz OO5N8/+6vT4lSgn02zigc2S7UWVsezM6 kwhhm5m2IUb3qXpAqJ8rwrwhVKdoGHOr QStBrrLgOHRAaZf68GjI+E2KRneu90M1 mofkjA29iZdXK8+XlEhxDnLVfR3zZflL /IjE6kCGOaNurrRhA0G3+g7wY91F+guT FsTqNKApCEvEI5O8N3XhxfJmKlWZ8UKf TTnrfxghMi11IxM3MRNsxw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -. IN NS -SECTION ANSWER -. 518400 IN NS rootns. -. 518400 IN RRSIG NS 8 0 518400 20180103000000 20171220000000 43863 . rlRwW56KLEwKjMVwq7vWtEHH8iUe0ME3 NRntwA96dWMXtYNp9ggPp+XYmQ8/fl/5 RwYtdcj649KjxdpauOiyCgBLpdu4dQnT JjfsHPRRMyTa3JLTxmQcnKKL84gVSI9P 4YRoUNiD1GCx0PpTsImF794Eg4k6qWjW +TPoraR41qv1+GywDLc6AZvkyMvm73Ru Fvj0TxI8KZuHlmwGL0gBPFl1Eqm0c/Pr n0PuTJXaNkDMBU/Bqm4K1uoWsZdECyT8 hnbOLMYIH8CENHn0h9miCAISdj5j+2mc bruRI9ZUknLF2fTev058NvHCYUOOTMmu NggrZOoVAMhUpyWUf3eooA== -SECTION ADDITIONAL -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG A 8 1 518400 20180103000000 20171220000000 43863 . qqJJVS9HmQPp5iPEUanAyVRFVJo70IEH zXOyegIPrVV4xAknPZezkwlDTxPJKEY/ 2Ob2sbvGmMiXvZn7vER5MPPOcb6YlT3E x9ygW8pa/5dx/gtemYmY4yhW4UhST4yB j500JpBItlMlbIP87ElECY8KyvekZ1RC PQfacGqJvZzG7SoHAOA+jphNgan0Qir8 Cx6iUsc2MEw5UMJmTCtx8fpweVmxHObT 7EaSleGQabSiV153GzRcTMA1Ye1ETUE5 YqIy89lKBDJfAJZ2m1AMYthLQwGOTtSI xyxA+qBgZfxC8foBVXgLUGB03X554V7K 32v2myX5HFSCNMhkXnQdSg== -rootns. 518400 IN RRSIG AAAA 8 1 518400 20180103000000 20171220000000 43863 . AXlfge8y4s4b0PS9u8ZhJsVaF52ihXKa SO+HR5yWAfzskmNTglPcv2R9UEkiXxuP EVwGz9vmWPo1STlBGw6vJ03TtGOR7BQW dn/20j4cYvtIM5RjosZ8u58OxKDsPy9e uLI+nlqx2gq/DUZ+pxySgV836As1GBhB c4QxQY3oCej52qDnWLCDfs+5j2JXx8q0 MiAH8m3H91tSJ3dWG198HmfpLTemBt41 WnYxBO0AS2Z9gf+TvYXulcbJMNwqXIzB 85NGzgq+fL1u11MJfjIQVW9F5bK7KTYk 8X+rT7b/DzIMSRupMJEYLCT8ECvlqOBM PQW8Nv+YSbLrKPBIJ2Vivw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN NS -SECTION AUTHORITY -. 86400 IN SOA rootns. you.test. 2017071100 1800 900 604800 86400 -rootns. 86400 IN NSEC test. A AAAA RRSIG NSEC -. 86400 IN RRSIG SOA 8 0 86400 20180103000000 20171220000000 43863 . oUqoqEdKMlNikXS+IfDF99twoBLkQeMp FNH8xdI7bN+CJ3asb+Zm/VvPNXjhu3fd +4HMwRJVT1Ar9IWI5CYKvhMPuTuiCgXO Nx7tTIYD0xGtIPeRwRBI1+M5v7iOdtwD CyCb9IUtAQu6Jcg4hC8LUFTpo53PWBD5 V7b3EC18aKOqpn5C6YwoXSal1LlNgTcr wIYs1OjAtDWgKtFbK/YVOOavgfEYs6eg Fwqtn1xNAhpSDc5CnMUdl2gg/ejUvUvs 28/e2Wcp4xg5B6pB0mbHs1RjBYES2Vo/ OMyKqY1/1GJhqLm5Gal7h8nW6LHJSkjH K6YenULi+qMDAaC4kCFtqw== -rootns. 86400 IN RRSIG NSEC 8 1 86400 20180103000000 20171220000000 43863 . jlED8vYS7eDm/0s4ZrlCuVJfRVSfQKxY 3STI2gq0PptQx+M6ovJf1oxjw6rNLF7s 8DK8WnznqxEocXFaJaR6jgUggZ8Dkgj7 DHNfshwISf5P93qDkPCOLqQ62vHTBmNk Pww3+aV2atnKhNAoEe8OphpGGpFeE0W+ gRf1+GAp+1Tid7E8SBxduIzrxEtKKvJM l/Ow0rLal5MKrnejV45hgAsVF0r0ZF0B 2G7Ud2aK47ZGcIDybRUD/rUxYiPDjSwe PgLU5M9+4VDSCdW1z/sf2fgQP7kt8tzC dhxRu9wLlM/YFSJb25qBhDI267qEh9cE rA1X0mbnTkueDGq9Wty4MA== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN A -SECTION ANSWER -rootns. 518400 IN A 198.41.0.4 -rootns. 518400 IN RRSIG A 8 1 518400 20180103000000 20171220000000 43863 . qqJJVS9HmQPp5iPEUanAyVRFVJo70IEH zXOyegIPrVV4xAknPZezkwlDTxPJKEY/ 2Ob2sbvGmMiXvZn7vER5MPPOcb6YlT3E x9ygW8pa/5dx/gtemYmY4yhW4UhST4yB j500JpBItlMlbIP87ElECY8KyvekZ1RC PQfacGqJvZzG7SoHAOA+jphNgan0Qir8 Cx6iUsc2MEw5UMJmTCtx8fpweVmxHObT 7EaSleGQabSiV153GzRcTMA1Ye1ETUE5 YqIy89lKBDJfAJZ2m1AMYthLQwGOTtSI xyxA+qBgZfxC8foBVXgLUGB03X554V7K 32v2myX5HFSCNMhkXnQdSg== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -rootns. IN AAAA -SECTION ANSWER -rootns. 518400 IN AAAA 2001:503:ba3e::2:30 -rootns. 518400 IN RRSIG AAAA 8 1 518400 20180103000000 20171220000000 43863 . AXlfge8y4s4b0PS9u8ZhJsVaF52ihXKa SO+HR5yWAfzskmNTglPcv2R9UEkiXxuP EVwGz9vmWPo1STlBGw6vJ03TtGOR7BQW dn/20j4cYvtIM5RjosZ8u58OxKDsPy9e uLI+nlqx2gq/DUZ+pxySgV836As1GBhB c4QxQY3oCej52qDnWLCDfs+5j2JXx8q0 MiAH8m3H91tSJ3dWG198HmfpLTemBt41 WnYxBO0AS2Z9gf+TvYXulcbJMNwqXIzB 85NGzgq+fL1u11MJfjIQVW9F5bK7KTYk 8X+rT7b/DzIMSRupMJEYLCT8ECvlqOBM PQW8Nv+YSbLrKPBIJ2Vivw== -ENTRY_END - -ENTRY_BEGIN -MATCH opcode question -ADJUST copy_id -REPLY NOERROR QR AA DO -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. 1 IN TXT "it works" -test. 1 IN RRSIG TXT 8 1 1 20180103000000 20171220000000 43863 . s8AQUwbk1av7JPMS3E1/K6Ew2Pv01lYo JkgknqA4+i5LK4Jrqj+TgDXt4er5sFfK bD9FjDRVIXQJkpLtb48YGsIGqZK0ePSd hS/+eyfjg7W0XPDBsLjuNmJBZ4/Gtih5 I8+pZs9o1UwwrLTX7LrWDQnJAsLY/kyP aZYmOrGgki9LNw6m/itOn1FcACRI3Fmz zGeW0MXwFKA+SE3yAMcoAjhGdYWaWMR3 jZAWhLQRHDvZXRUS9XjLsDWfMSN1pEJx UrQY7+Q/B3aEf9kNw9rAgMkKST3GeNEn ElUZ/gIr3P5mCVqHr8Bi2L/Mts/vo+2N VQx7KoJL7pf9jjSokV9NuA== -ENTRY_END -RANGE_END - - -; 2017-07-01T00:00:00 -STEP 20170701000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170701000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170701000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-02T00:00:00 -STEP 20170702000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170702000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170702000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-03T00:00:00 -STEP 20170703000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170703000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170703000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-04T00:00:00 -STEP 20170704000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170704000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170704000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-05T00:00:00 -STEP 20170705000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170705000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170705000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-06T00:00:00 -STEP 20170706000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170706000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170706000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-07T00:00:00 -STEP 20170707000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170707000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170707000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-08T00:00:00 -STEP 20170708000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170708000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170708000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-09T00:00:00 -STEP 20170709000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170709000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170709000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-10T00:00:00 -STEP 20170710000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170710000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170710000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-11T00:00:00 -STEP 20170711000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170711000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170711000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-12T00:00:00 -STEP 20170712000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170712000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170712000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-13T00:00:00 -STEP 20170713000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170713000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170713000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-14T00:00:00 -STEP 20170714000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170714000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170714000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-15T00:00:00 -STEP 20170715000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170715000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170715000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-16T00:00:00 -STEP 20170716000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170716000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170716000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-17T00:00:00 -STEP 20170717000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170717000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170717000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-18T00:00:00 -STEP 20170718000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170718000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170718000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-19T00:00:00 -STEP 20170719000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170719000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170719000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-20T00:00:00 -STEP 20170720000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170720000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170720000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-21T00:00:00 -STEP 20170721000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170721000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170721000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-22T00:00:00 -STEP 20170722000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170722000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170722000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-23T00:00:00 -STEP 20170723000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170723000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170723000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-24T00:00:00 -STEP 20170724000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170724000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170724000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-25T00:00:00 -STEP 20170725000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170725000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170725000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-26T00:00:00 -STEP 20170726000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170726000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170726000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-27T00:00:00 -STEP 20170727000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170727000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170727000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-28T00:00:00 -STEP 20170728000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170728000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170728000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-29T00:00:00 -STEP 20170729000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170729000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170729000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-30T00:00:00 -STEP 20170730000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170730000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170730000099 TIME_PASSES ELAPSE 86400 - - -; 2017-07-31T00:00:00 -STEP 20170731000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170731000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170731000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-01T00:00:00 -STEP 20170801000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170801000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170801000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-02T00:00:00 -STEP 20170802000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170802000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170802000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-03T00:00:00 -STEP 20170803000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170803000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170803000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-04T00:00:00 -STEP 20170804000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170804000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170804000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-05T00:00:00 -STEP 20170805000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170805000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170805000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-06T00:00:00 -STEP 20170806000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170806000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170806000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-07T00:00:00 -STEP 20170807000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170807000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170807000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-08T00:00:00 -STEP 20170808000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170808000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170808000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-09T00:00:00 -STEP 20170809000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170809000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170809000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-10T00:00:00 -STEP 20170810000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170810000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170810000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-11T00:00:00 -STEP 20170811000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170811000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170811000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-12T00:00:00 -STEP 20170812000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170812000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170812000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-13T00:00:00 -STEP 20170813000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170813000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170813000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-14T00:00:00 -STEP 20170814000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170814000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170814000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-15T00:00:00 -STEP 20170815000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170815000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170815000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-16T00:00:00 -STEP 20170816000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170816000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170816000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-17T00:00:00 -STEP 20170817000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170817000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170817000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-18T00:00:00 -STEP 20170818000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170818000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170818000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-19T00:00:00 -STEP 20170819000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170819000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170819000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-20T00:00:00 -STEP 20170820000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170820000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170820000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-21T00:00:00 -STEP 20170821000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170821000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170821000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-22T00:00:00 -STEP 20170822000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170822000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170822000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-23T00:00:00 -STEP 20170823000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170823000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170823000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-24T00:00:00 -STEP 20170824000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170824000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170824000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-25T00:00:00 -STEP 20170825000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170825000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170825000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-26T00:00:00 -STEP 20170826000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170826000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170826000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-27T00:00:00 -STEP 20170827000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170827000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170827000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-28T00:00:00 -STEP 20170828000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170828000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170828000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-29T00:00:00 -STEP 20170829000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170829000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170829000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-30T00:00:00 -STEP 20170830000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170830000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170830000099 TIME_PASSES ELAPSE 86400 - - -; 2017-08-31T00:00:00 -STEP 20170831000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170831000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170831000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-01T00:00:00 -STEP 20170901000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170901000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170901000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-02T00:00:00 -STEP 20170902000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170902000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170902000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-03T00:00:00 -STEP 20170903000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170903000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170903000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-04T00:00:00 -STEP 20170904000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170904000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170904000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-05T00:00:00 -STEP 20170905000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170905000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170905000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-06T00:00:00 -STEP 20170906000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170906000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170906000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-07T00:00:00 -STEP 20170907000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170907000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170907000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-08T00:00:00 -STEP 20170908000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170908000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170908000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-09T00:00:00 -STEP 20170909000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170909000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170909000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-10T00:00:00 -STEP 20170910000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170910000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170910000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-11T00:00:00 -STEP 20170911000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170911000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170911000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-12T00:00:00 -STEP 20170912000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170912000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170912000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-13T00:00:00 -STEP 20170913000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170913000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170913000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-14T00:00:00 -STEP 20170914000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170914000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170914000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-15T00:00:00 -STEP 20170915000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170915000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170915000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-16T00:00:00 -STEP 20170916000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170916000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170916000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-17T00:00:00 -STEP 20170917000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170917000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170917000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-18T00:00:00 -STEP 20170918000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170918000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170918000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-19T00:00:00 -STEP 20170919000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170919000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170919000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-20T00:00:00 -STEP 20170920000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170920000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170920000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-21T00:00:00 -STEP 20170921000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170921000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170921000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-22T00:00:00 -STEP 20170922000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170922000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170922000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-23T00:00:00 -STEP 20170923000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170923000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170923000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-24T00:00:00 -STEP 20170924000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170924000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170924000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-25T00:00:00 -STEP 20170925000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170925000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170925000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-26T00:00:00 -STEP 20170926000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170926000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170926000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-27T00:00:00 -STEP 20170927000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170927000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170927000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-28T00:00:00 -STEP 20170928000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170928000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170928000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-29T00:00:00 -STEP 20170929000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170929000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170929000099 TIME_PASSES ELAPSE 86400 - - -; 2017-09-30T00:00:00 -STEP 20170930000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20170930000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20170930000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-01T00:00:00 -STEP 20171001000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171001000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171001000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-02T00:00:00 -STEP 20171002000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171002000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171002000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-03T00:00:00 -STEP 20171003000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171003000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171003000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-04T00:00:00 -STEP 20171004000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171004000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171004000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-05T00:00:00 -STEP 20171005000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171005000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171005000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-06T00:00:00 -STEP 20171006000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171006000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171006000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-07T00:00:00 -STEP 20171007000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171007000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171007000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-08T00:00:00 -STEP 20171008000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171008000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171008000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-09T00:00:00 -STEP 20171009000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171009000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171009000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-10T00:00:00 -STEP 20171010000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171010000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171010000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-11T00:00:00 -STEP 20171011000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171011000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171011000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-12T00:00:00 -STEP 20171012000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171012000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171012000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-13T00:00:00 -STEP 20171013000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171013000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171013000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-14T00:00:00 -STEP 20171014000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171014000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171014000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-15T00:00:00 -STEP 20171015000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171015000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171015000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-16T00:00:00 -STEP 20171016000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171016000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171016000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-17T00:00:00 -STEP 20171017000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171017000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171017000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-18T00:00:00 -STEP 20171018000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171018000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171018000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-19T00:00:00 -STEP 20171019000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171019000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171019000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-20T00:00:00 -STEP 20171020000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171020000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171020000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-21T00:00:00 -STEP 20171021000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171021000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171021000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-22T00:00:00 -STEP 20171022000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171022000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171022000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-23T00:00:00 -STEP 20171023000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171023000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171023000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-24T00:00:00 -STEP 20171024000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171024000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171024000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-25T00:00:00 -STEP 20171025000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171025000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171025000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-26T00:00:00 -STEP 20171026000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171026000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171026000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-27T00:00:00 -STEP 20171027000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171027000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171027000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-28T00:00:00 -STEP 20171028000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171028000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171028000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-29T00:00:00 -STEP 20171029000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171029000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171029000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-30T00:00:00 -STEP 20171030000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171030000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171030000099 TIME_PASSES ELAPSE 86400 - - -; 2017-10-31T00:00:00 -STEP 20171031000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171031000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171031000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-01T00:00:00 -STEP 20171101000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171101000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171101000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-02T00:00:00 -STEP 20171102000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171102000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171102000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-03T00:00:00 -STEP 20171103000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171103000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171103000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-04T00:00:00 -STEP 20171104000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171104000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171104000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-05T00:00:00 -STEP 20171105000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171105000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171105000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-06T00:00:00 -STEP 20171106000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171106000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171106000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-07T00:00:00 -STEP 20171107000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171107000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171107000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-08T00:00:00 -STEP 20171108000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171108000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171108000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-09T00:00:00 -STEP 20171109000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171109000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171109000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-10T00:00:00 -STEP 20171110000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171110000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171110000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-11T00:00:00 -STEP 20171111000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171111000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171111000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-12T00:00:00 -STEP 20171112000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171112000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171112000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-13T00:00:00 -STEP 20171113000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171113000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171113000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-14T00:00:00 -STEP 20171114000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171114000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171114000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-15T00:00:00 -STEP 20171115000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171115000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171115000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-16T00:00:00 -STEP 20171116000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171116000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171116000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-17T00:00:00 -STEP 20171117000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171117000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171117000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-18T00:00:00 -STEP 20171118000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171118000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171118000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-19T00:00:00 -STEP 20171119000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171119000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171119000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-20T00:00:00 -STEP 20171120000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171120000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171120000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-21T00:00:00 -STEP 20171121000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171121000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171121000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-22T00:00:00 -STEP 20171122000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171122000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171122000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-23T00:00:00 -STEP 20171123000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171123000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171123000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-24T00:00:00 -STEP 20171124000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171124000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171124000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-25T00:00:00 -STEP 20171125000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171125000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171125000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-26T00:00:00 -STEP 20171126000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171126000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171126000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-27T00:00:00 -STEP 20171127000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171127000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171127000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-28T00:00:00 -STEP 20171128000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171128000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171128000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-29T00:00:00 -STEP 20171129000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171129000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171129000099 TIME_PASSES ELAPSE 86400 - - -; 2017-11-30T00:00:00 -STEP 20171130000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171130000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171130000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-01T00:00:00 -STEP 20171201000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171201000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171201000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-02T00:00:00 -STEP 20171202000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171202000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171202000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-03T00:00:00 -STEP 20171203000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171203000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171203000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-04T00:00:00 -STEP 20171204000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171204000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171204000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-05T00:00:00 -STEP 20171205000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171205000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171205000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-06T00:00:00 -STEP 20171206000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171206000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171206000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-07T00:00:00 -STEP 20171207000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171207000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171207000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-08T00:00:00 -STEP 20171208000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171208000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171208000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-09T00:00:00 -STEP 20171209000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171209000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171209000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-10T00:00:00 -STEP 20171210000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171210000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171210000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-11T00:00:00 -STEP 20171211000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171211000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171211000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-12T00:00:00 -STEP 20171212000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171212000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171212000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-13T00:00:00 -STEP 20171213000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171213000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171213000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-14T00:00:00 -STEP 20171214000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171214000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171214000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-15T00:00:00 -STEP 20171215000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171215000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171215000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-16T00:00:00 -STEP 20171216000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171216000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171216000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-17T00:00:00 -STEP 20171217000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171217000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171217000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-18T00:00:00 -STEP 20171218000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171218000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171218000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-19T00:00:00 -STEP 20171219000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171219000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171219000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-20T00:00:00 -STEP 20171220000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171220000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171220000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-21T00:00:00 -STEP 20171221000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171221000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171221000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-22T00:00:00 -STEP 20171222000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171222000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171222000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-23T00:00:00 -STEP 20171223000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171223000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171223000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-24T00:00:00 -STEP 20171224000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171224000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171224000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-25T00:00:00 -STEP 20171225000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171225000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171225000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-26T00:00:00 -STEP 20171226000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171226000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171226000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-27T00:00:00 -STEP 20171227000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171227000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171227000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-28T00:00:00 -STEP 20171228000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171228000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171228000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-29T00:00:00 -STEP 20171229000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171229000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171229000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-30T00:00:00 -STEP 20171230000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171230000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171230000099 TIME_PASSES ELAPSE 86400 - - -; 2017-12-31T00:00:00 -STEP 20171231000000 QUERY -ENTRY_BEGIN -REPLY RD AD -SECTION QUESTION -test. IN TXT -ENTRY_END - -STEP 20171231000001 CHECK_ANSWER -ENTRY_BEGIN -REPLY QR RD RA AD -MATCH opcode rcode flags question answer -SECTION QUESTION -test. IN TXT -SECTION ANSWER -test. IN TXT "it works" -ENTRY_END - -; move time by 1 day, 0:00:00 -STEP 20171231000099 TIME_PASSES ELAPSE 86400 - - - -SCENARIO_END - diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/val_cname_oob.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/val_cname_oob.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/val_cname_oob.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/val_cname_oob.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -159,25 +159,6 @@ ns.farfaraway.com. 3600 IN A 1.2.3.10 ENTRY_END -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR AA NOERROR -SECTION QUESTION -alfa.example.com. IN A -SECTION ANSWER -alfa.example.com. 3600 IN A 1.2.3.123 -farfaraway.com. 3600 IN RRSIG A 7 4 3600 20251231235959 20160308093040 27527 farfaraway.com. 11111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 11111111110= -SECTION AUTHORITY -SECTION ADDITIONAL -ENTRY_END -RANGE_END - -; ns.farfaraway.com. -RANGE_BEGIN 0 100 - ADDRESS 1.2.3.10 -ENTRY_BEGIN -ENTRY_END RANGE_END STEP 1 QUERY diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/val_cname_trust_domains.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/val_cname_trust_domains.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/val_cname_trust_domains.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/val_cname_trust_domains.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -189,7 +189,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION insecure.example.com. IN A @@ -249,7 +249,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR DO NOERROR SECTION QUESTION insecure.example.net. IN A @@ -278,7 +278,7 @@ ENTRY_BEGIN MATCH opcode qname -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION www.example.org. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/val_deleg_nons.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/val_deleg_nons.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/val_deleg_nons.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/val_deleg_nons.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -59,6 +59,15 @@ ENTRY_END ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +ns.example.com. IN AAAA +SECTION ANSWER +ENTRY_END + +ENTRY_BEGIN MATCH opcode subdomain ADJUST copy_id copy_query REPLY QR NOERROR @@ -69,15 +78,6 @@ SECTION ADDITIONAL ns.example.com. IN A 1.2.3.4 ENTRY_END - -ENTRY_BEGIN -MATCH opcode qtype qname -ADJUST copy_id -REPLY QR AA NOERROR -SECTION QUESTION -ns.example.com. IN AAAA -SECTION ANSWER -ENTRY_END RANGE_END ; ns.example.com. diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/val_nsec3_b1_nameerror.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/val_nsec3_b1_nameerror.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/val_nsec3_b1_nameerror.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/val_nsec3_b1_nameerror.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -138,7 +138,7 @@ ENTRY_END ;cached answer -STEP 20 CHECK_ANSWER +STEP 40 CHECK_ANSWER ENTRY_BEGIN MATCH all REPLY QR RD RA DO NXDOMAIN diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/val_nsec3_b4_wild.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/val_nsec3_b4_wild.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/val_nsec3_b4_wild.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/val_nsec3_b4_wild.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -127,21 +127,21 @@ ; answer has no AD since NSEC3 has optout STEP 10 CHECK_ANSWER ENTRY_BEGIN -MATCH opcode qname flags rcode question answer authority +MATCH opcode qname flags rcode question answer REPLY QR RD RA DO NOERROR SECTION QUESTION a.z.w.example. IN MX SECTION ANSWER a.z.w.example. MX 1 ai.example. a.z.w.example. RRSIG MX 7 2 3600 20150420235959 20051021000000 ( 40430 example. CikebjQwGQPwijVcxgcZcSJKtfynugtlBiKb 9FcBTrmOoyQ4InoWVudhCWsh/URX3lc4WRUM ivEBP6+4KS3ldA== ) -SECTION AUTHORITY -q04jkcevqvmu85r014c7dkba38o0ji5r.example. NSEC3 1 1 12 aabbccdd ( r53bq7cc2uvmubfu5ocmm6pers9tk9en A RRSIG ) -q04jkcevqvmu85r014c7dkba38o0ji5r.example. RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 ( 40430 example. hV5I89b+4FHJDATp09g4bbN0R1F845CaXpL3 ZxlMKimoPAyqletMlEWwLfFia7sdpSzn+ZlN NlkxWcLsIlMmUg== ) -SECTION ADDITIONAL -ai.example. A 192.0.2.9 -ai.example. RRSIG A 7 2 3600 20150420235959 20051021000000 ( 40430 example. hVe+wKYMlObTRPhX0NL67GxeZfdxqr/QeR6F tfdAj5+FgYxyzPEjIzvKWy00hWIl6wD3Vws+ rznEn8sQ64UdqA== ) -ai.example. AAAA 2001:db8:0:0:0:0:f00:baa9 -ai.example. RRSIG AAAA 7 2 3600 20150420235959 20051021000000 ( 40430 example. LcdxKaCB5bGZwPDg+3JJ4O02zoMBrjxqlf6W uaHQZZfTUpb9Nf2nxFGe2XRPfR5tpJT6GdRG cHueLuXkMjBArQ== ) +; SECTION AUTHORITY +; q04jkcevqvmu85r014c7dkba38o0ji5r.example. NSEC3 1 1 12 aabbccdd ( r53bq7cc2uvmubfu5ocmm6pers9tk9en A RRSIG ) +; q04jkcevqvmu85r014c7dkba38o0ji5r.example. RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 ( 40430 example. hV5I89b+4FHJDATp09g4bbN0R1F845CaXpL3 ZxlMKimoPAyqletMlEWwLfFia7sdpSzn+ZlN NlkxWcLsIlMmUg== ) +; SECTION ADDITIONAL +; ai.example. A 192.0.2.9 +; ai.example. RRSIG A 7 2 3600 20150420235959 20051021000000 ( 40430 example. hVe+wKYMlObTRPhX0NL67GxeZfdxqr/QeR6F tfdAj5+FgYxyzPEjIzvKWy00hWIl6wD3Vws+ rznEn8sQ64UdqA== ) +; ai.example. AAAA 2001:db8:0:0:0:0:f00:baa9 +; ai.example. RRSIG AAAA 7 2 3600 20150420235959 20051021000000 ( 40430 example. LcdxKaCB5bGZwPDg+3JJ4O02zoMBrjxqlf6W uaHQZZfTUpb9Nf2nxFGe2XRPfR5tpJT6GdRG cHueLuXkMjBArQ== ) ENTRY_END ; check for cached answer @@ -154,21 +154,21 @@ STEP 30 CHECK_ANSWER ENTRY_BEGIN -MATCH opcode qname flags rcode question answer authority +MATCH opcode qname flags rcode question answer REPLY QR RD RA DO NOERROR SECTION QUESTION a.z.w.example. IN MX SECTION ANSWER a.z.w.example. MX 1 ai.example. a.z.w.example. RRSIG MX 7 2 3600 20150420235959 20051021000000 ( 40430 example. CikebjQwGQPwijVcxgcZcSJKtfynugtlBiKb 9FcBTrmOoyQ4InoWVudhCWsh/URX3lc4WRUM ivEBP6+4KS3ldA== ) -SECTION AUTHORITY -q04jkcevqvmu85r014c7dkba38o0ji5r.example. NSEC3 1 1 12 aabbccdd ( r53bq7cc2uvmubfu5ocmm6pers9tk9en A RRSIG ) -q04jkcevqvmu85r014c7dkba38o0ji5r.example. RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 ( 40430 example. hV5I89b+4FHJDATp09g4bbN0R1F845CaXpL3 ZxlMKimoPAyqletMlEWwLfFia7sdpSzn+ZlN NlkxWcLsIlMmUg== ) -SECTION ADDITIONAL -ai.example. A 192.0.2.9 -ai.example. RRSIG A 7 2 3600 20150420235959 20051021000000 ( 40430 example. hVe+wKYMlObTRPhX0NL67GxeZfdxqr/QeR6F tfdAj5+FgYxyzPEjIzvKWy00hWIl6wD3Vws+ rznEn8sQ64UdqA== ) -ai.example. AAAA 2001:db8:0:0:0:0:f00:baa9 -ai.example. RRSIG AAAA 7 2 3600 20150420235959 20051021000000 ( 40430 example. LcdxKaCB5bGZwPDg+3JJ4O02zoMBrjxqlf6W uaHQZZfTUpb9Nf2nxFGe2XRPfR5tpJT6GdRG cHueLuXkMjBArQ== ) +; SECTION AUTHORITY +; q04jkcevqvmu85r014c7dkba38o0ji5r.example. NSEC3 1 1 12 aabbccdd ( r53bq7cc2uvmubfu5ocmm6pers9tk9en A RRSIG ) +; q04jkcevqvmu85r014c7dkba38o0ji5r.example. RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 ( 40430 example. hV5I89b+4FHJDATp09g4bbN0R1F845CaXpL3 ZxlMKimoPAyqletMlEWwLfFia7sdpSzn+ZlN NlkxWcLsIlMmUg== ) +; SECTION ADDITIONAL +; ai.example. A 192.0.2.9 +; ai.example. RRSIG A 7 2 3600 20150420235959 20051021000000 ( 40430 example. hVe+wKYMlObTRPhX0NL67GxeZfdxqr/QeR6F tfdAj5+FgYxyzPEjIzvKWy00hWIl6wD3Vws+ rznEn8sQ64UdqA== ) +; ai.example. AAAA 2001:db8:0:0:0:0:f00:baa9 +; ai.example. RRSIG AAAA 7 2 3600 20150420235959 20051021000000 ( 40430 example. LcdxKaCB5bGZwPDg+3JJ4O02zoMBrjxqlf6W uaHQZZfTUpb9Nf2nxFGe2XRPfR5tpJT6GdRG cHueLuXkMjBArQ== ) ENTRY_END SCENARIO_END diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/val_nsec3_optout_ns_ad.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/val_nsec3_optout_ns_ad.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/val_nsec3_optout_ns_ad.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/val_nsec3_optout_ns_ad.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -48,7 +48,7 @@ ENTRY_BEGIN MATCH opcode qtype -ADJUST copy_id +ADJUST copy_id copy_query REPLY QR RD AA REFUSED SECTION QUESTION . IN RRSIG diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/val_nsec3_optout_unsec_cache.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/val_nsec3_optout_unsec_cache.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/val_nsec3_optout_unsec_cache.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/val_nsec3_optout_unsec_cache.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -37,6 +37,7 @@ ENTRY_BEGIN MATCH opcode qtype qname +ADJUST copy_id REPLY QR RD RA AD SECTION QUESTION . IN DNSKEY @@ -199,7 +200,7 @@ STEP 20 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer additional authority REPLY QR RD RA SECTION QUESTION a.b.sample.net. IN A @@ -219,7 +220,7 @@ STEP 40 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer additional authority REPLY QR RD RA SECTION QUESTION a.b.sample.net. IN A @@ -240,7 +241,7 @@ STEP 60 CHECK_ANSWER ENTRY_BEGIN -MATCH all +MATCH flags rcode question answer additional authority REPLY QR RD RA SECTION QUESTION a.b.sample.net. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/val_ta_sentinel_insecure.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/val_ta_sentinel_insecure.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/val_ta_sentinel_insecure.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/val_ta_sentinel_insecure.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -363,7 +363,7 @@ root-key-sentinel-not-ta-48409.unsigned. IN AAAA ENTRY_END -STEP 322 CHECK_ANSWER +STEP 323 CHECK_ANSWER ENTRY_BEGIN REPLY QR RD RA NOERROR MATCH opcode rcode flags question answer diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/val_ta_sentinel_nokey.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/val_ta_sentinel_nokey.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/val_ta_sentinel_nokey.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/val_ta_sentinel_nokey.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -348,7 +348,7 @@ root-key-sentinel-not-ta-48409.test. IN AAAA ENTRY_END -STEP 322 CHECK_ANSWER +STEP 323 CHECK_ANSWER ENTRY_BEGIN REPLY QR RD RA NOERROR MATCH opcode rcode flags question answer diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/val_ta_sentinel.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/val_ta_sentinel.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/val_ta_sentinel.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/val_ta_sentinel.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -407,7 +407,7 @@ ENTRY_END ; query without AD must SERVFAIL as well -STEP 322 QUERY +STEP 321 QUERY ENTRY_BEGIN REPLY RD SECTION QUESTION @@ -494,14 +494,14 @@ ENTRY_END ; +CD must disable sentinel logic -STEP 423 QUERY +STEP 424 QUERY ENTRY_BEGIN REPLY RD CD SECTION QUESTION root-key-sentinel-is-ta-00000.test. IN AAAA ENTRY_END -STEP 424 CHECK_ANSWER +STEP 425 CHECK_ANSWER ENTRY_BEGIN REPLY QR RD RA CD NOERROR MATCH opcode rcode flags question answer diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/val_wild_pos_multi.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/val_wild_pos_multi.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/val_wild_pos_multi.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/val_wild_pos_multi.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -167,14 +167,14 @@ ; retry with DNSSEC enabled ; recursion happens here, we expect NODATA wildcard proof -STEP 101 QUERY +STEP 131 QUERY ENTRY_BEGIN REPLY RD DO SECTION QUESTION ns. IN TXT ENTRY_END -STEP 102 CHECK_ANSWER +STEP 132 CHECK_ANSWER ENTRY_BEGIN MATCH all ADJUST copy_id diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/world_cz_lidovky_www.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/world_cz_lidovky_www.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/world_cz_lidovky_www.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/world_cz_lidovky_www.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -556,8 +556,8 @@ ENTRY_END ENTRY_BEGIN - MATCH opcode subdomain - ADJUST copy_id + MATCH opcode qtype subdomain + ADJUST copy_id copy_query REPLY QR RD DO NOERROR SECTION QUESTION gtld-servers.net. IN NS @@ -584,7 +584,7 @@ ENTRY_END ENTRY_BEGIN - MATCH opcode qname + MATCH opcode qname qtype ADJUST copy_id REPLY QR RD DO NOERROR SECTION QUESTION diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/world_cz_vutbr_www.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/world_cz_vutbr_www.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/world_cz_vutbr_www.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/world_cz_vutbr_www.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -113,6 +113,7 @@ ENTRY_BEGIN MATCH opcode qtype qname +ADJUST copy_id REPLY QR AA DO SECTION QUESTION vutbr.cz. IN NS @@ -133,6 +134,7 @@ ENTRY_BEGIN MATCH opcode qtype qname +ADJUST copy_id REPLY QR AA DO SECTION QUESTION vutbr.cz. IN DNSKEY @@ -145,6 +147,7 @@ ENTRY_BEGIN MATCH opcode qtype qname +ADJUST copy_id REPLY QR AA DO SECTION QUESTION www.vutbr.cz. IN A @@ -173,6 +176,7 @@ ENTRY_BEGIN MATCH opcode qtype qname +ADJUST copy_id REPLY QR AA DO SECTION QUESTION ro.vutbr.cz. IN NS @@ -196,6 +200,7 @@ ENTRY_BEGIN MATCH opcode qtype qname +ADJUST copy_id REPLY QR AA DO SECTION QUESTION ro.vutbr.cz. IN DS @@ -207,6 +212,7 @@ ENTRY_BEGIN MATCH opcode qtype qname +ADJUST copy_id REPLY QR AA DO SECTION QUESTION ro.vutbr.cz. IN DNSKEY @@ -219,6 +225,7 @@ ENTRY_BEGIN MATCH opcode qtype qname +ADJUST copy_id REPLY QR AA DO SECTION QUESTION piranha.ro.vutbr.cz. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/sets/resolver/world_mx_nic_www.rpl knot-resolver-3.1.0/tests/deckard/sets/resolver/world_mx_nic_www.rpl --- knot-resolver-3.0.0/tests/deckard/sets/resolver/world_mx_nic_www.rpl 2018-07-02 13:20:06.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/sets/resolver/world_mx_nic_www.rpl 2018-09-03 13:11:50.000000000 +0000 @@ -167,6 +167,7 @@ ENTRY_BEGIN MATCH opcode qtype qname +ADJUST copy_id REPLY QR AA DO SECTION QUESTION nicmexico.mx. IN DS @@ -178,6 +179,7 @@ ENTRY_BEGIN MATCH opcode qtype qname +ADJUST copy_id REPLY QR AA DO SECTION QUESTION nicmexico.mx. IN DNSKEY @@ -191,6 +193,7 @@ ENTRY_BEGIN MATCH opcode qtype qname +ADJUST copy_id REPLY QR AA DO SECTION QUESTION www.nicmexico.mx. IN A diff -Nru knot-resolver-3.0.0/tests/deckard/tools/divide_tests.sh knot-resolver-3.1.0/tests/deckard/tools/divide_tests.sh --- knot-resolver-3.0.0/tests/deckard/tools/divide_tests.sh 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/tools/divide_tests.sh 2018-09-03 13:11:50.000000000 +0000 @@ -0,0 +1,77 @@ +#!/bin/bash + +# Sorts .rpl tests into several categories. +# Takes a diretory with the tests as an argument and moves the test to its subdirectories. +# Env variable SCRIPT= sets *_run.sh script for finding working tests, default script is kresd_run.sh +# Env variable DEST= sets output directory where the tests will be copied and divided into subfolders. Default value is working directory. + +set -o nounset +set -o errexit + +SOURCE="$1" + +SCRIPT=${SCRIPT:-"./../kresd_run.sh"} +DEST=${DEST:-"."} + +rm -rf "$DEST/sorted_tests" +mkdir "$DEST/sorted_tests" +for TEST in "$SOURCE/"*.rpl +do + cp "$TEST" "$DEST/sorted_tests" +done + +# Test with the same name is already imported in deckard/sets/resolver +echo Already imported: +mkdir -p "$DEST/sorted_tests/imported" +for TEST in `comm -12 <(ls -F ../sets/resolver/*.rpl | xargs -n 1 basename) <(ls -F "$DEST/sorted_tests" | xargs -n 1 basename)` +do + echo -e '\t' "$TEST" + mv "$DEST/sorted_tests/$TEST" "$DEST/sorted_tests/imported" +done + +# Parse failed +echo Parse failed: +mkdir -p "$DEST/sorted_tests/parsefail" +for TEST in "$DEST/sorted_tests/"*.rpl +do + if ! python3 parse.py "$TEST" >/dev/null 2>/dev/null + then + echo -e '\t' $(basename "$TEST") + mv "$TEST" "$DEST/sorted_tests/parsefail" + fi +done + + +# Invalid DSA signatures (common in old testbound tests) +echo Invalid DSA signatures: +mkdir -p "$DEST/sorted_tests/invaliddsa" +for TEST in "$DEST/sorted_tests/"*.rpl +do + if ! python3 invalid_dsa.py "$TEST" >/dev/null 2>/dev/null + then + echo -e '\t' $(basename "$TEST") + mv "$TEST" "$DEST/sorted_tests/invaliddsa" + fi +done + + +# Working in selected script +echo Working in $SCRIPT: +mkdir -p "$DEST/sorted_tests/working" +for TEST in "$DEST/sorted_tests/"*.rpl +do + if TESTS="$(readlink -m $TEST)" $SCRIPT >/dev/null 2>/dev/null + then + echo -e '\t' $(basename "$TEST") + mv "$TEST" "$DEST/sorted_tests/working" + fi +done + +echo Others: +mkdir -p "$DEST/sorted_tests/others" +for TEST in "$DEST/sorted_tests/"*.rpl +do + echo -e '\t' $(basename "$TEST") + mv "$TEST" "$DEST/sorted_tests/others" +done + diff -Nru knot-resolver-3.0.0/tests/deckard/tools/invalid_dsa.py knot-resolver-3.1.0/tests/deckard/tools/invalid_dsa.py --- knot-resolver-3.0.0/tests/deckard/tools/invalid_dsa.py 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/tools/invalid_dsa.py 2018-09-03 13:11:50.000000000 +0000 @@ -0,0 +1,82 @@ +"""Returns 1 if there is a DNSSEC DSA signature which is not 41 bytes long.\ +0 otherwise. +""" + +import os +import sys +import argparse +import dns +import pydnstest +import pydnstest.scenario +import pydnstest.augwrap + + +def parse(test): + """ Parse the test""" + _, config = pydnstest.scenario.parse_file(os.path.realpath(test)) + aug = pydnstest.augwrap.AugeasWrapper( + confpath=os.path.realpath(test), + lens='Deckard', loadpath="../pydnstest") + node = aug.tree + return config, node + + +def get_dsakeys(config, node): + """ Make list of all DSA keys in the test""" + dsakeys = [] + for conf in config: + if conf[0] == "trust-anchor": + conf[1] = conf[1][1:-1] + trust_anchor = conf[1].split() + for i, word in enumerate(trust_anchor): + if word == "DS": + algorithm = trust_anchor[i + 2] + if algorithm == "3" or algorithm == "DSA": + dsakeys.append(trust_anchor[i + 1]) + + for entry in node.match("/scenario/range/entry"): + records = list(entry.match("/section/answer/record")) + records.extend(list(entry.match("/section/authority/record"))) + records.extend(list(entry.match("/section/additional/record"))) + + for record in records: + if record["/type"].value == "DS": + if record["/data"].value[1] in ["3", "DSA"]: + dsakeys.append(record["/data"].value[2]) + return dsakeys + + +def check_rrsig(node, dsakeys): + """ Find records with wrong lenght of rrsig""" + for key in dsakeys: + for entry in node.match("/scenario/range/entry"): + records = list(entry.match("/section/answer/record")) + records.extend(list(entry.match("/section/authority/record"))) + records.extend(list(entry.match("/section/additional/record"))) + + for record in records: + if record["/type"].value == "RRSIG": + rrset = dns.rrset.from_text(record["/domain"].value, 300, + 1, dns.rdatatype.RRSIG, + record["/data"].value) + if rrset.items[0].key_tag == int(key): + if len(rrset.items[0].signature) != 41: + return True + return False + + +def main(): + """Returns 1 if there is a DNSSEC DSA signature which is not 41 bytes long. \ + 0 otherwise.""" + argparser = argparse.ArgumentParser() + argparser.add_argument("file") + args = argparser.parse_args() + config, node = parse(args.file) + dsakeys = get_dsakeys(config, node) + bad_rrsig = check_rrsig(node, dsakeys) + if bad_rrsig: + sys.exit(1) + else: + sys.exit(0) + +main() diff -Nru knot-resolver-3.0.0/tests/deckard/tools/parse.py knot-resolver-3.1.0/tests/deckard/tools/parse.py --- knot-resolver-3.0.0/tests/deckard/tools/parse.py 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/tests/deckard/tools/parse.py 2018-09-03 13:11:50.000000000 +0000 @@ -0,0 +1,20 @@ +"""Returns 0 if the test is parsed, 1 if not.""" + +import sys +import os +import argparse +import pydnstest +import pydnstest.scenario + + +def main(): + """Returns 0 if the test is parsed, 1 if not.""" + argparser = argparse.ArgumentParser() + argparser.add_argument("file") + args = argparser.parse_args() + if pydnstest.scenario.parse_file(os.path.realpath(args.file)): + sys.exit(0) + else: + sys.exit(1) + +main() diff -Nru knot-resolver-3.0.0/tests/test_queue.c knot-resolver-3.1.0/tests/test_queue.c --- knot-resolver-3.0.0/tests/test_queue.c 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/tests/test_queue.c 2018-11-02 15:29:58.000000000 +0000 @@ -0,0 +1,75 @@ +/* Copyright (C) 2018 CZ.NIC, z.s.p.o. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "tests/test.h" +#include "lib/generic/queue.h" + +/* The main intention is to use queues with pointers, so we test the same-sized int. */ +typedef queue_t(ptrdiff_t) queue_int_t; +typedef queue_it_t(int) queue_int_it_t; + +static void test_int(void **state_) +{ + queue_int_t q; + queue_init(q); + + queue_push_head(q, 2); + queue_push_head(q, 1); + queue_push_head(q, 0); + for (int i = 0; i < 100; ++i) { + assert_int_equal(queue_head(q), i); + queue_push(q, i + 3); + queue_pop(q); + } + assert_int_equal(queue_len(q), 3); + for (int i = 99; i > 0; --i) { + assert_int_equal(queue_head(q), i + 1); + queue_push_head(q, i); + } + assert_int_equal(queue_len(q), 3 + 99); + + /* Basic iterator test. */ + int i = 0; + for (queue_int_it_t it = queue_it_begin(q); !queue_it_finished(it); + queue_it_next(it)) { + ++queue_it_val(it); + ++i; + } + assert_int_equal(queue_len(q), i); + + queue_deinit(q); + queue_init(q); + + for (int i = 0; i < 100; ++i) { + queue_push(q, 2*i); + queue_push(q, 2*i + 1); + assert_int_equal(queue_head(q), i); + queue_pop(q); + } + + queue_deinit(q); +} + + +int main(void) +{ + const UnitTest tests[] = { + unit_test(test_int), + }; + + return run_tests(tests); +} + diff -Nru knot-resolver-3.0.0/tests/test_trie.c knot-resolver-3.1.0/tests/test_trie.c --- knot-resolver-3.0.0/tests/test_trie.c 1970-01-01 00:00:00.000000000 +0000 +++ knot-resolver-3.1.0/tests/test_trie.c 2018-11-02 15:29:58.000000000 +0000 @@ -0,0 +1,165 @@ +/* Copyright (C) 2018 CZ.NIC, z.s.p.o. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "lib/generic/trie.h" +#include "tests/test.h" + +static const char *dict[] = { + "catagmatic", "prevaricator", "statoscope", "workhand", "benzamide", + "work", "workhands", // have some keys that are prefixes of each other + "alluvia", "fanciful", "bladish", "Tarsius", "unfast", "appropriative", + "seraphically", "monkeypod", "deflectometer", "tanglesome", "zodiacal", + "physiologically", "economizer", "forcepslike", "betrumpet", + "Danization", "broadthroat", "randir", "usherette", "nephropyosis", + "hematocyanin", "chrysohermidin", "uncave", "mirksome", "podophyllum", + "siphonognathous", "indoor", "featheriness", "forwardation", + "archruler", "soricoid", "Dailamite", "carmoisin", "controllability", + "unpragmatical", "childless", "transumpt", "productive", + "thyreotoxicosis", "oversorrow", "disshadow", "osse", "roar", + "pantomnesia", "talcer", "hydrorrhoea", "Satyridae", "undetesting", + "smoothbored", "widower", "sivathere", "pendle", "saltation", + "autopelagic", "campfight", "unexplained", "Macrorhamphosus", + "absconsa", "counterflory", "interdependent", "triact", "reconcentration", + "oversharpness", "sarcoenchondroma", "superstimulate", "assessory", + "pseudepiscopacy", "telescopically", "ventriloque", "politicaster", + "Caesalpiniaceae", "inopportunity", "Helion", "uncompatible", + "cephaloclasia", "oversearch", "Mahayanistic", "quarterspace", + "bacillogenic", "hamartite", "polytheistical", "unescapableness", + "Pterophorus", "cradlemaking", "Hippoboscidae", "overindustrialize", + "perishless", "cupidity", "semilichen", "gadge", "detrimental", + "misencourage", "toparchia", "lurchingly", "apocatastasis" +}; +#define KEY_LEN(x) (strlen(x) + 1) +static const int dict_size = sizeof(dict) / sizeof(const char *); + +static void test_init(void **state) +{ + trie_t *t = trie_create(NULL); + assert_non_null(t); + *state = t; +} + +static void test_insert(void **state) +{ + trie_t *t = *state; + + for (int i = 0; i < dict_size; ++i) { + trie_val_t *data = trie_get_ins(t, dict[i], KEY_LEN(dict[i])); + assert_non_null(data); + assert_null(*data); + *data = NULL + (ptrdiff_t)i; // yes, ugly + assert_ptr_equal(trie_get_try(t, dict[i], KEY_LEN(dict[i])), data); + } + assert_int_equal(trie_weight(t), dict_size); +} + +static void test_missing(void **state) +{ + trie_t *t = *state; + const char *notin = "p"; + assert_null(trie_get_try(t, notin, KEY_LEN(notin))); +} + +static int cmpstringp(const void *p1, const void *p2) +{ + return strcmp(* (char * const *) p1, * (char * const *) p2); +} + +static void test_iter(void **state) +{ + // prepare sorted dictionary + char *dict_sorted[dict_size]; + memcpy(dict_sorted, dict, sizeof(dict)); + qsort(dict_sorted, dict_size, sizeof(dict[0]), cmpstringp); + + // iterate and check the order is consistent + trie_t *t = *state; + trie_it_t *it = trie_it_begin(t); + for (int i = 0; i < dict_size; ++i, trie_it_next(it)) { + assert_false(trie_it_finished(it)); + size_t len; + const char *key = trie_it_key(it, &len); + assert_int_equal(KEY_LEN(key), len); + assert_string_equal(key, dict_sorted[i]); + assert_ptr_equal(dict[*trie_it_val(it) - NULL], dict_sorted[i]); + } + assert_true(trie_it_finished(it)); + trie_it_free(it); +} + +static void test_queue(void **state) +{ + trie_t *t = *state; + // remove all the elements in ascending order + for (int i = 0; i < dict_size; ++i) { + char *key; + uint32_t len; + trie_val_t *data = trie_get_first(t, &key, &len); + assert_non_null(key); + assert_int_equal(len, KEY_LEN(key)); + assert_non_null(data); + ptrdiff_t key_i = *data - NULL; + assert_string_equal(key, dict[key_i]); + + len = 30; + char key_buf[len]; + ptrdiff_t key_i_new; + int ret = trie_del_first(t, key_buf, &len, (trie_val_t *)&key_i_new); + assert_int_equal(ret, kr_ok()); + assert_int_equal(KEY_LEN(key_buf), len); + assert_int_equal(key_i, key_i_new); + assert_string_equal(dict[key_i], key_buf); + } +} + +static void test_leq_bug(void **state) +{ + /* We use different contents of the trie, + * so that the particular bug would've been triggered. */ + trie_t *t = trie_create(NULL); + char key = 'a'; + trie_get_ins(t, &key, sizeof(key)); + + key = 0xff; + trie_val_t *val; + int ret = trie_get_leq(t, &key, sizeof(key), &val); + assert_int_equal(ret, 1); + trie_free(t); +} + +static void test_deinit(void **state) +{ + trie_t *t = *state; + trie_free(t); + *state = NULL; +} + +/* Program entry point */ +int main(int argc, char **argv) +{ + const UnitTest tests[] = { + group_test_setup(test_init), + unit_test(test_insert), + unit_test(test_leq_bug), + unit_test(test_missing), + unit_test(test_iter), + unit_test(test_queue), + group_test_teardown(test_deinit) + }; + + return run_group_tests(tests); +} + diff -Nru knot-resolver-3.0.0/tests/unit.mk knot-resolver-3.1.0/tests/unit.mk --- knot-resolver-3.0.0/tests/unit.mk 2018-08-14 12:27:05.000000000 +0000 +++ knot-resolver-3.1.0/tests/unit.mk 2018-11-02 15:29:58.000000000 +0000 @@ -3,15 +3,17 @@ # tests_BIN := \ - test_set \ - test_map \ test_array \ - test_pack \ test_lru \ - test_utils \ + test_map \ test_module \ + test_pack \ + test_queue \ + test_rplan \ + test_set \ + test_trie \ + test_utils \ test_zonecut \ - test_rplan #test_cache TODO: re-consider how best to test cache mock_cmodule_CFLAGS := -fPIC