iter_priv.c File Reference
#include "config.h"
#include "iterator/iter_priv.h"
#include "util/regional.h"
#include "util/log.h"
#include "util/config_file.h"
#include "util/data/dname.h"
#include "util/data/msgparse.h"
#include "util/net_help.h"
#include "util/storage/dnstree.h"
#include "sldns/str2wire.h"
#include "sldns/sbuffer.h"


struct iter_privpriv_create (void)
 Create priv structure. More...
void priv_delete (struct iter_priv *priv)
 Delete priv structure. More...
static int read_addrs (struct iter_priv *priv, struct config_file *cfg)
 Read private-addr declarations from config.
static int read_names (struct iter_priv *priv, struct config_file *cfg)
 Read private-domain declarations from config.
int priv_apply_cfg (struct iter_priv *priv, struct config_file *cfg)
 Process priv config. More...
static int priv_lookup_addr (struct iter_priv *priv, struct sockaddr_storage *addr, socklen_t addrlen)
 See if an address is blocked. More...
static int priv_lookup_name (struct iter_priv *priv, sldns_buffer *pkt, uint8_t *name, size_t name_len, uint16_t dclass)
 See if a name is whitelisted. More...
size_t priv_get_mem (struct iter_priv *priv)
 Get memory used by priv structure. More...
static int remove_rr (const char *str, sldns_buffer *pkt, struct rrset_parse *rrset, struct rr_parse *prev, struct rr_parse **rr, struct sockaddr_storage *addr, socklen_t addrlen)
 remove RR from msgparse RRset, return true if rrset is entirely bad
int priv_rrset_bad (struct iter_priv *priv, sldns_buffer *pkt, struct rrset_parse *rrset)
 See if rrset is bad. More...

Detailed Description

This file contains functions to assist the iterator module. Keep track of the private addresses and lookup fast.

Function Documentation

◆ priv_create()

struct iter_priv* priv_create ( void  )

Create priv structure.

new structure or NULL on error.

References iter_priv::a, addr_tree_init(), iter_priv::n, name_tree_init(), priv_delete(), iter_priv::region, and regional_create().

Referenced by iter_apply_cfg().

◆ priv_delete()

void priv_delete ( struct iter_priv priv)

Delete priv structure.

privto delete.

References iter_priv::region, and regional_destroy().

Referenced by iter_deinit(), and priv_create().

◆ priv_apply_cfg()

int priv_apply_cfg ( struct iter_priv priv,
struct config_file cfg 

Process priv config.

privwhere to store.
cfgconfig options.
0 on error.

References iter_priv::a, addr_tree_init(), addr_tree_init_parents(), iter_priv::n, name_tree_init(), name_tree_init_parents(), read_addrs(), read_names(), iter_priv::region, and regional_free_all().

Referenced by iter_apply_cfg().

◆ priv_lookup_addr()

static int priv_lookup_addr ( struct iter_priv priv,
struct sockaddr_storage *  addr,
socklen_t  addrlen 

See if an address is blocked.

privstructure for address storage.
addraddress to check
addrlenlength of addr.
: true if the address must not be queried. false if unlisted.

References iter_priv::a, and addr_tree_lookup().

◆ priv_lookup_name()

static int priv_lookup_name ( struct iter_priv priv,
sldns_buffer pkt,
uint8_t *  name,
size_t  name_len,
uint16_t  dclass 

See if a name is whitelisted.

privstructure for address storage.
pktthe packet (for compression ptrs).
namename to check.
name_lenuncompressed length of the name to check.
dclassclass to check.
: true if the name is OK. false if unlisted.

References name_tree_node::dclass, dname_count_size_labels(), dname_pkt_copy(), name_tree_node::labs, name_tree_node::len, log_assert, iter_priv::n, name_tree_node::name, and name_tree_lookup().

Referenced by priv_rrset_bad().

◆ priv_get_mem()

size_t priv_get_mem ( struct iter_priv priv)

Get memory used by priv structure.

privstructure for address storage.
bytes in use.

References iter_priv::region, and regional_get_mem().

Referenced by iter_get_mem().

◆ priv_rrset_bad()

int priv_rrset_bad ( struct iter_priv priv,
struct sldns_buffer pkt,
struct rrset_parse rrset 

See if rrset is bad.

Will remove individual RRs that are bad (if possible) to sanitize the RRset without removing it completely.

privstructure for private address storage.
pktpacket to decompress rrset name in.
rrsetthe rrset to examine, A or AAAA.
true if the rrset is bad and should be removed.

References iter_priv::a, rbtree_type::count, rrset_parse::dname, rrset_parse::dname_len, LDNS_RR_TYPE_A, name_tree_node::len, rr_parse::next, priv_lookup_name(), rrset_parse::rr_first, rrset_parse::rrset_class, and rrset_parse::type.