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