change response cache ttl (--enable-cache-ttl)

SUKMOON LEE smlee at sk.com
Thu Aug 4 11:25:28 UTC 2016


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.
 		 */


More information about the bind-users mailing list