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