mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 22:45:39 +00:00
Start ncache support
This commit is contained in:
@@ -80,6 +80,8 @@ typedef isc_uint32_t rbtdb_rdatatype_t;
|
|||||||
RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, dns_rdatatype_ns)
|
RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, dns_rdatatype_ns)
|
||||||
#define RBTDB_RDATATYPE_SIGCNAME \
|
#define RBTDB_RDATATYPE_SIGCNAME \
|
||||||
RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, dns_rdatatype_cname)
|
RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, dns_rdatatype_cname)
|
||||||
|
#define RBTDB_RDATATYPE_NXDOMAIN \
|
||||||
|
RBTDB_RDATATYPE_VALUE(0, dns_rdatatype_any)
|
||||||
|
|
||||||
typedef struct rdatasetheader {
|
typedef struct rdatasetheader {
|
||||||
/*
|
/*
|
||||||
@@ -2212,11 +2214,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
|
|||||||
rdatasetheader_t *header, *header_prev, *header_next;
|
rdatasetheader_t *header, *header_prev, *header_next;
|
||||||
rdatasetheader_t *found, *nsheader;
|
rdatasetheader_t *found, *nsheader;
|
||||||
rdatasetheader_t *foundsig, *nssig, *cnamesig;
|
rdatasetheader_t *foundsig, *nssig, *cnamesig;
|
||||||
rbtdb_rdatatype_t sigtype;
|
rbtdb_rdatatype_t sigtype, nxtype;
|
||||||
|
|
||||||
/*
|
|
||||||
* XXXRTH Currently this code has no support for negative caching.
|
|
||||||
*/
|
|
||||||
|
|
||||||
search.rbtdb = (dns_rbtdb_t *)db;
|
search.rbtdb = (dns_rbtdb_t *)db;
|
||||||
|
|
||||||
@@ -2287,6 +2285,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
|
|||||||
found = NULL;
|
found = NULL;
|
||||||
foundsig = NULL;
|
foundsig = NULL;
|
||||||
sigtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, type);
|
sigtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, type);
|
||||||
|
nxtype = RBTDB_RDATATYPE_VALUE(0, type);
|
||||||
nsheader = NULL;
|
nsheader = NULL;
|
||||||
nssig = NULL;
|
nssig = NULL;
|
||||||
cnamesig = NULL;
|
cnamesig = NULL;
|
||||||
@@ -2350,6 +2349,12 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
|
|||||||
* target type. Remember it.
|
* target type. Remember it.
|
||||||
*/
|
*/
|
||||||
foundsig = header;
|
foundsig = header;
|
||||||
|
} else if (header->type == RBTDB_RDATATYPE_NXDOMAIN ||
|
||||||
|
header->type == nxtype) {
|
||||||
|
/*
|
||||||
|
* We've found a negative cache entry.
|
||||||
|
*/
|
||||||
|
found = header;
|
||||||
} else if (header->type == dns_rdatatype_ns) {
|
} else if (header->type == dns_rdatatype_ns) {
|
||||||
/*
|
/*
|
||||||
* Remember a NS rdataset even if we're
|
* Remember a NS rdataset even if we're
|
||||||
@@ -2422,7 +2427,15 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
|
|||||||
*nodep = node;
|
*nodep = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type != found->type &&
|
if (RBTDB_RDATATYPE_BASE(found->type) == 0) {
|
||||||
|
/*
|
||||||
|
* We found a negative cache entry.
|
||||||
|
*/
|
||||||
|
if (found->type == RBTDB_RDATATYPE_NXDOMAIN)
|
||||||
|
result = DNS_R_NCACHENXDOMAIN;
|
||||||
|
else
|
||||||
|
result = DNS_R_NCACHENXRRSET;
|
||||||
|
} else if (type != found->type &&
|
||||||
type != dns_rdatatype_any &&
|
type != dns_rdatatype_any &&
|
||||||
found->type == dns_rdatatype_cname) {
|
found->type == dns_rdatatype_cname) {
|
||||||
/*
|
/*
|
||||||
@@ -2696,13 +2709,16 @@ cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||||||
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
|
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
|
||||||
dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node;
|
dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node;
|
||||||
rdatasetheader_t *header, *header_next, *found, *foundsig;
|
rdatasetheader_t *header, *header_next, *found, *foundsig;
|
||||||
rbtdb_rdatatype_t matchtype, sigmatchtype;
|
rbtdb_rdatatype_t matchtype, sigmatchtype, nxtype;
|
||||||
|
isc_result_t result;
|
||||||
|
|
||||||
REQUIRE(VALID_RBTDB(rbtdb));
|
REQUIRE(VALID_RBTDB(rbtdb));
|
||||||
REQUIRE(type != dns_rdatatype_any);
|
REQUIRE(type != dns_rdatatype_any);
|
||||||
|
|
||||||
version = NULL; /* Keep compilers quiet. */
|
version = NULL; /* Keep compilers quiet. */
|
||||||
|
|
||||||
|
result = ISC_R_SUCCESS;
|
||||||
|
|
||||||
if (now == 0 && isc_stdtime_get(&now) != ISC_R_SUCCESS) {
|
if (now == 0 && isc_stdtime_get(&now) != ISC_R_SUCCESS) {
|
||||||
/*
|
/*
|
||||||
* We don't need to call UNEXPECTED_ERROR() because
|
* We don't need to call UNEXPECTED_ERROR() because
|
||||||
@@ -2716,6 +2732,7 @@ cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||||||
found = NULL;
|
found = NULL;
|
||||||
foundsig = NULL;
|
foundsig = NULL;
|
||||||
matchtype = RBTDB_RDATATYPE_VALUE(type, covers);
|
matchtype = RBTDB_RDATATYPE_VALUE(type, covers);
|
||||||
|
nxtype = RBTDB_RDATATYPE_VALUE(0, type);
|
||||||
if (covers == 0)
|
if (covers == 0)
|
||||||
sigmatchtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, type);
|
sigmatchtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, type);
|
||||||
else
|
else
|
||||||
@@ -2732,13 +2749,14 @@ cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||||||
*/
|
*/
|
||||||
header->attributes |= RDATASET_ATTR_STALE;
|
header->attributes |= RDATASET_ATTR_STALE;
|
||||||
rbtnode->dirty = 1;
|
rbtnode->dirty = 1;
|
||||||
} else if (header->type == matchtype &&
|
} else if ((header->attributes & RDATASET_ATTR_NONEXISTENT) ==
|
||||||
(header->attributes & RDATASET_ATTR_NONEXISTENT) ==
|
|
||||||
0) {
|
0) {
|
||||||
|
if (header->type == matchtype)
|
||||||
found = header;
|
found = header;
|
||||||
} else if (header->type == sigmatchtype &&
|
else if (header->type == RBTDB_RDATATYPE_NXDOMAIN ||
|
||||||
(header->attributes & RDATASET_ATTR_NONEXISTENT) ==
|
header->type == nxtype)
|
||||||
0) {
|
found = header;
|
||||||
|
else if (header->type == sigmatchtype)
|
||||||
foundsig = header;
|
foundsig = header;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2754,7 +2772,17 @@ cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||||||
if (found == NULL)
|
if (found == NULL)
|
||||||
return (DNS_R_NOTFOUND);
|
return (DNS_R_NOTFOUND);
|
||||||
|
|
||||||
return (DNS_R_SUCCESS);
|
if (RBTDB_RDATATYPE_BASE(found->type) == 0) {
|
||||||
|
/*
|
||||||
|
* We found a negative cache entry.
|
||||||
|
*/
|
||||||
|
if (found->type == RBTDB_RDATATYPE_NXDOMAIN)
|
||||||
|
result = DNS_R_NCACHENXDOMAIN;
|
||||||
|
else
|
||||||
|
result = DNS_R_NCACHENXRRSET;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static dns_result_t
|
static dns_result_t
|
||||||
@@ -2829,6 +2857,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
|
|||||||
isc_boolean_t force = ISC_FALSE;
|
isc_boolean_t force = ISC_FALSE;
|
||||||
isc_boolean_t header_nx;
|
isc_boolean_t header_nx;
|
||||||
isc_boolean_t newheader_nx;
|
isc_boolean_t newheader_nx;
|
||||||
|
dns_rdatatype_t nxtype;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add an rdatasetheader_t to a node.
|
* Add an rdatasetheader_t to a node.
|
||||||
@@ -2853,14 +2882,51 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
|
|||||||
|
|
||||||
newheader_nx = NONEXISTENT(newheader) ? ISC_TRUE : ISC_FALSE;
|
newheader_nx = NONEXISTENT(newheader) ? ISC_TRUE : ISC_FALSE;
|
||||||
|
|
||||||
|
nxtype = 0;
|
||||||
|
#ifdef notyet
|
||||||
|
if (rbtversion == NULL) {
|
||||||
|
if (RBTDB_RDATASET_BASE(newheader->type) == 0
|
||||||
|
&& !newheader_nx) {
|
||||||
|
/*
|
||||||
|
* We're adding a negative cache entry.
|
||||||
|
*/
|
||||||
|
if (RBTDB_RDATASET_EXT(newheader->type) ==
|
||||||
|
dns_rdatatype_any) {
|
||||||
|
/*
|
||||||
|
* We're adding an NXDOMAIN negative cache
|
||||||
|
* entry.
|
||||||
|
*
|
||||||
|
* We make all other data stale so that the
|
||||||
|
* only rdataset that can be found at this
|
||||||
|
* node is the NXDOMAIN negative cache entry.
|
||||||
|
*/
|
||||||
|
for (topheader = rbtnode->data;
|
||||||
|
topheader != NULL;
|
||||||
|
topheader = topheader->next) {
|
||||||
|
topheader->ttl = 0;
|
||||||
|
topheader->attributes |=
|
||||||
|
RDATASET_ATTR_STALE;
|
||||||
|
}
|
||||||
|
rbtnode->dirty = 1;
|
||||||
|
goto find_header;
|
||||||
|
}
|
||||||
|
nxtype = ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
topheader_prev = NULL;
|
topheader_prev = NULL;
|
||||||
for (topheader = rbtnode->data;
|
for (topheader = rbtnode->data;
|
||||||
topheader != NULL;
|
topheader != NULL;
|
||||||
topheader = topheader->next) {
|
topheader = topheader->next) {
|
||||||
if (topheader->type == newheader->type)
|
if (topheader->type == newheader->type ||
|
||||||
|
topheader->type == nxtype)
|
||||||
break;
|
break;
|
||||||
topheader_prev = topheader;
|
topheader_prev = topheader;
|
||||||
}
|
}
|
||||||
|
#ifdef notyet
|
||||||
|
find_header:
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* If header isn't NULL, we've found the right type. There may be
|
* If header isn't NULL, we've found the right type. There may be
|
||||||
* IGNORE rdatasets between the top of the chain and the first real
|
* IGNORE rdatasets between the top of the chain and the first real
|
||||||
|
Reference in New Issue
Block a user