Data Structures | Enumerations | Functions
localzone.h File Reference

This file contains functions to enable local zone authority service. More...

#include "util/rbtree.h"
#include "util/locks.h"
#include "util/storage/dnstree.h"
#include "util/module.h"
#include "services/view.h"

Data Structures

struct  local_zones
 Authoritative local zones storage, shared. More...
 
struct  local_zone
 Local zone. More...
 
struct  local_data
 Local data. More...
 
struct  local_rrset
 A local data RRset. More...
 
struct  local_zone_override
 Local zone override information. More...
 

Enumerations

enum  localzone_type {
  local_zone_unset = 0, local_zone_deny, local_zone_refuse, local_zone_static,
  local_zone_transparent, local_zone_typetransparent, local_zone_redirect, local_zone_nodefault,
  local_zone_inform, local_zone_inform_deny, local_zone_always_transparent, local_zone_always_refuse,
  local_zone_always_nxdomain
}
 Local zone type This type determines processing for queries that did not match local-data directly. More...
 
enum  respip_action {
  respip_none = local_zone_unset, respip_deny = local_zone_deny, respip_redirect = local_zone_redirect, respip_inform = local_zone_inform,
  respip_inform_deny = local_zone_inform_deny, respip_always_transparent = local_zone_always_transparent, respip_always_refuse = local_zone_always_refuse, respip_always_nxdomain = local_zone_always_nxdomain,
  respip_refuse = local_zone_refuse, respip_static = local_zone_static, respip_transparent = local_zone_transparent, respip_typetransparent = local_zone_typetransparent
}
 Valid response ip actions for the IP-response-driven-action feature; defined here instead of in the respip module to enable sharing of enum values with the localzone_type enum. More...
 

Functions

struct local_zoneslocal_zones_create (void)
 Create local zones storage. More...
 
void local_zones_delete (struct local_zones *zones)
 Delete local zones storage. More...
 
int local_zones_apply_cfg (struct local_zones *zones, struct config_file *cfg)
 Apply config settings; setup the local authoritative data. More...
 
int local_zone_cmp (const void *z1, const void *z2)
 Compare two local_zone entries in rbtree. More...
 
int local_data_cmp (const void *d1, const void *d2)
 Compare two local_data entries in rbtree. More...
 
void local_zone_delete (struct local_zone *z)
 Delete one zone. More...
 
struct local_zonelocal_zones_tags_lookup (struct local_zones *zones, uint8_t *name, size_t len, int labs, uint16_t dclass, uint16_t dtype, uint8_t *taglist, size_t taglen, int ignoretags)
 Lookup zone that contains the given name, class and taglist. More...
 
struct local_zonelocal_zones_lookup (struct local_zones *zones, uint8_t *name, size_t len, int labs, uint16_t dclass, uint16_t dtype)
 Lookup zone that contains the given name, class. More...
 
void local_zones_print (struct local_zones *zones)
 Debug helper. More...
 
int local_zones_answer (struct local_zones *zones, struct module_env *env, struct query_info *qinfo, struct edns_data *edns, struct sldns_buffer *buf, struct regional *temp, struct comm_reply *repinfo, uint8_t *taglist, size_t taglen, uint8_t *tagactions, size_t tagactionssize, struct config_strlist **tag_datas, size_t tag_datas_size, char **tagname, int num_tags, struct view *view)
 Answer authoritatively for local zones. More...
 
int local_zone_str2type (const char *str, enum localzone_type *t)
 Parse the string into localzone type. More...
 
const char * local_zone_type2str (enum localzone_type t)
 Print localzone type to a string. More...
 
struct local_zonelocal_zones_find (struct local_zones *zones, uint8_t *name, size_t len, int labs, uint16_t dclass)
 Find zone that with exactly given name, class. More...
 
struct local_zonelocal_zones_add_zone (struct local_zones *zones, uint8_t *name, size_t len, int labs, uint16_t dclass, enum localzone_type tp)
 Add a new zone. More...
 
void local_zones_del_zone (struct local_zones *zones, struct local_zone *zone)
 Delete a zone. More...
 
int local_zones_add_RR (struct local_zones *zones, const char *rr)
 Add RR data into the localzone data. More...
 
void local_zones_del_data (struct local_zones *zones, uint8_t *name, size_t len, int labs, uint16_t dclass)
 Remove data from domain name in the tree. More...
 
int parse_dname (const char *str, uint8_t **res, size_t *len, int *labs)
 Form wireformat from text format domain name. More...
 
int local_data_find_tag_datas (const struct query_info *qinfo, struct config_strlist *list, struct ub_packed_rrset_key *r, struct regional *temp)
 Find local data tag string match for the given type (in qinfo) in the list. More...
 
enum localzone_type local_data_find_tag_action (const uint8_t *taglist, size_t taglen, const uint8_t *taglist2, size_t taglen2, const uint8_t *tagactions, size_t tagactionssize, enum localzone_type lzt, int *tag, char *const *tagname, int num_tags)
 See if two sets of tag lists (in the form of bitmap) have the same tag that has an action. More...
 
int local_zone_enter_defaults (struct local_zones *zones, struct config_file *cfg)
 Enter defaults to local zone. More...
 
int rrstr_get_rr_content (const char *str, uint8_t **nm, uint16_t *type, uint16_t *dclass, time_t *ttl, uint8_t *rr, size_t len, uint8_t **rdata, size_t *rdata_len)
 Parses resource record string into wire format, also returning its field values. More...
 
int rrset_insert_rr (struct regional *region, struct packed_rrset_data *pd, uint8_t *rdata, size_t rdata_len, time_t ttl, const char *rrstr)
 Insert specified rdata into the specified resource record. More...
 

Detailed Description

This file contains functions to enable local zone authority service.

Enumeration Type Documentation

◆ localzone_type

Local zone type This type determines processing for queries that did not match local-data directly.

Enumerator
local_zone_unset 

unset type, used for unset tag_action elements

local_zone_deny 

drop query

local_zone_refuse 

answer with error

local_zone_static 

answer nxdomain or nodata

local_zone_transparent 

resolve normally

local_zone_typetransparent 

do not block types at localdata names

local_zone_redirect 

answer with data at zone apex

local_zone_nodefault 

remove default AS112 blocking contents for zone nodefault is used in config not during service.

local_zone_inform 

log client address, but no block (transparent)

local_zone_inform_deny 

log client address, and block (drop)

local_zone_always_transparent 

resolve normally, even when there is local data

local_zone_always_refuse 

answer with error, even when there is local data

local_zone_always_nxdomain 

answer with nxdomain, even when there is local data

◆ respip_action

Valid response ip actions for the IP-response-driven-action feature; defined here instead of in the respip module to enable sharing of enum values with the localzone_type enum.

Note that these values except 'none' are the same as localzone types of the 'same semantics'. It's intentional as we use these values via access-control-tags, which can be shared for both response ip actions and local zones.

Enumerator
respip_none 

no respip action

respip_deny 

don't answer

respip_redirect 

redirect as per provided data

respip_inform 

log query source and answer query

respip_inform_deny 

log query source and don't answer query

respip_always_transparent 

resolve normally, even when there is response-ip data

respip_always_refuse 

answer with 'refused' response

respip_always_nxdomain 

answer with 'no such domain' response

respip_refuse 

serves response data (if any), else, drops queries.

respip_static 

serves response data, else, nodata answer.

respip_transparent 

gives response data (if any), else nodata answer.

respip_typetransparent 

gives response data (if any), else nodata answer.

Function Documentation

◆ local_zones_create()

struct local_zones* local_zones_create ( void  )

Create local zones storage.

Returns
new struct or NULL on error.

References local_zone_cmp(), local_zones::lock, rbtree_init(), and local_zones::ztree.

Referenced by context_finalize(), do_view_data_add(), do_view_zone_add(), localzonechecks(), and views_apply_cfg().

◆ local_zones_delete()

void local_zones_delete ( struct local_zones zones)

Delete local zones storage.

Parameters
zonesto delete.

References local_zones::lock, lzdel(), traverse_postorder(), and local_zones::ztree.

Referenced by daemon_cleanup(), ub_ctx_delete(), and view_delete().

◆ local_zones_apply_cfg()

int local_zones_apply_cfg ( struct local_zones zones,
struct config_file cfg 
)

Apply config settings; setup the local authoritative data.

Takes care of locking.

Parameters
zonesis set up.
cfgconfig data.
Returns
false on error.

References init_parents(), local_zone_enter_defaults(), lz_enter_data(), lz_enter_overrides(), lz_enter_zone_tags(), lz_enter_zones(), lz_freeup_cfg(), and lz_setup_implicit().

Referenced by context_finalize(), and views_apply_cfg().

◆ local_zone_cmp()

int local_zone_cmp ( const void *  z1,
const void *  z2 
)

Compare two local_zone entries in rbtree.

Sort hierarchical but not canonical

Parameters
z1zone 1
z2zone 2
Returns
: -1, 0, +1 comparison value.

References local_zone::dclass, dname_lab_cmp(), local_zone::name, and local_zone::namelabs.

Referenced by fptr_whitelist_rbtree_cmp(), and local_zones_create().

◆ local_data_cmp()

int local_data_cmp ( const void *  d1,
const void *  d2 
)

Compare two local_data entries in rbtree.

Sort canonical.

Parameters
d1data 1
d2data 2
Returns
: -1, 0, +1 comparison value.

References dname_canon_lab_cmp(), local_data::name, and local_data::namelabs.

Referenced by fptr_whitelist_rbtree_cmp(), and local_zone_create().

◆ local_zone_delete()

void local_zone_delete ( struct local_zone z)

◆ local_zones_tags_lookup()

struct local_zone* local_zones_tags_lookup ( struct local_zones zones,
uint8_t *  name,
size_t  len,
int  labs,
uint16_t  dclass,
uint16_t  dtype,
uint8_t *  taglist,
size_t  taglen,
int  ignoretags 
)

Lookup zone that contains the given name, class and taglist.

User must lock the tree or result zone.

Parameters
zonesthe zones tree
namedname to lookup
lenlength of name.
labslabelcount of name.
dclassclass to lookup.
dtypetype to lookup, if type DS a zone higher is used for zonecuts.
taglisttaglist to lookup.
taglenlenth of taglist.
ignoretagslookup zone by name and class, regardless the local-zone's tags.
Returns
closest local_zone or NULL if no covering zone is found.

References local_zone::dclass, dname_is_root(), dname_lab_cmp(), dname_remove_label(), rbnode_type::key, LDNS_RR_TYPE_DS, local_zone::name, local_zone::namelabs, local_zone::namelen, local_zone::node, local_zone::parent, rbtree_find_less_equal(), local_zone::taglen, local_zone::taglist, taglist_intersect(), and local_zones::ztree.

Referenced by local_zones_answer(), and local_zones_lookup().

◆ local_zones_lookup()

struct local_zone* local_zones_lookup ( struct local_zones zones,
uint8_t *  name,
size_t  len,
int  labs,
uint16_t  dclass,
uint16_t  dtype 
)

Lookup zone that contains the given name, class.

User must lock the tree or result zone.

Parameters
zonesthe zones tree
namedname to lookup
lenlength of name.
labslabelcount of name.
dclassclass to lookup.
dtypetype of the record, if type DS then a zone higher up is found pass 0 to just plain find a zone for a name.
Returns
closest local_zone or NULL if no covering zone is found.

References local_zones_tags_lookup().

Referenced by local_zones_add_RR(), local_zones_answer(), local_zones_del_data(), lz_enter_rr_str(), and lz_setup_implicit().

◆ local_zones_print()

void local_zones_print ( struct local_zones zones)

◆ local_zones_answer()

int local_zones_answer ( struct local_zones zones,
struct module_env env,
struct query_info qinfo,
struct edns_data edns,
struct sldns_buffer buf,
struct regional temp,
struct comm_reply repinfo,
uint8_t *  taglist,
size_t  taglen,
uint8_t *  tagactions,
size_t  tagactionssize,
struct config_strlist **  tag_datas,
size_t  tag_datas_size,
char **  tagname,
int  num_tags,
struct view view 
)

Answer authoritatively for local zones.

Takes care of locking.

Parameters
zonesthe stored zones (shared, read only).
envthe module environment.
qinfoquery info (parsed).
ednsedns info (parsed).
bufbuffer with query ID and flags, also for reply.
temptemporary storage region.
repinfosource address for checks. may be NULL.
taglisttaglist for checks. May be NULL.
taglenlength of the taglist.
tagactionslocal zone actions for tags. May be NULL.
tagactionssizelength of the tagactions.
tag_datasarray per tag of strlist with rdata strings. or NULL.
tag_datas_sizesize of tag_datas array.
tagnamearray of tag name strings (for debug output).
num_tagsnumber of items in tagname array.
viewanswer using this view. May be NULL.
Returns
true if answer is in buffer. false if query is not answered by authority data. If the reply should be dropped altogether, the return value is true, but the buffer is cleared (empty). It can also return true if a non-exact alias answer is found. In this case qinfo->local_alias points to the corresponding alias RRset but the answer is NOT encoded in buffer. It's the caller's responsibility to complete the alias chain (if needed) and encode the final set of answer. Data pointed to by qinfo->local_alias is allocated in 'temp' or refers to configuration data. So the caller will need to make a deep copy of it if it needs to keep it beyond the lifetime of 'temp' or a dynamic update to local zone data.

References dname_count_labels(), view::isfirst, local_zone_transparent, view::local_zones, local_zones_lookup(), local_zones_tags_lookup(), view::lock, local_zones::lock, local_zone::lock, view::name, query_info::qclass, query_info::qname, query_info::qname_len, query_info::qtype, local_zone::type, VERB_ALGO, and verbose().

Referenced by handle_newq(), libworker_attach_mesh(), and libworker_fg().

◆ local_zone_str2type()

int local_zone_str2type ( const char *  str,
enum localzone_type t 
)

◆ local_zone_type2str()

const char* local_zone_type2str ( enum localzone_type  t)

◆ local_zones_find()

struct local_zone* local_zones_find ( struct local_zones zones,
uint8_t *  name,
size_t  len,
int  labs,
uint16_t  dclass 
)

Find zone that with exactly given name, class.

User must lock the tree or result zone.

Parameters
zonesthe zones tree
namedname to lookup
lenlength of name.
labslabelcount of name.
dclassclass to lookup.
Returns
the exact local_zone or NULL.

References local_zone::dclass, rbnode_type::key, local_zone::name, local_zone::namelabs, local_zone::namelen, local_zone::node, rbtree_search(), and local_zones::ztree.

Referenced by local_zones_add_zone(), lz_enter_override(), lz_enter_zone_dname(), lz_enter_zone_tag(), perform_zone_add(), perform_zone_remove(), ub_ctx_zone_add(), and ub_ctx_zone_remove().

◆ local_zones_add_zone()

struct local_zone* local_zones_add_zone ( struct local_zones zones,
uint8_t *  name,
size_t  len,
int  labs,
uint16_t  dclass,
enum localzone_type  tp 
)

Add a new zone.

Caller must hold the zones lock. Adjusts the other zones as well (parent pointers) after insertion. The zone must NOT exist (returns NULL and logs error).

Parameters
zonesthe zones tree
namedname to add
lenlength of name.
labslabelcount of name.
dclassclass to add.
tptype.
Returns
local_zone or NULL on error, caller must printout memory error.

References local_zone_create(), local_zone_delete(), local_zones_find(), local_zone::lock, log_err(), local_zone::node, local_zone::parent, rbtree_insert(), set_kiddo_parents(), and local_zones::ztree.

Referenced by local_zones_add_RR(), perform_zone_add(), and ub_ctx_zone_add().

◆ local_zones_del_zone()

void local_zones_del_zone ( struct local_zones zones,
struct local_zone zone 
)

Delete a zone.

Caller must hold the zones lock. Adjusts the other zones as well (parent pointers) after insertion.

Parameters
zonesthe zones tree
zonethe zone to delete from tree. Also deletes zone from memory.

References local_zone_delete(), local_zone::lock, local_zone::parent, rbtree_delete(), set_kiddo_parents(), and local_zones::ztree.

Referenced by perform_zone_remove(), and ub_ctx_zone_remove().

◆ local_zones_add_RR()

int local_zones_add_RR ( struct local_zones zones,
const char *  rr 
)

Add RR data into the localzone data.

Looks up the zone, if no covering zone, a transparent zone with the name of the RR is created.

Parameters
zonesthe zones tree. Not locked by caller.
rrstring with on RR.
Returns
false on failure.

References dname_count_size_labels(), get_rr_nameclass(), local_zone_transparent, local_zones_add_zone(), local_zones_lookup(), local_zones::lock, local_zone::lock, and lz_enter_rr_into_zone().

Referenced by perform_data_add(), and ub_ctx_data_add().

◆ local_zones_del_data()

void local_zones_del_data ( struct local_zones zones,
uint8_t *  name,
size_t  len,
int  labs,
uint16_t  dclass 
)

Remove data from domain name in the tree.

All types are removed. No effect if zone or name does not exist.

Parameters
zoneszones tree.
namedname to remove
lenlength of name.
labslabelcount of name.
dclassclass to remove.

References del_empty_term(), del_local_rrset(), LDNS_RR_TYPE_DS, local_zones_lookup(), local_zones::lock, local_zone::lock, lz_find_node(), local_zone::name, local_data::name, query_dname_compare(), local_data::rrsets, and local_zone::soa.

Referenced by perform_data_remove(), and ub_ctx_data_remove().

◆ parse_dname()

int parse_dname ( const char *  str,
uint8_t **  res,
size_t *  len,
int *  labs 
)

Form wireformat from text format domain name.

Parameters
strthe domain name in text "www.example.com"
resresulting wireformat is stored here with malloc.
lenlength of resulting wireformat.
labsnumber of labels in resulting wireformat.
Returns
false on error, syntax or memory. Also logged.

References dname_count_size_labels(), log_err(), and sldns_str2wire_dname().

Referenced by lz_enter_zone(), lz_exists(), ub_ctx_data_remove(), ub_ctx_set_stub(), ub_ctx_zone_add(), and ub_ctx_zone_remove().

◆ local_data_find_tag_datas()

int local_data_find_tag_datas ( const struct query_info qinfo,
struct config_strlist list,
struct ub_packed_rrset_key r,
struct regional temp 
)

Find local data tag string match for the given type (in qinfo) in the list.

If found, 'r' will be filled with corresponding rrset information.

Parameters
qinfocontains name, type, and class for the data
liststores local tag data to be searched
rrrset key to be filled for matched data
tempregion to allocate rrset in 'r'
Returns
1 if a match is found and rrset is built; otherwise 0 including errors.

Find local data tag string match for the given type (in qinfo) in the list.

References packed_rrset_data::count, lruhash_entry::data, packed_rrset_key::dname, packed_rrset_key::dname_len, ub_packed_rrset_key::entry, packed_rrset_key::flags, lruhash_entry::key, LDNS_RR_BUF_SIZE, LDNS_RR_TYPE_CNAME, config_strlist::next, query_info::qclass, query_info::qname, query_info::qname_len, query_info::qtype, regional_alloc_init(), regional_alloc_zero(), ub_packed_rrset_key::rk, packed_rrset_data::rr_data, packed_rrset_data::rr_len, packed_rrset_data::rr_ttl, packed_rrset_key::rrset_class, sldns_str2wire_rr_buf(), sldns_wirerr_get_rdatalen(), sldns_wirerr_get_rdatawl(), sldns_wirerr_get_ttl(), sldns_wirerr_get_type(), config_strlist::str, packed_rrset_data::ttl, and packed_rrset_key::type.

Referenced by respip_data_answer().

◆ local_data_find_tag_action()

enum localzone_type local_data_find_tag_action ( const uint8_t *  taglist,
size_t  taglen,
const uint8_t *  taglist2,
size_t  taglen2,
const uint8_t *  tagactions,
size_t  tagactionssize,
enum localzone_type  lzt,
int *  tag,
char *const *  tagname,
int  num_tags 
)

See if two sets of tag lists (in the form of bitmap) have the same tag that has an action.

If so, '*tag' will be set to the found tag index, and the corresponding action will be returned in the form of local zone type. Otherwise the passed type (lzt) will be returned as the default action. Pointers except tagactions must not be NULL.

Parameters
taglist1st list of tags
taglensize of taglist in bytes
taglist22nd list of tags
taglen2size of taglist2 in bytes
tagactionslocal data actions for tags. May be NULL.
tagactionssizelength of the tagactions.
lztdefault action (local zone type) if no tag action is found.
tagsee above.
tagnamearray of tag name strings (for debug output).
num_tagsnumber of items in tagname array.
Returns
found tag action or the default action.

References local_zone_type2str(), VERB_ALGO, and verbose().

Referenced by respip_rewrite_reply().

◆ local_zone_enter_defaults()

int local_zone_enter_defaults ( struct local_zones zones,
struct config_file cfg 
)

Enter defaults to local zone.

Parameters
zonesto add defaults to
cfgcontaining list of zones to exclude from default set.
Returns
1 on success; 0 otherwise.

Enter defaults to local zone.

References add_empty_default(), as112_zones, LDNS_RR_CLASS_IN, config_file::local_zones_disable_default, local_zone::lock, log_err(), lz_enter_rr_into_zone(), lz_enter_zone(), lz_exists(), lz_nodefault(), and config_file::unblock_lan_zones.

Referenced by do_view_zone_add(), and local_zones_apply_cfg().

◆ rrstr_get_rr_content()

int rrstr_get_rr_content ( const char *  str,
uint8_t **  nm,
uint16_t *  type,
uint16_t *  dclass,
time_t *  ttl,
uint8_t *  rr,
size_t  len,
uint8_t **  rdata,
size_t *  rdata_len 
)

Parses resource record string into wire format, also returning its field values.

Parameters
strinput resource record
nmdomain name field
typerecord type field
dclassrecord class field
ttlttl field
rrbuffer for the parsed rr in wire format
lenbuffer length
rdatardata field
rdata_lenrdata field length
Returns
1 on success; 0 otherwise.

References log_err(), and sldns_str2wire_rr_buf().

Referenced by lz_enter_rr_into_zone(), and respip_enter_rr().

◆ rrset_insert_rr()

int rrset_insert_rr ( struct regional region,
struct packed_rrset_data pd,
uint8_t *  rdata,
size_t  rdata_len,
time_t  ttl,
const char *  rrstr 
)

Insert specified rdata into the specified resource record.

Parameters
regionallocator
pddata portion of the destination resource record
rdatasource rdata
rdata_lensource rdata length
ttltime to live
rrstrresource record in text form (for logging)
Returns
1 on success; 0 otherwise.

Insert specified rdata into the specified resource record.

References packed_rrset_data::count, packed_rrset_data::rr_data, packed_rrset_data::rr_len, and packed_rrset_data::rr_ttl.

Referenced by respip_enter_rr().