diff options
Diffstat (limited to 'contrib/bind9/lib/dns/rdataset.c')
-rw-r--r-- | contrib/bind9/lib/dns/rdataset.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/contrib/bind9/lib/dns/rdataset.c b/contrib/bind9/lib/dns/rdataset.c index 8c86549..026d771 100644 --- a/contrib/bind9/lib/dns/rdataset.c +++ b/contrib/bind9/lib/dns/rdataset.c @@ -26,6 +26,7 @@ #include <isc/buffer.h> #include <isc/mem.h> #include <isc/random.h> +#include <isc/serial.h> #include <isc/util.h> #include <dns/name.h> @@ -772,3 +773,30 @@ dns_rdataset_expire(dns_rdataset_t *rdataset) { if (rdataset->methods->expire != NULL) (rdataset->methods->expire)(rdataset); } + +void +dns_rdataset_trimttl(dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset, + dns_rdata_rrsig_t *rrsig, isc_stdtime_t now, + isc_boolean_t acceptexpired) +{ + isc_uint32_t ttl = 0; + + REQUIRE(DNS_RDATASET_VALID(rdataset)); + REQUIRE(DNS_RDATASET_VALID(sigrdataset)); + REQUIRE(rrsig != NULL); + + /* + * If we accept expired RRsets keep them for no more than 120 seconds. + */ + if (acceptexpired && + (isc_serial_le(rrsig->timeexpire, ((now + 120) & 0xffffffff)) || + isc_serial_le(rrsig->timeexpire, now))) + ttl = 120; + else if (isc_serial_ge(rrsig->timeexpire, now)) + ttl = rrsig->timeexpire - now; + + ttl = ISC_MIN(ISC_MIN(rdataset->ttl, sigrdataset->ttl), + ISC_MIN(rrsig->originalttl, ttl)); + rdataset->ttl = ttl; + sigrdataset->ttl = ttl; +} |