]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add CO support to dig
authorMark Andrews <marka@isc.org>
Tue, 27 May 2025 04:41:24 +0000 (14:41 +1000)
committerMark Andrews <marka@isc.org>
Fri, 13 Jun 2025 10:39:17 +0000 (20:39 +1000)
Dig now support setting the EDNS CO as flag using "+coflag" /
"+nocoflag" rather than as part of +ednsflags.

(cherry picked from commit 6c28411c55d595e3c9ce3f8d1754b24875eb5306)

bin/dig/dig.c
bin/dig/dig.rst
bin/dig/dighost.c
bin/dig/dighost.h
lib/dns/include/dns/message.h
lib/dns/message.c

index d31a0b664a4da3de588bb5b4d53593e334b2289f..1e724c6185daa454739bd4a370f721a073261528 100644 (file)
@@ -196,6 +196,9 @@ help(void) {
               "                 +[no]cmd            (Control display of "
               "command line -\n"
               "                                      global option)\n"
+              "                 +[no]coflag         (Set compact denial of "
+              "existence ok flag)\n"
+              "                                      in query)\n"
               "                 +[no]comments       (Control display of "
               "packet "
               "header\n"
@@ -1285,6 +1288,11 @@ plus_option(char *option, bool is_batchfile, bool *need_clone,
                        break;
                case 'o': /* comments */
                        switch (cmd[2]) {
+                       case 'f':
+                       case '\0': /* +co is a synonym for +coflag */
+                               FULLCHECK("coflag");
+                               lookup->coflag = state;
+                               break;
                        case 'm':
                                FULLCHECK("comments");
                                lookup->comments = state;
index 59ac9f15ddc4c10b1bd526b7ca4234ef4c7f4312..88b0a40307e68fec8bc1408d6672c35fb49b26ee 100644 (file)
@@ -298,6 +298,13 @@ abbreviation is unambiguous; for example, :option:`+cd` is equivalent to
    always has a global effect; it cannot be set globally and then overridden on a
    per-lookup basis. The default is to print this comment.
 
+.. option:: +coflag, +co, +nocoflag, +noco
+
+   This option sets [or does not set] the CO (Compact denial of
+   existence Ok) EDNS bit in the query.  If set, it tells servers
+   that Compact Denial of Existence responses are acceptable when
+   replying to queries.  The default is ``+nocoflag``.
+
 .. option:: +comments, +nocomments
 
    This option toggles the display of some comment lines in the output, with
@@ -363,7 +370,7 @@ abbreviation is unambiguous; for example, :option:`+cd` is equivalent to
 
    This option sets the must-be-zero EDNS flags bits (Z bits) to the specified value.
    Decimal, hex, and octal encodings are accepted. Setting a named flag
-   (e.g., DO) is silently ignored. By default, no Z bits are set.
+   (e.g. DO, CO) is silently ignored. By default, no Z bits are set.
 
 .. option:: +ednsnegotiation, +noednsnegotiation
 
index 87fbb41e1c2c17024674768522642a94090e859e..0f8ac1335c92659c2c3ac33a58054566664a7b21 100644 (file)
@@ -789,6 +789,7 @@ clone_lookup(dig_lookup_t *lookold, bool servers) {
        looknew->aaonly = lookold->aaonly;
        looknew->adflag = lookold->adflag;
        looknew->cdflag = lookold->cdflag;
+       looknew->coflag = lookold->coflag;
        looknew->raflag = lookold->raflag;
        looknew->tcflag = lookold->tcflag;
        looknew->print_unknown_format = lookold->print_unknown_format;
@@ -2655,10 +2656,13 @@ setup_lookup(dig_lookup_t *lookup) {
                }
 
                flags = lookup->ednsflags;
-               flags &= ~DNS_MESSAGEEXTFLAG_DO;
+               flags &= ~(DNS_MESSAGEEXTFLAG_DO | DNS_MESSAGEEXTFLAG_CO);
                if (lookup->dnssec) {
                        flags |= DNS_MESSAGEEXTFLAG_DO;
                }
+               if (lookup->coflag) {
+                       flags |= DNS_MESSAGEEXTFLAG_CO;
+               }
                add_opt(lookup->sendmsg, lookup->udpsize, lookup->edns, flags,
                        opts, i);
        }
index 227c315f513c402962a79c30e6dcfba95827352f..09d136363dea8ac5ea15ac60c5efda8de3f478b1 100644 (file)
@@ -105,11 +105,10 @@ typedef struct dig_searchlist dig_searchlist_t;
 struct dig_lookup {
        unsigned int magic;
        isc_refcount_t references;
-       bool aaonly, adflag, badcookie, besteffort, cdflag, cleared, comments,
-               dns64prefix, dnssec, doing_xfr, done_as_is, ednsneg, expandaaaa,
-               expire, fuzzing, header_only, identify, /*%< Append an "on
-                                                          server <foo>" message
-                                                        */
+       bool aaonly, adflag, badcookie, besteffort, cdflag, cleared, coflag,
+               comments, dns64prefix, dnssec, doing_xfr, done_as_is, ednsneg,
+               expandaaaa, expire, fuzzing, header_only,
+               identify, /*%< Append an "on server <foo>" message */
                identify_previous_line, /*% Prepend a "Nameserver <foo>:"
                                           message, with newline and tab */
                idnin, idnout, ignore, multiline, need_search, new_search,
index f15884a1831695f3a5978aeaa01eccb2ca100fb0..b4c2c8ee9cdc68ab149fe4e61ef567cc0397b839 100644 (file)
@@ -97,7 +97,8 @@
 #define DNS_MESSAGEFLAG_CD 0x0010U
 
 /*%< EDNS0 extended message flags */
-#define DNS_MESSAGEEXTFLAG_DO 0x8000U
+#define DNS_MESSAGEEXTFLAG_DO 0x8000U /* DNSSEC OK */
+#define DNS_MESSAGEEXTFLAG_CO 0x4000U /* Compact denial of existence OK */
 
 /*%< EDNS0 extended OPT codes */
 #define DNS_OPT_LLQ          1  /*%< LLQ opt code */
index 63c07abecbff26156f6cc9d7ea541af5637c6298..9fdc2db30e0ae8c6baf23cbf116cb093269b4aa7 100644 (file)
@@ -3513,9 +3513,13 @@ dns_message_pseudosectiontoyaml(dns_message_t *msg, dns_pseudosection_t section,
                if ((ps->ttl & DNS_MESSAGEEXTFLAG_DO) != 0) {
                        ADD_STRING(target, " do");
                }
+               if ((ps->ttl & DNS_MESSAGEEXTFLAG_CO) != 0) {
+                       ADD_STRING(target, " co");
+               }
                ADD_STRING(target, "\n");
                mbz = ps->ttl & 0xffff;
-               mbz &= ~DNS_MESSAGEEXTFLAG_DO; /* Known Flags. */
+               /* Exclude Known Flags. */
+               mbz &= ~(DNS_MESSAGEEXTFLAG_DO | DNS_MESSAGEEXTFLAG_CO);
                if (mbz != 0) {
                        INDENT(style);
                        ADD_STRING(target, "MBZ: ");
@@ -3871,8 +3875,12 @@ dns_message_pseudosectiontotext(dns_message_t *msg, dns_pseudosection_t section,
                if ((ps->ttl & DNS_MESSAGEEXTFLAG_DO) != 0) {
                        ADD_STRING(target, " do");
                }
+               if ((ps->ttl & DNS_MESSAGEEXTFLAG_CO) != 0) {
+                       ADD_STRING(target, " co");
+               }
                mbz = ps->ttl & 0xffff;
-               mbz &= ~DNS_MESSAGEEXTFLAG_DO; /* Known Flags. */
+               /* Exclude Known Flags. */
+               mbz &= ~(DNS_MESSAGEEXTFLAG_DO | DNS_MESSAGEEXTFLAG_CO);
                if (mbz != 0) {
                        ADD_STRING(target, "; MBZ: ");
                        snprintf(buf, sizeof(buf), "0x%.4x", mbz);