unbound 0.1
|
This file contains functions to enable local zone authority service. More...
#include "config.h"
#include "ldns/dname.h"
#include "ldns/host2wire.h"
#include "services/localzone.h"
#include "util/regional.h"
#include "util/config_file.h"
#include "util/data/dname.h"
#include "util/data/packed_rrset.h"
#include "util/data/msgencode.h"
#include "util/net_help.h"
#include "util/data/msgreply.h"
#include "util/data/msgparse.h"
Functions | |
struct local_zones * | local_zones_create (void) |
Create local zones storage. | |
static void | lzdel (rbnode_t *n, void *arg) |
helper traverse to delete zones | |
void | local_zones_delete (struct local_zones *zones) |
Delete local zones storage. | |
void | local_zone_delete (struct local_zone *z) |
Delete one zone. | |
int | local_zone_cmp (const void *z1, const void *z2) |
Compare two local_zone entries in rbtree. | |
int | local_data_cmp (const void *d1, const void *d2) |
Compare two local_data entries in rbtree. | |
int | parse_dname (const char *str, uint8_t **res, size_t *len, int *labs) |
Form wireformat from text format domain name. | |
static struct local_zone * | local_zone_create (uint8_t *nm, size_t len, int labs, enum localzone_type t, uint16_t dclass) |
create a new localzone | |
static struct local_zone * | lz_enter_zone_dname (struct local_zones *zones, uint8_t *nm, size_t len, int labs, enum localzone_type t, uint16_t c) |
enter a new zone with allocated dname returns with WRlock | |
static struct local_zone * | lz_enter_zone (struct local_zones *zones, const char *name, const char *type, uint16_t dclass) |
enter a new zone | |
static int | get_rr_content (const char *str, uint8_t **nm, uint16_t *type, uint16_t *dclass, uint32_t *ttl, ldns_buffer *rdata) |
return name and class and rdata of rr; parses string | |
static int | get_rr_nameclass (const char *str, uint8_t **nm, uint16_t *dclass) |
return name and class of rr; parses string | |
static struct local_rrset * | local_data_find_type (struct local_data *data, uint16_t type) |
Find an rrset in local data structure. | |
static int | rr_is_duplicate (struct packed_rrset_data *pd, ldns_buffer *buf) |
check for RR duplicates | |
static struct local_rrset * | new_local_rrset (struct regional *region, struct local_data *node, uint16_t rrtype, uint16_t rrclass) |
new local_rrset | |
static int | insert_rr (struct regional *region, struct packed_rrset_data *pd, ldns_buffer *buf, uint32_t ttl) |
insert RR into RRset data structure; Wastes a couple of bytes | |
static struct local_data * | lz_find_node (struct local_zone *z, uint8_t *nm, size_t nmlen, int nmlabs) |
find a data node by exact name | |
static int | lz_find_create_node (struct local_zone *z, uint8_t *nm, size_t nmlen, int nmlabs, struct local_data **res) |
find a node, create it if not and all its empty nonterminal parents | |
static int | lz_enter_rr_into_zone (struct local_zone *z, ldns_buffer *buf, const char *rrstr) |
enter data RR into auth zone | |
static int | lz_enter_rr_str (struct local_zones *zones, const char *rr, ldns_buffer *buf) |
enter a data RR into auth data; a zone for it must exist | |
static int | lz_enter_zones (struct local_zones *zones, struct config_file *cfg) |
parse local-zone: statements | |
static int | lz_exists (struct local_zones *zones, const char *name) |
lookup a zone in rbtree; exact match only; SLOW due to parse | |
static int | lz_nodefault (struct config_file *cfg, const char *name) |
lookup a zone in cfg->nodefault list | |
static int | add_as112_default (struct local_zones *zones, struct config_file *cfg, ldns_buffer *buf, const char *name) |
enter AS112 default zone | |
static int | lz_enter_defaults (struct local_zones *zones, struct config_file *cfg, ldns_buffer *buf) |
enter default zones | |
static void | init_parents (struct local_zones *zones) |
setup parent pointers, so that a lookup can be done for closest match | |
static int | lz_setup_implicit (struct local_zones *zones, struct config_file *cfg) |
enter implicit transparent zone for local-data: without local-zone: | |
static int | lz_enter_data (struct local_zones *zones, struct config_file *cfg, ldns_buffer *buf) |
enter auth data | |
static void | lz_freeup_cfg (struct config_file *cfg) |
free memory from config | |
int | local_zones_apply_cfg (struct local_zones *zones, struct config_file *cfg) |
Apply config settings; setup the local authoritative data. | |
struct local_zone * | local_zones_lookup (struct local_zones *zones, uint8_t *name, size_t len, int labs, uint16_t dclass) |
Lookup zone that contains the given name, class. | |
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. | |
static void | local_zone_out (struct local_zone *z) |
print all RRsets in local zone | |
void | local_zones_print (struct local_zones *zones) |
Debug helper. | |
static int | local_encode (struct query_info *qinfo, struct edns_data *edns, ldns_buffer *buf, struct regional *temp, struct ub_packed_rrset_key *rrset, int ansec, int rcode) |
encode answer consisting of 1 rrset | |
static int | local_data_answer (struct local_zone *z, struct query_info *qinfo, struct edns_data *edns, ldns_buffer *buf, struct regional *temp, int labs, struct local_data **ldp) |
answer local data match | |
static int | lz_zone_answer (struct local_zone *z, struct query_info *qinfo, struct edns_data *edns, ldns_buffer *buf, struct regional *temp, struct local_data *ld) |
answer in case where no exact match is found | |
int | local_zones_answer (struct local_zones *zones, struct query_info *qinfo, struct edns_data *edns, ldns_buffer *buf, struct regional *temp) |
Answer authoritatively for local zones. | |
const char * | local_zone_type2str (enum localzone_type t) |
Print localzone type to a string. | |
int | local_zone_str2type (const char *type, enum localzone_type *t) |
Parse the string into localzone type. | |
static void | set_kiddo_parents (struct local_zone *z, struct local_zone *match, struct local_zone *newp) |
iterate over the kiddies of the given name and set their parent ptr | |
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. | |
void | local_zones_del_zone (struct local_zones *zones, struct local_zone *z) |
Delete a zone. | |
int | local_zones_add_RR (struct local_zones *zones, const char *rr, ldns_buffer *buf) |
Add RR data into the localzone data. | |
static int | is_terminal (struct local_data *d) |
returns true if the node is terminal so no deeper domain names exist | |
static void | del_empty_term (struct local_zone *z, struct local_data *d, uint8_t *name, size_t len, int labs) |
delete empty terminals from tree when final data is deleted | |
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. |
This file contains functions to enable local zone authority service.
struct local_zones* local_zones_create | ( | void | ) | [read] |
Create local zones storage.
References local_zone_cmp(), local_zones::lock, rbtree_init(), and local_zones::ztree.
Referenced by context_finalize(), daemon_fork(), and localzonechecks().
void local_zones_delete | ( | struct local_zones * | zones | ) |
Delete local zones storage.
zones,: | to delete. |
References local_zones::lock, lzdel(), traverse_postorder(), and local_zones::ztree.
Referenced by daemon_cleanup(), localzonechecks(), and ub_ctx_delete().
void local_zone_delete | ( | struct local_zone * | z | ) |
Delete one zone.
z,: | to delete. |
References local_zone::lock, local_zone::name, local_zone::region, and regional_destroy().
Referenced by local_zones_add_zone(), local_zones_del_zone(), lz_enter_zone_dname(), and lzdel().
int local_zone_cmp | ( | const void * | z1, |
const void * | z2 | ||
) |
Compare two local_zone entries in rbtree.
Sort hierarchical but not canonical
z1,: | zone 1 |
z2,: | zone 2 |
References local_zone::dclass, dname_lab_cmp(), local_zone::name, and local_zone::namelabs.
Referenced by fptr_whitelist_rbtree_cmp(), and local_zones_create().
int local_data_cmp | ( | const void * | d1, |
const void * | d2 | ||
) |
Compare two local_data entries in rbtree.
Sort canonical.
d1,: | data 1 |
d2,: | data 2 |
References dname_canon_lab_cmp(), local_data::name, and local_data::namelabs.
Referenced by fptr_whitelist_rbtree_cmp(), and local_zone_create().
int parse_dname | ( | const char * | str, |
uint8_t ** | res, | ||
size_t * | len, | ||
int * | labs | ||
) |
Form wireformat from text format domain name.
str,: | the domain name in text "www.example.com" |
res,: | resulting wireformat is stored here with malloc. |
len,: | length of resulting wireformat. |
labs,: | number of labels in resulting wireformat. |
References dname_count_size_labels(), log_err(), and memdup().
Referenced by lz_enter_zone(), lz_exists(), ub_ctx_data_remove(), ub_ctx_zone_add(), and ub_ctx_zone_remove().
static struct local_rrset* local_data_find_type | ( | struct local_data * | data, |
uint16_t | type | ||
) | [static, read] |
Find an rrset in local data structure.
data,: | local data domain name structure. |
type,: | type to look for (host order). |
References local_rrset::next, ub_packed_rrset_key::rk, local_rrset::rrset, local_data::rrsets, and packed_rrset_key::type.
Referenced by local_data_answer(), and lz_enter_rr_into_zone().
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.
zones,: | is set up. |
cfg,: | config data. |
References fatal_exit(), init_parents(), lz_enter_data(), lz_enter_defaults(), lz_enter_zones(), lz_freeup_cfg(), and lz_setup_implicit().
Referenced by context_finalize(), daemon_fork(), and localzonechecks().
struct local_zone* local_zones_lookup | ( | struct local_zones * | zones, |
uint8_t * | name, | ||
size_t | len, | ||
int | labs, | ||
uint16_t | dclass | ||
) | [read] |
Lookup zone that contains the given name, class.
User must lock the tree or result zone.
zones,: | the zones tree |
name,: | dname to lookup |
len,: | length of name. |
labs,: | labelcount of name. |
dclass,: | class to lookup. |
References local_zone::dclass, dname_lab_cmp(), rbnode_t::key, local_zone::name, local_zone::namelabs, local_zone::namelen, local_zone::node, local_zone::parent, rbtree_find_less_equal(), and local_zones::ztree.
Referenced by local_zones_add_RR(), local_zones_answer(), local_zones_del_data(), lz_enter_rr_str(), and lz_setup_implicit().
struct local_zone* local_zones_find | ( | struct local_zones * | zones, |
uint8_t * | name, | ||
size_t | len, | ||
int | labs, | ||
uint16_t | dclass | ||
) | [read] |
Find zone that with exactly given name, class.
User must lock the tree or result zone.
zones,: | the zones tree |
name,: | dname to lookup |
len,: | length of name. |
labs,: | labelcount of name. |
dclass,: | class to lookup. |
References local_zone::dclass, rbnode_t::key, local_zone::name, local_zone::namelabs, local_zone::namelen, local_zone::node, rbtree_search(), and local_zones::ztree.
Referenced by do_zone_add(), do_zone_remove(), local_zones_add_zone(), ub_ctx_zone_add(), and ub_ctx_zone_remove().
void local_zones_print | ( | struct local_zones * | zones | ) |
Debug helper.
Print all zones Takes care of locking.
zones,: | the zones tree |
References rbtree_t::count, local_zone::dclass, local_zone_deny, local_zone_out(), local_zone_redirect, local_zone_refuse, local_zone_static, local_zone_transparent, local_zone_typetransparent, local_zone::lock, local_zones::lock, log_info(), log_nametypeclass(), local_zone::name, RBTREE_FOR, local_zone::type, and local_zones::ztree.
Referenced by ub_ctx_print_local_zones().
static int lz_zone_answer | ( | struct local_zone * | z, |
struct query_info * | qinfo, | ||
struct edns_data * | edns, | ||
ldns_buffer * | buf, | ||
struct regional * | temp, | ||
struct local_data * | ld | ||
) | [static] |
answer in case where no exact match is found
z,: | zone for query |
qinfo,: | query |
edns,: | edns from query |
buf,: | buffer for answer. |
temp,: | temp region for encoding |
ld,: | local data, if NULL, no such name exists in localdata. |
no reply at all, signal caller by clearing buffer.
References BIT_AA, error_encode(), local_encode(), local_zone_deny, local_zone_redirect, local_zone_refuse, local_zone_static, local_zone_typetransparent, local_data::rrsets, local_zone::soa, and local_zone::type.
Referenced by local_zones_answer().
int local_zones_answer | ( | struct local_zones * | zones, |
struct query_info * | qinfo, | ||
struct edns_data * | edns, | ||
ldns_buffer * | buf, | ||
struct regional * | temp | ||
) |
Answer authoritatively for local zones.
Takes care of locking.
zones,: | the stored zones (shared, read only). |
qinfo,: | query info (parsed). |
edns,: | edns info (parsed). |
buf,: | buffer with query ID and flags, also for reply. |
temp,: | temporary storage region. |
References dname_count_labels(), local_data_answer(), local_zones_lookup(), local_zone::lock, local_zones::lock, lz_zone_answer(), query_info::qclass, query_info::qname, and query_info::qname_len.
Referenced by handle_newq(), libworker_fg(), and worker_handle_request().
const char* local_zone_type2str | ( | enum localzone_type | t | ) |
Print localzone type to a string.
Pointer to a constant string.
t,: | local zone type. |
References local_zone_deny, local_zone_nodefault, local_zone_redirect, local_zone_refuse, local_zone_static, local_zone_transparent, and local_zone_typetransparent.
Referenced by do_list_local_zones().
int local_zone_str2type | ( | const char * | str, |
enum localzone_type * | t | ||
) |
Parse the string into localzone type.
str,: | string to parse |
t,: | local zone type returned here. |
References local_zone_deny, local_zone_redirect, local_zone_refuse, local_zone_static, local_zone_transparent, and local_zone_typetransparent.
Referenced by do_zone_add(), lz_enter_zone(), and ub_ctx_zone_add().
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 | ||
) | [read] |
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).
zones,: | the zones tree |
name,: | dname to add |
len,: | length of name. |
labs,: | labelcount of name. |
dclass,: | class to add. |
tp,: | type. |
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 do_zone_add(), local_zones_add_RR(), and ub_ctx_zone_add().
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.
zones,: | the zones tree |
zone,: | the 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 do_zone_remove(), and ub_ctx_zone_remove().
int local_zones_add_RR | ( | struct local_zones * | zones, |
const char * | rr, | ||
ldns_buffer * | buf | ||
) |
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.
zones,: | the zones tree. Not locked by caller. |
rr,: | string with on RR. |
buf,: | buffer for scratch. |
References dname_count_size_labels(), get_rr_nameclass(), local_zone_transparent, local_zones_add_zone(), local_zones_lookup(), local_zone::lock, local_zones::lock, and lz_enter_rr_into_zone().
Referenced by do_data_add(), and ub_ctx_data_add().
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.
zones,: | zones tree. |
name,: | dname to remove |
len,: | length of name. |
labs,: | labelcount of name. |
dclass,: | class to remove. |
References del_empty_term(), local_zones_lookup(), local_zone::lock, local_zones::lock, lz_find_node(), local_zone::name, local_data::name, query_dname_compare(), local_data::rrsets, and local_zone::soa.
Referenced by do_data_remove(), and ub_ctx_data_remove().