#define DCTX_MAGIC ISC_MAGIC('D', 'C', 'T', 'X')
#define VALID_DCTX(x) ISC_MAGIC_VALID(x, DCTX_MAGIC)
+#define TABLE_READY \
+ do { \
+ unsigned int i; \
+ \
+ if ((cctx->allowed & DNS_COMPRESS_READY) == 0) { \
+ cctx->allowed |= DNS_COMPRESS_READY; \
+ for (i = 0; i < DNS_COMPRESS_TABLESIZE; i++) \
+ cctx->table[i] = NULL; \
+ } \
+ } while (0)
+
/***
*** Compression
***/
isc_result_t
dns_compress_init(dns_compress_t *cctx, int edns, isc_mem_t *mctx) {
- unsigned int i;
-
REQUIRE(cctx != NULL);
REQUIRE(mctx != NULL); /* See: rdataset.c:towiresorted(). */
- cctx->allowed = 0;
cctx->edns = edns;
- for (i = 0; i < DNS_COMPRESS_TABLESIZE; i++)
- cctx->table[i] = NULL;
cctx->mctx = mctx;
cctx->count = 0;
+ cctx->allowed = DNS_COMPRESS_ENABLED;
cctx->magic = CCTX_MAGIC;
- cctx->enabled = ISC_TRUE;
return (ISC_R_SUCCESS);
}
REQUIRE(VALID_CCTX(cctx));
- cctx->magic = 0;
- for (i = 0; i < DNS_COMPRESS_TABLESIZE; i++) {
- while (cctx->table[i] != NULL) {
- node = cctx->table[i];
- cctx->table[i] = cctx->table[i]->next;
- if ((node->offset & 0x8000) != 0)
- isc_mem_put(cctx->mctx, node->r.base,
- node->r.length);
- if (node->count < DNS_COMPRESS_INITIALNODES)
- continue;
- isc_mem_put(cctx->mctx, node, sizeof(*node));
+ if ((cctx->allowed & DNS_COMPRESS_READY) != 0) {
+ for (i = 0; i < DNS_COMPRESS_TABLESIZE; i++) {
+ while (cctx->table[i] != NULL) {
+ node = cctx->table[i];
+ cctx->table[i] = cctx->table[i]->next;
+ if ((node->offset & 0x8000) != 0)
+ isc_mem_put(cctx->mctx, node->r.base,
+ node->r.length);
+ if (node->count < DNS_COMPRESS_INITIALNODES)
+ continue;
+ isc_mem_put(cctx->mctx, node, sizeof(*node));
+ }
}
}
+ cctx->magic = 0;
cctx->allowed = 0;
cctx->edns = -1;
}
void
dns_compress_disable(dns_compress_t *cctx) {
REQUIRE(VALID_CCTX(cctx));
- cctx->enabled = ISC_FALSE;
+ cctx->allowed &= ~DNS_COMPRESS_ENABLED;
}
void
REQUIRE(dns_name_isabsolute(name) == ISC_TRUE);
REQUIRE(offset != NULL);
- if (cctx->enabled == ISC_FALSE)
+ if ((cctx->allowed & DNS_COMPRESS_ENABLED) == 0)
return (ISC_FALSE);
+ TABLE_READY;
+
if (cctx->count == 0)
return (ISC_FALSE);
REQUIRE(VALID_CCTX(cctx));
REQUIRE(dns_name_isabsolute(name));
- if (cctx->enabled == ISC_FALSE)
+ if ((cctx->allowed & DNS_COMPRESS_ENABLED) == 0)
return;
+ TABLE_READY;
+
if (offset >= 0x4000)
return;
dns_name_init(&tname, NULL);
REQUIRE(VALID_CCTX(cctx));
+ if ((cctx->allowed & DNS_COMPRESS_ENABLED) == 0)
+ return;
+
+ if ((cctx->allowed & DNS_COMPRESS_READY) == 0)
+ return;
+
for (i = 0; i < DNS_COMPRESS_TABLESIZE; i++) {
node = cctx->table[i];
/*
#define DNS_COMPRESS_GLOBAL14 0x01 /*%< "normal" compression. */
#define DNS_COMPRESS_ALL 0x01 /*%< all compression. */
#define DNS_COMPRESS_CASESENSITIVE 0x02 /*%< case sensitive compression. */
+#define DNS_COMPRESS_ENABLED 0x04
+
+#define DNS_COMPRESS_READY 0x80000000
#define DNS_COMPRESS_TABLESIZE 64
#define DNS_COMPRESS_INITIALNODES 16
struct dns_compress {
unsigned int magic; /*%< Magic number. */
unsigned int allowed; /*%< Allowed methods. */
- isc_boolean_t enabled; /*%< If the compression is enabled at all. */
int edns; /*%< Edns version or -1. */
/*% Global compression table. */
dns_compressnode_t *table[DNS_COMPRESS_TABLESIZE];