1 /*
2  * Copyright (C) 2004-2008  Internet Systems Consortium, Inc. ("ISC")
3  * Copyright (C) 1999-2002  Internet Software Consortium.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15  * PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 /* $Id: rdataslab.h,v 1.33 2008/04/01 23:47:10 tbox Exp $ */
19 
20 #ifndef DNS_RDATASLAB_H
21 #define DNS_RDATASLAB_H 1
22 
23 /*! \file dns/rdataslab.h
24  * \brief
25  * Implements storage of rdatasets into slabs of memory.
26  *
27  * MP:
28  *\li	Clients of this module must impose any required synchronization.
29  *
30  * Reliability:
31  *\li	This module deals with low-level byte streams.  Errors in any of
32  *	the functions are likely to crash the server or corrupt memory.
33  *
34  *\li	If the caller passes invalid memory references, these functions are
35  *	likely to crash the server or corrupt memory.
36  *
37  * Resources:
38  *\li	None.
39  *
40  * Security:
41  *\li	None.
42  *
43  * Standards:
44  *\li	None.
45  */
46 
47 /***
48  *** Imports
49  ***/
50 
51 #include <isc/lang.h>
52 
53 #include <dns/types.h>
54 
55 ISC_LANG_BEGINDECLS
56 
57 #define DNS_RDATASLAB_FORCE 0x1
58 #define DNS_RDATASLAB_EXACT 0x2
59 
60 #define DNS_RDATASLAB_OFFLINE 0x01 	/* RRSIG is for offline DNSKEY */
61 #define DNS_RDATASLAB_WARNMASK 0x0E	/*%< RRSIG(DNSKEY) expired
62 					 * warnings number mask. */
63 #define DNS_RDATASLAB_WARNSHIFT 1	/*%< How many bits to shift to find
64 					 * remaining expired warning number. */
65 
66 
67 /***
68  *** Functions
69  ***/
70 
71 isc_result_t
72 dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
73 			   isc_region_t *region, unsigned int reservelen);
74 /*%<
75  * Slabify a rdataset.  The slab area will be allocated and returned
76  * in 'region'.
77  *
78  * Requires:
79  *\li	'rdataset' is valid.
80  *
81  * Ensures:
82  *\li	'region' will have base pointing to the start of allocated memory,
83  *	with the slabified region beginning at region->base + reservelen.
84  *	region->length contains the total length allocated.
85  *
86  * Returns:
87  *\li	ISC_R_SUCCESS		- successful completion
88  *\li	ISC_R_NOMEMORY		- no memory.
89  *\li	XXX others
90  */
91 
92 void
93 dns_rdataslab_tordataset(unsigned char *slab, unsigned int reservelen,
94 			 dns_rdataclass_t rdclass, dns_rdatatype_t rdtype,
95 			 dns_rdatatype_t covers, dns_ttl_t ttl,
96 			 dns_rdataset_t *rdataset);
97 /*%<
98  * Construct an rdataset from a slab.
99  *
100  * Requires:
101  *\li	'slab' points to a slab.
102  *\li	'rdataset' is disassociated.
103  *
104  * Ensures:
105  *\li	'rdataset' is associated and points to a valid rdataest.
106  */
107 unsigned int
108 dns_rdataslab_size(unsigned char *slab, unsigned int reservelen);
109 /*%<
110  * Return the total size of an rdataslab.
111  *
112  * Requires:
113  *\li	'slab' points to a slab.
114  *
115  * Returns:
116  *\li	The number of bytes in the slab, including the reservelen.
117  */
118 
119 isc_result_t
120 dns_rdataslab_merge(unsigned char *oslab, unsigned char *nslab,
121 		    unsigned int reservelen, isc_mem_t *mctx,
122 		    dns_rdataclass_t rdclass, dns_rdatatype_t type,
123 		    unsigned int flags, unsigned char **tslabp);
124 /*%<
125  * Merge 'oslab' and 'nslab'.
126  */
127 
128 isc_result_t
129 dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
130 		       unsigned int reservelen, isc_mem_t *mctx,
131 		       dns_rdataclass_t rdclass, dns_rdatatype_t type,
132 		       unsigned int flags, unsigned char **tslabp);
133 /*%<
134  * Subtract 'sslab' from 'mslab'.  If 'exact' is true then all elements
135  * of 'sslab' must exist in 'mslab'.
136  *
137  * XXX
138  * valid flags are DNS_RDATASLAB_EXACT
139  */
140 
141 isc_boolean_t
142 dns_rdataslab_equal(unsigned char *slab1, unsigned char *slab2,
143 		    unsigned int reservelen);
144 /*%<
145  * Compare two rdataslabs for equality.  This does _not_ do a full
146  * DNSSEC comparison.
147  *
148  * Requires:
149  *\li	'slab1' and 'slab2' point to slabs.
150  *
151  * Returns:
152  *\li	ISC_TRUE if the slabs are equal, ISC_FALSE otherwise.
153  */
154 isc_boolean_t
155 dns_rdataslab_equalx(unsigned char *slab1, unsigned char *slab2,
156 		     unsigned int reservelen, dns_rdataclass_t rdclass,
157 		     dns_rdatatype_t type);
158 /*%<
159  * Compare two rdataslabs for DNSSEC equality.
160  *
161  * Requires:
162  *\li	'slab1' and 'slab2' point to slabs.
163  *
164  * Returns:
165  *\li	ISC_TRUE if the slabs are equal, #ISC_FALSE otherwise.
166  */
167 
168 ISC_LANG_ENDDECLS
169 
170 #endif /* DNS_RDATASLAB_H */
171