1135446Strhodes/*
2193149Sdougb * Copyright (C) 2004-2007, 2009  Internet Systems Consortium, Inc. ("ISC")
3135446Strhodes * Copyright (C) 1999-2002  Internet Software Consortium.
4135446Strhodes *
5193149Sdougb * Permission to use, copy, modify, and/or distribute this software for any
6135446Strhodes * purpose with or without fee is hereby granted, provided that the above
7135446Strhodes * copyright notice and this permission notice appear in all copies.
8135446Strhodes *
9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11135446Strhodes * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15135446Strhodes * PERFORMANCE OF THIS SOFTWARE.
16135446Strhodes */
17135446Strhodes
18234010Sdougb/* $Id: compress.h,v 1.42 2009/01/17 23:47:43 tbox Exp $ */
19135446Strhodes
20135446Strhodes#ifndef DNS_COMPRESS_H
21135446Strhodes#define DNS_COMPRESS_H 1
22135446Strhodes
23135446Strhodes#include <isc/lang.h>
24135446Strhodes#include <isc/region.h>
25135446Strhodes
26135446Strhodes#include <dns/types.h>
27135446Strhodes
28135446StrhodesISC_LANG_BEGINDECLS
29135446Strhodes
30170222Sdougb#define DNS_COMPRESS_NONE		0x00	/*%< no compression */
31170222Sdougb#define DNS_COMPRESS_GLOBAL14		0x01	/*%< "normal" compression. */
32170222Sdougb#define DNS_COMPRESS_ALL		0x01	/*%< all compression. */
33170222Sdougb#define DNS_COMPRESS_CASESENSITIVE	0x02	/*%< case sensitive compression. */
34135446Strhodes
35193149Sdougb/*! \file dns/compress.h
36135446Strhodes *	Direct manipulation of the structures is strongly discouraged.
37135446Strhodes */
38135446Strhodes
39135446Strhodes#define DNS_COMPRESS_TABLESIZE 64
40135446Strhodes#define DNS_COMPRESS_INITIALNODES 16
41135446Strhodes
42135446Strhodestypedef struct dns_compressnode dns_compressnode_t;
43135446Strhodes
44135446Strhodesstruct dns_compressnode {
45135446Strhodes	isc_region_t		r;
46135446Strhodes	isc_uint16_t		offset;
47135446Strhodes	isc_uint16_t		count;
48135446Strhodes	isc_uint8_t		labels;
49135446Strhodes	dns_compressnode_t	*next;
50135446Strhodes};
51135446Strhodes
52135446Strhodesstruct dns_compress {
53170222Sdougb	unsigned int		magic;		/*%< Magic number. */
54170222Sdougb	unsigned int		allowed;	/*%< Allowed methods. */
55170222Sdougb	int			edns;		/*%< Edns version or -1. */
56170222Sdougb	/*% Global compression table. */
57135446Strhodes	dns_compressnode_t	*table[DNS_COMPRESS_TABLESIZE];
58170222Sdougb	/*% Preallocated nodes for the table. */
59135446Strhodes	dns_compressnode_t	initialnodes[DNS_COMPRESS_INITIALNODES];
60170222Sdougb	isc_uint16_t		count;		/*%< Number of nodes. */
61170222Sdougb	isc_mem_t		*mctx;		/*%< Memory context. */
62135446Strhodes};
63135446Strhodes
64135446Strhodestypedef enum {
65170222Sdougb	DNS_DECOMPRESS_ANY,			/*%< Any compression */
66170222Sdougb	DNS_DECOMPRESS_STRICT,			/*%< Allowed compression */
67170222Sdougb	DNS_DECOMPRESS_NONE			/*%< No compression */
68135446Strhodes} dns_decompresstype_t;
69135446Strhodes
70135446Strhodesstruct dns_decompress {
71170222Sdougb	unsigned int		magic;		/*%< Magic number. */
72170222Sdougb	unsigned int		allowed;	/*%< Allowed methods. */
73170222Sdougb	int			edns;		/*%< Edns version or -1. */
74170222Sdougb	dns_decompresstype_t	type;		/*%< Strict checking */
75135446Strhodes};
76135446Strhodes
77135446Strhodesisc_result_t
78135446Strhodesdns_compress_init(dns_compress_t *cctx, int edns, isc_mem_t *mctx);
79170222Sdougb/*%<
80193149Sdougb *	Initialise the compression context structure pointed to by 'cctx'.
81135446Strhodes *
82135446Strhodes *	Requires:
83170222Sdougb *	\li	'cctx' is a valid dns_compress_t structure.
84170222Sdougb *	\li	'mctx' is an initialized memory context.
85135446Strhodes *	Ensures:
86170222Sdougb *	\li	cctx->global is initialized.
87135446Strhodes *
88135446Strhodes *	Returns:
89170222Sdougb *	\li	#ISC_R_SUCCESS
90170222Sdougb *	\li	failures from dns_rbt_create()
91135446Strhodes */
92135446Strhodes
93135446Strhodesvoid
94135446Strhodesdns_compress_invalidate(dns_compress_t *cctx);
95135446Strhodes
96170222Sdougb/*%<
97135446Strhodes *	Invalidate the compression structure pointed to by cctx.
98135446Strhodes *
99135446Strhodes *	Requires:
100170222Sdougb *\li		'cctx' to be initialized.
101135446Strhodes */
102135446Strhodes
103135446Strhodesvoid
104135446Strhodesdns_compress_setmethods(dns_compress_t *cctx, unsigned int allowed);
105135446Strhodes
106170222Sdougb/*%<
107135446Strhodes *	Sets allowed compression methods.
108135446Strhodes *
109135446Strhodes *	Requires:
110170222Sdougb *\li		'cctx' to be initialized.
111135446Strhodes */
112135446Strhodes
113135446Strhodesunsigned int
114135446Strhodesdns_compress_getmethods(dns_compress_t *cctx);
115135446Strhodes
116170222Sdougb/*%<
117135446Strhodes *	Gets allowed compression methods.
118135446Strhodes *
119135446Strhodes *	Requires:
120170222Sdougb *\li		'cctx' to be initialized.
121135446Strhodes *
122135446Strhodes *	Returns:
123170222Sdougb *\li		allowed compression bitmap.
124135446Strhodes */
125135446Strhodes
126170222Sdougbvoid
127170222Sdougbdns_compress_setsensitive(dns_compress_t *cctx, isc_boolean_t sensitive);
128170222Sdougb
129170222Sdougb/*
130170222Sdougb *	Preserve the case of compressed domain names.
131170222Sdougb *
132170222Sdougb *	Requires:
133170222Sdougb *		'cctx' to be initialized.
134170222Sdougb */
135170222Sdougb
136170222Sdougbisc_boolean_t
137170222Sdougbdns_compress_getsensitive(dns_compress_t *cctx);
138170222Sdougb/*
139193149Sdougb *	Return whether case is to be preserved when compressing
140170222Sdougb *	domain names.
141170222Sdougb *
142170222Sdougb *	Requires:
143170222Sdougb *		'cctx' to be initialized.
144170222Sdougb */
145170222Sdougb
146135446Strhodesint
147135446Strhodesdns_compress_getedns(dns_compress_t *cctx);
148135446Strhodes
149170222Sdougb/*%<
150135446Strhodes *	Gets edns value.
151135446Strhodes *
152135446Strhodes *	Requires:
153170222Sdougb *\li		'cctx' to be initialized.
154135446Strhodes *
155135446Strhodes *	Returns:
156170222Sdougb *\li		-1 .. 255
157135446Strhodes */
158135446Strhodes
159135446Strhodesisc_boolean_t
160165071Sdougbdns_compress_findglobal(dns_compress_t *cctx, const dns_name_t *name,
161135446Strhodes			dns_name_t *prefix, isc_uint16_t *offset);
162170222Sdougb/*%<
163135446Strhodes *	Finds longest possible match of 'name' in the global compression table.
164135446Strhodes *
165135446Strhodes *	Requires:
166170222Sdougb *\li		'cctx' to be initialized.
167170222Sdougb *\li		'name' to be a absolute name.
168170222Sdougb *\li		'prefix' to be initialized.
169170222Sdougb *\li		'offset' to point to an isc_uint16_t.
170135446Strhodes *
171135446Strhodes *	Ensures:
172170222Sdougb *\li		'prefix' and 'offset' are valid if ISC_TRUE is 	returned.
173135446Strhodes *
174135446Strhodes *	Returns:
175170222Sdougb *\li		#ISC_TRUE / #ISC_FALSE
176135446Strhodes */
177135446Strhodes
178135446Strhodesvoid
179165071Sdougbdns_compress_add(dns_compress_t *cctx, const dns_name_t *name,
180165071Sdougb		 const dns_name_t *prefix, isc_uint16_t offset);
181170222Sdougb/*%<
182135446Strhodes *	Add compression pointers for 'name' to the compression table,
183135446Strhodes *	not replacing existing pointers.
184135446Strhodes *
185135446Strhodes *	Requires:
186170222Sdougb *\li		'cctx' initialized
187135446Strhodes *
188170222Sdougb *\li		'name' must be initialized and absolute, and must remain
189135446Strhodes *		valid until the message compression is complete.
190135446Strhodes *
191170222Sdougb *\li		'prefix' must be a prefix returned by
192135446Strhodes *		dns_compress_findglobal(), or the same as 'name'.
193135446Strhodes */
194135446Strhodes
195135446Strhodesvoid
196135446Strhodesdns_compress_rollback(dns_compress_t *cctx, isc_uint16_t offset);
197135446Strhodes
198170222Sdougb/*%<
199135446Strhodes *	Remove any compression pointers from global table >= offset.
200135446Strhodes *
201135446Strhodes *	Requires:
202170222Sdougb *\li		'cctx' is initialized.
203135446Strhodes */
204135446Strhodes
205135446Strhodesvoid
206135446Strhodesdns_decompress_init(dns_decompress_t *dctx, int edns,
207135446Strhodes		    dns_decompresstype_t type);
208135446Strhodes
209170222Sdougb/*%<
210135446Strhodes *	Initializes 'dctx'.
211135446Strhodes *	Records 'edns' and 'type' into the structure.
212135446Strhodes *
213135446Strhodes *	Requires:
214170222Sdougb *\li		'dctx' to be a valid pointer.
215135446Strhodes */
216135446Strhodes
217135446Strhodesvoid
218135446Strhodesdns_decompress_invalidate(dns_decompress_t *dctx);
219135446Strhodes
220170222Sdougb/*%<
221135446Strhodes *	Invalidates 'dctx'.
222135446Strhodes *
223135446Strhodes *	Requires:
224170222Sdougb *\li		'dctx' to be initialized
225135446Strhodes */
226135446Strhodes
227135446Strhodesvoid
228135446Strhodesdns_decompress_setmethods(dns_decompress_t *dctx, unsigned int allowed);
229135446Strhodes
230170222Sdougb/*%<
231135446Strhodes *	Sets 'dctx->allowed' to 'allowed'.
232135446Strhodes *
233135446Strhodes *	Requires:
234170222Sdougb *\li		'dctx' to be initialized
235135446Strhodes */
236135446Strhodes
237135446Strhodesunsigned int
238135446Strhodesdns_decompress_getmethods(dns_decompress_t *dctx);
239135446Strhodes
240170222Sdougb/*%<
241135446Strhodes *	Returns 'dctx->allowed'
242135446Strhodes *
243135446Strhodes *	Requires:
244170222Sdougb *\li		'dctx' to be initialized
245135446Strhodes */
246135446Strhodes
247135446Strhodesint
248135446Strhodesdns_decompress_edns(dns_decompress_t *dctx);
249135446Strhodes
250170222Sdougb/*%<
251135446Strhodes *	Returns 'dctx->edns'
252135446Strhodes *
253135446Strhodes *	Requires:
254170222Sdougb *\li		'dctx' to be initialized
255135446Strhodes */
256135446Strhodes
257135446Strhodesdns_decompresstype_t
258135446Strhodesdns_decompress_type(dns_decompress_t *dctx);
259135446Strhodes
260170222Sdougb/*%<
261135446Strhodes *	Returns 'dctx->type'
262135446Strhodes *
263135446Strhodes *	Requires:
264170222Sdougb *\li		'dctx' to be initialized
265135446Strhodes */
266135446Strhodes
267135446StrhodesISC_LANG_ENDDECLS
268135446Strhodes
269135446Strhodes#endif /* DNS_COMPRESS_H */
270