iter_hints.c File Reference

This file contains functions to assist the iterator module. More...

#include "config.h"
#include "iterator/iter_hints.h"
#include "iterator/iter_delegpt.h"
#include "util/log.h"
#include "util/config_file.h"
#include "util/net_help.h"
#include "util/data/dname.h"
#include "sldns/rrdef.h"
#include "sldns/str2wire.h"
#include "sldns/wire2str.h"

Functions

struct iter_hintshints_create (void)
 Create hints. More...
 
static void hints_stub_free (struct iter_hints_stub *s)
 
static void delhintnode (rbnode_type *n, void *ATTR_UNUSED(arg))
 
static void hints_del_tree (struct iter_hints *hints)
 
void hints_delete (struct iter_hints *hints)
 Delete hints. More...
 
static int ah (struct delegpt *dp, const char *sv, const char *ip)
 add hint to delegation hints
 
static struct delegptcompile_time_root_prime (int do_ip4, int do_ip6)
 obtain compiletime provided root hints
 
static int hints_insert (struct iter_hints *hints, uint16_t c, struct delegpt *dp, int noprime)
 insert new hint info into hint structure
 
static struct delegptread_stubs_name (struct config_stub *s)
 set stub name
 
static int read_stubs_host (struct config_stub *s, struct delegpt *dp)
 set stub host names
 
static int read_stubs_addr (struct config_stub *s, struct delegpt *dp)
 set stub server addresses
 
static int read_stubs (struct iter_hints *hints, struct config_file *cfg)
 read stubs config
 
static int read_root_hints (struct iter_hints *hints, char *fname)
 read root hints from file
 
static int read_root_hints_list (struct iter_hints *hints, struct config_file *cfg)
 read root hints list
 
int hints_apply_cfg (struct iter_hints *hints, struct config_file *cfg)
 Process hints config. More...
 
struct delegpthints_find (struct iter_hints *hints, uint8_t *qname, uint16_t qclass, int nolock)
 Find hints for the given class. More...
 
struct delegpthints_find_root (struct iter_hints *hints, uint16_t qclass, int nolock)
 Same as hints_lookup, but for the root only. More...
 
struct iter_hints_stubhints_lookup_stub (struct iter_hints *hints, uint8_t *qname, uint16_t qclass, struct delegpt *cache_dp, int nolock)
 Given a qname/qclass combination, and the delegation point from the cache for this qname/qclass, determine if this combination indicates that a stub hint exists and must be primed. More...
 
int hints_next_root (struct iter_hints *hints, uint16_t *qclass, int nolock)
 Find next root hints (to cycle through all root hints). More...
 
size_t hints_get_mem (struct iter_hints *hints)
 Get memory in use by hints Locks and unlocks the structure. More...
 
int hints_add_stub (struct iter_hints *hints, uint16_t c, struct delegpt *dp, int noprime, int nolock)
 Add stub to hints structure. More...
 
void hints_delete_stub (struct iter_hints *hints, uint16_t c, uint8_t *nm, int nolock)
 Remove stub from hints structure. More...
 

Detailed Description

This file contains functions to assist the iterator module.

Keep track of stub and root hints, and read those from config.

Function Documentation

◆ hints_create()

struct iter_hints* hints_create ( void  )

Create hints.

Returns
new hints or NULL on error.

References iter_hints::lock, and iter_hints::tree.

Referenced by check_hints(), and context_finalize().

◆ hints_delete()

void hints_delete ( struct iter_hints hints)

Delete hints.

Parameters
hintsto delete.

References iter_hints::lock.

Referenced by daemon_cleanup().

◆ hints_apply_cfg()

int hints_apply_cfg ( struct iter_hints hints,
struct config_file cfg 
)

Process hints config.

Sets default values for root hints if no config.

Parameters
hintswhere to store.
cfgconfig options.
Returns
0 on error.

References iter_hints::lock.

Referenced by check_hints(), and context_finalize().

◆ hints_find()

struct delegpt* hints_find ( struct iter_hints hints,
uint8_t *  qname,
uint16_t  qclass,
int  nolock 
)

Find hints for the given class.

The return value is contents of the hints structure. Caller should lock and unlock a readlock on the hints structure if nolock is set. Otherwise caller should unlock the readlock on the hints structure if a value was returned.

Parameters
hintshint storage.
qnamethe qname that generated the delegation point.
qclassclass for which root hints are requested. host order.
nolockSkip locking, locking is handled by the caller.
Returns
: NULL if no hints, or a ptr to stored hints.

References dname_count_size_labels(), iter_hints_stub::dp, iter_hints::lock, name_tree_find(), and iter_hints::tree.

Referenced by hints_find_root().

◆ hints_find_root()

struct delegpt* hints_find_root ( struct iter_hints hints,
uint16_t  qclass,
int  nolock 
)

Same as hints_lookup, but for the root only.

Parameters
hintshint storage.
qclassclass for which root hints are requested. host order.
nolockSkip locking, locking is handled by the caller.
Returns
: NULL if no hints, or a ptr to stored hints.

References hints_find().

Referenced by prime_root().

◆ hints_lookup_stub()

struct iter_hints_stub* hints_lookup_stub ( struct iter_hints hints,
uint8_t *  qname,
uint16_t  qclass,
struct delegpt dp,
int  nolock 
)

Given a qname/qclass combination, and the delegation point from the cache for this qname/qclass, determine if this combination indicates that a stub hint exists and must be primed.

The return value is contents of the hints structure. Caller should lock and unlock a readlock on the hints structure if nolock is set. Otherwise caller should unlock the readlock on the hints structure if a value was returned.

Parameters
hintshint storage.
qnameThe qname that generated the delegation point.
qclassThe qclass that generated the delegation point.
dpThe cache generated delegation point.
nolockSkip locking, locking is handled by the caller.
Returns
: A priming delegation point if there is a stub hint that must be primed, otherwise null.

References dname_count_size_labels(), dname_strict_subdomain(), iter_hints_stub::dp, iter_hints::lock, delegpt::name, name_tree_lookup(), delegpt::namelabs, iter_hints_stub::noprime, query_dname_compare(), and iter_hints::tree.

Referenced by iter_stub_fwd_no_cache(), and prime_stub().

◆ hints_next_root()

int hints_next_root ( struct iter_hints hints,
uint16_t *  qclass,
int  nolock 
)

Find next root hints (to cycle through all root hints).

Handles its own locking unless nolock is set. In that case the caller should lock and unlock a readlock on the hints structure.

Parameters
hintshint storage
qclassclass for which root hints are sought. 0 means give the first available root hints class. x means, give class x or a higher class if any. returns the found class in this variable.
nolockSkip locking, locking is handled by the caller.
Returns
true if a root hint class is found. false if not root hint class is found (qclass may have been changed).

References iter_hints::lock, name_tree_next_root(), and iter_hints::tree.

Referenced by iter_get_next_root().

◆ hints_get_mem()

size_t hints_get_mem ( struct iter_hints hints)

Get memory in use by hints Locks and unlocks the structure.

Parameters
hintshint storage.
Returns
bytes in use

References delegpt_get_mem(), iter_hints_stub::dp, iter_hints::lock, RBTREE_FOR, and iter_hints::tree.

◆ hints_add_stub()

int hints_add_stub ( struct iter_hints hints,
uint16_t  c,
struct delegpt dp,
int  noprime,
int  nolock 
)

Add stub to hints structure.

For external use since it recalcs the tree parents. Handles its own locking unless nolock is set. In that case the caller should lock and unlock a writelock on the hints structure.

Parameters
hintsthe hints data structure
cclass of zone
dpdelegation point with name and target nameservers for new hints stub. malloced.
noprimeset noprime option to true or false on new hint stub.
nolockSkip locking, locking is handled by the caller.
Returns
false on failure (out of memory);

References iter_hints_stub::dp, iter_hints::lock, delegpt::name, name_tree_find(), delegpt::namelabs, delegpt::namelen, iter_hints_stub::node, rbtree_delete(), and iter_hints::tree.

◆ hints_delete_stub()

void hints_delete_stub ( struct iter_hints hints,
uint16_t  c,
uint8_t *  nm,
int  nolock 
)

Remove stub from hints structure.

For external use since it recalcs the tree parents. Handles its own locking unless nolock is set. In that case the caller should lock and unlock a writelock on the hints structure.

Parameters
hintsthe hints data structure
cclass of stub zone
nmname of stub zone (in uncompressed wireformat).
nolockSkip locking, locking is handled by the caller.

References dname_count_size_labels(), iter_hints::lock, name_tree_find(), iter_hints_stub::node, rbtree_delete(), and iter_hints::tree.