unbound  0.1
Data Structures | Macros | Functions
infra.h File Reference

This file contains the infrastructure cache. More...

#include "util/storage/lruhash.h"
#include "util/rtt.h"

Data Structures

struct  infra_key
 Host information kept for every server, per zone. More...
struct  infra_data
 Host information encompasses host capabilities and retransmission timeouts. More...
struct  infra_cache
 Infra cache. More...

Macros

#define INFRA_HOST_STARTSIZE   32
 infra host cache default hash lookup size
#define INFRA_BYTES_NAME   14
 bytes per zonename reserved in the hostcache, dnamelen(zonename.com.)

Functions

struct infra_cacheinfra_create (struct config_file *cfg)
 Create infra cache.
void infra_delete (struct infra_cache *infra)
 Delete infra cache.
struct infra_cacheinfra_adjust (struct infra_cache *infra, struct config_file *cfg)
 Adjust infra cache to use updated configuration settings.
struct lruhash_entryinfra_lookup_nottl (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen, int wr)
 Plain find infra data function (used by the the other functions)
int infra_host (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen, uint32_t timenow, int *edns_vs, uint8_t *edns_lame_known, int *to)
 Find host information to send a packet.
int infra_set_lame (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen, uint32_t timenow, int dnsseclame, int reclame, uint16_t qtype)
 Set a host to be lame for the given zone.
int infra_rtt_update (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen, int qtype, int roundtrip, int orig_rtt, uint32_t timenow)
 Update rtt information for the host.
void infra_update_tcp_works (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen)
 Update information for the host, store that a TCP transaction works.
int infra_edns_update (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen, int edns_version, uint32_t timenow)
 Update edns information for the host.
int infra_get_lame_rtt (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen, uint16_t qtype, int *lame, int *dnsseclame, int *reclame, int *rtt, uint32_t timenow)
 Get Lameness information and average RTT if host is in the cache.
int infra_get_host_rto (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen, struct rtt_info *rtt, int *delay, uint32_t timenow, int *tA, int *tAAAA, int *tother)
 Get additional (debug) info on timing.
size_t infra_get_mem (struct infra_cache *infra)
 Get memory used by the infra cache.
size_t infra_sizefunc (void *k, void *d)
 calculate size for the hashtable, does not count size of lameness, so the hashtable is a fixed number of items
int infra_compfunc (void *key1, void *key2)
 compare two addresses, returns -1, 0, or +1
void infra_delkeyfunc (void *k, void *arg)
 delete key, and destroy the lock
void infra_deldatafunc (void *d, void *arg)
 delete data and destroy the lameness hashtable

Detailed Description

This file contains the infrastructure cache.

Function Documentation

struct infra_cache* infra_create ( struct config_file cfg)
read

Create infra cache.

Parameters
cfg,:config parameters or NULL for defaults.
Returns
: new infra cache, or NULL.

References infra_cache::host_ttl, config_file::host_ttl, infra_cache::hosts, config_file::infra_cache_numhosts, config_file::infra_cache_slabs, infra_compfunc(), infra_deldatafunc(), infra_delkeyfunc(), INFRA_HOST_STARTSIZE, infra_sizefunc(), and slabhash_create().

Referenced by infra_adjust(), and infra_test().

void infra_delete ( struct infra_cache infra)

Delete infra cache.

Parameters
infra,:infrastructure cache to delete.

References infra_cache::hosts, and slabhash_delete().

Referenced by daemon_delete(), infra_adjust(), infra_test(), and ub_ctx_delete().

struct infra_cache* infra_adjust ( struct infra_cache infra,
struct config_file cfg 
)
read

Adjust infra cache to use updated configuration settings.

This may clean the cache. Operates a bit like realloc. There may be no threading or use by other threads.

Parameters
infra,:existing cache. If NULL a new infra cache is returned.
cfg,:config options.
Returns
the new infra cache pointer or NULL on error.

References infra_cache::host_ttl, config_file::host_ttl, infra_cache::hosts, config_file::infra_cache_numhosts, config_file::infra_cache_slabs, infra_create(), infra_delete(), slabhash::size, and slabhash_get_size().

Referenced by context_finalize(), and daemon_apply_cfg().

struct lruhash_entry* infra_lookup_nottl ( struct infra_cache infra,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
uint8_t *  name,
size_t  namelen,
int  wr 
)
read

Plain find infra data function (used by the the other functions)

Parameters
infra,:infrastructure cache.
addr,:host address.
addrlen,:length of addr.
name,:domain name of zone.
namelen,:length of domain name.
wr,:if true, writelock, else readlock.
Returns
the entry, could be expired (this is not checked) or NULL.

References infra_key::addr, infra_key::addrlen, lruhash_entry::data, infra_key::entry, lruhash_entry::hash, hash_infra(), infra_cache::hosts, lruhash_entry::key, infra_key::namelen, slabhash_lookup(), and infra_key::zonename.

Referenced by infra_edns_update(), infra_get_host_rto(), infra_get_lame_rtt(), infra_host(), infra_rtt_update(), infra_set_lame(), and infra_update_tcp_works().

int infra_host ( struct infra_cache infra,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
uint8_t *  name,
size_t  namelen,
uint32_t  timenow,
int *  edns_vs,
uint8_t *  edns_lame_known,
int *  to 
)

Find host information to send a packet.

Creates new entry if not found. Lameness is empty. EDNS is 0 (try with first), and rtt is returned for the first message to it. Use this to send a packet only, because it also locks out others when probing is restricted.

Parameters
infra,:infrastructure cache.
addr,:host address.
addrlen,:length of addr.
name,:domain name of zone.
namelen,:length of domain name.
timenow,:what time it is now.
edns_vs,:edns version it supports, is returned.
edns_lame_known,:if EDNS lame (EDNS is dropped in transit) has already been probed, is returned.
to,:timeout to use, is returned.
Returns
: 0 on error.

References lruhash_entry::data, data_entry_init(), infra_data::edns_lame_known, infra_data::edns_version, lruhash_entry::hash, infra_cache::hosts, infra_lookup_nottl(), lruhash_entry::lock, new_entry(), PROBE_MAXRTO, infra_data::probedelay, rtt_info::rto, infra_data::rtt, rtt_notimeout(), rtt_timeout(), slabhash_insert(), and USEFUL_SERVER_TOP_TIMEOUT.

Referenced by expon_timeout_backoff(), infra_test(), print_dp_details(), serviced_tcp_send(), and serviced_udp_send().

int infra_set_lame ( struct infra_cache infra,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
uint8_t *  name,
size_t  namelen,
uint32_t  timenow,
int  dnsseclame,
int  reclame,
uint16_t  qtype 
)

Set a host to be lame for the given zone.

Parameters
infra,:infrastructure cache.
addr,:host address.
addrlen,:length of addr.
name,:domain name of zone apex.
namelen,:length of domain name.
timenow,:what time it is now.
dnsseclame,:if true the host is set dnssec lame. if false, the host is marked lame (not serving the zone).
reclame,:if true host is a recursor not AA server. if false, dnsseclame or marked lame.
qtype,:the query type for which it is lame.
Returns
: 0 on error.

References lruhash_entry::data, data_entry_init(), lruhash_entry::hash, infra_cache::hosts, infra_lookup_nottl(), infra_data::isdnsseclame, infra_data::lame_other, infra_data::lame_type_A, lruhash_entry::lock, log_err(), new_entry(), infra_data::rec_lame, and slabhash_insert().

Referenced by infra_test(), and processQueryResponse().

int infra_rtt_update ( struct infra_cache infra,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
uint8_t *  name,
size_t  namelen,
int  qtype,
int  roundtrip,
int  orig_rtt,
uint32_t  timenow 
)

Update rtt information for the host.

Parameters
infra,:infrastructure cache.
addr,:host address.
addrlen,:length of addr.
name,:zone name
namelen,:zone name length
qtype,:query type.
roundtrip,:estimate of roundtrip time in milliseconds or -1 for timeout.
orig_rtt,:original rtt for the query that timed out (roundtrip==-1). ignored if roundtrip != -1.
timenow,:what time it is now.
Returns
: 0 on error. new rto otherwise.

References lruhash_entry::data, data_entry_init(), lruhash_entry::hash, infra_cache::hosts, infra_lookup_nottl(), lruhash_entry::lock, new_entry(), infra_data::probedelay, rtt_info::rto, infra_data::rtt, rtt_lost(), rtt_update(), slabhash_insert(), infra_data::timeout_A, infra_data::timeout_AAAA, TIMEOUT_COUNT_MAX, and infra_data::timeout_other.

Referenced by do_infra_rtt(), expon_timeout_backoff(), infra_test(), serviced_tcp_callback(), and serviced_udp_callback().

void infra_update_tcp_works ( struct infra_cache infra,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
uint8_t *  name,
size_t  namelen 
)

Update information for the host, store that a TCP transaction works.

Parameters
infra,:infrastructure cache.
addr,:host address.
addrlen,:length of addr.
name,:name of zone
namelen,:length of name

References lruhash_entry::data, infra_lookup_nottl(), lruhash_entry::lock, rtt_info::rto, infra_data::rtt, and RTT_MAX_TIMEOUT.

Referenced by serviced_tcp_callback().

int infra_edns_update ( struct infra_cache infra,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
uint8_t *  name,
size_t  namelen,
int  edns_version,
uint32_t  timenow 
)

Update edns information for the host.

Parameters
infra,:infrastructure cache.
addr,:host address.
addrlen,:length of addr.
name,:name of zone
namelen,:length of name
edns_version,:the version that it publishes. If it is known to support EDNS then no-EDNS is not stored over it.
timenow,:what time it is now.
Returns
: 0 on error.

References lruhash_entry::data, data_entry_init(), infra_data::edns_lame_known, infra_data::edns_version, lruhash_entry::hash, infra_cache::hosts, infra_lookup_nottl(), lruhash_entry::lock, new_entry(), and slabhash_insert().

Referenced by infra_test(), serviced_tcp_callback(), and serviced_udp_callback().

int infra_get_lame_rtt ( struct infra_cache infra,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
uint8_t *  name,
size_t  namelen,
uint16_t  qtype,
int *  lame,
int *  dnsseclame,
int *  reclame,
int *  rtt,
uint32_t  timenow 
)

Get Lameness information and average RTT if host is in the cache.

This information is to be used for server selection.

Parameters
infra,:infrastructure cache.
addr,:host address.
addrlen,:length of addr.
name,:zone name.
namelen,:zone name length.
qtype,:the query to be made.
lame,:if function returns true, this returns lameness of the zone.
dnsseclame,:if function returns true, this returns if the zone is dnssec-lame.
reclame,:if function returns true, this is if it is recursion lame.
rtt,:if function returns true, this returns avg rtt of the server. The rtt value is unclamped and reflects recent timeouts.
timenow,:what time it is now.
Returns
if found in cache, or false if not (or TTL bad).

References lruhash_entry::data, infra_lookup_nottl(), infra_data::isdnsseclame, infra_data::lame_other, infra_data::lame_type_A, lruhash_entry::lock, PROBE_MAXRTO, infra_data::probedelay, infra_data::rec_lame, rtt_info::rto, infra_data::rtt, rtt_notimeout(), rtt_unclamped(), infra_data::timeout_A, infra_data::timeout_AAAA, TIMEOUT_COUNT_MAX, infra_data::timeout_other, infra_data::ttl, and USEFUL_SERVER_TOP_TIMEOUT.

Referenced by iter_filter_unsuitable(), and print_dp_details().

int infra_get_host_rto ( struct infra_cache infra,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
uint8_t *  name,
size_t  namelen,
struct rtt_info rtt,
int *  delay,
uint32_t  timenow,
int *  tA,
int *  tAAAA,
int *  tother 
)

Get additional (debug) info on timing.

Parameters
infra,:infra cache.
addr,:host address.
addrlen,:length of addr.
name,:zone name
namelen,:zone name length
rtt,:the rtt_info is copied into here (caller alloced return struct).
delay,:probe delay (if any).
timenow,:what time it is now.
tA,:timeout counter on type A.
tAAAA,:timeout counter on type AAAA.
tother,:timeout counter on type other.
Returns
TTL the infra host element is valid for. If -1: not found in cache. TTL -2: found but expired.

References lruhash_entry::data, infra_lookup_nottl(), lruhash_entry::lock, infra_data::probedelay, infra_data::rtt, infra_data::timeout_A, infra_data::timeout_AAAA, infra_data::timeout_other, and infra_data::ttl.

Referenced by print_dp_details().

size_t infra_get_mem ( struct infra_cache infra)

Get memory used by the infra cache.

Parameters
infra,:infrastructure cache.
Returns
memory in use in bytes.

References infra_cache::hosts, and slabhash_get_mem().

Referenced by worker_mem_report().