Hello Sirs,

I am Sukmoon Lee, a software developer and network engineer in South Korea.

Recently, most clients(smart phone) have a local DNS cache.
The Cache DNS TTL  affects the client cache expiration time domain. So many 
clients have caused a burst DNS traffic.
In order to solve this issue made the following patches for 9.9.9-P2 ISC BIND.

It was modified so as not to affect the original code as much as possible.
This function is working using '--enable-cache-ttl' option.
So cache DNS responses a stored cache TTL.

My question is wondering whether to require this function.
So, please check code that there are no problems.

Thank you.

Sukmoon Lee






diff -Nur bind-9.9.9-P2/bin/named/query.c bind-9.9.9-P2-ttl/bin/named/query.c
--- bind-9.9.9-P2/bin/named/query.c     2016-07-14 08:54:33.000000000 +0900
+++ bind-9.9.9-P2-ttl/bin/named/query.c 2016-07-27 11:05:46.414020726 +0900
@@ -2302,11 +2302,15 @@
        dns_rdatalist_init(dns64_rdatalist);
        dns64_rdatalist->rdclass = dns_rdataclass_in;
        dns64_rdatalist->type = dns_rdatatype_aaaa;
+#ifdef USE_CACHE_STORED_TTL
+       dns64_rdatalist->ttl = rdataset->base_ttl;
+#else
        if (client->query.dns64_ttl != ISC_UINT32_MAX)
                dns64_rdatalist->ttl = ISC_MIN(rdataset->ttl,
                                               client->query.dns64_ttl);
        else
                dns64_rdatalist->ttl = ISC_MIN(rdataset->ttl, 600);
+#endif
 
        if (RECURSIONOK(client))
                flags |= DNS_DNS64_RECURSIVE;
@@ -2360,6 +2364,9 @@
        result = dns_rdatalist_tordataset(dns64_rdatalist, dns64_rdataset);
        if (result != ISC_R_SUCCESS)
                goto cleanup;
+#ifdef USE_CACHE_STORED_TTL
+       dns64_rdataset->base_ttl = rdataset->base_ttl;
+#endif
        client->query.attributes |= NS_QUERYATTR_NOADDITIONAL;
        dns64_rdataset->trust = rdataset->trust;
        query_addrdataset(client, mname, dns64_rdataset);
@@ -5456,7 +5463,11 @@
        dns_rdataset_current(&rdataset, &rdata);
        result = dns_rdata_tostruct(&rdata, &soa, NULL);
        RUNTIME_CHECK(result == ISC_R_SUCCESS);
+#ifdef USE_CACHE_STORED_TTL
+       ttl = ISC_MIN(rdataset.base_ttl, soa.minimum);
+#else
        ttl = ISC_MIN(rdataset.ttl, soa.minimum);
+#endif
 
 cleanup:
        if (dns_rdataset_isassociated(&rdataset))
@@ -6984,10 +6995,14 @@
                         * decremented to zero or if there was no negative cache
                         * ttl in the answer.
                         */
+#ifdef USE_CACHE_STORED_TTL
+                       client->query.dns64_ttl = rdataset->base_ttl;
+#else
                        if (rdataset->ttl != 0)
                                client->query.dns64_ttl = rdataset->ttl;
                        else if (dns_rdataset_first(rdataset) == ISC_R_SUCCESS)
                                client->query.dns64_ttl = 0;
+#endif
                        query_releasename(client, &fname);
                        dns_db_detachnode(db, &node);
                        rdataset = NULL;
@@ -7510,7 +7525,11 @@
                         */
                        client->query.dns64_aaaa = rdataset;
                        client->query.dns64_sigaaaa = sigrdataset;
+#ifdef USE_CACHE_STORED_TTL
+                       client->query.dns64_ttl = rdataset->base_ttl;
+#else
                        client->query.dns64_ttl = rdataset->ttl;
+#endif
                        query_releasename(client, &fname);
                        dns_db_detachnode(db, &node);
                        rdataset = NULL;
diff -Nur bind-9.9.9-P2/config.h.in bind-9.9.9-P2-ttl/config.h.in
--- bind-9.9.9-P2/config.h.in   2016-07-14 08:54:33.000000000 +0900
+++ bind-9.9.9-P2-ttl/config.h.in       2016-07-27 08:35:55.669404673 +0900
@@ -159,6 +159,9 @@
 /* Define to enable the "filter-aaaa-on-v4" option. */
 #undef ALLOW_FILTER_AAAA_ON_V4
 
+/* Define to enable the "cache-ttl" option. */
+#undef USE_CACHE_STORED_TTL
+
 /* define if ATF unit tests are to be built. */
 #undef ATF_TEST
 
diff -Nur bind-9.9.9-P2/configure bind-9.9.9-P2-ttl/configure
--- bind-9.9.9-P2/configure     2016-07-14 08:54:33.000000000 +0900
+++ bind-9.9.9-P2-ttl/configure 2016-07-27 08:33:08.743618406 +0900
@@ -1024,6 +1024,7 @@
 with_dlz_stub
 with_make_clean
 enable_full_report
+enable_cache_ttl
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1690,6 +1691,7 @@
                          [default=no]
   --enable-querytrace     enable very verbose query trace logging [default=no]
   --enable-full-report   report values of all configure options
+  --enable-cache-ttl     use response a stored cache ttl [default=no]
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -11442,6 +11444,7 @@
        test "${enable_fetchlimit+set}" = set || enable_fetchlimit=yes
        test "${enable_warn_error+set}" = set || enable_warn_error=yes
        test "${enable_warn_shadow+set}" = set || enable_warn_shadow=yes
+       test "${enable_cache_ttl+set}" = set || enable_cache_ttl=yes
        ;;
 esac
 #
@@ -13211,6 +13214,26 @@
 
 
 #
+# check if we want Stored Cache TTL
+#
+# Check whether --enable-cache-ttl was given.
+if test "${enable_cache_ttl+set}" = set; then :
+  enableval=$enable_cache_ttl;
+fi
+
+case "$enable_cache_ttl" in
+yes)
+
+$as_echo "#define USE_CACHE_STORED_TTL 1" >>confdefs.h
+
+       ;;
+*)
+       ;;
+esac
+
+
+
+#
 # check if we have kqueue
 #
 # Check whether --enable-kqueue was given.
@@ -23531,6 +23554,8 @@
 test "$want_querytrace" = "yes" && \
     echo "    Very verbose query trace logging (--enable-querytrace)"
 test "$atf" = "no" || echo "    Automated Testing Framework (--with-atf)"
+test "$enable_cache_ttl" = "yes" && \
+    echo "    Stored cache TTL (--enable-cacht-ttl)"
 
 # these lines are only printed if run with --enable-full-report
 if test "$enable_full_report" = "yes"; then
@@ -23590,6 +23615,8 @@
     echo "    ECDSA algorithm support (--with-ecdsa)"
 test "X$PYTHON" = "X" && echo "    Python tools (--with-python)"
 test "X$libxml2_libs" = "X" && echo "    XML statistics (--with-libxml2)"
+test "$enable_cacht_ttl" = "yes" || \
+    echo "    Stored cache TTL (--enable-cache-ttl)"
 
 if test "X$ac_unrecognized_opts" != "X"; then
     echo
diff -Nur bind-9.9.9-P2/lib/dns/include/dns/rdataset.h 
bind-9.9.9-P2-ttl/lib/dns/include/dns/rdataset.h
--- bind-9.9.9-P2/lib/dns/include/dns/rdataset.h        2016-07-14 
08:54:33.000000000 +0900
+++ bind-9.9.9-P2-ttl/lib/dns/include/dns/rdataset.h    2016-07-27 
08:33:28.849073731 +0900
@@ -137,6 +137,9 @@
        dns_rdataclass_t                rdclass;
        dns_rdatatype_t                 type;
        dns_ttl_t                       ttl;
+#ifdef USE_CACHE_STORED_TTL
+       dns_ttl_t                       base_ttl;
+#endif
        dns_trust_t                     trust;
        dns_rdatatype_t                 covers;
        /*
diff -Nur bind-9.9.9-P2/lib/dns/rbtdb.c bind-9.9.9-P2-ttl/lib/dns/rbtdb.c
--- bind-9.9.9-P2/lib/dns/rbtdb.c       2016-07-14 08:54:33.000000000 +0900
+++ bind-9.9.9-P2-ttl/lib/dns/rbtdb.c   2016-07-27 08:33:49.981554223 +0900
@@ -342,6 +342,9 @@
         */
        rbtdb_serial_t                  serial;
        dns_ttl_t                       rdh_ttl;
+#ifdef USE_CACHE_STORED_TTL
+       dns_ttl_t                       base_ttl;
+#endif
        rbtdb_rdatatype_t               type;
        isc_uint16_t                    attributes;
        dns_trust_t                     trust;
@@ -2948,6 +2951,9 @@
        rdataset->type = RBTDB_RDATATYPE_BASE(header->type);
        rdataset->covers = RBTDB_RDATATYPE_EXT(header->type);
        rdataset->ttl = header->rdh_ttl - now;
+#ifdef USE_CACHE_STORED_TTL
+       rdataset->base_ttl = header->base_ttl;
+#endif
        rdataset->trust = header->trust;
        if (NEGATIVE(header))
                rdataset->attributes |= DNS_RDATASETATTR_NEGATIVE;
@@ -6676,6 +6682,13 @@
        newheader = (rdatasetheader_t *)region.base;
        init_rdataset(rbtdb, newheader);
        set_ttl(rbtdb, newheader, rdataset->ttl + now);
+#ifdef USE_CACHE_STORED_TTL
+       if (rdataset->type==0) { // ncache for dns64
+               newheader->base_ttl = rdataset->ttl;
+       } else {
+               newheader->base_ttl = rdataset->base_ttl;
+       }
+#endif
        newheader->type = RBTDB_RDATATYPE_VALUE(rdataset->type,
                                                rdataset->covers);
        newheader->attributes = 0;
@@ -6862,6 +6875,13 @@
        newheader = (rdatasetheader_t *)region.base;
        init_rdataset(rbtdb, newheader);
        set_ttl(rbtdb, newheader, rdataset->ttl);
+#ifdef USE_CACHE_STORED_TTL
+       if (rdataset->type==0) { // ncache for dns64
+               newheader->base_ttl = rdataset->ttl;
+       } else {
+               newheader->base_ttl = rdataset->base_ttl;
+       }
+#endif
        newheader->type = RBTDB_RDATATYPE_VALUE(rdataset->type,
                                                rdataset->covers);
        newheader->attributes = 0;
diff -Nur bind-9.9.9-P2/lib/dns/rdataset.c bind-9.9.9-P2-ttl/lib/dns/rdataset.c
--- bind-9.9.9-P2/lib/dns/rdataset.c    2016-07-14 08:54:33.000000000 +0900
+++ bind-9.9.9-P2-ttl/lib/dns/rdataset.c        2016-07-27 10:49:36.011035374 
+0900
@@ -70,6 +70,9 @@
        rdataset->rdclass = 0;
        rdataset->type = 0;
        rdataset->ttl = 0;
+#ifdef USE_CACHE_STORED_TTL
+       rdataset->base_ttl = 0;
+#endif
        rdataset->trust = 0;
        rdataset->covers = 0;
        rdataset->attributes = 0;
@@ -99,6 +102,9 @@
        rdataset->rdclass = 0;
        rdataset->type = 0;
        rdataset->ttl = 0;
+#ifdef USE_CACHE_STORED_TTL
+       rdataset->base_ttl = 0;
+#endif
        rdataset->trust = 0;
        rdataset->covers = 0;
        rdataset->attributes = 0;
@@ -126,6 +132,9 @@
        rdataset->rdclass = 0;
        rdataset->type = 0;
        rdataset->ttl = 0;
+#ifdef USE_CACHE_STORED_TTL
+       rdataset->base_ttl = 0;
+#endif
        rdataset->trust = 0;
        rdataset->covers = 0;
        rdataset->attributes = 0;
@@ -488,7 +497,15 @@
                isc_buffer_putuint16(target, rdataset->type);
                isc_buffer_putuint16(target, rdataset->rdclass);
                if (!question) {
+#ifdef USE_CACHE_STORED_TTL
+                       if (rdataset->type==dns_rdatatype_a || 
rdataset->type==dns_rdatatype_aaaa) {
+                               isc_buffer_putuint32(target, 
rdataset->base_ttl);
+                       } else {
+                               isc_buffer_putuint32(target, rdataset->ttl);
+                       }
+#else
                        isc_buffer_putuint32(target, rdataset->ttl);
+#endif
 
                        /*
                         * Save space for rdlen.
diff -Nur bind-9.9.9-P2/lib/dns/resolver.c bind-9.9.9-P2-ttl/lib/dns/resolver.c
--- bind-9.9.9-P2/lib/dns/resolver.c    2016-07-14 08:54:33.000000000 +0900
+++ bind-9.9.9-P2-ttl/lib/dns/resolver.c        2016-07-27 10:46:42.692031770 
+0900
@@ -5119,6 +5119,13 @@
                if (rdataset->ttl > res->view->maxcachettl)
                        rdataset->ttl = res->view->maxcachettl;
 
+#ifdef USE_CACHE_STORED_TTL
+               /*
+                * Save a stored cache TTL.
+                */
+               rdataset->base_ttl = rdataset->ttl;
+
+#endif
                /*
                 * Find the SIG for this rdataset, if we have it.
                 */
_______________________________________________
Please visit https://lists.isc.org/mailman/listinfo/bind-users to unsubscribe 
from this list

bind-users mailing list
bind-users@lists.isc.org
https://lists.isc.org/mailman/listinfo/bind-users

Reply via email to