diff --git a/lib/dns/adb.c b/lib/dns/adb.c index 59b6d56e1c..cf76f62044 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -1717,10 +1717,44 @@ dns_adb_marklame(dns_adb_t *adb, dns_adbaddrinfo_t *addr, dns_name_t *zone, zi->lame_timer = expire_time; bucket = addr->entry->lock_bucket; - LOCK(&adb->entrylocks[bucket]); ISC_LIST_PREPEND(addr->entry->zoneinfo, zi, link); UNLOCK(&adb->entrylocks[bucket]); return (ISC_R_SUCCESS); } + +void +dns_adb_adjustgoodness(dns_adb_t *adb, dns_adbaddrinfo_t *addr, + int goodness_adjustment) +{ + int bucket; + int old_goodness, new_goodness; + + REQUIRE(DNS_ADBADDRINFO_VALID(addr)); + + if (goodness_adjustment == 0) + return; + + bucket = addr->entry->lock_bucket; + LOCK(&adb->entrylocks[bucket]); + + old_goodness = addr->entry->goodness; + + if (goodness_adjustment > 0) { + if (old_goodness > INT_MAX - goodness_adjustment) + new_goodness = INT_MAX; + else + new_goodness = old_goodness + goodness_adjustment; + } else { + if (old_goodness < INT_MIN - goodness_adjustment) + new_goodness = INT_MAX; + else + new_goodness = old_goodness + goodness_adjustment; + } + + addr->entry->goodness = new_goodness; + + UNLOCK(&adb->entrylocks[bucket]); +} + diff --git a/lib/dns/include/dns/adb.h b/lib/dns/include/dns/adb.h index c0503fa12b..4326eb105f 100644 --- a/lib/dns/include/dns/adb.h +++ b/lib/dns/include/dns/adb.h @@ -387,6 +387,23 @@ dns_adb_marklame(dns_adb_t *adb, dns_adbaddrinfo_t *addr, dns_name_t *zone, * ISC_R_NOMEMORY -- could not mark address as lame. */ +void +dns_adb_adjustgoodness(dns_adb_t *adb, dns_adbaddrinfo_t *addr, + int goodness_adjustment); +/* + * Increase or decrease the address's goodness value. + * + * Requires: + * + * adb be valid. + * + * addr be valid. + * + * Note: + * + * Goodness values are silently clamped to INT_MAX and INT_MIN. + */ + /* * XXX Need functions/macros to: *