]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Add EDNS client tag test
authorRalph Dolmans <ralph@nlnetlabs.nl>
Mon, 27 Jul 2020 13:54:43 +0000 (15:54 +0200)
committerRalph Dolmans <ralph@nlnetlabs.nl>
Mon, 27 Jul 2020 13:54:43 +0000 (15:54 +0200)
testcode/fake_event.c
testdata/edns_client_tag.rpl [new file with mode: 0644]

index d89eedce8bd01410baee4007727f82fd5ce7d297..59df27f5703261f1444318ac9100157e8a96e266 100644 (file)
@@ -52,6 +52,7 @@
 #include "util/data/msgreply.h"
 #include "util/data/msgencode.h"
 #include "util/data/dname.h"
+#include "util/edns.h"
 #include "util/config_file.h"
 #include "services/listen_dnsport.h"
 #include "services/outside_network.h"
@@ -1180,7 +1181,7 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
        socklen_t addrlen, uint8_t* zone, size_t zonelen,
        struct module_qstate* qstate, comm_point_callback_type* callback,
        void* callback_arg, sldns_buffer* ATTR_UNUSED(buff),
-       struct module_env* ATTR_UNUSED(env))
+       struct module_env* env)
 {
        struct replay_runtime* runtime = (struct replay_runtime*)outnet->base;
        struct fake_pending* pend = (struct fake_pending*)calloc(1,
@@ -1209,6 +1210,7 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
        sldns_buffer_flip(pend->buffer);
        if(1) {
                struct edns_data edns;
+               struct edns_tag_addr* client_tag_addr;
                if(!inplace_cb_query_call(env, qinfo, flags, addr, addrlen,
                        zone, zonelen, qstate, qstate->region)) {
                        free(pend);
@@ -1220,9 +1222,17 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
                edns.edns_version = EDNS_ADVERTISED_VERSION;
                edns.udp_size = EDNS_ADVERTISED_SIZE;
                edns.bits = 0;
-               edns.opt_list = qstate->edns_opts_back_out;
                if(dnssec)
                        edns.bits = EDNS_DO;
+               if((client_tag_addr = edns_tag_addr_lookup(
+                       &env->edns_tags->client_tags,
+                       addr, addrlen))) {
+                       uint16_t client_tag = htons(client_tag_addr->tag_data);
+                       edns_opt_list_append(&qstate->edns_opts_back_out,
+                               LDNS_EDNS_CLIENT_TAG, 2,
+                               (uint8_t*)&client_tag, qstate->region);
+               }
+               edns.opt_list = qstate->edns_opts_back_out;
                attach_edns_record(pend->buffer, &edns);
        }
        memcpy(&pend->addr, addr, addrlen);
diff --git a/testdata/edns_client_tag.rpl b/testdata/edns_client_tag.rpl
new file mode 100644 (file)
index 0000000..767652c
--- /dev/null
@@ -0,0 +1,151 @@
+; config options
+server:
+       edns-client-tag: 10.0.0.0/24 1234
+       edns-client-tag: 10.0.0.10/32 5678
+
+stub-zone:
+       name: "tag1234."
+       stub-addr: 10.0.0.1
+
+stub-zone:
+       name: "tag5678."
+       stub-addr: 10.0.0.10
+
+stub-zone:
+       name: "notag."
+       stub-addr: 10.10.0.1
+
+CONFIG_END
+
+SCENARIO_BEGIN Test EDNS client tag option
+
+RANGE_BEGIN 0 1000
+       ADDRESS 10.0.0.1
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+tag1234. IN A
+SECTION ANSWER
+tag1234. IN A 10.20.30.40
+SECTION ADDITIONAL
+ENTRY_END
+RANGE_END
+
+RANGE_BEGIN 0 1000
+       ADDRESS 10.0.0.10
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+tag5678. IN A
+SECTION ANSWER
+tag5678. IN A 10.20.30.40
+SECTION ADDITIONAL
+ENTRY_END
+RANGE_END
+
+RANGE_BEGIN 0 1000
+       ADDRESS 10.10.0.1
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+notag. IN A
+SECTION ANSWER
+notag. IN A 10.20.30.40
+SECTION ADDITIONAL
+ENTRY_END
+RANGE_END
+
+STEP 10 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+tag1234. IN A
+ENTRY_END
+
+STEP 20 CHECK_OUT_QUERY
+ENTRY_BEGIN
+MATCH qname qtype opcode ednsdata
+SECTION QUESTION
+tag1234. IN A
+SECTION ADDITIONAL
+       HEX_EDNSDATA_BEGIN
+               00 10           ; Opcode 16
+               00 02           ; Length 2
+               04 d2           ; 1234
+       HEX_EDNSDATA_END
+ENTRY_END
+
+STEP 30 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+tag1234. IN A
+SECTION ANSWER
+tag1234. IN A 10.20.30.40
+ENTRY_END
+
+STEP 110 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+tag5678. IN A
+ENTRY_END
+
+STEP 120 CHECK_OUT_QUERY
+ENTRY_BEGIN
+MATCH qname qtype opcode ednsdata
+SECTION QUESTION
+tag5678. IN A
+SECTION ADDITIONAL
+       HEX_EDNSDATA_BEGIN
+               00 10           ; Opcode 16
+               00 02           ; Length 2
+               16 2e           ; 5678
+       HEX_EDNSDATA_END
+ENTRY_END
+
+STEP 130 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+tag5678. IN A
+SECTION ANSWER
+tag5678. IN A 10.20.30.40
+ENTRY_END
+
+STEP 210 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+notag. IN A
+ENTRY_END
+
+STEP 220 CHECK_OUT_QUERY
+ENTRY_BEGIN
+MATCH qname qtype opcode ednsdata
+SECTION QUESTION
+notag. IN A
+SECTION ADDITIONAL
+       HEX_EDNSDATA_BEGIN
+       HEX_EDNSDATA_END
+ENTRY_END
+
+STEP 230 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+notag. IN A
+SECTION ANSWER
+notag. IN A 10.20.30.40
+ENTRY_END
+
+SCENARIO_END