Data Structures | Macros | Enumerations | Functions
iterator.h File Reference

This file contains a module that performs recursive iterative DNS query processing. More...

#include "services/outbound_list.h"
#include "util/data/msgreply.h"
#include "util/module.h"

Data Structures

struct  iter_env
 Global state for the iterator. More...
 
struct  iter_qstate
 Per query state for the iterator module. More...
 
struct  iter_prep_list
 List of prepend items. More...
 

Macros

#define MAX_TARGET_COUNT   64
 max number of targets spawned for a query and its subqueries
 
#define MAX_RESTART_COUNT   8
 max number of query restarts. More...
 
#define MAX_REFERRAL_COUNT   130
 max number of referrals. More...
 
#define MAX_SENT_COUNT   32
 max number of queries-sent-out. More...
 
#define DNSSEC_LAME_DETECT_COUNT   4
 max number of queries for which to perform dnsseclameness detection, (rrsigs missing detection) after that, just pick up that response
 
#define MAX_MINIMISE_COUNT   10
 max number of QNAME minimisation iterations. More...
 
#define MAX_MINIMISE_TIMEOUT_COUNT   3
 
#define MINIMISE_ONE_LAB   4
 number of labels from QNAME that are always send individually when using QNAME minimisation, even when the number of labels of the QNAME is bigger tham MAX_MINIMISE_COUNT
 
#define MINIMISE_MULTIPLE_LABS   (MAX_MINIMISE_COUNT - MINIMISE_ONE_LAB)
 
#define TARGET_FETCH_STOP   3
 at what query-sent-count to stop target fetch policy
 
#define UNKNOWN_SERVER_NICENESS   376
 how nice is a server without further information, in msec Equals rtt initial timeout value.
 
#define USEFUL_SERVER_TOP_TIMEOUT   120000
 maximum timeout before a host is deemed unsuitable, in msec. More...
 
#define OUTBOUND_MSG_RETRY   5
 number of retries on outgoing queries
 
#define RTT_BAND   400
 RTT band, within this amount from the best, servers are chosen randomly. More...
 
#define INFRA_BACKOFF_INITIAL   240
 Start value for blacklisting a host, 2*USEFUL_SERVER_TOP_TIMEOUT in sec.
 

Enumerations

enum  minimisation_state { INIT_MINIMISE_STATE = 0, MINIMISE_STATE, SKIP_MINIMISE_STATE, DONOT_MINIMISE_STATE }
 QNAME minimisation state. More...
 
enum  iter_state {
  INIT_REQUEST_STATE = 0, INIT_REQUEST_2_STATE, INIT_REQUEST_3_STATE, QUERYTARGETS_STATE,
  QUERY_RESP_STATE, PRIME_RESP_STATE, COLLECT_CLASS_STATE, DSNS_FIND_STATE,
  FINISHED_STATE
}
 State of the iterator for a query. More...
 

Functions

struct module_func_blockiter_get_funcblock (void)
 Get the iterator function block. More...
 
const char * iter_state_to_string (enum iter_state state)
 Get iterator state as a string. More...
 
int iter_state_is_responsestate (enum iter_state s)
 See if iterator state is a response state. More...
 
int iter_init (struct module_env *env, int id)
 iterator init
 
void iter_deinit (struct module_env *env, int id)
 iterator deinit
 
void iter_operate (struct module_qstate *qstate, enum module_ev event, int id, struct outbound_entry *outbound)
 iterator operate on a query
 
void iter_inform_super (struct module_qstate *qstate, int id, struct module_qstate *super)
 Return priming query results to interested super querystates. More...
 
void iter_clear (struct module_qstate *qstate, int id)
 iterator cleanup query state
 
size_t iter_get_mem (struct module_env *env, int id)
 iterator alloc size routine
 

Detailed Description

This file contains a module that performs recursive iterative DNS query processing.

Macro Definition Documentation

◆ MAX_RESTART_COUNT

#define MAX_RESTART_COUNT   8

max number of query restarts.

Determines max number of CNAME chain.

Referenced by processInitRequest().

◆ MAX_REFERRAL_COUNT

#define MAX_REFERRAL_COUNT   130

max number of referrals.

Makes sure resolver does not run away

Referenced by processQueryTargets().

◆ MAX_SENT_COUNT

#define MAX_SENT_COUNT   32

max number of queries-sent-out.

Make sure large NS set does not loop

◆ MAX_MINIMISE_COUNT

#define MAX_MINIMISE_COUNT   10

max number of QNAME minimisation iterations.

Limits number of queries for QNAMEs with a lot of labels.

◆ USEFUL_SERVER_TOP_TIMEOUT

#define USEFUL_SERVER_TOP_TIMEOUT   120000

maximum timeout before a host is deemed unsuitable, in msec.

After host_ttl this will be timed out and the host will be tried again. Equals RTT_MAX_TIMEOUT

Referenced by dump_infra_host(), infra_get_lame_rtt(), infra_host(), infra_rtt_update(), iter_filter_order(), iter_filter_unsuitable(), iter_server_selection(), and print_dp_details().

◆ RTT_BAND

#define RTT_BAND   400

RTT band, within this amount from the best, servers are chosen randomly.

Chosen so that the UNKNOWN_SERVER_NICENESS falls within the band of a fast server, this causes server exploration as a side benefit. msec.

Referenced by iter_filter_order().

Enumeration Type Documentation

◆ minimisation_state

QNAME minimisation state.

Enumerator
INIT_MINIMISE_STATE 

(Re)start minimisation.

Outgoing QNAME should be set to dp->name. State entered on new query or after following referral or CNAME.

MINIMISE_STATE 

QNAME minimisation ongoing.

Increase QNAME on every iteration.

SKIP_MINIMISE_STATE 

Don't increment QNAME this iteration.

DONOT_MINIMISE_STATE 

Send out full QNAME + original QTYPE.

◆ iter_state

enum iter_state

State of the iterator for a query.

Enumerator
INIT_REQUEST_STATE 

Externally generated queries start at this state.

Query restarts are reset to this state.

INIT_REQUEST_2_STATE 

Root priming events reactivate here, most other events pass through this naturally as the 2nd part of the INIT_REQUEST_STATE.

INIT_REQUEST_3_STATE 

Stub priming events reactivate here, most other events pass through this naturally as the 3rd part of the INIT_REQUEST_STATE.

QUERYTARGETS_STATE 

Each time a delegation point changes for a given query or a query times out and/or wakes up, this state is (re)visited.

This state is responsible for iterating through a list of nameserver targets.

QUERY_RESP_STATE 

Responses to queries start at this state.

This state handles the decision tree associated with handling responses.

PRIME_RESP_STATE 

Responses to priming queries finish at this state.

COLLECT_CLASS_STATE 

Collecting query class information, for qclass=ANY, when it spawns off queries for every class, it returns here.

DSNS_FIND_STATE 

Find NS record to resolve DS record from, walking to the right NS spot until we find it.

FINISHED_STATE 

Responses that are to be returned upstream end at this state.

As well as responses to target queries.

Function Documentation

◆ iter_get_funcblock()

struct module_func_block* iter_get_funcblock ( void  )

Get the iterator function block.

Returns
: function block with function pointers to iterator methods.

References iter_block.

Referenced by module_funcs_avail().

◆ iter_state_to_string()

const char* iter_state_to_string ( enum iter_state  state)

Get iterator state as a string.

Parameters
stateto convert
Returns
constant string that is printable.

References COLLECT_CLASS_STATE, DSNS_FIND_STATE, FINISHED_STATE, INIT_REQUEST_2_STATE, INIT_REQUEST_3_STATE, INIT_REQUEST_STATE, PRIME_RESP_STATE, QUERY_RESP_STATE, and QUERYTARGETS_STATE.

Referenced by iter_handle().

◆ iter_state_is_responsestate()

int iter_state_is_responsestate ( enum iter_state  s)

See if iterator state is a response state.

Parameters
sto inspect
Returns
true if response state.

References COLLECT_CLASS_STATE, INIT_REQUEST_2_STATE, INIT_REQUEST_3_STATE, INIT_REQUEST_STATE, and QUERYTARGETS_STATE.

Referenced by next_state().

◆ iter_inform_super()

void iter_inform_super ( struct module_qstate qstate,
int  id,
struct module_qstate super 
)

Return priming query results to interested super querystates.

Sets the delegation point and delegation message (not nonRD queries). This is a callback from walk_supers.

Parameters
qstatequery state that finished.
idmodule id.
superthe qstate to inform.

References DSNS_FIND_STATE, module_qstate::is_priming, LDNS_RR_CLASS_ANY, LDNS_RR_TYPE_DS, module_qstate::minfo, processClassResponse(), processDSNSResponse(), query_info::qclass, module_qstate::qinfo, query_info::qtype, and module_qstate::return_rcode.

Referenced by fptr_whitelist_mod_inform_super().