merge dns_db_find/findext and dns_db_findnode/findnodeext

the dns_db_findext and _findnodeext calls are extended versions
of dns_db_find and _findnode, which take additional arguments for
client information in order to support ECS. previously, database
implementations could support either API call, with cross-compatibility
so that, for example, dns_db_findext() could call a find implementation
if findext was not implemented, and dns_db_find() could call findext
if find was not implemented.

this has now been simplified. the find and findnodeext implementations
now support client info.  all database implementations will now provide
these calls.  implementations which do not support ECS will simply
ignore the clientinfo and clientinfomethods parameters.

this only affects the underlying implementation; callers will still
use the same interface. dns_db_find() and dns_db_findnode() are now
macros which pass NULL to the clientinfo parameters, so that callers
don't have to do so explicitly. dns_db_findext() and dns_db_findnodeext()
are still available for callers that do wish to pass clientinfo pointers.
This commit is contained in:
Evan Hunt 2025-08-04 16:54:08 -07:00
parent 9e14fcd259
commit 4de396f955
7 changed files with 75 additions and 184 deletions

View file

@ -859,6 +859,8 @@ getoriginnode(dns_db_t *db, dns_dbnode_t **nodep DNS__DB_FLARG) {
static isc_result_t
findnode(dns_db_t *db, const dns_name_t *name, bool create,
dns_clientinfomethods_t *methods ISC_ATTR_UNUSED,
dns_clientinfo_t *clientinfo ISC_ATTR_UNUSED,
dns_dbnode_t **nodep DNS__DB_FLARG) {
bdb_t *bdb = (bdb_t *)db;
bdbnode_t *node = NULL;
@ -906,7 +908,9 @@ findnode(dns_db_t *db, const dns_name_t *name, bool create,
static isc_result_t
find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname, dns_rdataset_t *rdataset,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_clientinfomethods_t *methods ISC_ATTR_UNUSED,
dns_clientinfo_t *clientinfo ISC_ATTR_UNUSED, dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG) {
bdb_t *bdb = (bdb_t *)db;
isc_result_t result;
@ -942,7 +946,8 @@ find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
* Look up the next label.
*/
dns_name_getlabelsequence(name, nlabels - i, i, xname);
result = findnode(db, xname, false, &node DNS__DB_FLARG_PASS);
result = findnode(db, xname, false, NULL, NULL,
&node DNS__DB_FLARG_PASS);
if (result == ISC_R_NOTFOUND) {
/*
* No data at zone apex?

View file

@ -125,31 +125,6 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp,
dns__db_closeversion(sampledb->db, versionp, commit DNS__DB_FLARG_PASS);
}
static isc_result_t
findnode(dns_db_t *db, const dns_name_t *name, bool create,
dns_dbnode_t **nodep DNS__DB_FLARG) {
sampledb_t *sampledb = (sampledb_t *)db;
REQUIRE(VALID_SAMPLEDB(sampledb));
return dns__db_findnode(sampledb->db, name, create,
nodep DNS__DB_FLARG_PASS);
}
static isc_result_t
find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname, dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG) {
sampledb_t *sampledb = (sampledb_t *)db;
REQUIRE(VALID_SAMPLEDB(sampledb));
return dns__db_find(sampledb->db, name, version, type, options, now,
nodep, foundname, rdataset,
sigrdataset DNS__DB_FLARG_PASS);
}
static isc_result_t
findzonecut(dns_db_t *db, const dns_name_t *name, unsigned int options,
isc_stdtime_t now, dns_dbnode_t **nodep, dns_name_t *foundname,
@ -345,30 +320,30 @@ getrrsetstats(dns_db_t *db) {
}
static isc_result_t
findnodeext(dns_db_t *db, const dns_name_t *name, bool create,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_dbnode_t **nodep DNS__DB_FLARG) {
findnode(dns_db_t *db, const dns_name_t *name, bool create,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_dbnode_t **nodep DNS__DB_FLARG) {
sampledb_t *sampledb = (sampledb_t *)db;
REQUIRE(VALID_SAMPLEDB(sampledb));
return dns__db_findnodeext(sampledb->db, name, create, methods,
clientinfo, nodep DNS__DB_FLARG_PASS);
return dns__db_findnode(sampledb->db, name, create, methods, clientinfo,
nodep DNS__DB_FLARG_PASS);
}
static isc_result_t
findext(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset DNS__DB_FLARG) {
find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset DNS__DB_FLARG) {
sampledb_t *sampledb = (sampledb_t *)db;
REQUIRE(VALID_SAMPLEDB(sampledb));
return dns__db_findext(sampledb->db, name, version, type, options, now,
nodep, foundname, methods, clientinfo, rdataset,
sigrdataset DNS__DB_FLARG_PASS);
return dns__db_find(sampledb->db, name, version, type, options, now,
nodep, foundname, methods, clientinfo, rdataset,
sigrdataset DNS__DB_FLARG_PASS);
}
static isc_result_t
@ -390,8 +365,6 @@ static dns_dbmethods_t sampledb_methods = {
.newversion = newversion,
.attachversion = attachversion,
.closeversion = closeversion,
.findnode = findnode,
.find = find,
.findzonecut = findzonecut,
.createiterator = createiterator,
.findrdataset = findrdataset,
@ -407,8 +380,8 @@ static dns_dbmethods_t sampledb_methods = {
.setsigningtime = setsigningtime,
.getsigningtime = getsigningtime,
.getrrsetstats = getrrsetstats,
.findnodeext = findnodeext,
.findext = findext,
.findnode = findnode,
.find = find,
.setcachestats = setcachestats,
};

View file

@ -415,28 +415,8 @@ dns__db_closeversion(dns_db_t *db, dns_dbversion_t **versionp,
isc_result_t
dns__db_findnode(dns_db_t *db, const dns_name_t *name, bool create,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_dbnode_t **nodep DNS__DB_FLARG) {
/*
* Find the node with name 'name'.
*/
REQUIRE(DNS_DB_VALID(db));
REQUIRE(nodep != NULL && *nodep == NULL);
if (db->methods->findnode != NULL) {
return (db->methods->findnode)(db, name, create,
nodep DNS__DB_FLARG_PASS);
} else {
return (db->methods->findnodeext)(db, name, create, NULL, NULL,
nodep DNS__DB_FLARG_PASS);
}
}
isc_result_t
dns__db_findnodeext(dns_db_t *db, const dns_name_t *name, bool create,
dns_clientinfomethods_t *methods,
dns_clientinfo_t *clientinfo,
dns_dbnode_t **nodep DNS__DB_FLARG) {
/*
* Find the node with name 'name', passing 'arg' to the database
* implementation.
@ -445,14 +425,12 @@ dns__db_findnodeext(dns_db_t *db, const dns_name_t *name, bool create,
REQUIRE(DNS_DB_VALID(db));
REQUIRE(nodep != NULL && *nodep == NULL);
if (db->methods->findnodeext != NULL) {
return (db->methods->findnodeext)(db, name, create, methods,
clientinfo,
nodep DNS__DB_FLARG_PASS);
} else {
return (db->methods->findnode)(db, name, create,
if (db->methods->findnode != NULL) {
return (db->methods->findnode)(db, name, create, methods,
clientinfo,
nodep DNS__DB_FLARG_PASS);
}
return ISC_R_NOTIMPLEMENTED;
}
isc_result_t
@ -473,41 +451,9 @@ isc_result_t
dns__db_find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG) {
/*
* Find the best match for 'name' and 'type' in version 'version'
* of 'db'.
*/
REQUIRE(DNS_DB_VALID(db));
REQUIRE(type != dns_rdatatype_rrsig);
REQUIRE(nodep == NULL || *nodep == NULL);
REQUIRE(dns_name_hasbuffer(foundname));
REQUIRE(rdataset == NULL || (DNS_RDATASET_VALID(rdataset) &&
!dns_rdataset_isassociated(rdataset)));
REQUIRE(sigrdataset == NULL ||
(DNS_RDATASET_VALID(sigrdataset) &&
!dns_rdataset_isassociated(sigrdataset)));
if (db->methods->find != NULL) {
return (db->methods->find)(db, name, version, type, options,
now, nodep, foundname, rdataset,
sigrdataset DNS__DB_FLARG_PASS);
} else {
return (db->methods->findext)(
db, name, version, type, options, now, nodep, foundname,
NULL, NULL, rdataset, sigrdataset DNS__DB_FLARG_PASS);
}
}
isc_result_t
dns__db_findext(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG) {
/*
* Find the best match for 'name' and 'type' in version 'version'
* of 'db', passing in 'arg'.
@ -523,16 +469,13 @@ dns__db_findext(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
(DNS_RDATASET_VALID(sigrdataset) &&
!dns_rdataset_isassociated(sigrdataset)));
if (db->methods->findext != NULL) {
return (db->methods->findext)(db, name, version, type, options,
now, nodep, foundname, methods,
clientinfo, rdataset,
sigrdataset DNS__DB_FLARG_PASS);
} else {
if (db->methods->find != NULL) {
return (db->methods->find)(db, name, version, type, options,
now, nodep, foundname, rdataset,
now, nodep, foundname, methods,
clientinfo, rdataset,
sigrdataset DNS__DB_FLARG_PASS);
}
return ISC_R_NOTIMPLEMENTED;
}
isc_result_t

View file

@ -100,15 +100,6 @@ typedef struct dns_db_methods {
dns_dbversion_t **targetp);
void (*closeversion)(dns_db_t *db, dns_dbversion_t **versionp,
bool commit DNS__DB_FLARG);
isc_result_t (*findnode)(dns_db_t *db, const dns_name_t *name,
bool create,
dns_dbnode_t **nodep DNS__DB_FLARG);
isc_result_t (*find)(dns_db_t *db, const dns_name_t *name,
dns_dbversion_t *version, dns_rdatatype_t type,
unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG);
isc_result_t (*findzonecut)(dns_db_t *db, const dns_name_t *name,
unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname,
@ -159,19 +150,18 @@ typedef struct dns_db_methods {
dns_name_t *name,
dns_typepair_t *typepair);
dns_stats_t *(*getrrsetstats)(dns_db_t *db);
isc_result_t (*findnodeext)(dns_db_t *db, const dns_name_t *name,
bool create,
dns_clientinfomethods_t *methods,
dns_clientinfo_t *clientinfo,
dns_dbnode_t **nodep DNS__DB_FLARG);
isc_result_t (*findext)(dns_db_t *db, const dns_name_t *name,
dns_dbversion_t *version, dns_rdatatype_t type,
unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_clientinfomethods_t *methods,
dns_clientinfo_t *clientinfo,
dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG);
isc_result_t (*findnode)(dns_db_t *db, const dns_name_t *name,
bool create, dns_clientinfomethods_t *methods,
dns_clientinfo_t *clientinfo,
dns_dbnode_t **nodep DNS__DB_FLARG);
isc_result_t (*find)(dns_db_t *db, const dns_name_t *name,
dns_dbversion_t *version, dns_rdatatype_t type,
unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_clientinfomethods_t *methods,
dns_clientinfo_t *clientinfo,
dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG);
isc_result_t (*setcachestats)(dns_db_t *db, isc_stats_t *stats);
isc_result_t (*getsize)(dns_db_t *db, dns_dbversion_t *version,
uint64_t *records, uint64_t *bytes);
@ -694,19 +684,14 @@ dns__db_closeversion(dns_db_t *db, dns_dbversion_t **versionp,
***/
#define dns_db_findnode(db, name, create, nodep) \
dns__db_findnode(db, name, create, nodep DNS__DB_FILELINE)
dns__db_findnode(db, name, create, NULL, NULL, nodep DNS__DB_FILELINE)
#define dns_db_findnodeext(db, name, create, methods, clientinfo, nodep) \
dns__db_findnode(db, name, create, methods, clientinfo, \
nodep DNS__DB_FILELINE)
isc_result_t
dns__db_findnode(dns_db_t *db, const dns_name_t *name, bool create,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_dbnode_t **nodep DNS__DB_FLARG);
#define dns_db_findnodeext(db, name, create, methods, clientinfo, nodep) \
dns__db_findnodeext(db, name, create, methods, clientinfo, \
nodep DNS__DB_FILELINE)
isc_result_t
dns__db_findnodeext(dns_db_t *db, const dns_name_t *name, bool create,
dns_clientinfomethods_t *methods,
dns_clientinfo_t *clientinfo,
dns_dbnode_t **nodep DNS__DB_FLARG);
/*%<
* Find the node with name 'name'.
*
@ -748,26 +733,19 @@ dns__db_findnodeext(dns_db_t *db, const dns_name_t *name, bool create,
#define dns_db_find(db, name, version, type, options, now, nodep, foundname, \
rdataset, sigrdataset) \
dns__db_find(db, name, version, type, options, now, nodep, foundname, \
rdataset, sigrdataset DNS__DB_FILELINE)
NULL, NULL, rdataset, sigrdataset DNS__DB_FILELINE)
#define dns_db_findext(db, name, version, type, options, now, nodep, \
foundname, methods, clientinfo, rdataset, sigrdataset) \
dns__db_find(db, name, version, type, options, now, nodep, foundname, \
methods, clientinfo, rdataset, \
sigrdataset DNS__DB_FILELINE)
isc_result_t
dns__db_find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG);
#define dns_db_findext(db, name, version, type, options, now, nodep, \
foundname, methods, clientinfo, rdataset, sigrdataset) \
dns__db_findext(db, name, version, type, options, now, nodep, \
foundname, methods, clientinfo, rdataset, \
sigrdataset DNS__DB_FILELINE)
isc_result_t
dns__db_findext(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG);
/*%<
* Find the best match for 'name' and 'type' in version 'version' of 'db'.
*

View file

@ -1542,6 +1542,8 @@ static isc_result_t
qpcache_find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t __now,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_clientinfomethods_t *methods ISC_ATTR_UNUSED,
dns_clientinfo_t *clientinfo ISC_ATTR_UNUSED,
dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG) {
qpcnode_t *node = NULL;
@ -2420,6 +2422,8 @@ new_qpcnode(qpcache_t *qpdb, const dns_name_t *name, dns_namespace_t nspace) {
static isc_result_t
qpcache_findnode(dns_db_t *db, const dns_name_t *name, bool create,
dns_clientinfomethods_t *methods ISC_ATTR_UNUSED,
dns_clientinfo_t *clientinfo ISC_ATTR_UNUSED,
dns_dbnode_t **nodep DNS__DB_FLARG) {
qpcache_t *qpdb = (qpcache_t *)db;
qpcnode_t *node = NULL;

View file

@ -2505,6 +2505,8 @@ findnodeintree(qpzonedb_t *qpdb, const dns_name_t *name, bool create,
static isc_result_t
qpzone_findnode(dns_db_t *db, const dns_name_t *name, bool create,
dns_clientinfomethods_t *methods ISC_ATTR_UNUSED,
dns_clientinfo_t *clientinfo ISC_ATTR_UNUSED,
dns_dbnode_t **nodep DNS__DB_FLARG) {
qpzonedb_t *qpdb = (qpzonedb_t *)db;
@ -3269,7 +3271,10 @@ static isc_result_t
qpzone_find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options,
isc_stdtime_t now ISC_ATTR_UNUSED, dns_dbnode_t **nodep,
dns_name_t *foundname, dns_rdataset_t *rdataset,
dns_name_t *foundname,
dns_clientinfomethods_t *methods ISC_ATTR_UNUSED,
dns_clientinfo_t *clientinfo ISC_ATTR_UNUSED,
dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG) {
isc_result_t result;
qpzonedb_t *qpdb = (qpzonedb_t *)db;
@ -4992,7 +4997,7 @@ glue_nsdname_cb(void *arg, const dns_name_t *name, dns_rdatatype_t qtype,
result = qpzone_find(ctx->db, name, ctx->version, dns_rdatatype_a,
DNS_DBFIND_GLUEOK, 0, (dns_dbnode_t **)&node_a,
name_a, &rdataset_a,
name_a, NULL, NULL, &rdataset_a,
&sigrdataset_a DNS__DB_FLARG_PASS);
if (result == DNS_R_GLUE) {
glue = new_glue(ctx->db->mctx, name_a);
@ -5011,7 +5016,7 @@ glue_nsdname_cb(void *arg, const dns_name_t *name, dns_rdatatype_t qtype,
result = qpzone_find(ctx->db, name, ctx->version, dns_rdatatype_aaaa,
DNS_DBFIND_GLUEOK, 0, (dns_dbnode_t **)&node_aaaa,
name_aaaa, &rdataset_aaaa,
name_aaaa, NULL, NULL, &rdataset_aaaa,
&sigrdataset_aaaa DNS__DB_FLARG_PASS);
if (result == DNS_R_GLUE) {
if (glue == NULL) {

View file

@ -618,17 +618,11 @@ getnodedata(dns_db_t *db, const dns_name_t *name, bool create,
return ISC_R_SUCCESS;
}
static isc_result_t
findnodeext(dns_db_t *db, const dns_name_t *name, bool create,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_dbnode_t **nodep DNS__DB_FLARG) {
return getnodedata(db, name, create, 0, methods, clientinfo, nodep);
}
static isc_result_t
findnode(dns_db_t *db, const dns_name_t *name, bool create,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_dbnode_t **nodep DNS__DB_FLARG) {
return getnodedata(db, name, create, 0, NULL, NULL, nodep);
return getnodedata(db, name, create, 0, methods, clientinfo, nodep);
}
static void
@ -771,11 +765,11 @@ findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
}
static isc_result_t
findext(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset DNS__DB_FLARG) {
find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname,
dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset DNS__DB_FLARG) {
dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
dns_dbnode_t *node = NULL;
dns_fixedname_t fname;
@ -935,15 +929,6 @@ findext(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
return result;
}
static isc_result_t
find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
dns_dbnode_t **nodep, dns_name_t *foundname, dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG) {
return findext(db, name, version, type, options, now, nodep, foundname,
NULL, NULL, rdataset, sigrdataset DNS__DB_FLARG_PASS);
}
static isc_result_t
allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
unsigned int options, isc_stdtime_t now,
@ -1162,8 +1147,6 @@ static dns_dbmethods_t sdlzdb_methods = {
.issecure = issecure,
.nodecount = nodecount,
.getoriginnode = getoriginnode,
.findnodeext = findnodeext,
.findext = findext,
};
/*