1135446Strhodes/*
2193149Sdougb * Copyright (C) 2004-2008  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: rdataslab.h,v 1.33 2008/04/01 23:47:10 tbox Exp $ */
19135446Strhodes
20135446Strhodes#ifndef DNS_RDATASLAB_H
21135446Strhodes#define DNS_RDATASLAB_H 1
22135446Strhodes
23193149Sdougb/*! \file dns/rdataslab.h
24170222Sdougb * \brief
25135446Strhodes * Implements storage of rdatasets into slabs of memory.
26135446Strhodes *
27135446Strhodes * MP:
28170222Sdougb *\li	Clients of this module must impose any required synchronization.
29135446Strhodes *
30135446Strhodes * Reliability:
31170222Sdougb *\li	This module deals with low-level byte streams.  Errors in any of
32135446Strhodes *	the functions are likely to crash the server or corrupt memory.
33135446Strhodes *
34170222Sdougb *\li	If the caller passes invalid memory references, these functions are
35135446Strhodes *	likely to crash the server or corrupt memory.
36135446Strhodes *
37135446Strhodes * Resources:
38170222Sdougb *\li	None.
39135446Strhodes *
40135446Strhodes * Security:
41170222Sdougb *\li	None.
42135446Strhodes *
43135446Strhodes * Standards:
44170222Sdougb *\li	None.
45135446Strhodes */
46135446Strhodes
47135446Strhodes/***
48135446Strhodes *** Imports
49135446Strhodes ***/
50135446Strhodes
51135446Strhodes#include <isc/lang.h>
52135446Strhodes
53135446Strhodes#include <dns/types.h>
54135446Strhodes
55135446StrhodesISC_LANG_BEGINDECLS
56135446Strhodes
57135446Strhodes#define DNS_RDATASLAB_FORCE 0x1
58135446Strhodes#define DNS_RDATASLAB_EXACT 0x2
59135446Strhodes
60193149Sdougb#define DNS_RDATASLAB_OFFLINE 0x01 	/* RRSIG is for offline DNSKEY */
61193149Sdougb#define DNS_RDATASLAB_WARNMASK 0x0E	/*%< RRSIG(DNSKEY) expired
62193149Sdougb					 * warnings number mask. */
63193149Sdougb#define DNS_RDATASLAB_WARNSHIFT 1	/*%< How many bits to shift to find
64193149Sdougb					 * remaining expired warning number. */
65193149Sdougb
66193149Sdougb
67135446Strhodes/***
68135446Strhodes *** Functions
69135446Strhodes ***/
70135446Strhodes
71135446Strhodesisc_result_t
72135446Strhodesdns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
73135446Strhodes			   isc_region_t *region, unsigned int reservelen);
74170222Sdougb/*%<
75135446Strhodes * Slabify a rdataset.  The slab area will be allocated and returned
76135446Strhodes * in 'region'.
77135446Strhodes *
78135446Strhodes * Requires:
79170222Sdougb *\li	'rdataset' is valid.
80135446Strhodes *
81135446Strhodes * Ensures:
82170222Sdougb *\li	'region' will have base pointing to the start of allocated memory,
83135446Strhodes *	with the slabified region beginning at region->base + reservelen.
84135446Strhodes *	region->length contains the total length allocated.
85135446Strhodes *
86135446Strhodes * Returns:
87170222Sdougb *\li	ISC_R_SUCCESS		- successful completion
88170222Sdougb *\li	ISC_R_NOMEMORY		- no memory.
89170222Sdougb *\li	XXX others
90135446Strhodes */
91135446Strhodes
92135446Strhodesvoid
93135446Strhodesdns_rdataslab_tordataset(unsigned char *slab, unsigned int reservelen,
94135446Strhodes			 dns_rdataclass_t rdclass, dns_rdatatype_t rdtype,
95135446Strhodes			 dns_rdatatype_t covers, dns_ttl_t ttl,
96135446Strhodes			 dns_rdataset_t *rdataset);
97170222Sdougb/*%<
98135446Strhodes * Construct an rdataset from a slab.
99135446Strhodes *
100135446Strhodes * Requires:
101170222Sdougb *\li	'slab' points to a slab.
102170222Sdougb *\li	'rdataset' is disassociated.
103135446Strhodes *
104135446Strhodes * Ensures:
105170222Sdougb *\li	'rdataset' is associated and points to a valid rdataest.
106135446Strhodes */
107135446Strhodesunsigned int
108135446Strhodesdns_rdataslab_size(unsigned char *slab, unsigned int reservelen);
109170222Sdougb/*%<
110135446Strhodes * Return the total size of an rdataslab.
111135446Strhodes *
112135446Strhodes * Requires:
113170222Sdougb *\li	'slab' points to a slab.
114135446Strhodes *
115135446Strhodes * Returns:
116170222Sdougb *\li	The number of bytes in the slab, including the reservelen.
117135446Strhodes */
118135446Strhodes
119135446Strhodesisc_result_t
120135446Strhodesdns_rdataslab_merge(unsigned char *oslab, unsigned char *nslab,
121135446Strhodes		    unsigned int reservelen, isc_mem_t *mctx,
122135446Strhodes		    dns_rdataclass_t rdclass, dns_rdatatype_t type,
123135446Strhodes		    unsigned int flags, unsigned char **tslabp);
124170222Sdougb/*%<
125135446Strhodes * Merge 'oslab' and 'nslab'.
126135446Strhodes */
127135446Strhodes
128135446Strhodesisc_result_t
129135446Strhodesdns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
130135446Strhodes		       unsigned int reservelen, isc_mem_t *mctx,
131135446Strhodes		       dns_rdataclass_t rdclass, dns_rdatatype_t type,
132135446Strhodes		       unsigned int flags, unsigned char **tslabp);
133170222Sdougb/*%<
134135446Strhodes * Subtract 'sslab' from 'mslab'.  If 'exact' is true then all elements
135135446Strhodes * of 'sslab' must exist in 'mslab'.
136135446Strhodes *
137135446Strhodes * XXX
138135446Strhodes * valid flags are DNS_RDATASLAB_EXACT
139135446Strhodes */
140135446Strhodes
141135446Strhodesisc_boolean_t
142135446Strhodesdns_rdataslab_equal(unsigned char *slab1, unsigned char *slab2,
143135446Strhodes		    unsigned int reservelen);
144170222Sdougb/*%<
145135446Strhodes * Compare two rdataslabs for equality.  This does _not_ do a full
146135446Strhodes * DNSSEC comparison.
147135446Strhodes *
148135446Strhodes * Requires:
149170222Sdougb *\li	'slab1' and 'slab2' point to slabs.
150135446Strhodes *
151135446Strhodes * Returns:
152170222Sdougb *\li	ISC_TRUE if the slabs are equal, ISC_FALSE otherwise.
153135446Strhodes */
154135446Strhodesisc_boolean_t
155135446Strhodesdns_rdataslab_equalx(unsigned char *slab1, unsigned char *slab2,
156193149Sdougb		     unsigned int reservelen, dns_rdataclass_t rdclass,
157135446Strhodes		     dns_rdatatype_t type);
158170222Sdougb/*%<
159193149Sdougb * Compare two rdataslabs for DNSSEC equality.
160135446Strhodes *
161135446Strhodes * Requires:
162170222Sdougb *\li	'slab1' and 'slab2' point to slabs.
163135446Strhodes *
164135446Strhodes * Returns:
165170222Sdougb *\li	ISC_TRUE if the slabs are equal, #ISC_FALSE otherwise.
166135446Strhodes */
167135446Strhodes
168135446StrhodesISC_LANG_ENDDECLS
169135446Strhodes
170135446Strhodes#endif /* DNS_RDATASLAB_H */
171