unbound 0.1
Functions
iter_delegpt.c File Reference

This file implements the Delegation Point. More...

#include "config.h"
#include "iterator/iter_delegpt.h"
#include "services/cache/dns.h"
#include "util/regional.h"
#include "util/data/dname.h"
#include "util/data/packed_rrset.h"
#include "util/data/msgreply.h"
#include "util/net_help.h"

Functions

struct delegptdelegpt_create (struct regional *region)
 Create new delegation point.
struct delegptdelegpt_copy (struct delegpt *dp, struct regional *region)
 Create a copy of a delegation point.
int delegpt_set_name (struct delegpt *dp, struct regional *region, uint8_t *name)
 Set name of delegation point.
int delegpt_add_ns (struct delegpt *dp, struct regional *region, uint8_t *name, int lame)
 Add a name to the delegation point.
struct delegpt_nsdelegpt_find_ns (struct delegpt *dp, uint8_t *name, size_t namelen)
 Find NS record in name list of delegation point.
struct delegpt_addrdelegpt_find_addr (struct delegpt *dp, struct sockaddr_storage *addr, socklen_t addrlen)
 Find address record in total list of delegation point.
int delegpt_add_target (struct delegpt *dp, struct regional *region, uint8_t *name, size_t namelen, struct sockaddr_storage *addr, socklen_t addrlen, int bogus, int lame)
 Add target address to the delegation point.
int delegpt_add_addr (struct delegpt *dp, struct regional *region, struct sockaddr_storage *addr, socklen_t addrlen, int bogus, int lame)
 Add address to the delegation point.
void delegpt_count_ns (struct delegpt *dp, size_t *numns, size_t *missing)
 count NS and number missing for logging
void delegpt_count_addr (struct delegpt *dp, size_t *numaddr, size_t *numres, size_t *numavail)
 count addresses, and number in result and available lists, for logging
void delegpt_log (enum verbosity_value v, struct delegpt *dp)
 Print the delegation point to the log.
void delegpt_add_unused_targets (struct delegpt *dp)
 Add all usable targets to the result list.
size_t delegpt_count_targets (struct delegpt *dp)
 count total number of targets in dp
size_t delegpt_count_missing_targets (struct delegpt *dp)
 Count number of missing targets.
static struct ub_packed_rrset_keyfind_NS (struct reply_info *rep, size_t from, size_t to)
 find NS rrset in given list
struct delegptdelegpt_from_message (struct dns_msg *msg, struct regional *region)
 Create new delegation point from a dns message.
int delegpt_rrset_add_ns (struct delegpt *dp, struct regional *region, struct ub_packed_rrset_key *ns_rrset, int lame)
 Add NS rrset; calls add_ns repeatedly.
int delegpt_add_rrset_A (struct delegpt *dp, struct regional *region, struct ub_packed_rrset_key *ak, int lame)
 Add A RRset to delegpt.
int delegpt_add_rrset_AAAA (struct delegpt *dp, struct regional *region, struct ub_packed_rrset_key *ak, int lame)
 Add AAAA RRset to delegpt.
int delegpt_add_rrset (struct delegpt *dp, struct regional *region, struct ub_packed_rrset_key *rrset, int lame)
 Add any RRset to delegpt.
void delegpt_add_neg_msg (struct delegpt *dp, struct msgreply_entry *msg)
 Add negative message to delegation point.
void delegpt_no_ipv6 (struct delegpt *dp)
 Register the fact that there is no ipv6 and thus AAAAs are not going to be queried for or be useful.

Detailed Description

This file implements the Delegation Point.

It contains a list of name servers and their addresses if known.


Function Documentation

struct delegpt* delegpt_create ( struct regional regional) [read]

Create new delegation point.

Parameters:
regional,:where to allocate it.
Returns:
new delegation point or NULL on error.

References regional_alloc().

Referenced by compile_time_root_prime(), delegpt_copy(), delegpt_from_message(), dns_cache_find_delegation(), parse_delegpt(), read_forwards(), read_root_hints(), and read_stubs().

struct delegpt* delegpt_copy ( struct delegpt dp,
struct regional regional 
) [read]
int delegpt_set_name ( struct delegpt dp,
struct regional regional,
uint8_t *  name 
)

Set name of delegation point.

Parameters:
dp,:delegation point.
regional,:where to allocate the name copy.
name,:name to use.
Returns:
false on error.

References dname_count_size_labels(), delegpt::name, delegpt::namelabs, delegpt::namelen, and regional_alloc_init().

Referenced by compile_time_root_prime(), delegpt_copy(), delegpt_from_message(), dns_cache_find_delegation(), parse_delegpt(), read_fwds_name(), read_root_hints(), and read_stubs_name().

int delegpt_add_ns ( struct delegpt dp,
struct regional regional,
uint8_t *  name,
int  lame 
)

Add a name to the delegation point.

Parameters:
dp,:delegation point.
regional,:where to allocate the info.
name,:domain name in wire format.
lame,:name is lame, disprefer it.
Returns:
false on error.

References delegpt_find_ns(), dname_count_size_labels(), delegpt_ns::done_pside4, delegpt_ns::done_pside6, delegpt_ns::got4, delegpt_ns::got6, delegpt_ns::lame, delegpt_ns::name, delegpt_ns::namelen, delegpt_ns::next, delegpt::nslist, regional_alloc(), regional_alloc_init(), and delegpt_ns::resolved.

Referenced by ah(), delegpt_copy(), delegpt_rrset_add_ns(), processTargetResponse(), read_fwds_host(), read_root_hints(), and read_stubs_host().

struct delegpt_ns* delegpt_find_ns ( struct delegpt dp,
uint8_t *  name,
size_t  namelen 
) [read]

Find NS record in name list of delegation point.

Parameters:
dp,:delegation point.
name,:name of nameserver to look for, uncompressed wireformat.
namelen,:length of name.
Returns:
the ns structure or NULL if not found.

References delegpt_ns::name, delegpt_ns::namelen, delegpt_ns::next, delegpt::nslist, and query_dname_compare().

Referenced by delegpt_add_neg_msg(), delegpt_add_ns(), delegpt_add_target(), error_supers(), iter_dp_is_useless(), and processTargetResponse().

struct delegpt_addr* delegpt_find_addr ( struct delegpt dp,
struct sockaddr_storage *  addr,
socklen_t  addrlen 
) [read]

Find address record in total list of delegation point.

Parameters:
dp,:delegation point.
addr,:address
addrlen,:length of addr
Returns:
the addr structure or NULL if not found.

References delegpt_addr::addr, delegpt_addr::addrlen, delegpt_addr::next_target, sockaddr_cmp_addr(), and delegpt::target_list.

Referenced by delegpt_add_addr(), and iter_merge_retry_counts().

int delegpt_add_target ( struct delegpt dp,
struct regional regional,
uint8_t *  name,
size_t  namelen,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
int  bogus,
int  lame 
)

Add target address to the delegation point.

Parameters:
dp,:delegation point.
regional,:where to allocate the info.
name,:name for which target was found (must be in nslist). This name is marked resolved.
namelen,:length of name.
addr,:the address.
addrlen,:the length of addr.
bogus,:security status for the address, pass true if bogus.
lame,:address is lame.
Returns:
false on error.

References addr_is_ip6(), delegpt_add_addr(), delegpt_find_ns(), delegpt_ns::got4, delegpt_ns::got6, and delegpt_ns::resolved.

Referenced by ah(), delegpt_add_rrset_A(), delegpt_add_rrset_AAAA(), and read_root_hints().

int delegpt_add_addr ( struct delegpt dp,
struct regional regional,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
int  bogus,
int  lame 
)

Add address to the delegation point.

No servername is associated or checked.

Parameters:
dp,:delegation point.
regional,:where to allocate the info.
addr,:the address.
addrlen,:the length of addr.
bogus,:if address is bogus.
lame,:if address is lame.
Returns:
false on error.

References delegpt_addr::addr, delegpt_addr::addrlen, delegpt_addr::attempts, delegpt_addr::bogus, delegpt_find_addr(), delegpt_addr::lame, delegpt_addr::next_result, delegpt_addr::next_target, delegpt_addr::next_usable, regional_alloc(), delegpt::target_list, and delegpt::usable_list.

Referenced by delegpt_add_target(), delegpt_copy(), parse_delegpt(), read_fwds_addr(), and read_stubs_addr().

void delegpt_log ( enum verbosity_value  v,
struct delegpt dp 
)
void delegpt_add_unused_targets ( struct delegpt dp)

Add all usable targets to the result list.

Parameters:
dp,:delegation point.

References delegpt_addr::next_result, delegpt_addr::next_usable, delegpt::result_list, and delegpt::usable_list.

Referenced by processQueryTargets().

size_t delegpt_count_missing_targets ( struct delegpt dp)

Count number of missing targets.

These are ns names with no resolved flag.

Parameters:
dp,:delegation point.
Returns:
number of missing targets (or 0).

References delegpt_ns::next, delegpt::nslist, and delegpt_ns::resolved.

Referenced by iter_filter_order(), processLastResort(), processQueryTargets(), and query_for_targets().

struct delegpt* delegpt_from_message ( struct dns_msg msg,
struct regional regional 
) [read]

Create new delegation point from a dns message.

Note that this method does not actually test to see if the message is an actual referral. It really is just checking to see if it can construct a delegation point, so the message could be of some other type (some ANSWER messages, some CNAME messages, generally.) Note that the resulting DelegationPoint will contain targets for all "relevant" glue (i.e., address records whose ownernames match the target of one of the NS records), so if policy dictates that some glue should be discarded beyond that, discard it before calling this method. Note that this method will find "glue" in either the ADDITIONAL section or the ANSWER section.

Parameters:
msg,:the dns message, referral.
regional,:where to allocate delegation point.
Returns:
new delegation point or NULL on alloc error, or if the message was not appropriate.

References reply_info::an_numrrsets, delegpt_add_rrset_A(), delegpt_add_rrset_AAAA(), delegpt_create(), delegpt_rrset_add_ns(), delegpt_set_name(), packed_rrset_key::dname, find_NS(), delegpt::has_parent_side_NS, reply_info::ns_numrrsets, dns_msg::rep, ub_packed_rrset_key::rk, reply_info::rrset_count, reply_info::rrsets, and packed_rrset_key::type.

Referenced by prime_supers(), and processQueryResponse().

int delegpt_rrset_add_ns ( struct delegpt dp,
struct regional regional,
struct ub_packed_rrset_key ns_rrset,
int  lame 
)

Add NS rrset; calls add_ns repeatedly.

Parameters:
dp,:delegation point.
regional,:where to allocate the info.
ns_rrset,:NS rrset.
lame,:rrset is lame, disprefer it.
Returns:
0 on alloc error.

References delegpt::bogus, packed_rrset_data::count, lruhash_entry::data, delegpt_add_ns(), dname_valid(), ub_packed_rrset_key::entry, packed_rrset_data::rr_data, packed_rrset_data::rr_len, sec_status_bogus, and packed_rrset_data::security.

Referenced by delegpt_add_rrset(), delegpt_from_message(), dns_cache_find_delegation(), and iter_lookup_parent_NS_from_cache().

int delegpt_add_rrset_A ( struct delegpt dp,
struct regional regional,
struct ub_packed_rrset_key rrset,
int  lame 
)
int delegpt_add_rrset_AAAA ( struct delegpt dp,
struct regional regional,
struct ub_packed_rrset_key rrset,
int  lame 
)

Add AAAA RRset to delegpt.

Parameters:
dp,:delegation point.
regional,:where to allocate the info.
rrset,:RRset AAAA to add.
lame,:rrset is lame, disprefer it.
Returns:
0 on alloc error.

References packed_rrset_data::count, lruhash_entry::data, delegpt_add_target(), packed_rrset_key::dname, packed_rrset_key::dname_len, ub_packed_rrset_key::entry, INET6_SIZE, ub_packed_rrset_key::rk, packed_rrset_data::rr_data, packed_rrset_data::rr_len, sec_status_bogus, and packed_rrset_data::security.

Referenced by cache_fill_missing(), delegpt_add_rrset(), delegpt_from_message(), find_add_addrs(), and iter_lookup_parent_glue_from_cache().

int delegpt_add_rrset ( struct delegpt dp,
struct regional regional,
struct ub_packed_rrset_key rrset,
int  lame 
)

Add any RRset to delegpt.

Does not check for duplicates added.

Parameters:
dp,:delegation point.
regional,:where to allocate the info.
rrset,:RRset to add, NS, A, AAAA.
lame,:rrset is lame, disprefer it.
Returns:
0 on alloc error.

References delegpt_add_rrset_A(), delegpt_add_rrset_AAAA(), delegpt_rrset_add_ns(), log_warn(), ub_packed_rrset_key::rk, and packed_rrset_key::type.

Referenced by processTargetResponse().

void delegpt_add_neg_msg ( struct delegpt dp,
struct msgreply_entry msg 
)

Add negative message to delegation point.

Parameters:
dp,:delegation point.
msg,:the message added, marks off A or AAAA from an NS entry.

References reply_info::an_numrrsets, lruhash_entry::data, delegpt_find_ns(), msgreply_entry::entry, reply_info::flags, FLAGS_GET_RCODE, delegpt_ns::got4, delegpt_ns::got6, msgreply_entry::key, query_info::qname, query_info::qname_len, query_info::qtype, and delegpt_ns::resolved.

Referenced by cache_fill_missing(), and find_add_addrs().

void delegpt_no_ipv6 ( struct delegpt dp)

Register the fact that there is no ipv6 and thus AAAAs are not going to be queried for or be useful.

Parameters:
dp,:the delegation point. Updated to reflect no ipv6.

References delegpt_ns::got4, delegpt_ns::next, delegpt::nslist, and delegpt_ns::resolved.

Referenced by processQueryTargets().