1/* 2 * Copyright (C) 2004-2007, 2009 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: compress.h,v 1.42 2009/01/17 23:47:43 tbox Exp $ */ 19 20#ifndef DNS_COMPRESS_H 21#define DNS_COMPRESS_H 1 22 23#include <isc/lang.h> 24#include <isc/region.h> 25 26#include <dns/types.h> 27 28ISC_LANG_BEGINDECLS 29 30#define DNS_COMPRESS_NONE 0x00 /*%< no compression */ 31#define DNS_COMPRESS_GLOBAL14 0x01 /*%< "normal" compression. */ 32#define DNS_COMPRESS_ALL 0x01 /*%< all compression. */ 33#define DNS_COMPRESS_CASESENSITIVE 0x02 /*%< case sensitive compression. */ 34 35/*! \file dns/compress.h 36 * Direct manipulation of the structures is strongly discouraged. 37 */ 38 39#define DNS_COMPRESS_TABLESIZE 64 40#define DNS_COMPRESS_INITIALNODES 16 41 42typedef struct dns_compressnode dns_compressnode_t; 43 44struct dns_compressnode { 45 isc_region_t r; 46 isc_uint16_t offset; 47 isc_uint16_t count; 48 isc_uint8_t labels; 49 dns_compressnode_t *next; 50}; 51 52struct dns_compress { 53 unsigned int magic; /*%< Magic number. */ 54 unsigned int allowed; /*%< Allowed methods. */ 55 int edns; /*%< Edns version or -1. */ 56 /*% Global compression table. */ 57 dns_compressnode_t *table[DNS_COMPRESS_TABLESIZE]; 58 /*% Preallocated nodes for the table. */ 59 dns_compressnode_t initialnodes[DNS_COMPRESS_INITIALNODES]; 60 isc_uint16_t count; /*%< Number of nodes. */ 61 isc_mem_t *mctx; /*%< Memory context. */ 62}; 63 64typedef enum { 65 DNS_DECOMPRESS_ANY, /*%< Any compression */ 66 DNS_DECOMPRESS_STRICT, /*%< Allowed compression */ 67 DNS_DECOMPRESS_NONE /*%< No compression */ 68} dns_decompresstype_t; 69 70struct dns_decompress { 71 unsigned int magic; /*%< Magic number. */ 72 unsigned int allowed; /*%< Allowed methods. */ 73 int edns; /*%< Edns version or -1. */ 74 dns_decompresstype_t type; /*%< Strict checking */ 75}; 76 77isc_result_t 78dns_compress_init(dns_compress_t *cctx, int edns, isc_mem_t *mctx); 79/*%< 80 * Initialise the compression context structure pointed to by 'cctx'. 81 * 82 * Requires: 83 * \li 'cctx' is a valid dns_compress_t structure. 84 * \li 'mctx' is an initialized memory context. 85 * Ensures: 86 * \li cctx->global is initialized. 87 * 88 * Returns: 89 * \li #ISC_R_SUCCESS 90 * \li failures from dns_rbt_create() 91 */ 92 93void 94dns_compress_invalidate(dns_compress_t *cctx); 95 96/*%< 97 * Invalidate the compression structure pointed to by cctx. 98 * 99 * Requires: 100 *\li 'cctx' to be initialized. 101 */ 102 103void 104dns_compress_setmethods(dns_compress_t *cctx, unsigned int allowed); 105 106/*%< 107 * Sets allowed compression methods. 108 * 109 * Requires: 110 *\li 'cctx' to be initialized. 111 */ 112 113unsigned int 114dns_compress_getmethods(dns_compress_t *cctx); 115 116/*%< 117 * Gets allowed compression methods. 118 * 119 * Requires: 120 *\li 'cctx' to be initialized. 121 * 122 * Returns: 123 *\li allowed compression bitmap. 124 */ 125 126void 127dns_compress_setsensitive(dns_compress_t *cctx, isc_boolean_t sensitive); 128 129/* 130 * Preserve the case of compressed domain names. 131 * 132 * Requires: 133 * 'cctx' to be initialized. 134 */ 135 136isc_boolean_t 137dns_compress_getsensitive(dns_compress_t *cctx); 138/* 139 * Return whether case is to be preserved when compressing 140 * domain names. 141 * 142 * Requires: 143 * 'cctx' to be initialized. 144 */ 145 146int 147dns_compress_getedns(dns_compress_t *cctx); 148 149/*%< 150 * Gets edns value. 151 * 152 * Requires: 153 *\li 'cctx' to be initialized. 154 * 155 * Returns: 156 *\li -1 .. 255 157 */ 158 159isc_boolean_t 160dns_compress_findglobal(dns_compress_t *cctx, const dns_name_t *name, 161 dns_name_t *prefix, isc_uint16_t *offset); 162/*%< 163 * Finds longest possible match of 'name' in the global compression table. 164 * 165 * Requires: 166 *\li 'cctx' to be initialized. 167 *\li 'name' to be a absolute name. 168 *\li 'prefix' to be initialized. 169 *\li 'offset' to point to an isc_uint16_t. 170 * 171 * Ensures: 172 *\li 'prefix' and 'offset' are valid if ISC_TRUE is returned. 173 * 174 * Returns: 175 *\li #ISC_TRUE / #ISC_FALSE 176 */ 177 178void 179dns_compress_add(dns_compress_t *cctx, const dns_name_t *name, 180 const dns_name_t *prefix, isc_uint16_t offset); 181/*%< 182 * Add compression pointers for 'name' to the compression table, 183 * not replacing existing pointers. 184 * 185 * Requires: 186 *\li 'cctx' initialized 187 * 188 *\li 'name' must be initialized and absolute, and must remain 189 * valid until the message compression is complete. 190 * 191 *\li 'prefix' must be a prefix returned by 192 * dns_compress_findglobal(), or the same as 'name'. 193 */ 194 195void 196dns_compress_rollback(dns_compress_t *cctx, isc_uint16_t offset); 197 198/*%< 199 * Remove any compression pointers from global table >= offset. 200 * 201 * Requires: 202 *\li 'cctx' is initialized. 203 */ 204 205void 206dns_decompress_init(dns_decompress_t *dctx, int edns, 207 dns_decompresstype_t type); 208 209/*%< 210 * Initializes 'dctx'. 211 * Records 'edns' and 'type' into the structure. 212 * 213 * Requires: 214 *\li 'dctx' to be a valid pointer. 215 */ 216 217void 218dns_decompress_invalidate(dns_decompress_t *dctx); 219 220/*%< 221 * Invalidates 'dctx'. 222 * 223 * Requires: 224 *\li 'dctx' to be initialized 225 */ 226 227void 228dns_decompress_setmethods(dns_decompress_t *dctx, unsigned int allowed); 229 230/*%< 231 * Sets 'dctx->allowed' to 'allowed'. 232 * 233 * Requires: 234 *\li 'dctx' to be initialized 235 */ 236 237unsigned int 238dns_decompress_getmethods(dns_decompress_t *dctx); 239 240/*%< 241 * Returns 'dctx->allowed' 242 * 243 * Requires: 244 *\li 'dctx' to be initialized 245 */ 246 247int 248dns_decompress_edns(dns_decompress_t *dctx); 249 250/*%< 251 * Returns 'dctx->edns' 252 * 253 * Requires: 254 *\li 'dctx' to be initialized 255 */ 256 257dns_decompresstype_t 258dns_decompress_type(dns_decompress_t *dctx); 259 260/*%< 261 * Returns 'dctx->type' 262 * 263 * Requires: 264 *\li 'dctx' to be initialized 265 */ 266 267ISC_LANG_ENDDECLS 268 269#endif /* DNS_COMPRESS_H */ 270