xref: /netbsd-src/external/mpl/bind/dist/lib/dns/rbtdb_p.h (revision bcda20f65a8566e103791ec395f7f499ef322704)
1*bcda20f6Schristos /*	$NetBSD: rbtdb_p.h,v 1.2 2025/01/26 16:25:24 christos Exp $	*/
29689912eSchristos 
39689912eSchristos /*
49689912eSchristos  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
59689912eSchristos  *
69689912eSchristos  * SPDX-License-Identifier: MPL-2.0
79689912eSchristos  *
89689912eSchristos  * This Source Code Form is subject to the terms of the Mozilla Public
99689912eSchristos  * License, v. 2.0. If a copy of the MPL was not distributed with this
109689912eSchristos  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
119689912eSchristos  *
129689912eSchristos  * See the COPYRIGHT file distributed with this work for additional
139689912eSchristos  * information regarding copyright ownership.
149689912eSchristos  */
159689912eSchristos 
169689912eSchristos #pragma once
179689912eSchristos 
189689912eSchristos #include <isc/heap.h>
199689912eSchristos #include <isc/lang.h>
209689912eSchristos #include <isc/rwlock.h>
219689912eSchristos #include <isc/urcu.h>
229689912eSchristos 
239689912eSchristos #include <dns/nsec3.h>
249689912eSchristos #include <dns/rbt.h>
259689912eSchristos #include <dns/types.h>
269689912eSchristos 
279689912eSchristos #include "db_p.h" /* for db_nodelock_t */
289689912eSchristos 
299689912eSchristos /*%
309689912eSchristos  * Note that "impmagic" is not the first four bytes of the struct, so
319689912eSchristos  * ISC_MAGIC_VALID cannot be used.
329689912eSchristos  */
339689912eSchristos #define RBTDB_MAGIC ISC_MAGIC('R', 'B', 'D', '4')
349689912eSchristos #define VALID_RBTDB(rbtdb) \
359689912eSchristos 	((rbtdb) != NULL && (rbtdb)->common.impmagic == RBTDB_MAGIC)
369689912eSchristos 
379689912eSchristos #define RBTDB_HEADERNODE(h) ((dns_rbtnode_t *)((h)->node))
389689912eSchristos 
399689912eSchristos /*
409689912eSchristos  * Allow clients with a virtual time of up to 5 minutes in the past to see
419689912eSchristos  * records that would have otherwise have expired.
429689912eSchristos  */
439689912eSchristos #define RBTDB_VIRTUAL 300
449689912eSchristos 
459689912eSchristos /*****
469689912eSchristos ***** Module Info
479689912eSchristos *****/
489689912eSchristos 
499689912eSchristos /*! \file
509689912eSchristos  * \brief
519689912eSchristos  * DNS Red-Black Tree DB Implementation
529689912eSchristos  */
539689912eSchristos 
549689912eSchristos ISC_LANG_BEGINDECLS
559689912eSchristos 
569689912eSchristos typedef struct rbtdb_changed {
579689912eSchristos 	dns_rbtnode_t *node;
589689912eSchristos 	bool dirty;
599689912eSchristos 	ISC_LINK(struct rbtdb_changed) link;
609689912eSchristos } rbtdb_changed_t;
619689912eSchristos 
629689912eSchristos typedef ISC_LIST(rbtdb_changed_t) rbtdb_changedlist_t;
639689912eSchristos 
649689912eSchristos struct dns_rbtdb_version {
659689912eSchristos 	/* Not locked */
669689912eSchristos 	uint32_t serial;
679689912eSchristos 	dns_rbtdb_t *rbtdb;
689689912eSchristos 	/*
699689912eSchristos 	 * Protected in the refcount routines.
709689912eSchristos 	 * XXXJT: should we change the lock policy based on the refcount
719689912eSchristos 	 * performance?
729689912eSchristos 	 */
739689912eSchristos 	isc_refcount_t references;
749689912eSchristos 	/* Locked by database lock. */
759689912eSchristos 	bool writer;
769689912eSchristos 	bool commit_ok;
779689912eSchristos 	rbtdb_changedlist_t changed_list;
789689912eSchristos 	dns_slabheaderlist_t resigned_list;
799689912eSchristos 	ISC_LINK(dns_rbtdb_version_t) link;
809689912eSchristos 	bool secure;
819689912eSchristos 	bool havensec3;
829689912eSchristos 	/* NSEC3 parameters */
839689912eSchristos 	dns_hash_t hash;
849689912eSchristos 	uint8_t flags;
859689912eSchristos 	uint16_t iterations;
869689912eSchristos 	uint8_t salt_length;
879689912eSchristos 	unsigned char salt[DNS_NSEC3_SALTSIZE];
889689912eSchristos 
899689912eSchristos 	/*
909689912eSchristos 	 * records and xfrsize are covered by rwlock.
919689912eSchristos 	 */
929689912eSchristos 	isc_rwlock_t rwlock;
939689912eSchristos 	uint64_t records;
949689912eSchristos 	uint64_t xfrsize;
959689912eSchristos 
969689912eSchristos 	struct cds_lfht *glue_table;
979689912eSchristos };
989689912eSchristos 
999689912eSchristos typedef ISC_LIST(dns_rbtdb_version_t) rbtdb_versionlist_t;
1009689912eSchristos 
1019689912eSchristos struct dns_rbtdb {
1029689912eSchristos 	/* Unlocked. */
1039689912eSchristos 	dns_db_t common;
1049689912eSchristos 	/* Locks the data in this struct */
1059689912eSchristos 	isc_rwlock_t lock;
1069689912eSchristos 	/* Locks the tree structure (prevents nodes appearing/disappearing) */
1079689912eSchristos 	isc_rwlock_t tree_lock;
1089689912eSchristos 	/* Locks for individual tree nodes */
1099689912eSchristos 	unsigned int node_lock_count;
1109689912eSchristos 	db_nodelock_t *node_locks;
1119689912eSchristos 	dns_rbtnode_t *origin_node;
1129689912eSchristos 	dns_rbtnode_t *nsec3_origin_node;
1139689912eSchristos 	dns_stats_t *rrsetstats;     /* cache DB only */
1149689912eSchristos 	isc_stats_t *cachestats;     /* cache DB only */
1159689912eSchristos 	isc_stats_t *gluecachestats; /* zone DB only */
1169689912eSchristos 	/* Locked by lock. */
1179689912eSchristos 	unsigned int active;
1189689912eSchristos 	unsigned int attributes;
1199689912eSchristos 	uint32_t current_serial;
1209689912eSchristos 	uint32_t least_serial;
1219689912eSchristos 	uint32_t next_serial;
1229689912eSchristos 	uint32_t maxrrperset;
1239689912eSchristos 	uint32_t maxtypepername;
1249689912eSchristos 	dns_rbtdb_version_t *current_version;
1259689912eSchristos 	dns_rbtdb_version_t *future_version;
1269689912eSchristos 	rbtdb_versionlist_t open_versions;
1279689912eSchristos 	isc_loop_t *loop;
1289689912eSchristos 	dns_dbnode_t *soanode;
1299689912eSchristos 	dns_dbnode_t *nsnode;
1309689912eSchristos 
1319689912eSchristos 	/*
1329689912eSchristos 	 * The time after a failed lookup, where stale answers from cache
1339689912eSchristos 	 * may be used directly in a DNS response without attempting a
1349689912eSchristos 	 * new iterative lookup.
1359689912eSchristos 	 */
1369689912eSchristos 	uint32_t serve_stale_refresh;
1379689912eSchristos 
1389689912eSchristos 	/*
1399689912eSchristos 	 * This is an array of linked lists used to implement the LRU cache.
1409689912eSchristos 	 * There will be node_lock_count linked lists here.  Nodes in bucket 1
1419689912eSchristos 	 * will be placed on the linked list lru[1].
1429689912eSchristos 	 */
1439689912eSchristos 	dns_slabheaderlist_t *lru;
1449689912eSchristos 
1459689912eSchristos 	/*
1469689912eSchristos 	 * Start point % node_lock_count for next LRU cleanup.
1479689912eSchristos 	 */
1489689912eSchristos 	atomic_uint lru_sweep;
1499689912eSchristos 
1509689912eSchristos 	/*
1519689912eSchristos 	 * When performing LRU cleaning limit cleaning to headers that were
1529689912eSchristos 	 * last used at or before this.
1539689912eSchristos 	 */
1549689912eSchristos 	_Atomic(isc_stdtime_t) last_used;
1559689912eSchristos 
1569689912eSchristos 	/*%
1579689912eSchristos 	 * Temporary storage for stale cache nodes and dynamically deleted
1589689912eSchristos 	 * nodes that await being cleaned up.
1599689912eSchristos 	 */
1609689912eSchristos 	dns_rbtnodelist_t *deadnodes;
1619689912eSchristos 
1629689912eSchristos 	/*
1639689912eSchristos 	 * Heaps.  These are used for TTL based expiry in a cache,
1649689912eSchristos 	 * or for zone resigning in a zone DB.  hmctx is the memory
1659689912eSchristos 	 * context to use for the heap (which differs from the main
1669689912eSchristos 	 * database memory context in the case of a cache).
1679689912eSchristos 	 */
1689689912eSchristos 	isc_mem_t *hmctx;
1699689912eSchristos 	isc_heap_t **heaps;
1709689912eSchristos 	isc_heapcompare_t sooner;
1719689912eSchristos 
1729689912eSchristos 	/* Locked by tree_lock. */
1739689912eSchristos 	dns_rbt_t *tree;
1749689912eSchristos 	dns_rbt_t *nsec;
1759689912eSchristos 	dns_rbt_t *nsec3;
1769689912eSchristos 
1779689912eSchristos 	/* Unlocked */
1789689912eSchristos 	unsigned int quantum;
1799689912eSchristos };
1809689912eSchristos 
1819689912eSchristos /*%
1829689912eSchristos  * Search Context
1839689912eSchristos  */
1849689912eSchristos typedef struct {
1859689912eSchristos 	dns_rbtdb_t *rbtdb;
1869689912eSchristos 	dns_rbtdb_version_t *rbtversion;
1879689912eSchristos 	uint32_t serial;
1889689912eSchristos 	unsigned int options;
1899689912eSchristos 	dns_rbtnodechain_t chain;
1909689912eSchristos 	bool copy_name;
1919689912eSchristos 	bool need_cleanup;
1929689912eSchristos 	bool wild;
1939689912eSchristos 	dns_rbtnode_t *zonecut;
1949689912eSchristos 	dns_slabheader_t *zonecut_header;
1959689912eSchristos 	dns_slabheader_t *zonecut_sigheader;
1969689912eSchristos 	dns_fixedname_t zonecut_name;
1979689912eSchristos 	isc_stdtime_t now;
1989689912eSchristos } rbtdb_search_t;
1999689912eSchristos 
2009689912eSchristos /*%
2019689912eSchristos  * Load Context
2029689912eSchristos  */
2039689912eSchristos typedef struct {
2049689912eSchristos 	dns_db_t *db;
2059689912eSchristos 	isc_stdtime_t now;
2069689912eSchristos } rbtdb_load_t;
2079689912eSchristos 
2089689912eSchristos /*%
2099689912eSchristos  * Prune context
2109689912eSchristos  */
2119689912eSchristos typedef struct {
2129689912eSchristos 	dns_db_t *db;
2139689912eSchristos 	dns_rbtnode_t *node;
2149689912eSchristos } rbtdb_prune_t;
2159689912eSchristos 
2169689912eSchristos extern dns_dbmethods_t dns__rbtdb_zonemethods;
2179689912eSchristos extern dns_dbmethods_t dns__rbtdb_cachemethods;
2189689912eSchristos 
2199689912eSchristos typedef struct dns_gluenode_t {
2209689912eSchristos 	isc_mem_t *mctx;
2219689912eSchristos 
2229689912eSchristos 	struct dns_glue *glue;
2239689912eSchristos 
2249689912eSchristos 	dns_db_t *db;
2259689912eSchristos 	dns_rbtnode_t *node;
2269689912eSchristos 
2279689912eSchristos 	struct cds_lfht_node ht_node;
2289689912eSchristos 	struct rcu_head rcu_head;
2299689912eSchristos } dns_gluenode_t;
2309689912eSchristos 
2319689912eSchristos /*
2329689912eSchristos  * Common DB implementation methods shared by both cache and zone RBT
2339689912eSchristos  * databases:
2349689912eSchristos  */
2359689912eSchristos 
2369689912eSchristos isc_result_t
2379689912eSchristos dns__rbtdb_create(isc_mem_t *mctx, const dns_name_t *base, dns_dbtype_t type,
2389689912eSchristos 		  dns_rdataclass_t rdclass, unsigned int argc, char *argv[],
2399689912eSchristos 		  void *driverarg, dns_db_t **dbp);
2409689912eSchristos /*%<
2419689912eSchristos  * Create a new database of type "rbt". Called via dns_db_create();
2429689912eSchristos  * see documentation for that function for more details.
2439689912eSchristos  *
2449689912eSchristos  * If argv[0] is set, it points to a valid memory context to be used for
2459689912eSchristos  * allocation of heap memory.  Generally this is used for cache databases
2469689912eSchristos  * only.
2479689912eSchristos  *
2489689912eSchristos  * Requires:
2499689912eSchristos  *
2509689912eSchristos  * \li argc == 0 or argv[0] is a valid memory context.
2519689912eSchristos  */
2529689912eSchristos 
2539689912eSchristos void
2549689912eSchristos dns__rbtdb_destroy(dns_db_t *arg);
2559689912eSchristos /*%<
2569689912eSchristos  * Implement dns_db_destroy() for RBT databases, see documentation
2579689912eSchristos  * for that function for more details.
2589689912eSchristos  */
2599689912eSchristos 
2609689912eSchristos void
2619689912eSchristos dns__rbtdb_currentversion(dns_db_t *db, dns_dbversion_t **versionp);
2629689912eSchristos isc_result_t
2639689912eSchristos dns__rbtdb_newversion(dns_db_t *db, dns_dbversion_t **versionp);
2649689912eSchristos void
2659689912eSchristos dns__rbtdb_attachversion(dns_db_t *db, dns_dbversion_t *source,
2669689912eSchristos 			 dns_dbversion_t **targetp);
2679689912eSchristos void
2689689912eSchristos dns__rbtdb_closeversion(dns_db_t *db, dns_dbversion_t **versionp,
2699689912eSchristos 			bool commit DNS__DB_FLARG);
2709689912eSchristos /*%<
2719689912eSchristos  * Implement the dns_db_currentversion(), _newversion(),
2729689912eSchristos  * _attachversion() and _closeversion() methods for RBT databases;
2739689912eSchristos  * see documentation of those functions for more details.
2749689912eSchristos  */
2759689912eSchristos 
2769689912eSchristos isc_result_t
2779689912eSchristos dns__rbtdb_findnode(dns_db_t *db, const dns_name_t *name, bool create,
2789689912eSchristos 		    dns_dbnode_t **nodep DNS__DB_FLARG);
2799689912eSchristos isc_result_t
2809689912eSchristos dns__rbtdb_findnodeintree(dns_rbtdb_t *rbtdb, dns_rbt_t *tree,
2819689912eSchristos 			  const dns_name_t *name, bool create,
2829689912eSchristos 			  dns_dbnode_t **nodep DNS__DB_FLARG);
2839689912eSchristos /*%<
2849689912eSchristos  * Implement the dns_db_findnode() and _findnodeintree() methods for
2859689912eSchristos  * RBT databases; see documentation of those functions for more details.
2869689912eSchristos  */
2879689912eSchristos 
2889689912eSchristos void
2899689912eSchristos dns__rbtdb_attachnode(dns_db_t *db, dns_dbnode_t *source,
2909689912eSchristos 		      dns_dbnode_t **targetp DNS__DB_FLARG);
2919689912eSchristos void
2929689912eSchristos dns__rbtdb_detachnode(dns_db_t *db, dns_dbnode_t **targetp DNS__DB_FLARG);
2939689912eSchristos /*%<
2949689912eSchristos  * Implement the dns_db_attachnode() and _detachnode() methods for
2959689912eSchristos  * RBT databases; see documentation of those functions for more details.
2969689912eSchristos  */
2979689912eSchristos 
2989689912eSchristos isc_result_t
2999689912eSchristos dns__rbtdb_createiterator(dns_db_t *db, unsigned int options,
3009689912eSchristos 			  dns_dbiterator_t **iteratorp);
3019689912eSchristos /*%<
3029689912eSchristos  * Implement dns_db_createiterator() for RBT databases; see documentation of
3039689912eSchristos  * that function for more details.
3049689912eSchristos  */
3059689912eSchristos 
3069689912eSchristos isc_result_t
3079689912eSchristos dns__rbtdb_allrdatasets(dns_db_t *db, dns_dbnode_t *node,
3089689912eSchristos 			dns_dbversion_t *version, unsigned int options,
3099689912eSchristos 			isc_stdtime_t now,
3109689912eSchristos 			dns_rdatasetiter_t **iteratorp DNS__DB_FLARG);
3119689912eSchristos /*%<
3129689912eSchristos  * Implement dns_db_allrdatasets() for RBT databases; see documentation of
3139689912eSchristos  * that function for more details.
3149689912eSchristos  */
3159689912eSchristos isc_result_t
3169689912eSchristos dns__rbtdb_addrdataset(dns_db_t *db, dns_dbnode_t *node,
3179689912eSchristos 		       dns_dbversion_t *version, isc_stdtime_t now,
3189689912eSchristos 		       dns_rdataset_t *rdataset, unsigned int options,
3199689912eSchristos 		       dns_rdataset_t *addedrdataset DNS__DB_FLARG);
3209689912eSchristos isc_result_t
3219689912eSchristos dns__rbtdb_subtractrdataset(dns_db_t *db, dns_dbnode_t *node,
3229689912eSchristos 			    dns_dbversion_t *version, dns_rdataset_t *rdataset,
3239689912eSchristos 			    unsigned int options,
3249689912eSchristos 			    dns_rdataset_t *newrdataset DNS__DB_FLARG);
3259689912eSchristos isc_result_t
3269689912eSchristos dns__rbtdb_deleterdataset(dns_db_t *db, dns_dbnode_t *node,
3279689912eSchristos 			  dns_dbversion_t *version, dns_rdatatype_t type,
3289689912eSchristos 			  dns_rdatatype_t covers DNS__DB_FLARG);
3299689912eSchristos /*%<
3309689912eSchristos  * Implement the dns_db_addrdataset(), _subtractrdataset() and
3319689912eSchristos  * _deleterdataset() methods for RBT databases; see documentation of
3329689912eSchristos  * those functions for more details.
3339689912eSchristos  */
3349689912eSchristos 
3359689912eSchristos unsigned int
3369689912eSchristos dns__rbtdb_nodecount(dns_db_t *db, dns_dbtree_t tree);
3379689912eSchristos /*%<
3389689912eSchristos  * Implement dns_db_nodecount() for RBT databases; see documentation of
3399689912eSchristos  * that function for more details.
3409689912eSchristos  */
3419689912eSchristos 
3429689912eSchristos void
3439689912eSchristos dns__rbtdb_setloop(dns_db_t *db, isc_loop_t *loop);
3449689912eSchristos /*%<
3459689912eSchristos  * Implement dns_db_setloop() for RBT databases; see documentation of
3469689912eSchristos  * that function for more details.
3479689912eSchristos  */
3489689912eSchristos 
3499689912eSchristos isc_result_t
3509689912eSchristos dns__rbtdb_getoriginnode(dns_db_t *db, dns_dbnode_t **nodep DNS__DB_FLARG);
3519689912eSchristos /*%<
3529689912eSchristos  * Implement dns_db_getoriginnode() for RBT databases; see documentation of
3539689912eSchristos  * that function for more details.
3549689912eSchristos  */
3559689912eSchristos 
3569689912eSchristos void
3579689912eSchristos dns__rbtdb_deletedata(dns_db_t *db ISC_ATTR_UNUSED,
3589689912eSchristos 		      dns_dbnode_t *node ISC_ATTR_UNUSED, void *data);
3599689912eSchristos /*%<
3609689912eSchristos  * Implement dns_db_deletedata() for RBT databases; see documentation of
3619689912eSchristos  * that function for more details.
3629689912eSchristos  */
3639689912eSchristos 
3649689912eSchristos void
3659689912eSchristos dns__rbtdb_locknode(dns_db_t *db, dns_dbnode_t *node, isc_rwlocktype_t type);
3669689912eSchristos void
3679689912eSchristos dns__rbtdb_unlocknode(dns_db_t *db, dns_dbnode_t *node, isc_rwlocktype_t type);
3689689912eSchristos /*%<
3699689912eSchristos  * Implement the dns_db_locknode() and _unlocknode() methods for
3709689912eSchristos  * RBT databases; see documentation of those functions for more details.
3719689912eSchristos  */
3729689912eSchristos 
3739689912eSchristos /*%
3749689912eSchristos  * Functions used for the RBT implementation which are defined and
3759689912eSchristos  * used in rbtdb.c but may also be called from rbt-zonedb.c or
3769689912eSchristos  * rbt-cachedb.c:
3779689912eSchristos  */
3789689912eSchristos void
3799689912eSchristos dns__rbtdb_bindrdataset(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
3809689912eSchristos 			dns_slabheader_t *header, isc_stdtime_t now,
3819689912eSchristos 			isc_rwlocktype_t locktype,
3829689912eSchristos 			dns_rdataset_t *rdataset DNS__DB_FLARG);
3839689912eSchristos 
3849689912eSchristos isc_result_t
3859689912eSchristos dns__rbtdb_nodefullname(dns_db_t *db, dns_dbnode_t *node, dns_name_t *name);
3869689912eSchristos 
3879689912eSchristos void
3889689912eSchristos dns__rbtdb_free_gluenode_rcu(struct rcu_head *rcu_head);
3899689912eSchristos void
3909689912eSchristos dns__rbtdb_free_gluenode(dns_gluenode_t *gluenode);
3919689912eSchristos 
3929689912eSchristos void
3939689912eSchristos dns__rbtdb_newref(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
3949689912eSchristos 		  isc_rwlocktype_t locktype DNS__DB_FLARG);
3959689912eSchristos /*%<
3969689912eSchristos  * Increment the reference counter to a node in an RBT database.
3979689912eSchristos  * If the caller holds a node lock then its lock type is specified
3989689912eSchristos  * as 'locktype'. If the node is write-locked, then the node can
3999689912eSchristos  * be removed from the dead nodes list. If not, the list can be
4009689912eSchristos  * cleaned up later.
4019689912eSchristos  */
4029689912eSchristos 
4039689912eSchristos bool
4049689912eSchristos dns__rbtdb_decref(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
4059689912eSchristos 		  uint32_t least_serial, isc_rwlocktype_t *nlocktypep,
4069689912eSchristos 		  isc_rwlocktype_t *tlocktypep, bool tryupgrade,
4079689912eSchristos 		  bool pruning DNS__DB_FLARG);
4089689912eSchristos /*%<
4099689912eSchristos  * Decrement the reference counter to a node in an RBT database.
4109689912eSchristos  * 'nlocktypep' and 'tlocktypep' are pointers to the current status
4119689912eSchristos  * of the node lock and tree lock.
4129689912eSchristos  *
4139689912eSchristos  * If references go to 0, the node will be cleaned up, which may
4149689912eSchristos  * necessitate upgrading the locks.
4159689912eSchristos  */
4169689912eSchristos 
4179689912eSchristos isc_result_t
4189689912eSchristos dns__rbtdb_add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode,
4199689912eSchristos 	       const dns_name_t *nodename, dns_rbtdb_version_t *rbtversion,
4209689912eSchristos 	       dns_slabheader_t *newheader, unsigned int options, bool loading,
4219689912eSchristos 	       dns_rdataset_t *addedrdataset, isc_stdtime_t now DNS__DB_FLARG);
4229689912eSchristos /*%<
4239689912eSchristos  * Add a slab header 'newheader' to a node in an RBT database.
4249689912eSchristos  * The caller must have the node write-locked.
4259689912eSchristos  */
4269689912eSchristos 
4279689912eSchristos void
4289689912eSchristos dns__rbtdb_setsecure(dns_db_t *db, dns_rbtdb_version_t *version,
4299689912eSchristos 		     dns_dbnode_t *origin);
4309689912eSchristos /*%<
4319689912eSchristos  * Update the secure status for an RBT database version 'version'.
4329689912eSchristos  * The version will be marked secure if it is fully signed and
4339689912eSchristos  * and contains a complete NSEC/NSEC3 chain.
4349689912eSchristos  */
4359689912eSchristos 
4369689912eSchristos void
4379689912eSchristos dns__rbtdb_mark(dns_slabheader_t *header, uint_least16_t flag);
4389689912eSchristos /*%<
4399689912eSchristos  * Set attribute 'flag' in a slab header 'header' - for example,
4409689912eSchristos  * DNS_SLABHEADERATTR_STALE or DNS_SLABHEADERATTR_ANCIENT - and,
4419689912eSchristos  * in a cache database, update the rrset stats accordingly.
4429689912eSchristos  */
4439689912eSchristos 
4449689912eSchristos void
4459689912eSchristos dns__rbtdb_setttl(dns_slabheader_t *header, dns_ttl_t newttl);
4469689912eSchristos /*%<
4479689912eSchristos  * Set the TTL in a slab header 'header'. In a cache database,
4489689912eSchristos  * also update the TTL heap accordingly.
4499689912eSchristos  */
4509689912eSchristos 
4519689912eSchristos void
4529689912eSchristos dns__rbtdb_setmaxrrperset(dns_db_t *db, uint32_t maxrrperset);
4539689912eSchristos /*%<
4549689912eSchristos  * Set the max RRs per RRset limit.
4559689912eSchristos  */
4569689912eSchristos 
4579689912eSchristos void
4589689912eSchristos dns__rbtdb_setmaxtypepername(dns_db_t *db, uint32_t maxtypepername);
4599689912eSchristos /*%<
4609689912eSchristos  * Set the max RRs per RRset limit.
4619689912eSchristos  */
4629689912eSchristos 
4639689912eSchristos /*
4649689912eSchristos  * Functions specific to zone databases that are also called from rbtdb.c.
4659689912eSchristos  */
4669689912eSchristos void
4679689912eSchristos dns__zonerbt_resigninsert(dns_rbtdb_t *rbtdb, int idx,
4689689912eSchristos 			  dns_slabheader_t *newheader);
4699689912eSchristos void
4709689912eSchristos dns__zonerbt_resigndelete(dns_rbtdb_t *rbtdb, dns_rbtdb_version_t *version,
4719689912eSchristos 			  dns_slabheader_t *header DNS__DB_FLARG);
4729689912eSchristos /*%<
4739689912eSchristos  * Insert/delete a node from the zone database's resigning heap.
4749689912eSchristos  */
4759689912eSchristos 
4769689912eSchristos isc_result_t
4779689912eSchristos dns__zonerbt_wildcardmagic(dns_rbtdb_t *rbtdb, const dns_name_t *name,
4789689912eSchristos 			   bool lock);
4799689912eSchristos /*%<
4809689912eSchristos  * Add the necessary magic for the wildcard name 'name'
4819689912eSchristos  * to be found in 'rbtdb'.
4829689912eSchristos  *
4839689912eSchristos  * In order for wildcard matching to work correctly in
4849689912eSchristos  * zone_find(), we must ensure that a node for the wildcarding
4859689912eSchristos  * level exists in the database, and has its 'find_callback'
4869689912eSchristos  * and 'wild' bits set.
4879689912eSchristos  *
4889689912eSchristos  * E.g. if the wildcard name is "*.sub.example." then we
4899689912eSchristos  * must ensure that "sub.example." exists and is marked as
4909689912eSchristos  * a wildcard level.
4919689912eSchristos  *
4929689912eSchristos  * The tree must be write-locked.
4939689912eSchristos  */
4949689912eSchristos isc_result_t
4959689912eSchristos dns__zonerbt_addwildcards(dns_rbtdb_t *rbtdb, const dns_name_t *name,
4969689912eSchristos 			  bool lock);
4979689912eSchristos /*%<
4989689912eSchristos  * If 'name' is or contains a wildcard name, create a node for it in the
4999689912eSchristos  * database. The tree must be write-locked.
5009689912eSchristos  */
5019689912eSchristos 
5029689912eSchristos /*
5039689912eSchristos  * Cache-specific functions that are called from rbtdb.c
5049689912eSchristos  */
5059689912eSchristos void
5069689912eSchristos dns__cacherbt_expireheader(dns_slabheader_t *header,
5079689912eSchristos 			   isc_rwlocktype_t *tlocktypep,
5089689912eSchristos 			   dns_expire_t reason DNS__DB_FLARG);
5099689912eSchristos void
5109689912eSchristos dns__cacherbt_overmem(dns_rbtdb_t *rbtdb, dns_slabheader_t *newheader,
5119689912eSchristos 		      isc_rwlocktype_t *tlocktypep DNS__DB_FLARG);
5129689912eSchristos 
5139689912eSchristos ISC_LANG_ENDDECLS
514