#include <isc/magic.h>
#include <isc/stdtime.h>
+#include <dns/rdataslab.h>
#include <dns/rdatastruct.h>
#include <dns/types.h>
dns_rdatasetadditional_fromglue
} dns_rdatasetadditional_t;
-typedef struct dns_rdatasetmethods {
+struct dns_rdatasetmethods {
void (*disassociate)(dns_rdataset_t *rdataset DNS__DB_FLARG);
isc_result_t (*first)(dns_rdataset_t *rdataset);
isc_result_t (*next)(dns_rdataset_t *rdataset);
void (*getownercase)(const dns_rdataset_t *rdataset, dns_name_t *name);
isc_result_t (*addglue)(dns_rdataset_t *rdataset,
dns_dbversion_t *version, dns_message_t *msg);
-} dns_rdatasetmethods_t;
+ dns_slabheader_t *(*getheader)(const dns_rdataset_t *rdataset);
+};
#define DNS_RDATASET_MAGIC ISC_MAGIC('D', 'N', 'S', 'R')
#define DNS_RDATASET_VALID(set) ISC_MAGIC_VALID(set, DNS_RDATASET_MAGIC)
* the code referred to in the rdataset methods table. The names of
* the structures roughly correspond to the file containing the
* implementation, except that `rdlist` is used by `rdatalist.c`,
- * `sdb.c`, and `sdlz.c`.
+ * and `sdlz.c`, and `slab` by `rdataslab.c`.
*
* Pointers in these structs use incomplete structure types,
* because the structure definitions and corresponding typedef
/*
* A slab rdataset provides access to an rdataslab. In
- * an rbtdb database, 'raw' will generally point to the
+ * a QP database, 'raw' will generally point to the
* memory immediately following a slabheader. (There
* is an exception in the case of rdatasets returned by
* the `getnoqname` and `getclosest` methods; see
- * comments in rbtdb.c for details.)
+ * comments in rdataslab.c for details.)
*/
struct {
struct dns_db *db;
#define DNS_RDATASETATTR_CHECKNAMES 0x00008000 /*%< Used by resolver. */
#define DNS_RDATASETATTR_REQUIRED 0x00010000
#define DNS_RDATASETATTR_REQUIREDGLUE DNS_RDATASETATTR_REQUIRED
-#define DNS_RDATASETATTR_UNUSED1 0x00020000
+#define DNS_RDATASETATTR_NOHEADER 0x00020000
#define DNS_RDATASETATTR_RESIGN 0x00040000
#define DNS_RDATASETATTR_CLOSEST 0x00080000
#define DNS_RDATASETATTR_OPTOUT 0x00100000 /*%< OPTOUT proof */
/*%<
* Display trust in textual form.
*/
+
+dns_slabheader_t *
+dns_rdataset_getheader(const dns_rdataset_t *rdataset);
+/*%<
+ * Return a pointer to the slabheader for a slab rdataset. If 'rdataset'
+ * is not a slab rdataset or if the slab is raw (lacking a header), return
+ * NULL.
+ *
+ * Requires:
+ * \li 'rdataset' is a valid rdataset.
+ */
typedef struct dns_rdatalist dns_rdatalist_t;
typedef struct dns_rdataset dns_rdataset_t;
typedef ISC_LIST(dns_rdataset_t) dns_rdatasetlist_t;
-typedef struct dns_rdatasetiter dns_rdatasetiter_t;
-typedef uint16_t dns_rdatatype_t;
-typedef struct dns_remote dns_remote_t;
-typedef struct dns_request dns_request_t;
-typedef struct dns_requestmgr dns_requestmgr_t;
-typedef struct dns_resolver dns_resolver_t;
-typedef struct dns_qpnode dns_qpnode_t;
-typedef uint8_t dns_secalg_t;
-typedef uint8_t dns_secproto_t;
-typedef struct dns_signature dns_signature_t;
-typedef struct dns_skr dns_skr_t;
-typedef struct dns_slabheader dns_slabheader_t;
+typedef struct dns_rdatasetiter dns_rdatasetiter_t;
+typedef struct dns_rdatasetmethods dns_rdatasetmethods_t;
+typedef uint16_t dns_rdatatype_t;
+typedef struct dns_remote dns_remote_t;
+typedef struct dns_request dns_request_t;
+typedef struct dns_requestmgr dns_requestmgr_t;
+typedef struct dns_resolver dns_resolver_t;
+typedef struct dns_qpnode dns_qpnode_t;
+typedef uint8_t dns_secalg_t;
+typedef uint8_t dns_secproto_t;
+typedef struct dns_signature dns_signature_t;
+typedef struct dns_skr dns_skr_t;
+typedef struct dns_slabheader dns_slabheader_t;
typedef ISC_LIST(dns_slabheader_t) dns_slabheaderlist_t;
typedef struct dns_ssurule dns_ssurule_t;
typedef struct dns_ssutable dns_ssutable_t;
rdataset_setownercase(dns_rdataset_t *rdataset, const dns_name_t *name);
static void
rdataset_getownercase(const dns_rdataset_t *rdataset, dns_name_t *name);
+static dns_slabheader_t *
+rdataset_getheader(const dns_rdataset_t *rdataset);
/*% Note: the "const void *" are just to make qsort happy. */
static int
return true;
}
-dns_slabheader_t *
-dns_slabheader_fromrdataset(const dns_rdataset_t *rdataset) {
- dns_slabheader_t *header = (dns_slabheader_t *)rdataset->slab.raw;
- return header - 1;
-}
-
void *
dns_slabheader_raw(dns_slabheader_t *header) {
return header + 1;
*proof = NULL;
}
+dns_slabheader_t *
+dns_slabheader_top(dns_slabheader_t *header) {
+ dns_typepair_t type, negtype;
+ dns_rdatatype_t rdtype, covers;
+
+ type = header->type;
+ rdtype = DNS_TYPEPAIR_TYPE(header->type);
+ if (NEGATIVE(header)) {
+ covers = DNS_TYPEPAIR_COVERS(header->type);
+ negtype = DNS_TYPEPAIR_VALUE(covers, 0);
+ } else {
+ negtype = DNS_TYPEPAIR_VALUE(0, rdtype);
+ }
+
+ /*
+ * Find the start of the header chain for the next type
+ * by walking back up the list.
+ */
+ while (header->up != NULL &&
+ (header->up->type == type || header->up->type == negtype))
+ {
+ header = header->up;
+ }
+
+ return header;
+}
+
dns_rdatasetmethods_t dns_rdataslab_rdatasetmethods = {
.disassociate = rdataset_disassociate,
.first = rdataset_first,
.clearprefetch = rdataset_clearprefetch,
.setownercase = rdataset_setownercase,
.getownercase = rdataset_getownercase,
+ .getheader = rdataset_getheader,
};
/* Fixed RRSet helper macros */
* Usually, rdataset->slab.raw refers the data following a
* dns_slabheader, but in this case it points to a bare
* rdataslab belonging to the dns_slabheader's `noqname` field.
- * The DNS_RDATASETATTR_KEEPCASE attribute is set to prevent
- * setownercase and getownercase methods from affecting the
- * case of NSEC/NSEC3 owner names.
+ * The DNS_RDATASETATTR_NOHEADER attribute is set so that
+ * dns_rdataset_getheader() will return NULL, and the _KEEPCASE
+ * attribute is set to prevent setownercase and getownercase
+ * methods from affecting the case of NSEC/NSEC3 owner names.
*/
dns__db_attachnode(db, node,
&(dns_dbnode_t *){ NULL } DNS__DB_FLARG_PASS);
.slab.raw = noqname->neg,
.link = nsec->link,
.count = nsec->count,
- .attributes = nsec->attributes | DNS_RDATASETATTR_KEEPCASE,
+ .attributes = nsec->attributes | DNS_RDATASETATTR_KEEPCASE |
+ DNS_RDATASETATTR_NOHEADER,
.magic = nsec->magic,
};
.slab.raw = noqname->negsig,
.link = nsecsig->link,
.count = nsecsig->count,
- .attributes = nsecsig->attributes | DNS_RDATASETATTR_KEEPCASE,
+ .attributes = nsecsig->attributes | DNS_RDATASETATTR_KEEPCASE |
+ DNS_RDATASETATTR_NOHEADER,
.magic = nsecsig->magic,
};
.slab.raw = closest->neg,
.link = nsec->link,
.count = nsec->count,
- .attributes = nsec->attributes | DNS_RDATASETATTR_KEEPCASE,
+ .attributes = nsec->attributes | DNS_RDATASETATTR_KEEPCASE |
+ DNS_RDATASETATTR_NOHEADER,
.magic = nsec->magic,
};
.slab.raw = closest->negsig,
.link = nsecsig->link,
.count = nsecsig->count,
- .attributes = nsecsig->attributes | DNS_RDATASETATTR_KEEPCASE,
+ .attributes = nsecsig->attributes | DNS_RDATASETATTR_KEEPCASE |
+ DNS_RDATASETATTR_NOHEADER,
.magic = nsecsig->magic,
};
static void
rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust) {
- dns_slabheader_t *header = dns_slabheader_fromrdataset(rdataset);
+ dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
dns_db_locknode(header->db, header->node, isc_rwlocktype_write);
header->trust = rdataset->trust = trust;
static void
rdataset_expire(dns_rdataset_t *rdataset DNS__DB_FLARG) {
- dns_slabheader_t *header = dns_slabheader_fromrdataset(rdataset);
+ dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
dns_db_expiredata(header->db, header->node, header);
}
static void
rdataset_clearprefetch(dns_rdataset_t *rdataset) {
- dns_slabheader_t *header = dns_slabheader_fromrdataset(rdataset);
+ dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
dns_db_locknode(header->db, header->node, isc_rwlocktype_write);
DNS_SLABHEADER_CLRATTR(header, DNS_SLABHEADERATTR_PREFETCH);
static void
rdataset_setownercase(dns_rdataset_t *rdataset, const dns_name_t *name) {
- dns_slabheader_t *header = dns_slabheader_fromrdataset(rdataset);
+ dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
dns_db_locknode(header->db, header->node, isc_rwlocktype_write);
dns_slabheader_setownercase(header, name);
static void
rdataset_getownercase(const dns_rdataset_t *rdataset, dns_name_t *name) {
- dns_slabheader_t *header = dns_slabheader_fromrdataset(rdataset);
+ dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
uint8_t mask = (1 << 7);
uint8_t bits = 0;
dns_db_unlocknode(header->db, header->node, isc_rwlocktype_read);
}
-dns_slabheader_t *
-dns_slabheader_top(dns_slabheader_t *header) {
- dns_typepair_t type, negtype;
- dns_rdatatype_t rdtype, covers;
-
- type = header->type;
- rdtype = DNS_TYPEPAIR_TYPE(header->type);
- if (NEGATIVE(header)) {
- covers = DNS_TYPEPAIR_COVERS(header->type);
- negtype = DNS_TYPEPAIR_VALUE(covers, 0);
- } else {
- negtype = DNS_TYPEPAIR_VALUE(0, rdtype);
- }
-
- /*
- * Find the start of the header chain for the next type
- * by walking back up the list.
- */
- while (header->up != NULL &&
- (header->up->type == type || header->up->type == negtype))
- {
- header = header->up;
- }
-
- return header;
+static dns_slabheader_t *
+rdataset_getheader(const dns_rdataset_t *rdataset) {
+ dns_slabheader_t *header = (dns_slabheader_t *)rdataset->slab.raw;
+ return header - 1;
}