compress.h revision 3ddd814a97de1d152ba0913c592d6e6dc83d38a6
ddccd5811feff696ba460dabfb666ce61040f545Andreas Gustafsson/*
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Copyright (C) 1999 Internet Software Consortium.
75c0816e8295e180f4bc7f10db3d0d880383bc1cMark Andrews *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Permission to use, copy, modify, and distribute this software for any
ddccd5811feff696ba460dabfb666ce61040f545Andreas Gustafsson * purpose with or without fee is hereby granted, provided that the above
ddccd5811feff696ba460dabfb666ce61040f545Andreas Gustafsson * copyright notice and this permission notice appear in all copies.
ddccd5811feff696ba460dabfb666ce61040f545Andreas Gustafsson *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
8a66318e41ed14c5a88130e8c362610e8faa2121Mark Andrews * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
8a66318e41ed14c5a88130e8c362610e8faa2121Mark Andrews * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
8a66318e41ed14c5a88130e8c362610e8faa2121Mark Andrews * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
8a66318e41ed14c5a88130e8c362610e8faa2121Mark Andrews * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
8a66318e41ed14c5a88130e8c362610e8faa2121Mark Andrews * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
8a66318e41ed14c5a88130e8c362610e8faa2121Mark Andrews * SOFTWARE.
ddccd5811feff696ba460dabfb666ce61040f545Andreas Gustafsson */
75c0816e8295e180f4bc7f10db3d0d880383bc1cMark Andrews
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#ifndef DNS_COMPRESS_H
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define DNS_COMPRESS_H 1
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <isc/mem.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <isc/lang.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <dns/types.h>
75c0816e8295e180f4bc7f10db3d0d880383bc1cMark Andrews#include <dns/rbt.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinISC_LANG_BEGINDECLS
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define DNS_COMPRESS_NONE 0x00 /* no compression */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define DNS_COMPRESS_GLOBAL14 0x01 /* "normal" compression. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define DNS_COMPRESS_GLOBAL16 0x02 /* 16-bit global comp. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define DNS_COMPRESS_GLOBAL 0x03 /* all global comp. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define DNS_COMPRESS_LOCAL 0x04 /* local compression. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define DNS_COMPRESS_ALL 0x07 /* all compression. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * XXX An API for manipulating these structures will be forthcoming.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Also magic numbers, _init() and _invalidate(), etc. At that time,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * direct manipulation of the structures will be strongly discouraged.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinstruct dns_compress {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein unsigned int magic; /* Magic number. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein unsigned int allowed; /* Allowed methods. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein unsigned int rdata; /* Start of local rdata. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_boolean_t global16; /* 16 bit offsets allowed. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein int edns; /* Edns version or -1. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein dns_rbt_t *local; /* Local RBT. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein dns_rbt_t *global; /* Global RBT. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_mem_t *mctx; /* Memeory context. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein};
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinstruct dns_decompress {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein unsigned int magic; /* Magic number. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein unsigned int allowed; /* Allowed methods. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein unsigned int rdata; /* Start of local rdata. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein int edns; /* Edns version or -1. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_boolean_t strict; /* Strict checking */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein dns_name_t owner_name; /* For local compression. */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein};
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinisc_result_t dns_compress_init(dns_compress_t *cctx, int edns,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_mem_t *mctx);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Inialise the compression context structure pointed to by 'cctx'.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Requires:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'cctx' is a valid dns_compress_t structure.
75c0816e8295e180f4bc7f10db3d0d880383bc1cMark Andrews * 'mctx' is a initalised memory context.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Ensures:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * cctx->global is initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Returns:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * DNS_R_SUCCESS
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * failures from dns_rbt_create()
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinisc_result_t
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeindns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_buffer_t *target);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
ddccd5811feff696ba460dabfb666ce61040f545Andreas Gustafsson/*
8eea877894ea5bcf5cdd9ca124a8601ad421d753Andreas Gustafsson * Initalise 'cctx->local'.
8eea877894ea5bcf5cdd9ca124a8601ad421d753Andreas Gustafsson * All compression pointers pointing to logical labels in owner.
8eea877894ea5bcf5cdd9ca124a8601ad421d753Andreas Gustafsson * Record start of rdata 'target->used'.
8eea877894ea5bcf5cdd9ca124a8601ad421d753Andreas Gustafsson *
8eea877894ea5bcf5cdd9ca124a8601ad421d753Andreas Gustafsson * Ensures:
8eea877894ea5bcf5cdd9ca124a8601ad421d753Andreas Gustafsson * 'cctx->local' is valid.
8eea877894ea5bcf5cdd9ca124a8601ad421d753Andreas Gustafsson *
8eea877894ea5bcf5cdd9ca124a8601ad421d753Andreas Gustafsson * Requires:
8eea877894ea5bcf5cdd9ca124a8601ad421d753Andreas Gustafsson * 'cctx' initaliased
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'cctx->local' be NULL
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'owner' is a absolute name
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'target' is a valid buffer
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Returns:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * DNS_R_SUCCESS
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * failures from dns_rbt_create()
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinvoid
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeindns_compress_invalidate(dns_compress_t *cctx);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Invalidate the compression structure pointed to by cctx.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Destroys 'cctx->glocal' and 'cctx->local' RBT.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Requires:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'cctx' to be initalised.
ddccd5811feff696ba460dabfb666ce61040f545Andreas Gustafsson */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinvoid
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeindns_compress_localinvalidate(dns_compress_t *cctx);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Destroys 'cctx->local'.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Requires:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'cctx' to be initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinvoid
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeindns_compress_setmethods(dns_compress_t *cctx, unsigned int allowed);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Sets allowed compression methods.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Requires:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'cctx' to be initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinunsigned int
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeindns_compress_getmethods(dns_compress_t *cctx);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Gets allowed compression methods.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Requires:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'cctx' to be initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Returns:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * allowed compression bitmap.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinint
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeindns_compress_getedns(dns_compress_t *cctx);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Gets edns value.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Requires:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'cctx' to be initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Returns:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * -1 .. 255
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinisc_boolean_t
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeindns_compress_findglobal(dns_compress_t *cctx, dns_name_t *name,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein dns_name_t *prefix, dns_name_t *suffix,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_uint16_t *offset, isc_buffer_t *workspace);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Finds longest possible match of 'name' in the global compression
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * RBT. Workspace needs to be large enough to hold 'name' when split
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * in two (length->name + 3).
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Requires:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'cctx' to be initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'name' to be a absolute name.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'prefix' to be initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'suffix' to be initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'offset' to point it a isc_uint16_t.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'workspace' to be initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Ensures:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'prefix', 'suffix' and 'offset' are valid is ISC_TRUE is
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * returned.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Returns:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * ISC_TRUE / ISC_FALSE
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinisc_boolean_t
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeindns_compress_findlocal(dns_compress_t *cctx, dns_name_t *name,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein dns_name_t *prefix, dns_name_t *suffix,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_uint16_t *offset, isc_buffer_t *workspace);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Finds longest possible match of 'name' in the local compression
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * RBT. Workspace needs to be large enough to hold 'name' when split
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * in two (length->name + 3).
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Requires:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'cctx' to be initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'name' to be a absolute name.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'prefix' to be initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'suffix' to be initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'offset' to point it a isc_uint16_t.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'workspace' to be initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Ensures:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'prefix', 'suffix' and 'offset' are valid is ISC_TRUE is
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * returned.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Returns:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * ISC_TRUE / ISC_FALSE
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinvoid
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeindns_compress_add(dns_compress_t *cctx, dns_name_t *prefix,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein dns_name_t *suffix, isc_uint16_t offset,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_boolean_t local);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Add compression pointers for labels in prefix to RBT's.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * If 'prefix' is absolute 'suffix' must be NULL otherwise
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * suffix must be absolute.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'local' indicates that the domain name at offset contains
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * a local compression pointer.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Requires:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'cctx' initalised
75c0816e8295e180f4bc7f10db3d0d880383bc1cMark Andrews * 'prefix' to be initalised
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'suffix' to be initalised or NULL
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinvoid
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeindns_compress_rollback(dns_compress_t *cctx, isc_uint16_t offset);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Remove any compression pointers from global RBT >= offset.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * Requires:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * 'cctx' is initalised.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
void
dns_decompress_init(dns_decompress_t *dctx, int edns, isc_boolean_t strict);
/*
* Initalises 'dctx'.
* Records 'edns' and 'strict' into the structure.
*
* Requires:
* 'dctx' to be a valid pointer.
*/
void
dns_decompress_localinit(dns_decompress_t *dctx, dns_name_t *name,
isc_buffer_t *source);
/*
* Initalises 'dctx->name' from name.
* Records 'source->current' as the start of the rdata section.
*
* Requires:
* 'dctx' to be initalised
* 'name' to be absolute
* 'source' to be a BINARY buffer.
*/
void
dns_decompress_invalidate(dns_decompress_t *dctx);
/*
* Invalidates 'dctx'.
*
* Requires:
* 'dctx' to be initalised
*/
void
dns_decompress_localinvalidate(dns_decompress_t *dctx);
/*
* Invalidates 'dctx->name'.
*
* Requires:
* 'dctx' to be initalised
*/
void
dns_decompress_setmethods(dns_decompress_t *dctx, unsigned int allowed);
/*
* Sets 'dctx->allowed' to 'allowed'.
*
* Requires:
* 'dctx' to be initalised
*/
unsigned int
dns_decompress_getmethods(dns_decompress_t *dctx);
/*
* Returns 'dctx->allowed'
*
* Requires:
* 'dctx' to be initalised
*/
int
dns_decompress_edns(dns_decompress_t *dctx);
/*
* Returns 'dctx->edns'
*
* Requires:
* 'dctx' to be initalised
*/
isc_boolean_t
dns_decompress_strict(dns_decompress_t *dctx);
/*
* Returns 'dctx->strict'
*
* Requires:
* 'dctx' to be initalised
*/
ISC_LANG_ENDDECLS
#endif /* DNS_COMPRESS_H */