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