2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-05 09:05:40 +00:00

Local compression fixes to use rbt bitstrings.

This commit is contained in:
Mark Andrews
1999-04-28 03:03:56 +00:00
parent 075a8494bd
commit a41d348e14
3 changed files with 176 additions and 44 deletions

View File

@@ -15,7 +15,7 @@
* SOFTWARE.
*/
/* $Id: compress.c,v 1.12 1999/04/14 17:40:22 halley Exp $ */
/* $Id: compress.c,v 1.13 1999/04/28 03:03:55 marka Exp $ */
#include <config.h>
#include <string.h>
@@ -42,6 +42,12 @@ void compress_add(dns_rbt_t *root, dns_name_t *prefix,
dns_name_t *suffix, isc_uint16_t offset,
isc_boolean_t global16, isc_mem_t *mctx);
#undef MPADRC
#ifdef MPADRC
isc_buffer_t x;
char xxxx[1024];
#endif
/***
*** Compression
***/
@@ -87,7 +93,6 @@ dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner,
isc_buffer_t t;
isc_region_t region;
REQUIRE(VALID_CCTX(cctx));
REQUIRE(cctx->local == NULL);
REQUIRE(dns_name_isabsolute(owner) == ISC_TRUE);
@@ -124,6 +129,16 @@ dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner,
if (data == NULL)
return (DNS_R_SUCCESS);
*data = ll;
#ifdef MPADRC
isc_buffer_init(&x, xxxx, sizeof xxxx,
ISC_BUFFERTYPE_TEXT);
dns_name_totext(&name, ISC_FALSE, &x);
fprintf(stdout,
"dns_rbt_addname(local, \"%.*s\", %d)\n",
(int)x.used, (char*)x.base, *data);
#endif
result = dns_rbt_addname(cctx->local, &name, data);
if (result != DNS_R_SUCCESS) {
isc_mem_put(cctx->mctx, data, sizeof *data);
@@ -151,11 +166,11 @@ dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner,
* Adding 'bits' to 'll' may exceed the maximum logical
* offset index. Throw away bits until ll <= 254.
*/
ll += bits;
ll += bits - 1;
while (ll > 254 && bits > 0) {
/* clear bit */
buf[2 + bits / 8] &= ~(1 << (7 - (bits % 8)));
bits--;
buf[2 + bits / 8] &= ~(1 << (7 - (bits % 8)));
ll--;
}
/*
@@ -175,14 +190,25 @@ dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner,
if (data == NULL)
return (DNS_R_SUCCESS);
*data = ll;
#ifdef MPADRC
isc_buffer_init(&x, xxxx, sizeof xxxx,
ISC_BUFFERTYPE_TEXT);
dns_name_totext(&name, ISC_FALSE, &x);
fprintf(stdout,
"dns_rbt_addname(local, \"%.*s\", %d)\n",
(int)x.used, (char *)x.base,
*data);
#endif
result = dns_rbt_addname(cctx->local, &name, data);
if (result != DNS_R_SUCCESS) {
isc_mem_put(cctx->mctx, data, sizeof *data);
return (DNS_R_SUCCESS);
}
/* clear bit */
buf[2 + bits / 8] &= ~(1 << (7 - (bits % 8)));
bits--;
buf[2 + bits / 8] &= ~(1 << (7 - (bits % 8)));
ll--;
} while (bits > 0);
wl++;
@@ -249,6 +275,15 @@ dns_compress_findglobal(dns_compress_t *cctx, dns_name_t *name,
REQUIRE(dns_name_isabsolute(name) == ISC_TRUE);
REQUIRE(offset != NULL);
#ifdef MPADRC
isc_buffer_init(&x, xxxx, sizeof xxxx,
ISC_BUFFERTYPE_TEXT);
dns_name_totext(name, ISC_FALSE, &x);
fprintf(stdout, "compress_find(global, name \"%.*s\", ...)\n",
(int)x.used, (char*)x.base);
#endif
return (compress_find(cctx->global, name, prefix, suffix, offset,
workspace));
}
@@ -264,6 +299,16 @@ dns_compress_findlocal(dns_compress_t *cctx, dns_name_t *name,
if (cctx->local == NULL)
return (ISC_FALSE);
#ifdef MPADRC
isc_buffer_init(&x, xxxx, sizeof xxxx,
ISC_BUFFERTYPE_TEXT);
dns_name_totext(name, ISC_FALSE, &x);
fprintf(stdout, "compress_find(local, name \"%.*s\", ...)\n",
(int)x.used, (char*)x.base);
#endif
return (compress_find(cctx->local, name, prefix, suffix, offset,
workspace));
}
@@ -279,12 +324,19 @@ dns_compress_add(dns_compress_t *cctx, dns_name_t *prefix,
if (cctx->local != NULL && (cctx->allowed & DNS_COMPRESS_LOCAL) != 0) {
REQUIRE(cctx->rdata <= offset);
localoffset = offset - cctx->rdata + 256;
#ifdef MPADRC
fprintf(stdout, "compress_add(local, ...)\n");
#endif
compress_add(cctx->local, prefix, suffix, localoffset, ISC_TRUE,
cctx->mctx);
}
if ((cctx->edns > -1) || !local)
if ((cctx->edns > -1) || !local) {
#ifdef MPADRC
fprintf(stdout, "compress_add(global, ...)\n");
#endif
compress_add(cctx->global, prefix, suffix, offset,
cctx->global16, cctx->mctx);
}
}
void
@@ -424,6 +476,16 @@ compress_add(dns_rbt_t *root, dns_name_t *prefix, dns_name_t *suffix,
if (data == NULL)
return;
*data = offset;
#ifdef MPADRC
isc_buffer_init(&x, xxxx, sizeof xxxx,
ISC_BUFFERTYPE_TEXT);
dns_name_totext(&full, ISC_FALSE, &x);
fprintf(stdout,
"dns_rbt_addname(root, \"%.*s\", %d)\n",
(int)x.used, (char*)x.base, *data);
#endif
result = dns_rbt_addname(root, &full, data);
if (result != DNS_R_SUCCESS) {
isc_mem_put(mctx, data, sizeof *data);
@@ -474,10 +536,19 @@ compress_find(dns_rbt_t *root, dns_name_t *name, dns_name_t *prefix,
return (ISC_FALSE);
if (data == NULL) /* root label */
return (ISC_FALSE);
#ifdef MPADRC
isc_buffer_init(&x, xxxx, sizeof xxxx,
ISC_BUFFERTYPE_TEXT);
dns_name_totext(foundname, ISC_FALSE, &x);
fprintf(stdout, "foundname \"%.*s\" %d\n",
(int)x.used, (char*)x.base, *data);
#endif
/*
* Do we have to do bit string processing?
*/
dns_name_getlabel(dns_fixedname_name(&found), 0, &foundlabel);
dns_name_getlabel(foundname, 0, &foundlabel);
foundlabels = dns_name_countlabels(foundname);
INSIST(foundlabels > 1); /* root labels are not added to tree */
namelabels = dns_name_countlabels(name);
@@ -499,6 +570,24 @@ compress_find(dns_rbt_t *root, dns_name_t *name, dns_name_t *prefix,
dns_name_getlabelsequence(name, 0, prefixlen, prefix);
dns_name_getlabelsequence(foundname, 0, foundlabels, suffix);
*offset = *data;
#ifdef MPADRC
if (prefixlen != 0) {
isc_buffer_init(&x, xxxx, sizeof xxxx,
ISC_BUFFERTYPE_TEXT);
dns_name_totext(prefix, ISC_FALSE, &x);
fprintf(stdout, "prefix \"%.*s\"\n",
(int)x.used, (char*)x.base);
} else
fprintf(stdout, "prefix <EMPTY>\n");
isc_buffer_init(&x, xxxx, sizeof xxxx,
ISC_BUFFERTYPE_TEXT);
dns_name_totext(suffix, ISC_FALSE, &x);
fprintf(stdout, "suffix \"%.*s\"\n",
(int)x.used, (char*)x.base);
#endif
return (ISC_TRUE);
}
/* XXX MPA needs to be tested */
@@ -525,7 +614,6 @@ compress_find(dns_rbt_t *root, dns_name_t *name, dns_name_t *prefix,
*/
while (j < bits) {
bit = dns_label_getbit(&namelabel, foundbits + j);
j++;
if (bit)
buf[2 + j / 8] |= (1 << (7 - (j % 8)));
j++;
@@ -533,12 +621,27 @@ compress_find(dns_rbt_t *root, dns_name_t *name, dns_name_t *prefix,
buf[0] = DNS_LABELTYPE_BITSTRING;
buf[1] = j;
region.base = buf;
region.length = 2 + j / 8;
region.length = 2 + (j + 7) / 8;
dns_name_fromregion(&tmpsuffix, &region);
result = dns_name_concatenate(&tmpprefix, &tmpsuffix, prefix,
workspace);
if (result != DNS_R_SUCCESS)
return (ISC_FALSE);
*offset = *data;
#ifdef MPADRC
isc_buffer_init(&x, xxxx, sizeof xxxx,
ISC_BUFFERTYPE_TEXT);
dns_name_totext(prefix, ISC_FALSE, &x);
fprintf(stdout, "prefix \"%.*s\"\n",
(int)x.used, (char*)x.base);
isc_buffer_init(&x, xxxx, sizeof xxxx,
ISC_BUFFERTYPE_TEXT);
dns_name_totext(suffix, ISC_FALSE, &x);
fprintf(stdout, "suffix \"%.*s\"\n",
(int)x.used, (char*)x.base);
#endif
return (ISC_TRUE);
}