]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
[master] Process "port" and "dscp" for "default-masters"
authorMichał Kępień <michal@isc.org>
Wed, 12 Jul 2017 07:38:24 +0000 (09:38 +0200)
committerMichał Kępień <michal@isc.org>
Wed, 26 Jul 2017 07:28:28 +0000 (09:28 +0200)
4656. [bug] Apply "port" and "dscp" values specified in catalog
zone's "default-masters" option to the generated
configuration of its member zones. [RT #45545]

CHANGES
bin/tests/system/catz/ns1/named.conf
bin/tests/system/catz/ns2/named.conf.in
bin/tests/system/catz/tests.sh
lib/dns/catz.c

diff --git a/CHANGES b/CHANGES
index c0a7fe310a83334837105ea279491c15ac49255e..cd7a79f57ac8422318dbf8e6f55764d11652f19a 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+4656.  [bug]           Apply "port" and "dscp" values specified in catalog
+                       zone's "default-masters" option to the generated
+                       configuration of its member zones. [RT #45545]
+
 4655.  [bug]           Lack of seccomp could be falsely reported. [RT #45599]
 
 4654.  [cleanup]       Don't use C++ keywords delete, new and namespace.
index 17bb08cd3d75f62d06a201b71e3203a9e8027c7f..32274d67fe02d25369e1968b7ba93483cb73acb4 100644 (file)
@@ -20,6 +20,7 @@ options {
        allow-new-zones yes;
        pid-file "named.pid";
        listen-on { 10.53.0.1; };
+       listen-on port 5301 { 10.53.0.1; };
        listen-on-v6 { none; };
        notify no;
        recursion no;
index dd418af28caab49b56294d9436851647ed520898..f8e87068f4e8eca1984e45f2a8eee5d45c23ce14 100644 (file)
@@ -29,7 +29,7 @@ options {
                        in-memory no
                        zone-directory "zonedir";
                zone "catalog2.example"
-                       default-masters { 10.53.0.1; }
+                       default-masters { 10.53.0.1 port 5301; }
                        in-memory yes;
                zone "catalog3.example"
                        default-masters { 10.53.0.1; }
index 8dead2d1e8dd0ed9075ad660ff917ab796a70247..11b1fc8c62d9a23cce94f895fbfc3dbaf4c9a659 100644 (file)
@@ -214,7 +214,7 @@ if [ $ret = 0 ]; then
        while test $try -lt 45
        do
            sleep 1
-           sed -n "$cur,"'$p' < ns2/named.run | grep "transfer of 'dom4.example/IN' from 10.53.0.1#5300: Transfer status: success" > /dev/null && {
+           sed -n "$cur,"'$p' < ns2/named.run | grep "transfer of 'dom4.example/IN' from 10.53.0.1#5301: Transfer status: success" > /dev/null && {
                ret=0
                break
            }
index c6a78ae9860d45414bb09b5e4fbf25a4bce968e7..f05cb876eeeb994529b7d2a2a6b4488073e14a95 100644 (file)
@@ -1505,7 +1505,7 @@ dns_catz_generate_zonecfg(dns_catz_zone_t *zone, dns_catz_entry_t *entry,
         * We have to generate a text buffer with regular zone config:
         * zone foo.bar {
         *      type slave;
-        *      masters { ip1 port1; ip2 port2; };
+        *      masters [ dscp X ] { ip1 port port1; ip2 port port2; };
         * }
         */
        isc_buffer_t *buffer = NULL;
@@ -1513,6 +1513,7 @@ dns_catz_generate_zonecfg(dns_catz_zone_t *zone, dns_catz_entry_t *entry,
        isc_result_t result;
        isc_uint32_t i;
        isc_netaddr_t netaddr;
+       char pbuf[sizeof("65535")]; /* used both for port number and DSCP */
 
        REQUIRE(zone != NULL);
        REQUIRE(entry != NULL);
@@ -1520,7 +1521,7 @@ dns_catz_generate_zonecfg(dns_catz_zone_t *zone, dns_catz_entry_t *entry,
 
        /*
         * The buffer will be reallocated if something won't fit,
-        * ISC_BUFFER_INC seems like a good start.
+        * ISC_BUFFER_INCR seems like a good start.
         */
        result = isc_buffer_allocate(zone->catzs->mctx, &buffer,
                                     ISC_BUFFER_INCR);
@@ -1531,15 +1532,34 @@ dns_catz_generate_zonecfg(dns_catz_zone_t *zone, dns_catz_entry_t *entry,
        isc_buffer_setautorealloc(buffer, ISC_TRUE);
        isc_buffer_putstr(buffer, "zone ");
        dns_name_totext(&entry->name, ISC_TRUE, buffer);
-       isc_buffer_putstr(buffer, " { type slave; masters { ");
+       isc_buffer_putstr(buffer, " { type slave; masters");
+
+       /*
+        * DSCP value has no default, but when it is specified, it is identical
+        * for all masters and cannot be overriden for a specific master IP, so
+        * use the DSCP value set for the first master
+        */
+       if (entry->opts.masters.count > 0 &&
+           entry->opts.masters.dscps[0] != -1) {
+               isc_buffer_putstr(buffer, " dscp ");
+               snprintf(pbuf, sizeof(pbuf), "%u",
+                        entry->opts.masters.dscps[0]);
+               isc_buffer_putstr(buffer, pbuf);
+       }
+
+       isc_buffer_putstr(buffer, " { ");
        for (i = 0; i < entry->opts.masters.count; i++) {
-               /* TODO port and DSCP */
                isc_netaddr_fromsockaddr(&netaddr,
                                         &entry->opts.masters.addrs[i]);
                isc_buffer_reserve(&buffer, INET6_ADDRSTRLEN);
                result = isc_netaddr_totext(&netaddr, buffer);
                RUNTIME_CHECK(result == ISC_R_SUCCESS);
 
+               isc_buffer_putstr(buffer, " port ");
+               snprintf(pbuf, sizeof(pbuf), "%u",
+                        isc_sockaddr_getport(&entry->opts.masters.addrs[i]));
+               isc_buffer_putstr(buffer, pbuf);
+
                if (entry->opts.masters.keys[i] != NULL) {
                        isc_buffer_putstr(buffer, " key ");
                        result = dns_name_totext(entry->opts.masters.keys[i],