Electroneum
infra.h File Reference
#include "util/storage/lruhash.h"
#include "util/storage/dnstree.h"
#include "util/rtt.h"
#include "util/netevent.h"
#include "util/data/msgreply.h"
Include dependency graph for infra.h:

Go to the source code of this file.

Classes

struct  infra_key
 
struct  infra_data
 
struct  infra_cache
 
struct  domain_limit_data
 
struct  rate_key
 
struct  ip_rate_key
 
struct  rate_data
 

Macros

#define RATE_WINDOW   2
 
#define ip_rate_data   rate_data
 
#define INFRA_HOST_STARTSIZE   32
 
#define INFRA_BYTES_NAME   14
 
#define ip_rate_deldatafunc   rate_deldatafunc
 

Functions

struct infra_cacheinfra_create (struct config_file *cfg)
 
void infra_delete (struct infra_cache *infra)
 
struct infra_cacheinfra_adjust (struct infra_cache *infra, struct config_file *cfg)
 
struct lruhash_entryinfra_lookup_nottl (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen, int wr)
 
int infra_host (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen, time_t timenow, int *edns_vs, uint8_t *edns_lame_known, int *to)
 
int infra_set_lame (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen, time_t timenow, int dnsseclame, int reclame, uint16_t qtype)
 
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, time_t timenow)
 
void infra_update_tcp_works (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen)
 
int infra_edns_update (struct infra_cache *infra, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *name, size_t namelen, int edns_version, time_t timenow)
 
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, time_t timenow)
 
long long 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, time_t timenow, int *tA, int *tAAAA, int *tother)
 
int infra_ratelimit_inc (struct infra_cache *infra, uint8_t *name, size_t namelen, time_t timenow)
 
void infra_ratelimit_dec (struct infra_cache *infra, uint8_t *name, size_t namelen, time_t timenow)
 
int infra_ratelimit_exceeded (struct infra_cache *infra, uint8_t *name, size_t namelen, time_t timenow)
 
int infra_rate_max (void *data, time_t now)
 
int infra_find_ratelimit (struct infra_cache *infra, uint8_t *name, size_t namelen)
 
int infra_ip_ratelimit_inc (struct infra_cache *infra, struct comm_reply *repinfo, time_t timenow)
 
size_t infra_get_mem (struct infra_cache *infra)
 
size_t infra_sizefunc (void *k, void *d)
 
int infra_compfunc (void *key1, void *key2)
 
void infra_delkeyfunc (void *k, void *arg)
 
void infra_deldatafunc (void *d, void *arg)
 
size_t rate_sizefunc (void *k, void *d)
 
int rate_compfunc (void *key1, void *key2)
 
void rate_delkeyfunc (void *k, void *arg)
 
void rate_deldatafunc (void *d, void *arg)
 
size_t ip_rate_sizefunc (void *k, void *d)
 
int ip_rate_compfunc (void *key1, void *key2)
 
void ip_rate_delkeyfunc (void *d, void *arg)
 

Variables

int infra_dp_ratelimit
 
int infra_ip_ratelimit
 

Detailed Description

This file contains the infrastructure cache, as well as rate limiting. Note that there are two sorts of rate-limiting here:

  • Pre-cache, per-query rate limiting (query ratelimits)
  • Post-cache, per-domain name rate limiting (infra-ratelimits)

Definition in file infra.h.

Macro Definition Documentation

◆ INFRA_BYTES_NAME

#define INFRA_BYTES_NAME   14

bytes per zonename reserved in the hostcache, dnamelen(zonename.com.)

Definition at line 190 of file infra.h.

◆ INFRA_HOST_STARTSIZE

#define INFRA_HOST_STARTSIZE   32

infra host cache default hash lookup size

Definition at line 188 of file infra.h.

◆ ip_rate_data

#define ip_rate_data   rate_data

Definition at line 185 of file infra.h.

◆ ip_rate_deldatafunc

#define ip_rate_deldatafunc   rate_deldatafunc

Definition at line 460 of file infra.h.

◆ RATE_WINDOW

#define RATE_WINDOW   2

number of seconds to track qps rate

Definition at line 168 of file infra.h.

Function Documentation

◆ infra_adjust()

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

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
infraexisting cache. If NULL a new infra cache is returned.
cfgconfig options.
Returns
the new infra cache pointer or NULL on error.

◆ infra_compfunc()

int infra_compfunc ( void *  key1,
void *  key2 
)

compare two addresses, returns -1, 0, or +1

◆ infra_create()

struct infra_cache* infra_create ( struct config_file cfg)

Create infra cache.

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

◆ infra_deldatafunc()

void infra_deldatafunc ( void *  d,
void *  arg 
)

delete data and destroy the lameness hashtable

◆ infra_delete()

void infra_delete ( struct infra_cache infra)

Delete infra cache.

Parameters
infrainfrastructure cache to delete.

◆ infra_delkeyfunc()

void infra_delkeyfunc ( void *  k,
void *  arg 
)

delete key, and destroy the lock

◆ infra_edns_update()

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

Update edns information for the host.

Parameters
infrainfrastructure cache.
addrhost address.
addrlenlength of addr.
namename of zone
namelenlength of name
edns_versionthe version that it publishes. If it is known to support EDNS then no-EDNS is not stored over it.
timenowwhat time it is now.
Returns
: 0 on error.

◆ infra_find_ratelimit()

int infra_find_ratelimit ( struct infra_cache infra,
uint8_t name,
size_t  namelen 
)

find the ratelimit in qps for a domain. 0 if no limit for domain.

◆ infra_get_host_rto()

long long 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,
time_t  timenow,
int *  tA,
int *  tAAAA,
int *  tother 
)

Get additional (debug) info on timing.

Parameters
infrainfra cache.
addrhost address.
addrlenlength of addr.
namezone name
namelenzone name length
rttthe rtt_info is copied into here (caller alloced return struct).
delayprobe delay (if any).
timenowwhat time it is now.
tAtimeout counter on type A.
tAAAAtimeout counter on type AAAA.
tothertimeout counter on type other.
Returns
TTL the infra host element is valid for. If -1: not found in cache. TTL -2: found but expired.

◆ infra_get_lame_rtt()

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,
time_t  timenow 
)

Get Lameness information and average RTT if host is in the cache. This information is to be used for server selection.

Parameters
infrainfrastructure cache.
addrhost address.
addrlenlength of addr.
namezone name.
namelenzone name length.
qtypethe query to be made.
lameif function returns true, this returns lameness of the zone.
dnsseclameif function returns true, this returns if the zone is dnssec-lame.
reclameif function returns true, this is if it is recursion lame.
rttif function returns true, this returns avg rtt of the server. The rtt value is unclamped and reflects recent timeouts.
timenowwhat time it is now.
Returns
if found in cache, or false if not (or TTL bad).

◆ infra_get_mem()

size_t infra_get_mem ( struct infra_cache infra)

Get memory used by the infra cache.

Parameters
infrainfrastructure cache.
Returns
memory in use in bytes.

◆ infra_host()

int infra_host ( struct infra_cache infra,
struct sockaddr_storage addr,
socklen_t  addrlen,
uint8_t name,
size_t  namelen,
time_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
infrainfrastructure cache.
addrhost address.
addrlenlength of addr.
namedomain name of zone.
namelenlength of domain name.
timenowwhat time it is now.
edns_vsedns version it supports, is returned.
edns_lame_knownif EDNS lame (EDNS is dropped in transit) has already been probed, is returned.
totimeout to use, is returned.
Returns
: 0 on error.

◆ infra_ip_ratelimit_inc()

int infra_ip_ratelimit_inc ( struct infra_cache infra,
struct comm_reply repinfo,
time_t  timenow 
)

Update query ratelimit hash and decide whether or not a query should be dropped.

Parameters
infrainfra cache
repinfoinformation about client
timenowwhat time it is now.
Returns
1 if it could be incremented. 0 if the increment overshot the ratelimit and the query should be dropped.

◆ infra_lookup_nottl()

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 
)

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

Parameters
infrainfrastructure cache.
addrhost address.
addrlenlength of addr.
namedomain name of zone.
namelenlength of domain name.
wrif true, writelock, else readlock.
Returns
the entry, could be expired (this is not checked) or NULL.

◆ infra_rate_max()

int infra_rate_max ( void *  data,
time_t  now 
)

find the maximum rate stored, not too old. 0 if no information.

◆ infra_ratelimit_dec()

void infra_ratelimit_dec ( struct infra_cache infra,
uint8_t name,
size_t  namelen,
time_t  timenow 
)

Decrement the query rate counter for a delegation point. Because the reply received for the delegation point was pleasant, we do not charge this delegation point with it (i.e. it was a referral). Should call it with same second as when inc() was called.

Parameters
infrainfra cache.
namezone name
namelenzone name length
timenowwhat time it is now.

◆ infra_ratelimit_exceeded()

int infra_ratelimit_exceeded ( struct infra_cache infra,
uint8_t name,
size_t  namelen,
time_t  timenow 
)

See if the query rate counter for a delegation point is exceeded. So, no queries are going to be allowed.

Parameters
infrainfra cache.
namezone name
namelenzone name length
timenowwhat time it is now.
Returns
true if exceeded.

◆ infra_ratelimit_inc()

int infra_ratelimit_inc ( struct infra_cache infra,
uint8_t name,
size_t  namelen,
time_t  timenow 
)

Increment the query rate counter for a delegation point.

Parameters
infrainfra cache.
namezone name
namelenzone name length
timenowwhat time it is now.
Returns
1 if it could be incremented. 0 if the increment overshot the ratelimit or if in the previous second the ratelimit was exceeded. Failures like alloc failures are not returned (probably as 1).

◆ infra_rtt_update()

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,
time_t  timenow 
)

Update rtt information for the host.

Parameters
infrainfrastructure cache.
addrhost address.
addrlenlength of addr.
namezone name
namelenzone name length
qtypequery type.
roundtripestimate of roundtrip time in milliseconds or -1 for timeout.
orig_rttoriginal rtt for the query that timed out (roundtrip==-1). ignored if roundtrip != -1.
timenowwhat time it is now.
Returns
: 0 on error. new rto otherwise.

◆ infra_set_lame()

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

Set a host to be lame for the given zone.

Parameters
infrainfrastructure cache.
addrhost address.
addrlenlength of addr.
namedomain name of zone apex.
namelenlength of domain name.
timenowwhat time it is now.
dnsseclameif true the host is set dnssec lame. if false, the host is marked lame (not serving the zone).
reclameif true host is a recursor not AA server. if false, dnsseclame or marked lame.
qtypethe query type for which it is lame.
Returns
: 0 on error.

◆ infra_sizefunc()

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

◆ infra_update_tcp_works()

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
infrainfrastructure cache.
addrhost address.
addrlenlength of addr.
namename of zone
namelenlength of name

◆ ip_rate_compfunc()

int ip_rate_compfunc ( void *  key1,
void *  key2 
)

◆ ip_rate_delkeyfunc()

void ip_rate_delkeyfunc ( void *  d,
void *  arg 
)

◆ ip_rate_sizefunc()

size_t ip_rate_sizefunc ( void *  k,
void *  d 
)

◆ rate_compfunc()

int rate_compfunc ( void *  key1,
void *  key2 
)

compare two names, returns -1, 0, or +1

◆ rate_deldatafunc()

void rate_deldatafunc ( void *  d,
void *  arg 
)

delete data

◆ rate_delkeyfunc()

void rate_delkeyfunc ( void *  k,
void *  arg 
)

delete key, and destroy the lock

◆ rate_sizefunc()

size_t rate_sizefunc ( void *  k,
void *  d 
)

calculate size for the hashtable

Variable Documentation

◆ infra_dp_ratelimit

int infra_dp_ratelimit

ratelimit, unless overridden by domain_limits, 0 is off

◆ infra_ip_ratelimit

int infra_ip_ratelimit

ip ratelimit, 0 is off