Electroneum
localzone.h File Reference
#include "util/rbtree.h"
#include "util/locks.h"
#include "util/storage/dnstree.h"
#include "util/module.h"
#include "services/view.h"
Include dependency graph for localzone.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  local_zones
 
struct  local_zone
 
struct  local_data
 
struct  local_rrset
 
struct  local_zone_override
 

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_noview
}
 
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
}
 

Functions

struct local_zoneslocal_zones_create (void)
 
void local_zones_delete (struct local_zones *zones)
 
int local_zones_apply_cfg (struct local_zones *zones, struct config_file *cfg)
 
int local_zone_cmp (const void *z1, const void *z2)
 
int local_data_cmp (const void *d1, const void *d2)
 
void local_zone_delete (struct local_zone *z)
 
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)
 
struct local_zonelocal_zones_lookup (struct local_zones *zones, uint8_t *name, size_t len, int labs, uint16_t dclass, uint16_t dtype)
 
void local_zones_print (struct local_zones *zones)
 
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)
 
int local_zone_str2type (const char *str, enum localzone_type *t)
 
const char * local_zone_type2str (enum localzone_type t)
 
struct local_zonelocal_zones_find (struct local_zones *zones, uint8_t *name, size_t len, int labs, uint16_t dclass)
 
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)
 
void local_zones_del_zone (struct local_zones *zones, struct local_zone *zone)
 
int local_zones_add_RR (struct local_zones *zones, const char *rr)
 
void local_zones_del_data (struct local_zones *zones, uint8_t *name, size_t len, int labs, uint16_t dclass)
 
int parse_dname (const char *str, uint8_t **res, size_t *len, int *labs)
 
int local_data_find_tag_datas (const struct query_info *qinfo, struct config_strlist *list, struct ub_packed_rrset_key *r, struct regional *temp)
 
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)
 
int local_zone_enter_defaults (struct local_zones *zones, struct config_file *cfg)
 
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)
 
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)
 

Detailed Description

This file contains functions to enable local zone authority service.

Definition in file localzone.h.

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

local_zone_noview 

answer not from the view, but global or no-answer

Definition at line 64 of file localzone.h.

◆ 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.

Definition at line 483 of file localzone.h.

483  {
500 
501  /* The rest of the values are only possible as
502  * access-control-tag-action */
503 
512 };

Function Documentation

◆ 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.

◆ 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.

◆ 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.

◆ 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.

◆ local_zone_delete()

void local_zone_delete ( struct local_zone z)

Delete one zone

Parameters
zto delete.

◆ 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.

◆ local_zone_str2type()

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

Parse the string into localzone type.

Parameters
strstring to parse
tlocal zone type returned here.
Returns
0 on parse error.

◆ local_zone_type2str()

const char* local_zone_type2str ( enum localzone_type  t)

Print localzone type to a string. Pointer to a constant string.

Parameters
tlocal zone type.
Returns
constant string that describes type.

◆ 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.

◆ 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.

◆ 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.

◆ 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.

◆ local_zones_create()

struct local_zones* local_zones_create ( void  )

Create local zones storage

Returns
new struct or NULL on error.

◆ 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.

◆ 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.

◆ local_zones_delete()

void local_zones_delete ( struct local_zones zones)

Delete local zones storage

Parameters
zonesto delete.

◆ 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.

◆ 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.

◆ local_zones_print()

void local_zones_print ( struct local_zones zones)

Debug helper. Print all zones Takes care of locking.

Parameters
zonesthe zones tree

◆ 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.

◆ 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.

◆ 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.

◆ 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.