iter_utils.h File Reference

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

#include "iterator/iter_resptype.h"

Functions

int iter_apply_cfg (struct iter_env *iter_env, struct config_file *cfg)
 Process config options and set iterator module state.
struct delegpt_addriter_server_selection (struct iter_env *iter_env, struct module_env *env, struct delegpt *dp, uint8_t *name, size_t namelen, uint16_t qtype, int *dnssec_expected, int *chase_to_rd)
 Select a valid, nice target to send query to.
struct dns_msgdns_alloc_msg (ldns_buffer *pkt, struct msg_parse *msg, struct regional *regional)
 Allocate dns_msg from parsed msg, in regional.
struct dns_msgdns_copy_msg (struct dns_msg *from, struct regional *regional)
 Copy a dns_msg to this regional.
int iter_dns_store (struct module_env *env, struct query_info *qinf, struct reply_info *rep, int is_referral)
 Allocate a dns_msg with malloc/alloc structure and store in dns cache.
int iter_ns_probability (struct ub_randstate *rnd, int n, int m)
 Select randomly with n/m probability.
void iter_mark_cycle_targets (struct module_qstate *qstate, struct delegpt *dp)
 Mark targets that result in a dependency cycle as done, so they will not get selected as targets.
int iter_dp_is_useless (struct query_info *qinfo, uint16_t qflags, struct delegpt *dp)
 See if delegation is useful or offers immediately no targets for further recursion.
int iter_indicates_dnssec (struct module_env *env, struct delegpt *dp, struct dns_msg *msg, uint16_t dclass)
 See if delegation is expected to have DNSSEC information (RRSIGs) in its answers, or not.
int iter_msg_has_dnssec (struct dns_msg *msg)
 See if a message contains DNSSEC.
int iter_msg_from_zone (struct dns_msg *msg, struct delegpt *dp, enum response_type type, uint16_t dclass)
 See if a message is known to be from a certain zone.
int reply_equal (struct reply_info *p, struct reply_info *q)
 Check if two replies are equal For fallback procedures.


Detailed Description

This file contains functions to assist the iterator module.

Configuration options. Forward zones.


Function Documentation

int iter_apply_cfg ( struct iter_env iter_env,
struct config_file cfg 
)

struct delegpt_addr* iter_server_selection ( struct iter_env iter_env,
struct module_env env,
struct delegpt dp,
uint8_t *  name,
size_t  namelen,
uint16_t  qtype,
int *  dnssec_expected,
int *  chase_to_rd 
) [read]

Select a valid, nice target to send query to.

Sorting and removing unsuitable targets is combined.

Parameters:
iter_env,: iterator module global state, with ip6 enabled and do-not-query-addresses.
env,: environment with infra cache (lameness, rtt info).
dp,: delegation point with result list.
name,: zone name (for lameness check).
namelen,: length of name.
qtype,: query type that we want to send.
dnssec_expected,: set to 0, if a known dnssec-lame server is selected these are not preferred, but are used as a last resort.
chase_to_rd,: set to 1 if a known recursion lame server is selected these are not preferred, but are used as a last resort.
Returns:
best target or NULL if no target. if not null, that target is removed from the result list in the dp.

References delegpt_addr::attempts, iter_filter_order(), log_assert, delegpt_addr::next_result, module_env::now, OUTBOUND_MSG_RETRY, delegpt::result_list, module_env::rnd, ub_random(), USEFUL_SERVER_TOP_TIMEOUT, VERB_ALGO, and verbose().

Referenced by processQueryTargets().

struct dns_msg* dns_alloc_msg ( ldns_buffer *  pkt,
struct msg_parse msg,
struct regional regional 
) [read]

Allocate dns_msg from parsed msg, in regional.

Parameters:
pkt,: packet.
msg,: parsed message (cleaned and ready for regional allocation).
regional,: regional to use for allocation.
Returns:
newly allocated dns_msg, or NULL on memory error.

References log_err(), parse_create_msg(), dns_msg::qinfo, regional_alloc(), and dns_msg::rep.

Referenced by process_response().

struct dns_msg* dns_copy_msg ( struct dns_msg from,
struct regional regional 
) [read]

Copy a dns_msg to this regional.

Parameters:
from,: dns message, also in regional.
regional,: regional to use for allocation.
Returns:
newly allocated dns_msg, or NULL on memory error.

References dns_msg::qinfo, query_info::qname, query_info::qname_len, regional_alloc(), regional_alloc_init(), dns_msg::rep, and reply_info_copy().

Referenced by prime_supers().

int iter_dns_store ( struct module_env env,
struct query_info qinf,
struct reply_info rep,
int  is_referral 
)

Allocate a dns_msg with malloc/alloc structure and store in dns cache.

Parameters:
env,: environment, with alloc structure and dns cache.
qinf,: query info, the query for which answer is stored.
rep,: reply in dns_msg from dns_alloc_msg for example.
is_referral,: If true, then the given message to be stored is a referral. The cache implementation may use this as a hint.
Returns:
0 on alloc error (out of memory).

References dns_cache_store().

Referenced by error_response_cache(), processFinished(), and processQueryResponse().

int iter_ns_probability ( struct ub_randstate rnd,
int  n,
int  m 
)

Select randomly with n/m probability.

For shuffle NS records for address fetching.

Parameters:
rnd,: random table
n,: probability.
m,: divisor for probability.
Returns:
true with n/m probability.

References ub_random().

Referenced by query_for_targets().

void iter_mark_cycle_targets ( struct module_qstate qstate,
struct delegpt dp 
)

Mark targets that result in a dependency cycle as done, so they will not get selected as targets.

Parameters:
qstate,: query state.
dp,: delegpt to mark ns in.

References causes_cycle(), log_nametypeclass(), delegpt_ns::name, delegpt_ns::namelen, delegpt_ns::next, delegpt::nslist, query_info::qclass, module_qstate::qinfo, delegpt_ns::resolved, and VERB_QUERY.

Referenced by query_for_targets().

int iter_dp_is_useless ( struct query_info qinfo,
uint16_t  qflags,
struct delegpt dp 
)

See if delegation is useful or offers immediately no targets for further recursion.

Parameters:
qinfo,: query name and type
qflags,: query flags with RD flag
dp,: delegpt to check.

References BIT_RD, delegpt_find_ns(), dname_subdomain_c(), delegpt_ns::name, delegpt::name, delegpt_ns::next, delegpt::nslist, query_info::qname, query_info::qname_len, query_info::qtype, delegpt_ns::resolved, delegpt::result_list, and delegpt::usable_list.

Referenced by print_deleg_lookup(), and processInitRequest().

int iter_indicates_dnssec ( struct module_env env,
struct delegpt dp,
struct dns_msg msg,
uint16_t  dclass 
)

See if delegation is expected to have DNSSEC information (RRSIGs) in its answers, or not.

Inspects delegation point (name), trust anchors, and delegation message (DS RRset) to determine this.

Parameters:
env,: module env with trust anchors.
dp,: delegation point.
msg,: delegation message, with DS if a secure referral.
dclass,: class of query.
Returns:
1 if dnssec is expected, 0 if not.

References anchor_find(), module_env::anchors, delegpt::name, delegpt::namelabs, delegpt::namelen, dns_msg::rep, and reply_find_rrset_section_ns().

Referenced by generate_target_query(), prime_root(), prime_stub(), processInitRequest3(), and processQueryResponse().

int iter_msg_has_dnssec ( struct dns_msg msg  ) 

See if a message contains DNSSEC.

This is examined by looking for RRSIGs. With DNSSEC a valid answer, nxdomain, nodata, referral or cname reply has RRSIGs in answer or auth sections, sigs on answer data, SOA, DS, or NSEC/NSEC3 records.

Parameters:
msg,: message to examine.
Returns:
true if DNSSEC information was found.

References reply_info::an_numrrsets, reply_info::ns_numrrsets, dns_msg::rep, and reply_info::rrsets.

Referenced by processQueryResponse().

int iter_msg_from_zone ( struct dns_msg msg,
struct delegpt dp,
enum response_type  type,
uint16_t  dclass 
)

See if a message is known to be from a certain zone.

This looks for SOA or NS rrsets, for answers. For referrals, when one label is delegated, the zone is detected. Does not look at signatures.

Parameters:
msg,: the message to inspect.
dp,: delegation point with zone name to look for.
type,: type of message.
dclass,: class of query.
Returns:
true if message is certain to be from zone in dp->name. false if not sure (empty msg), or not from the zone.

References reply_info::an_numrrsets, packed_rrset_key::dname, dname_count_labels(), dname_strict_subdomain(), log_assert, delegpt::name, delegpt::namelabs, delegpt::namelen, reply_info::ns_numrrsets, dns_msg::rep, reply_find_rrset_section_an(), reply_find_rrset_section_ns(), RESPONSE_TYPE_ANSWER, RESPONSE_TYPE_CNAME, RESPONSE_TYPE_REFERRAL, ub_packed_rrset_key::rk, packed_rrset_key::rrset_class, reply_info::rrsets, and packed_rrset_key::type.

Referenced by processQueryResponse().

int reply_equal ( struct reply_info p,
struct reply_info q 
)

Check if two replies are equal For fallback procedures.

Parameters:
p,: reply one. The reply has rrset data pointers in region. Does not check rrset-IDs
q,: reply two
Returns:
if one and two are equal.

References reply_info::an_numrrsets, reply_info::ar_numrrsets, reply_info::flags, reply_info::ns_numrrsets, reply_info::qdcount, reply_info::rrset_count, rrset_equal(), reply_info::rrsets, reply_info::security, and reply_info::ttl.

Referenced by process_response().


Generated on Thu Mar 26 09:45:00 2009 for unbound by  doxygen 1.5.8