2014-10-05 15:44:31 -06:00
|
|
|
/*
|
|
|
|
* iterator/iter_fwd.h - iterative resolver module forward zones.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2007, NLnet Labs. All rights reserved.
|
|
|
|
*
|
|
|
|
* This software is open source.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
*
|
|
|
|
* Redistributions of source code must retain the above copyright notice,
|
|
|
|
* this list of conditions and the following disclaimer.
|
|
|
|
*
|
|
|
|
* Redistributions in binary form must reproduce the above copyright notice,
|
|
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
|
|
* and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* Neither the name of the NLNET LABS nor the names of its contributors may
|
|
|
|
* be used to endorse or promote products derived from this software without
|
|
|
|
* specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
|
|
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \file
|
|
|
|
*
|
|
|
|
* This file contains functions to assist the iterator module.
|
|
|
|
* Keep track of forward zones, and read those from config.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef ITERATOR_ITER_FWD_H
|
|
|
|
#define ITERATOR_ITER_FWD_H
|
|
|
|
#include "util/rbtree.h"
|
|
|
|
struct config_file;
|
|
|
|
struct delegpt;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Iterator forward zones structure
|
|
|
|
*/
|
|
|
|
struct iter_forwards {
|
|
|
|
/**
|
|
|
|
* Zones are stored in this tree. Sort order is specially chosen.
|
|
|
|
* first sorted on qclass. Then on dname in nsec-like order, so that
|
|
|
|
* a lookup on class, name will return an exact match or the closest
|
|
|
|
* match which gives the ancestor needed.
|
|
|
|
* contents of type iter_forward_zone.
|
|
|
|
*/
|
2017-06-16 04:16:05 -06:00
|
|
|
rbtree_type* tree;
|
2014-10-05 15:44:31 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Iterator forward servers for a particular zone.
|
|
|
|
*/
|
|
|
|
struct iter_forward_zone {
|
|
|
|
/** redblacktree node, key is this structure: class and name */
|
2017-06-16 04:16:05 -06:00
|
|
|
rbnode_type node;
|
2014-10-05 15:44:31 -06:00
|
|
|
/** name */
|
|
|
|
uint8_t* name;
|
|
|
|
/** length of name */
|
|
|
|
size_t namelen;
|
|
|
|
/** number of labels in name */
|
|
|
|
int namelabs;
|
|
|
|
/** delegation point with forward server information for this zone.
|
|
|
|
* If NULL then this forward entry is used to indicate that a
|
|
|
|
* stub-zone with the same name exists, and should be used.
|
|
|
|
* This delegation point is malloced.
|
|
|
|
*/
|
|
|
|
struct delegpt* dp;
|
|
|
|
/** pointer to parent in tree (or NULL if none) */
|
|
|
|
struct iter_forward_zone* parent;
|
|
|
|
/** class. host order. */
|
|
|
|
uint16_t dclass;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create forwards
|
|
|
|
* @return new forwards or NULL on error.
|
|
|
|
*/
|
|
|
|
struct iter_forwards* forwards_create(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete forwards.
|
|
|
|
* @param fwd: to delete.
|
|
|
|
*/
|
|
|
|
void forwards_delete(struct iter_forwards* fwd);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Process forwards config.
|
|
|
|
* @param fwd: where to store.
|
|
|
|
* @param cfg: config options.
|
|
|
|
* @return 0 on error.
|
|
|
|
*/
|
|
|
|
int forwards_apply_cfg(struct iter_forwards* fwd, struct config_file* cfg);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find forward zone exactly by name
|
|
|
|
* @param fwd: forward storage.
|
|
|
|
* @param qname: The qname of the query.
|
|
|
|
* @param qclass: The qclass of the query.
|
|
|
|
* @return: A delegation point or null.
|
|
|
|
*/
|
|
|
|
struct delegpt* forwards_find(struct iter_forwards* fwd, uint8_t* qname,
|
|
|
|
uint16_t qclass);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find forward zone information
|
|
|
|
* For this qname/qclass find forward zone information, returns delegation
|
|
|
|
* point with server names and addresses, or NULL if no forwarding is needed.
|
|
|
|
*
|
|
|
|
* @param fwd: forward storage.
|
|
|
|
* @param qname: The qname of the query.
|
|
|
|
* @param qclass: The qclass of the query.
|
|
|
|
* @return: A delegation point if the query has to be forwarded to that list,
|
|
|
|
* otherwise null.
|
|
|
|
*/
|
|
|
|
struct delegpt* forwards_lookup(struct iter_forwards* fwd,
|
|
|
|
uint8_t* qname, uint16_t qclass);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Same as forwards_lookup, but for the root only
|
|
|
|
* @param fwd: forward storage.
|
|
|
|
* @param qclass: The qclass of the query.
|
|
|
|
* @return: A delegation point if root forward exists, otherwise null.
|
|
|
|
*/
|
|
|
|
struct delegpt* forwards_lookup_root(struct iter_forwards* fwd,
|
|
|
|
uint16_t qclass);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find next root item in forwards lookup tree.
|
|
|
|
* @param fwd: the forward storage
|
|
|
|
* @param qclass: class to look at next, or higher.
|
|
|
|
* @return false if none found, or if true stored in qclass.
|
|
|
|
*/
|
|
|
|
int forwards_next_root(struct iter_forwards* fwd, uint16_t* qclass);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get memory in use by forward storage
|
|
|
|
* @param fwd: forward storage.
|
|
|
|
* @return bytes in use
|
|
|
|
*/
|
|
|
|
size_t forwards_get_mem(struct iter_forwards* fwd);
|
|
|
|
|
|
|
|
/** compare two fwd entries */
|
|
|
|
int fwd_cmp(const void* k1, const void* k2);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add zone to forward structure. For external use since it recalcs
|
|
|
|
* the tree parents.
|
|
|
|
* @param fwd: the forward data structure
|
|
|
|
* @param c: class of zone
|
|
|
|
* @param dp: delegation point with name and target nameservers for new
|
|
|
|
* forward zone. malloced.
|
|
|
|
* @return false on failure (out of memory);
|
|
|
|
*/
|
|
|
|
int forwards_add_zone(struct iter_forwards* fwd, uint16_t c,
|
|
|
|
struct delegpt* dp);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove zone from forward structure. For external use since it
|
|
|
|
* recalcs the tree parents.
|
|
|
|
* @param fwd: the forward data structure
|
|
|
|
* @param c: class of zone
|
|
|
|
* @param nm: name of zone (in uncompressed wireformat).
|
|
|
|
*/
|
|
|
|
void forwards_delete_zone(struct iter_forwards* fwd, uint16_t c, uint8_t* nm);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add stub hole (empty entry in forward table, that makes resolution skip
|
|
|
|
* a forward-zone because the stub zone should override the forward zone).
|
|
|
|
* Does not add one if not necessary.
|
|
|
|
* @param fwd: the forward data structure
|
|
|
|
* @param c: class of zone
|
|
|
|
* @param nm: name of zone (in uncompressed wireformat).
|
|
|
|
* @return false on failure (out of memory);
|
|
|
|
*/
|
|
|
|
int forwards_add_stub_hole(struct iter_forwards* fwd, uint16_t c, uint8_t* nm);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove stub hole, if one exists.
|
|
|
|
* @param fwd: the forward data structure
|
|
|
|
* @param c: class of zone
|
|
|
|
* @param nm: name of zone (in uncompressed wireformat).
|
|
|
|
*/
|
|
|
|
void forwards_delete_stub_hole(struct iter_forwards* fwd, uint16_t c,
|
|
|
|
uint8_t* nm);
|
|
|
|
|
|
|
|
#endif /* ITERATOR_ITER_FWD_H */
|