Electroneum
iter_utils.h File Reference
Include dependency graph for iter_utils.h:

Go to the source code of this file.

Functions

int iter_apply_cfg (struct iter_env *iter_env, struct config_file *cfg)
 
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_lame, int *chase_to_rd, int open_target, struct sock_list *blacklist, time_t prefetch)
 
struct dns_msgdns_alloc_msg (struct sldns_buffer *pkt, struct msg_parse *msg, struct regional *regional)
 
struct dns_msgdns_copy_msg (struct dns_msg *from, struct regional *regional)
 
void iter_dns_store (struct module_env *env, struct query_info *qinf, struct reply_info *rep, int is_referral, time_t leeway, int pside, struct regional *region, uint16_t flags)
 
int iter_ns_probability (struct ub_randstate *rnd, int n, int m)
 
void iter_mark_cycle_targets (struct module_qstate *qstate, struct delegpt *dp)
 
void iter_mark_pside_cycle_targets (struct module_qstate *qstate, struct delegpt *dp)
 
int iter_dp_is_useless (struct query_info *qinfo, uint16_t qflags, struct delegpt *dp)
 
int iter_qname_indicates_dnssec (struct module_env *env, struct query_info *qinfo)
 
int iter_indicates_dnssec (struct module_env *env, struct delegpt *dp, struct dns_msg *msg, uint16_t dclass)
 
int iter_msg_has_dnssec (struct dns_msg *msg)
 
int iter_msg_from_zone (struct dns_msg *msg, struct delegpt *dp, enum response_type type, uint16_t dclass)
 
int reply_equal (struct reply_info *p, struct reply_info *q, struct regional *region)
 
void caps_strip_reply (struct reply_info *rep)
 
int caps_failed_rcode (struct reply_info *rep)
 
void iter_store_parentside_rrset (struct module_env *env, struct ub_packed_rrset_key *rrset)
 
void iter_store_parentside_NS (struct module_env *env, struct reply_info *rep)
 
void iter_store_parentside_neg (struct module_env *env, struct query_info *qinfo, struct reply_info *rep)
 
int iter_lookup_parent_NS_from_cache (struct module_env *env, struct delegpt *dp, struct regional *region, struct query_info *qinfo)
 
int iter_lookup_parent_glue_from_cache (struct module_env *env, struct delegpt *dp, struct regional *region, struct query_info *qinfo)
 
int iter_get_next_root (struct iter_hints *hints, struct iter_forwards *fwd, uint16_t *c)
 
void iter_scrub_ds (struct dns_msg *msg, struct ub_packed_rrset_key *ns, uint8_t *z)
 
void iter_dec_attempts (struct delegpt *dp, int d)
 
void iter_merge_retry_counts (struct delegpt *dp, struct delegpt *old)
 
int iter_ds_toolow (struct dns_msg *msg, struct delegpt *dp)
 
int iter_dp_cangodown (struct query_info *qinfo, struct delegpt *dp)
 

Detailed Description

This file contains functions to assist the iterator module. Configuration options. Forward zones.

Definition in file iter_utils.h.

Function Documentation

◆ caps_failed_rcode()

int caps_failed_rcode ( struct reply_info rep)

see if reply has a 'useful' rcode for capsforid comparison, so not SERVFAIL or REFUSED, and thus NOERROR or NXDOMAIN.

Parameters
repreply to check.
Returns
true if the rcode is a bad type of message.

◆ caps_strip_reply()

void caps_strip_reply ( struct reply_info rep)

Remove unused bits from the reply if possible. So that caps-for-id (0x20) fallback is more likely to be successful. This removes like, the additional section, and NS record in the authority section if those records are gratuitous (not for a referral).

Parameters
repthe reply to strip stuff out of.

◆ dns_alloc_msg()

struct dns_msg* dns_alloc_msg ( struct sldns_buffer pkt,
struct msg_parse msg,
struct regional regional 
)

Allocate dns_msg from parsed msg, in regional.

Parameters
pktpacket.
msgparsed message (cleaned and ready for regional allocation).
regionalregional to use for allocation.
Returns
newly allocated dns_msg, or NULL on memory error.

◆ dns_copy_msg()

struct dns_msg* dns_copy_msg ( struct dns_msg from,
struct regional regional 
)

Copy a dns_msg to this regional.

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

◆ iter_apply_cfg()

int iter_apply_cfg ( struct iter_env iter_env,
struct config_file cfg 
)

Process config options and set iterator module state. Sets default values if no config is found.

Parameters
iter_enviterator module state.
cfgconfig options.
Returns
0 on error.

◆ iter_dec_attempts()

void iter_dec_attempts ( struct delegpt dp,
int  d 
)

Remove query attempts from all available ips. For 0x20.

Parameters
dpdelegpt.
ddecrease.

◆ iter_dns_store()

void iter_dns_store ( struct module_env env,
struct query_info qinf,
struct reply_info rep,
int  is_referral,
time_t  leeway,
int  pside,
struct regional region,
uint16_t  flags 
)

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

Parameters
envenvironment, with alloc structure and dns cache.
qinfquery info, the query for which answer is stored.
repreply in dns_msg from dns_alloc_msg for example.
is_referralIf true, then the given message to be stored is a referral. The cache implementation may use this as a hint.
leewayprefetch TTL leeway to expire old rrsets quicker.
psidetrue if dp is parentside, thus message is 'fresh' and NS can be prefetch-updates.
regionto copy modified (cache is better) rrs back to.
flagswith BIT_CD for dns64 AAAA translated queries.
Returns
void, because we are not interested in alloc errors, the iterator and validator can operate on the results in their scratch space (the qstate.region) and are not dependent on the cache. It is useful to log the alloc failure (for the server operator), but the query resolution can continue without cache storage.

◆ iter_dp_cangodown()

int iter_dp_cangodown ( struct query_info qinfo,
struct delegpt dp 
)

See if delegpt can go down a step to the qname or not

Parameters
qinfothe query name looked up.
dpchecked if the name can go lower to the qname
Returns
true if can go down, false if that would not be possible. the current response seems to be the one and only, best possible, response.

◆ iter_dp_is_useless()

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
qinfoquery name and type
qflagsquery flags with RD flag
dpdelegpt to check.
Returns
true if dp is useless.

◆ iter_ds_toolow()

int iter_ds_toolow ( struct dns_msg msg,
struct delegpt dp 
)

See if a DS response (type ANSWER) is too low: a nodata answer with a SOA record in the authority section at-or-below the qchase.qname. Also returns true if we are not sure (i.e. empty message, CNAME nosig).

Parameters
msgthe response.
dpthe dp name is used to check if the RRSIG gives a clue that it was originated from the correct nameserver.
Returns
true if too low.

◆ iter_get_next_root()

int iter_get_next_root ( struct iter_hints hints,
struct iter_forwards fwd,
uint16_t c 
)

Lookup next root-hint or root-forward entry.

Parameters
hintsthe hints.
fwdthe forwards.
cthe class to start searching at. 0 means find first one.
Returns
false if no classes found, true if found and returned in c.

◆ iter_indicates_dnssec()

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
envmodule env with trust anchors.
dpdelegation point.
msgdelegation message, with DS if a secure referral.
dclassclass of query.
Returns
1 if dnssec is expected, 0 if not or insecure point above qname.

◆ iter_lookup_parent_glue_from_cache()

int iter_lookup_parent_glue_from_cache ( struct module_env env,
struct delegpt dp,
struct regional region,
struct query_info qinfo 
)

Add parent-side glue if that exists in the cache. This is both new information and acts like a timeout throttle on retries to fetch them.

Parameters
envquery env with rrset cache and time.
dpdelegation point to store result in. Also this dp is used to see which NS name is needed.
regionregion to alloc result in.
qinfopertinent information, the qclass.
Returns
: true, it worked, no malloc failures, and new addresses (lame) have been added, giving extra options as query targets.

◆ iter_lookup_parent_NS_from_cache()

int iter_lookup_parent_NS_from_cache ( struct module_env env,
struct delegpt dp,
struct regional region,
struct query_info qinfo 
)

Add parent NS record if that exists in the cache. This is both new information and acts like a timeout throttle on retries.

Parameters
envquery env with rrset cache and time.
dpdelegation point to store result in. Also this dp is used to see which NS name is needed.
regionregion to alloc result in.
qinfopertinent information, the qclass.
Returns
false on malloc failure. if true, the routine worked and if such cached information existed dp->has_parent_side_NS is set true.

◆ iter_mark_cycle_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
qstatequery state.
dpdelegpt to mark ns in.

◆ iter_mark_pside_cycle_targets()

void iter_mark_pside_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. For the parent-side lookups.

Parameters
qstatequery state.
dpdelegpt to mark ns in.

◆ iter_merge_retry_counts()

void iter_merge_retry_counts ( struct delegpt dp,
struct delegpt old 
)

Add retry counts from older delegpt to newer delegpt. Does not waste time on timeout'd (or other failing) addresses.

Parameters
dpnew delegationpoint.
oldold delegationpoint.

◆ iter_msg_from_zone()

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
msgthe message to inspect.
dpdelegation point with zone name to look for.
typetype of message.
dclassclass 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.

◆ iter_msg_has_dnssec()

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
msgmessage to examine.
Returns
true if DNSSEC information was found.

◆ iter_ns_probability()

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
rndrandom table
nprobability.
mdivisor for probability.
Returns
true with n/m probability.

◆ iter_qname_indicates_dnssec()

int iter_qname_indicates_dnssec ( struct module_env env,
struct query_info qinfo 
)

See if qname has DNSSEC needs. This is true if there is a trust anchor above it. Whether there is an insecure delegation to the data is unknown.

Parameters
envenvironment with anchors.
qinfoquery name and class.
Returns
true if trust anchor above qname, false if no anchor or insecure point above qname.

◆ iter_scrub_ds()

void iter_scrub_ds ( struct dns_msg msg,
struct ub_packed_rrset_key ns,
uint8_t z 
)

Remove DS records that are inappropriate before they are cached.

Parameters
msgthe response to scrub.
nsRRSET that is the NS record for the referral. if NULL, then all DS records are removed from the authority section.
zzone name that the response is from.

◆ iter_server_selection()

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_lame,
int *  chase_to_rd,
int  open_target,
struct sock_list blacklist,
time_t  prefetch 
)

Select a valid, nice target to send query to. Sorting and removing unsuitable targets is combined.

Parameters
iter_enviterator module global state, with ip6 enabled and do-not-query-addresses.
envenvironment with infra cache (lameness, rtt info).
dpdelegation point with result list.
namezone name (for lameness check).
namelenlength of name.
qtypequery type that we want to send.
dnssec_lameset to 1, if a known dnssec-lame server is selected these are not preferred, but are used as a last resort.
chase_to_rdset to 1 if a known recursion lame server is selected these are not preferred, but are used as a last resort.
open_targetnumber of currently outstanding target queries. If we wait for these, perhaps more server addresses become available.
blacklistthe IP blacklist to use.
prefetchif not 0, prefetch is in use for this query. This means the query can have different timing, because prefetch is not waited upon by the downstream client, and thus a good time to perform exploration of other targets.
Returns
best target or NULL if no target. if not null, that target is removed from the result list in the dp.

◆ iter_store_parentside_neg()

void iter_store_parentside_neg ( struct module_env env,
struct query_info qinfo,
struct reply_info rep 
)

Store parent-side negative element, the parentside rrset does not exist, creates an rrset with empty rdata in the rrset cache with PARENTSIDE flag.

Parameters
envenvironment with cache, time, ...
qinfothe identity of the rrset that is missing.
repdelegation response or answer response, to glean TTL from. (malloc) failure is logged but otherwise ignored.

◆ iter_store_parentside_NS()

void iter_store_parentside_NS ( struct module_env env,
struct reply_info rep 
)

Store parent-side NS records from a referral message

Parameters
envenvironment with cache, time, ...
represponse with NS rrset. Failure to store is logged, but otherwise ignored.

◆ iter_store_parentside_rrset()

void iter_store_parentside_rrset ( struct module_env env,
struct ub_packed_rrset_key rrset 
)

Store parent-side rrset in separate rrset cache entries for later last-resort * lookups in case the child-side versions of this information fails.

Parameters
envenvironment with cache, time, ...
rrsetthe rrset to store (copied). Failure to store is logged, but otherwise ignored.

◆ reply_equal()

int reply_equal ( struct reply_info p,
struct reply_info q,
struct regional region 
)

Check if two replies are equal For fallback procedures

Parameters
preply one. The reply has rrset data pointers in region. Does not check rrset-IDs
qreply two
regionscratch buffer.
Returns
if one and two are equal.