Home | History | Annotate | Line # | Download | only in iterator
      1 /*
      2  * iterator/iter_fwd.h - iterative resolver module forward zones.
      3  *
      4  * Copyright (c) 2007, NLnet Labs. All rights reserved.
      5  *
      6  * This software is open source.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  *
     12  * Redistributions of source code must retain the above copyright notice,
     13  * this list of conditions and the following disclaimer.
     14  *
     15  * Redistributions in binary form must reproduce the above copyright notice,
     16  * this list of conditions and the following disclaimer in the documentation
     17  * and/or other materials provided with the distribution.
     18  *
     19  * Neither the name of the NLNET LABS nor the names of its contributors may
     20  * be used to endorse or promote products derived from this software without
     21  * specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     26  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     27  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     28  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
     29  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     30  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     31  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     32  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     33  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     34  */
     35 
     36 /**
     37  * \file
     38  *
     39  * This file contains functions to assist the iterator module.
     40  * Keep track of forward zones, and read those from config.
     41  */
     42 
     43 #ifndef ITERATOR_ITER_FWD_H
     44 #define ITERATOR_ITER_FWD_H
     45 #include "util/rbtree.h"
     46 #include "util/locks.h"
     47 struct config_file;
     48 struct delegpt;
     49 
     50 /**
     51  * Iterator forward zones structure
     52  */
     53 struct iter_forwards {
     54 	/** lock on the forwards tree.
     55 	 * When grabbing both this lock and the anchors.lock, this lock
     56 	 * is grabbed first. When grabbing both this lock and the hints.lock
     57 	 * this lock is grabbed first. */
     58 	lock_rw_type lock;
     59 	/**
     60 	 * Zones are stored in this tree. Sort order is specially chosen.
     61 	 * first sorted on qclass. Then on dname in nsec-like order, so that
     62 	 * a lookup on class, name will return an exact match or the closest
     63 	 * match which gives the ancestor needed.
     64 	 * contents of type iter_forward_zone.
     65 	 */
     66 	rbtree_type* tree;
     67 };
     68 
     69 /**
     70  * Iterator forward servers for a particular zone.
     71  */
     72 struct iter_forward_zone {
     73 	/** redblacktree node, key is this structure: class and name */
     74 	rbnode_type node;
     75 	/** name */
     76 	uint8_t* name;
     77 	/** length of name */
     78 	size_t namelen;
     79 	/** number of labels in name */
     80 	int namelabs;
     81 	/** delegation point with forward server information for this zone.
     82 	 * If NULL then this forward entry is used to indicate that a
     83 	 * stub-zone with the same name exists, and should be used.
     84 	 * This delegation point is malloced.
     85 	 */
     86 	struct delegpt* dp;
     87 	/** pointer to parent in tree (or NULL if none) */
     88 	struct iter_forward_zone* parent;
     89 	/** class. host order. */
     90 	uint16_t dclass;
     91 };
     92 
     93 /**
     94  * Create forwards
     95  * @return new forwards or NULL on error.
     96  */
     97 struct iter_forwards* forwards_create(void);
     98 
     99 /**
    100  * Delete forwards.
    101  * @param fwd: to delete.
    102  */
    103 void forwards_delete(struct iter_forwards* fwd);
    104 
    105 /**
    106  * Process forwards config.
    107  * @param fwd: where to store.
    108  * @param cfg: config options.
    109  * @return 0 on error.
    110  */
    111 int forwards_apply_cfg(struct iter_forwards* fwd, struct config_file* cfg);
    112 
    113 /**
    114  * Find forward zone exactly by name
    115  * The return value is contents of the forwards structure.
    116  * Caller should lock and unlock a readlock on the forwards structure if nolock
    117  * is set.
    118  * Otherwise caller should unlock the readlock on the forwards structure if a
    119  * value was returned.
    120  * @param fwd: forward storage.
    121  * @param qname: The qname of the query.
    122  * @param qclass: The qclass of the query.
    123  * @param nolock: Skip locking, locking is handled by the caller.
    124  * @return: A delegation point or null.
    125  */
    126 struct delegpt* forwards_find(struct iter_forwards* fwd, uint8_t* qname,
    127 	uint16_t qclass, int nolock);
    128 
    129 /**
    130  * Find forward zone information
    131  * For this qname/qclass find forward zone information, returns delegation
    132  * point with server names and addresses, or NULL if no forwarding is needed.
    133  * The return value is contents of the forwards structure.
    134  * Caller should lock and unlock a readlock on the forwards structure if nolock
    135  * is set.
    136  * Otherwise caller should unlock the readlock on the forwards structure if a
    137  * value was returned.
    138  *
    139  * @param fwd: forward storage.
    140  * @param qname: The qname of the query.
    141  * @param qclass: The qclass of the query.
    142  * @param nolock: Skip locking, locking is handled by the caller.
    143  * @return: A delegation point if the query has to be forwarded to that list,
    144  *         otherwise null.
    145  */
    146 struct delegpt* forwards_lookup(struct iter_forwards* fwd,
    147 	uint8_t* qname, uint16_t qclass, int nolock);
    148 
    149 /**
    150  * Same as forwards_lookup, but for the root only
    151  * @param fwd: forward storage.
    152  * @param qclass: The qclass of the query.
    153  * @param nolock: Skip locking, locking is handled by the caller.
    154  * @return: A delegation point if root forward exists, otherwise null.
    155  */
    156 struct delegpt* forwards_lookup_root(struct iter_forwards* fwd,
    157 	uint16_t qclass, int nolock);
    158 
    159 /**
    160  * Find next root item in forwards lookup tree.
    161  * Handles its own locking unless nolock is set. In that case the caller
    162  * should lock and unlock a readlock on the forwards structure.
    163  * @param fwd: the forward storage
    164  * @param qclass: class to look at next, or higher.
    165  * @param nolock: Skip locking, locking is handled by the caller.
    166  * @return false if none found, or if true stored in qclass.
    167  */
    168 int forwards_next_root(struct iter_forwards* fwd, uint16_t* qclass,
    169 	int nolock);
    170 
    171 /**
    172  * Get memory in use by forward storage
    173  * Locks and unlocks the structure.
    174  * @param fwd: forward storage.
    175  * @return bytes in use
    176  */
    177 size_t forwards_get_mem(struct iter_forwards* fwd);
    178 
    179 /** compare two fwd entries */
    180 int fwd_cmp(const void* k1, const void* k2);
    181 
    182 /**
    183  * Add zone to forward structure. For external use since it recalcs
    184  * the tree parents.
    185  * Handles its own locking unless nolock is set. In that case the caller
    186  * should lock and unlock a writelock on the forwards structure.
    187  * @param fwd: the forward data structure
    188  * @param c: class of zone
    189  * @param dp: delegation point with name and target nameservers for new
    190  *	forward zone. malloced.
    191  * @param nolock: Skip locking, locking is handled by the caller.
    192  * @return false on failure (out of memory);
    193  */
    194 int forwards_add_zone(struct iter_forwards* fwd, uint16_t c,
    195 	struct delegpt* dp, int nolock);
    196 
    197 /**
    198  * Remove zone from forward structure. For external use since it
    199  * recalcs the tree parents.
    200  * Handles its own locking unless nolock is set. In that case the caller
    201  * should lock and unlock a writelock on the forwards structure.
    202  * @param fwd: the forward data structure
    203  * @param c: class of zone
    204  * @param nm: name of zone (in uncompressed wireformat).
    205  * @param nolock: Skip locking, locking is handled by the caller.
    206  */
    207 void forwards_delete_zone(struct iter_forwards* fwd, uint16_t c,
    208 	uint8_t* nm, int nolock);
    209 
    210 /**
    211  * Add stub hole (empty entry in forward table, that makes resolution skip
    212  * a forward-zone because the stub zone should override the forward zone).
    213  * Does not add one if not necessary.
    214  * Handles its own locking unless nolock is set. In that case the caller
    215  * should lock and unlock a writelock on the forwards structure.
    216  * @param fwd: the forward data structure
    217  * @param c: class of zone
    218  * @param nm: name of zone (in uncompressed wireformat).
    219  * @param nolock: Skip locking, locking is handled by the caller.
    220  * @return false on failure (out of memory);
    221  */
    222 int forwards_add_stub_hole(struct iter_forwards* fwd, uint16_t c,
    223 	uint8_t* nm, int nolock);
    224 
    225 /**
    226  * Remove stub hole, if one exists.
    227  * Handles its own locking unless nolock is set. In that case the caller
    228  * should lock and unlock a writelock on the forwards structure.
    229  * @param fwd: the forward data structure
    230  * @param c: class of zone
    231  * @param nm: name of zone (in uncompressed wireformat).
    232  * @param nolock: Skip locking, locking is handled by the caller.
    233  */
    234 void forwards_delete_stub_hole(struct iter_forwards* fwd, uint16_t c,
    235 	uint8_t* nm, int nolock);
    236 
    237 /**
    238  * Swap internal tree with preallocated entries. Caller should manage
    239  * the locks.
    240  * @param fwd: the forward data structure.
    241  * @param data: the data structure used to take elements from. This contains
    242  * 	the old elements on return.
    243  */
    244 void forwards_swap_tree(struct iter_forwards* fwd, struct iter_forwards* data);
    245 
    246 #endif /* ITERATOR_ITER_FWD_H */
    247