localzone.c File Reference

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

#include "config.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_zoneslocal_zones_create ()
 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.
static int parse_dname (const char *str, uint8_t **res, size_t *len, int *labs)
 form wireformat from text format domain name
static struct local_zonelz_enter_zone_dname (struct local_zones *zones, uint8_t *nm, size_t len, int labs, enum localzone_type t, uint16_t dclass)
 enter a new zone with allocated dname
static struct local_zonelz_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
struct local_rrsetlocal_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_rrsetnew_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 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, 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_zonelocal_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.
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.


Detailed Description

This file contains functions to enable local zone authority service.


Function Documentation

struct local_zones* local_zones_create (  )  [read]

Create local zones storage.

Returns:
new struct or NULL on error.

References local_zone_cmp(), 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.

Parameters:
zones,: to delete.

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

Parameters:
z,: to delete.

References local_zone::name, local_zone::region, and regional_destroy().

Referenced by 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

Parameters:
z1,: zone 1
z2,: zone 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().

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

Compare two local_data entries in rbtree.

Sort canonical.

Parameters:
d1,: data 1
d2,: data 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 lz_enter_zone_dname().

struct local_rrset* local_data_find_type ( struct local_data data,
uint16_t  type 
) [read]

Find an rrset in local data structure.

Parameters:
data,: local data domain name structure.
type,: type to look for (host order).
Returns:
rrset pointer or NULL if not found.

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.

Parameters:
zones,: is set up.
cfg,: config data.
Returns:
false on error.

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.

Parameters:
zones,: the zones tree
name,: dname to lookup
len,: length of name.
labs,: labelcount of name.
dclass,: class to lookup.
Returns:
closest local_zone or NULL if no covering zone is found.

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_answer(), lz_enter_rr_str(), and lz_setup_implicit().

void local_zones_print ( struct local_zones 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

Parameters:
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.
Returns:
1 if a reply is to be sent, 0 if not.

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

Parameters:
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.
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).

References dname_count_labels(), local_data_answer(), local_zones_lookup(), lz_zone_answer(), query_info::qclass, query_info::qname, and query_info::qname_len.

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


Generated on Sun Sep 21 16:24:55 2008 for unbound by  doxygen 1.5.6