1*00b67f09SDavid van Moolenbroek /* $NetBSD: compress.c,v 1.4 2014/12/10 04:37:58 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek * Copyright (C) 1999-2001 Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek *
7*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek *
11*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek */
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroek /* Id: compress.c,v 1.59 2007/06/19 23:47:16 tbox Exp */
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek /*! \file */
23*00b67f09SDavid van Moolenbroek
24*00b67f09SDavid van Moolenbroek #define DNS_NAME_USEINLINE 1
25*00b67f09SDavid van Moolenbroek
26*00b67f09SDavid van Moolenbroek #include <config.h>
27*00b67f09SDavid van Moolenbroek
28*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
29*00b67f09SDavid van Moolenbroek #include <isc/string.h>
30*00b67f09SDavid van Moolenbroek #include <isc/util.h>
31*00b67f09SDavid van Moolenbroek
32*00b67f09SDavid van Moolenbroek #include <dns/compress.h>
33*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
34*00b67f09SDavid van Moolenbroek #include <dns/rbt.h>
35*00b67f09SDavid van Moolenbroek #include <dns/result.h>
36*00b67f09SDavid van Moolenbroek
37*00b67f09SDavid van Moolenbroek #define CCTX_MAGIC ISC_MAGIC('C', 'C', 'T', 'X')
38*00b67f09SDavid van Moolenbroek #define VALID_CCTX(x) ISC_MAGIC_VALID(x, CCTX_MAGIC)
39*00b67f09SDavid van Moolenbroek
40*00b67f09SDavid van Moolenbroek #define DCTX_MAGIC ISC_MAGIC('D', 'C', 'T', 'X')
41*00b67f09SDavid van Moolenbroek #define VALID_DCTX(x) ISC_MAGIC_VALID(x, DCTX_MAGIC)
42*00b67f09SDavid van Moolenbroek
43*00b67f09SDavid van Moolenbroek /***
44*00b67f09SDavid van Moolenbroek *** Compression
45*00b67f09SDavid van Moolenbroek ***/
46*00b67f09SDavid van Moolenbroek
47*00b67f09SDavid van Moolenbroek isc_result_t
dns_compress_init(dns_compress_t * cctx,int edns,isc_mem_t * mctx)48*00b67f09SDavid van Moolenbroek dns_compress_init(dns_compress_t *cctx, int edns, isc_mem_t *mctx) {
49*00b67f09SDavid van Moolenbroek unsigned int i;
50*00b67f09SDavid van Moolenbroek
51*00b67f09SDavid van Moolenbroek REQUIRE(cctx != NULL);
52*00b67f09SDavid van Moolenbroek REQUIRE(mctx != NULL); /* See: rdataset.c:towiresorted(). */
53*00b67f09SDavid van Moolenbroek
54*00b67f09SDavid van Moolenbroek cctx->allowed = 0;
55*00b67f09SDavid van Moolenbroek cctx->edns = edns;
56*00b67f09SDavid van Moolenbroek for (i = 0; i < DNS_COMPRESS_TABLESIZE; i++)
57*00b67f09SDavid van Moolenbroek cctx->table[i] = NULL;
58*00b67f09SDavid van Moolenbroek cctx->mctx = mctx;
59*00b67f09SDavid van Moolenbroek cctx->count = 0;
60*00b67f09SDavid van Moolenbroek cctx->magic = CCTX_MAGIC;
61*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
62*00b67f09SDavid van Moolenbroek }
63*00b67f09SDavid van Moolenbroek
64*00b67f09SDavid van Moolenbroek void
dns_compress_invalidate(dns_compress_t * cctx)65*00b67f09SDavid van Moolenbroek dns_compress_invalidate(dns_compress_t *cctx) {
66*00b67f09SDavid van Moolenbroek dns_compressnode_t *node;
67*00b67f09SDavid van Moolenbroek unsigned int i;
68*00b67f09SDavid van Moolenbroek
69*00b67f09SDavid van Moolenbroek REQUIRE(VALID_CCTX(cctx));
70*00b67f09SDavid van Moolenbroek
71*00b67f09SDavid van Moolenbroek cctx->magic = 0;
72*00b67f09SDavid van Moolenbroek for (i = 0; i < DNS_COMPRESS_TABLESIZE; i++) {
73*00b67f09SDavid van Moolenbroek while (cctx->table[i] != NULL) {
74*00b67f09SDavid van Moolenbroek node = cctx->table[i];
75*00b67f09SDavid van Moolenbroek cctx->table[i] = cctx->table[i]->next;
76*00b67f09SDavid van Moolenbroek if (node->count < DNS_COMPRESS_INITIALNODES)
77*00b67f09SDavid van Moolenbroek continue;
78*00b67f09SDavid van Moolenbroek isc_mem_put(cctx->mctx, node, sizeof(*node));
79*00b67f09SDavid van Moolenbroek }
80*00b67f09SDavid van Moolenbroek }
81*00b67f09SDavid van Moolenbroek cctx->allowed = 0;
82*00b67f09SDavid van Moolenbroek cctx->edns = -1;
83*00b67f09SDavid van Moolenbroek }
84*00b67f09SDavid van Moolenbroek
85*00b67f09SDavid van Moolenbroek void
dns_compress_setmethods(dns_compress_t * cctx,unsigned int allowed)86*00b67f09SDavid van Moolenbroek dns_compress_setmethods(dns_compress_t *cctx, unsigned int allowed) {
87*00b67f09SDavid van Moolenbroek REQUIRE(VALID_CCTX(cctx));
88*00b67f09SDavid van Moolenbroek
89*00b67f09SDavid van Moolenbroek cctx->allowed &= ~DNS_COMPRESS_ALL;
90*00b67f09SDavid van Moolenbroek cctx->allowed |= (allowed & DNS_COMPRESS_ALL);
91*00b67f09SDavid van Moolenbroek }
92*00b67f09SDavid van Moolenbroek
93*00b67f09SDavid van Moolenbroek unsigned int
dns_compress_getmethods(dns_compress_t * cctx)94*00b67f09SDavid van Moolenbroek dns_compress_getmethods(dns_compress_t *cctx) {
95*00b67f09SDavid van Moolenbroek REQUIRE(VALID_CCTX(cctx));
96*00b67f09SDavid van Moolenbroek return (cctx->allowed & DNS_COMPRESS_ALL);
97*00b67f09SDavid van Moolenbroek }
98*00b67f09SDavid van Moolenbroek
99*00b67f09SDavid van Moolenbroek void
dns_compress_setsensitive(dns_compress_t * cctx,isc_boolean_t sensitive)100*00b67f09SDavid van Moolenbroek dns_compress_setsensitive(dns_compress_t *cctx, isc_boolean_t sensitive) {
101*00b67f09SDavid van Moolenbroek REQUIRE(VALID_CCTX(cctx));
102*00b67f09SDavid van Moolenbroek
103*00b67f09SDavid van Moolenbroek if (sensitive)
104*00b67f09SDavid van Moolenbroek cctx->allowed |= DNS_COMPRESS_CASESENSITIVE;
105*00b67f09SDavid van Moolenbroek else
106*00b67f09SDavid van Moolenbroek cctx->allowed &= ~DNS_COMPRESS_CASESENSITIVE;
107*00b67f09SDavid van Moolenbroek }
108*00b67f09SDavid van Moolenbroek
109*00b67f09SDavid van Moolenbroek isc_boolean_t
dns_compress_getsensitive(dns_compress_t * cctx)110*00b67f09SDavid van Moolenbroek dns_compress_getsensitive(dns_compress_t *cctx) {
111*00b67f09SDavid van Moolenbroek REQUIRE(VALID_CCTX(cctx));
112*00b67f09SDavid van Moolenbroek
113*00b67f09SDavid van Moolenbroek return (ISC_TF((cctx->allowed & DNS_COMPRESS_CASESENSITIVE) != 0));
114*00b67f09SDavid van Moolenbroek }
115*00b67f09SDavid van Moolenbroek
116*00b67f09SDavid van Moolenbroek int
dns_compress_getedns(dns_compress_t * cctx)117*00b67f09SDavid van Moolenbroek dns_compress_getedns(dns_compress_t *cctx) {
118*00b67f09SDavid van Moolenbroek REQUIRE(VALID_CCTX(cctx));
119*00b67f09SDavid van Moolenbroek return (cctx->edns);
120*00b67f09SDavid van Moolenbroek }
121*00b67f09SDavid van Moolenbroek
122*00b67f09SDavid van Moolenbroek #define NODENAME(node, name) \
123*00b67f09SDavid van Moolenbroek do { \
124*00b67f09SDavid van Moolenbroek (name)->length = (node)->r.length; \
125*00b67f09SDavid van Moolenbroek (name)->labels = (node)->labels; \
126*00b67f09SDavid van Moolenbroek (name)->ndata = (node)->r.base; \
127*00b67f09SDavid van Moolenbroek (name)->attributes = DNS_NAMEATTR_ABSOLUTE; \
128*00b67f09SDavid van Moolenbroek } while (/*CONSTCOND*/0)
129*00b67f09SDavid van Moolenbroek
130*00b67f09SDavid van Moolenbroek /*
131*00b67f09SDavid van Moolenbroek * Find the longest match of name in the table.
132*00b67f09SDavid van Moolenbroek * If match is found return ISC_TRUE. prefix, suffix and offset are updated.
133*00b67f09SDavid van Moolenbroek * If no match is found return ISC_FALSE.
134*00b67f09SDavid van Moolenbroek */
135*00b67f09SDavid van Moolenbroek isc_boolean_t
dns_compress_findglobal(dns_compress_t * cctx,const dns_name_t * name,dns_name_t * prefix,isc_uint16_t * offset)136*00b67f09SDavid van Moolenbroek dns_compress_findglobal(dns_compress_t *cctx, const dns_name_t *name,
137*00b67f09SDavid van Moolenbroek dns_name_t *prefix, isc_uint16_t *offset)
138*00b67f09SDavid van Moolenbroek {
139*00b67f09SDavid van Moolenbroek dns_name_t tname, nname;
140*00b67f09SDavid van Moolenbroek dns_compressnode_t *node = NULL;
141*00b67f09SDavid van Moolenbroek unsigned int labels, hash, n;
142*00b67f09SDavid van Moolenbroek
143*00b67f09SDavid van Moolenbroek REQUIRE(VALID_CCTX(cctx));
144*00b67f09SDavid van Moolenbroek REQUIRE(dns_name_isabsolute(name) == ISC_TRUE);
145*00b67f09SDavid van Moolenbroek REQUIRE(offset != NULL);
146*00b67f09SDavid van Moolenbroek
147*00b67f09SDavid van Moolenbroek if (cctx->count == 0)
148*00b67f09SDavid van Moolenbroek return (ISC_FALSE);
149*00b67f09SDavid van Moolenbroek
150*00b67f09SDavid van Moolenbroek labels = dns_name_countlabels(name);
151*00b67f09SDavid van Moolenbroek INSIST(labels > 0);
152*00b67f09SDavid van Moolenbroek
153*00b67f09SDavid van Moolenbroek dns_name_init(&tname, NULL);
154*00b67f09SDavid van Moolenbroek dns_name_init(&nname, NULL);
155*00b67f09SDavid van Moolenbroek
156*00b67f09SDavid van Moolenbroek for (n = 0; n < labels - 1; n++) {
157*00b67f09SDavid van Moolenbroek dns_name_getlabelsequence(name, n, labels - n, &tname);
158*00b67f09SDavid van Moolenbroek hash = dns_name_hash(&tname, ISC_FALSE) %
159*00b67f09SDavid van Moolenbroek DNS_COMPRESS_TABLESIZE;
160*00b67f09SDavid van Moolenbroek for (node = cctx->table[hash]; node != NULL; node = node->next)
161*00b67f09SDavid van Moolenbroek {
162*00b67f09SDavid van Moolenbroek NODENAME(node, &nname);
163*00b67f09SDavid van Moolenbroek if ((cctx->allowed & DNS_COMPRESS_CASESENSITIVE) != 0) {
164*00b67f09SDavid van Moolenbroek if (dns_name_caseequal(&nname, &tname))
165*00b67f09SDavid van Moolenbroek break;
166*00b67f09SDavid van Moolenbroek } else {
167*00b67f09SDavid van Moolenbroek if (dns_name_equal(&nname, &tname))
168*00b67f09SDavid van Moolenbroek break;
169*00b67f09SDavid van Moolenbroek }
170*00b67f09SDavid van Moolenbroek }
171*00b67f09SDavid van Moolenbroek if (node != NULL)
172*00b67f09SDavid van Moolenbroek break;
173*00b67f09SDavid van Moolenbroek }
174*00b67f09SDavid van Moolenbroek
175*00b67f09SDavid van Moolenbroek /*
176*00b67f09SDavid van Moolenbroek * If node == NULL, we found no match at all.
177*00b67f09SDavid van Moolenbroek */
178*00b67f09SDavid van Moolenbroek if (node == NULL)
179*00b67f09SDavid van Moolenbroek return (ISC_FALSE);
180*00b67f09SDavid van Moolenbroek
181*00b67f09SDavid van Moolenbroek if (n == 0)
182*00b67f09SDavid van Moolenbroek dns_name_reset(prefix);
183*00b67f09SDavid van Moolenbroek else
184*00b67f09SDavid van Moolenbroek dns_name_getlabelsequence(name, 0, n, prefix);
185*00b67f09SDavid van Moolenbroek
186*00b67f09SDavid van Moolenbroek *offset = node->offset;
187*00b67f09SDavid van Moolenbroek return (ISC_TRUE);
188*00b67f09SDavid van Moolenbroek }
189*00b67f09SDavid van Moolenbroek
190*00b67f09SDavid van Moolenbroek static inline unsigned int
name_length(const dns_name_t * name)191*00b67f09SDavid van Moolenbroek name_length(const dns_name_t *name) {
192*00b67f09SDavid van Moolenbroek isc_region_t r;
193*00b67f09SDavid van Moolenbroek dns_name_toregion(name, &r);
194*00b67f09SDavid van Moolenbroek return (r.length);
195*00b67f09SDavid van Moolenbroek }
196*00b67f09SDavid van Moolenbroek
197*00b67f09SDavid van Moolenbroek void
dns_compress_add(dns_compress_t * cctx,const dns_name_t * name,const dns_name_t * prefix,isc_uint16_t offset)198*00b67f09SDavid van Moolenbroek dns_compress_add(dns_compress_t *cctx, const dns_name_t *name,
199*00b67f09SDavid van Moolenbroek const dns_name_t *prefix, isc_uint16_t offset)
200*00b67f09SDavid van Moolenbroek {
201*00b67f09SDavid van Moolenbroek dns_name_t tname;
202*00b67f09SDavid van Moolenbroek unsigned int start;
203*00b67f09SDavid van Moolenbroek unsigned int n;
204*00b67f09SDavid van Moolenbroek unsigned int count;
205*00b67f09SDavid van Moolenbroek unsigned int hash;
206*00b67f09SDavid van Moolenbroek dns_compressnode_t *node;
207*00b67f09SDavid van Moolenbroek unsigned int length;
208*00b67f09SDavid van Moolenbroek unsigned int tlength;
209*00b67f09SDavid van Moolenbroek isc_uint16_t toffset;
210*00b67f09SDavid van Moolenbroek
211*00b67f09SDavid van Moolenbroek REQUIRE(VALID_CCTX(cctx));
212*00b67f09SDavid van Moolenbroek REQUIRE(dns_name_isabsolute(name));
213*00b67f09SDavid van Moolenbroek
214*00b67f09SDavid van Moolenbroek dns_name_init(&tname, NULL);
215*00b67f09SDavid van Moolenbroek
216*00b67f09SDavid van Moolenbroek n = dns_name_countlabels(name);
217*00b67f09SDavid van Moolenbroek count = dns_name_countlabels(prefix);
218*00b67f09SDavid van Moolenbroek if (dns_name_isabsolute(prefix))
219*00b67f09SDavid van Moolenbroek count--;
220*00b67f09SDavid van Moolenbroek start = 0;
221*00b67f09SDavid van Moolenbroek length = name_length(name);
222*00b67f09SDavid van Moolenbroek while (count > 0) {
223*00b67f09SDavid van Moolenbroek if (offset >= 0x4000)
224*00b67f09SDavid van Moolenbroek break;
225*00b67f09SDavid van Moolenbroek dns_name_getlabelsequence(name, start, n, &tname);
226*00b67f09SDavid van Moolenbroek hash = dns_name_hash(&tname, ISC_FALSE) %
227*00b67f09SDavid van Moolenbroek DNS_COMPRESS_TABLESIZE;
228*00b67f09SDavid van Moolenbroek tlength = name_length(&tname);
229*00b67f09SDavid van Moolenbroek toffset = (isc_uint16_t)(offset + (length - tlength));
230*00b67f09SDavid van Moolenbroek /*
231*00b67f09SDavid van Moolenbroek * Create a new node and add it.
232*00b67f09SDavid van Moolenbroek */
233*00b67f09SDavid van Moolenbroek if (cctx->count < DNS_COMPRESS_INITIALNODES)
234*00b67f09SDavid van Moolenbroek node = &cctx->initialnodes[cctx->count];
235*00b67f09SDavid van Moolenbroek else {
236*00b67f09SDavid van Moolenbroek node = isc_mem_get(cctx->mctx,
237*00b67f09SDavid van Moolenbroek sizeof(dns_compressnode_t));
238*00b67f09SDavid van Moolenbroek if (node == NULL)
239*00b67f09SDavid van Moolenbroek return;
240*00b67f09SDavid van Moolenbroek }
241*00b67f09SDavid van Moolenbroek node->count = cctx->count++;
242*00b67f09SDavid van Moolenbroek node->offset = toffset;
243*00b67f09SDavid van Moolenbroek dns_name_toregion(&tname, &node->r);
244*00b67f09SDavid van Moolenbroek node->labels = (isc_uint8_t)dns_name_countlabels(&tname);
245*00b67f09SDavid van Moolenbroek node->next = cctx->table[hash];
246*00b67f09SDavid van Moolenbroek cctx->table[hash] = node;
247*00b67f09SDavid van Moolenbroek start++;
248*00b67f09SDavid van Moolenbroek n--;
249*00b67f09SDavid van Moolenbroek count--;
250*00b67f09SDavid van Moolenbroek }
251*00b67f09SDavid van Moolenbroek }
252*00b67f09SDavid van Moolenbroek
253*00b67f09SDavid van Moolenbroek void
dns_compress_rollback(dns_compress_t * cctx,isc_uint16_t offset)254*00b67f09SDavid van Moolenbroek dns_compress_rollback(dns_compress_t *cctx, isc_uint16_t offset) {
255*00b67f09SDavid van Moolenbroek unsigned int i;
256*00b67f09SDavid van Moolenbroek dns_compressnode_t *node;
257*00b67f09SDavid van Moolenbroek
258*00b67f09SDavid van Moolenbroek REQUIRE(VALID_CCTX(cctx));
259*00b67f09SDavid van Moolenbroek
260*00b67f09SDavid van Moolenbroek for (i = 0; i < DNS_COMPRESS_TABLESIZE; i++) {
261*00b67f09SDavid van Moolenbroek node = cctx->table[i];
262*00b67f09SDavid van Moolenbroek /*
263*00b67f09SDavid van Moolenbroek * This relies on nodes with greater offsets being
264*00b67f09SDavid van Moolenbroek * closer to the beginning of the list, and the
265*00b67f09SDavid van Moolenbroek * items with the greatest offsets being at the end
266*00b67f09SDavid van Moolenbroek * of the initialnodes[] array.
267*00b67f09SDavid van Moolenbroek */
268*00b67f09SDavid van Moolenbroek while (node != NULL && node->offset >= offset) {
269*00b67f09SDavid van Moolenbroek cctx->table[i] = node->next;
270*00b67f09SDavid van Moolenbroek if (node->count >= DNS_COMPRESS_INITIALNODES)
271*00b67f09SDavid van Moolenbroek isc_mem_put(cctx->mctx, node, sizeof(*node));
272*00b67f09SDavid van Moolenbroek cctx->count--;
273*00b67f09SDavid van Moolenbroek node = cctx->table[i];
274*00b67f09SDavid van Moolenbroek }
275*00b67f09SDavid van Moolenbroek }
276*00b67f09SDavid van Moolenbroek }
277*00b67f09SDavid van Moolenbroek
278*00b67f09SDavid van Moolenbroek /***
279*00b67f09SDavid van Moolenbroek *** Decompression
280*00b67f09SDavid van Moolenbroek ***/
281*00b67f09SDavid van Moolenbroek
282*00b67f09SDavid van Moolenbroek void
dns_decompress_init(dns_decompress_t * dctx,int edns,dns_decompresstype_t type)283*00b67f09SDavid van Moolenbroek dns_decompress_init(dns_decompress_t *dctx, int edns,
284*00b67f09SDavid van Moolenbroek dns_decompresstype_t type) {
285*00b67f09SDavid van Moolenbroek
286*00b67f09SDavid van Moolenbroek REQUIRE(dctx != NULL);
287*00b67f09SDavid van Moolenbroek REQUIRE(edns >= -1 && edns <= 255);
288*00b67f09SDavid van Moolenbroek
289*00b67f09SDavid van Moolenbroek dctx->allowed = DNS_COMPRESS_NONE;
290*00b67f09SDavid van Moolenbroek dctx->edns = edns;
291*00b67f09SDavid van Moolenbroek dctx->type = type;
292*00b67f09SDavid van Moolenbroek dctx->magic = DCTX_MAGIC;
293*00b67f09SDavid van Moolenbroek }
294*00b67f09SDavid van Moolenbroek
295*00b67f09SDavid van Moolenbroek void
dns_decompress_invalidate(dns_decompress_t * dctx)296*00b67f09SDavid van Moolenbroek dns_decompress_invalidate(dns_decompress_t *dctx) {
297*00b67f09SDavid van Moolenbroek
298*00b67f09SDavid van Moolenbroek REQUIRE(VALID_DCTX(dctx));
299*00b67f09SDavid van Moolenbroek
300*00b67f09SDavid van Moolenbroek dctx->magic = 0;
301*00b67f09SDavid van Moolenbroek }
302*00b67f09SDavid van Moolenbroek
303*00b67f09SDavid van Moolenbroek void
dns_decompress_setmethods(dns_decompress_t * dctx,unsigned int allowed)304*00b67f09SDavid van Moolenbroek dns_decompress_setmethods(dns_decompress_t *dctx, unsigned int allowed) {
305*00b67f09SDavid van Moolenbroek
306*00b67f09SDavid van Moolenbroek REQUIRE(VALID_DCTX(dctx));
307*00b67f09SDavid van Moolenbroek
308*00b67f09SDavid van Moolenbroek switch (dctx->type) {
309*00b67f09SDavid van Moolenbroek case DNS_DECOMPRESS_ANY:
310*00b67f09SDavid van Moolenbroek dctx->allowed = DNS_COMPRESS_ALL;
311*00b67f09SDavid van Moolenbroek break;
312*00b67f09SDavid van Moolenbroek case DNS_DECOMPRESS_NONE:
313*00b67f09SDavid van Moolenbroek dctx->allowed = DNS_COMPRESS_NONE;
314*00b67f09SDavid van Moolenbroek break;
315*00b67f09SDavid van Moolenbroek case DNS_DECOMPRESS_STRICT:
316*00b67f09SDavid van Moolenbroek dctx->allowed = allowed;
317*00b67f09SDavid van Moolenbroek break;
318*00b67f09SDavid van Moolenbroek }
319*00b67f09SDavid van Moolenbroek }
320*00b67f09SDavid van Moolenbroek
321*00b67f09SDavid van Moolenbroek unsigned int
dns_decompress_getmethods(dns_decompress_t * dctx)322*00b67f09SDavid van Moolenbroek dns_decompress_getmethods(dns_decompress_t *dctx) {
323*00b67f09SDavid van Moolenbroek
324*00b67f09SDavid van Moolenbroek REQUIRE(VALID_DCTX(dctx));
325*00b67f09SDavid van Moolenbroek
326*00b67f09SDavid van Moolenbroek return (dctx->allowed);
327*00b67f09SDavid van Moolenbroek }
328*00b67f09SDavid van Moolenbroek
329*00b67f09SDavid van Moolenbroek int
dns_decompress_edns(dns_decompress_t * dctx)330*00b67f09SDavid van Moolenbroek dns_decompress_edns(dns_decompress_t *dctx) {
331*00b67f09SDavid van Moolenbroek
332*00b67f09SDavid van Moolenbroek REQUIRE(VALID_DCTX(dctx));
333*00b67f09SDavid van Moolenbroek
334*00b67f09SDavid van Moolenbroek return (dctx->edns);
335*00b67f09SDavid van Moolenbroek }
336*00b67f09SDavid van Moolenbroek
337*00b67f09SDavid van Moolenbroek dns_decompresstype_t
dns_decompress_type(dns_decompress_t * dctx)338*00b67f09SDavid van Moolenbroek dns_decompress_type(dns_decompress_t *dctx) {
339*00b67f09SDavid van Moolenbroek
340*00b67f09SDavid van Moolenbroek REQUIRE(VALID_DCTX(dctx));
341*00b67f09SDavid van Moolenbroek
342*00b67f09SDavid van Moolenbroek return (dctx->type);
343*00b67f09SDavid van Moolenbroek }
344