Functions
packed_rrset.c File Reference

This file contains the data storage for RRsets. More...

#include "config.h"
#include "util/data/packed_rrset.h"
#include "util/data/dname.h"
#include "util/storage/lookup3.h"
#include "util/log.h"
#include "util/alloc.h"
#include "util/regional.h"
#include "util/net_help.h"
#include "ldns/rrdef.h"
#include "ldns/sbuffer.h"
#include "ldns/wire2str.h"

Functions

void ub_packed_rrset_parsedelete (struct ub_packed_rrset_key *pkey, struct alloc_cache *alloc)
 Delete packed rrset key and data, not entered in hashtables yet. More...
 
size_t ub_rrset_sizefunc (void *key, void *data)
 Calculate memory size of rrset entry. More...
 
size_t packed_rrset_sizeof (struct packed_rrset_data *d)
 Memory size of rrset data. More...
 
int ub_rrset_compare (void *k1, void *k2)
 compares two rrset keys. More...
 
void ub_rrset_key_delete (void *key, void *userdata)
 Old key to be deleted. More...
 
void rrset_data_delete (void *data, void *ATTR_UNUSED(userdata))
 
int rrsetdata_equal (struct packed_rrset_data *d1, struct packed_rrset_data *d2)
 compare two rrset data structures. More...
 
hashvalue_t rrset_key_hash (struct packed_rrset_key *key)
 Calculate hash value for a packed rrset key. More...
 
void packed_rrset_ptr_fixup (struct packed_rrset_data *data)
 Fixup pointers in fixed data packed_rrset_data blob. More...
 
void get_cname_target (struct ub_packed_rrset_key *rrset, uint8_t **dname, size_t *dname_len)
 Utility procedure to extract CNAME target name from its rdata. More...
 
void packed_rrset_ttl_add (struct packed_rrset_data *data, time_t add)
 Fixup TTLs in fixed data packed_rrset_data blob. More...
 
const char * rrset_trust_to_string (enum rrset_trust s)
 Get a printable string for a rrset trust value. More...
 
const char * sec_status_to_string (enum sec_status s)
 Get a printable string for a security status value. More...
 
void log_rrset_key (enum verbosity_value v, const char *str, struct ub_packed_rrset_key *rrset)
 Print string with neat domain name, type, class from rrset. More...
 
int packed_rr_to_string (struct ub_packed_rrset_key *rrset, size_t i, time_t now, char *dest, size_t dest_len)
 Convert RR from RRset to string. More...
 
void log_packed_rrset (enum verbosity_value v, const char *str, struct ub_packed_rrset_key *rrset)
 Print the string with prefix, one rr per line. More...
 
time_t ub_packed_rrset_ttl (struct ub_packed_rrset_key *key)
 Get TTL of rrset. More...
 
struct ub_packed_rrset_keypacked_rrset_copy_region (struct ub_packed_rrset_key *key, struct regional *region, time_t now)
 Allocate rrset in region - no more locks needed. More...
 
struct ub_packed_rrset_keypacked_rrset_copy_alloc (struct ub_packed_rrset_key *key, struct alloc_cache *alloc, time_t now)
 Allocate rrset with malloc (from region or you are holding the lock). More...
 

Detailed Description

This file contains the data storage for RRsets.

Function Documentation

void ub_packed_rrset_parsedelete ( struct ub_packed_rrset_key pkey,
struct alloc_cache alloc 
)

Delete packed rrset key and data, not entered in hashtables yet.

Used during parsing.

Parameters
pkey,:rrset key structure with locks, key and data pointers.
alloc,:where to return the unfree-able key structure.

References alloc_special_release(), lruhash_entry::data, packed_rrset_key::dname, ub_packed_rrset_key::entry, ub_packed_rrset_key::id, and ub_packed_rrset_key::rk.

Referenced by move_into_cache(), reply_info_parsedelete(), rrset_cache_update(), and verifytest_file().

size_t ub_rrset_sizefunc ( void *  key,
void *  data 
)

Calculate memory size of rrset entry.

For hash table usage.

Parameters
key,:struct ub_packed_rrset_key*.
data,:struct packed_rrset_data*.
Returns
size in bytes.

References ub_packed_rrset_key::entry, lruhash_entry::lock, and packed_rrset_sizeof().

Referenced by fptr_whitelist_hash_sizefunc(), and rrset_cache_create().

size_t packed_rrset_sizeof ( struct packed_rrset_data data)
int ub_rrset_compare ( void *  k1,
void *  k2 
)

compares two rrset keys.

Parameters
k1,:struct ub_packed_rrset_key*.
k2,:struct ub_packed_rrset_key*.
Returns
0 if equal.

References packed_rrset_key::dname, packed_rrset_key::dname_len, packed_rrset_key::flags, query_dname_compare(), ub_packed_rrset_key::rk, packed_rrset_key::rrset_class, and packed_rrset_key::type.

Referenced by fptr_whitelist_hash_compfunc(), and rrset_cache_create().

void ub_rrset_key_delete ( void *  key,
void *  userdata 
)

Old key to be deleted.

RRset keys are recycled via alloc. The id is set to 0. So that other threads, after acquiring a lock always get the correct value, in this case the 0 deleted-special value.

Parameters
key,:struct ub_packed_rrset_key*.
userdata,:alloc structure to use for recycling.

References alloc_special_release(), packed_rrset_key::dname, ub_packed_rrset_key::id, and ub_packed_rrset_key::rk.

Referenced by fptr_whitelist_hash_delkeyfunc(), and rrset_cache_create().

int rrsetdata_equal ( struct packed_rrset_data d1,
struct packed_rrset_data d2 
)

compare two rrset data structures.

Compared rdata and rrsigdata, not the trust or ttl value.

Parameters
d1,:data to compare.
d2,:data to compare.
Returns
1 if equal.

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

Referenced by rrset_cache_update(), rrset_check_sec_status(), and rrset_update_sec_status().

hashvalue_t rrset_key_hash ( struct packed_rrset_key key)
void packed_rrset_ptr_fixup ( struct packed_rrset_data data)
void get_cname_target ( struct ub_packed_rrset_key rrset,
uint8_t **  dname,
size_t *  dname_len 
)

Utility procedure to extract CNAME target name from its rdata.

Failsafes; it will change passed dname to a valid dname or do nothing.

Parameters
rrset,:the rrset structure. Must be a CNAME. Only first RR is used (multiple RRs are technically illegal anyway). Also works on type DNAME. Returns target name.
dname,:this pointer is updated to point into the cname rdata. If a failsafe fails, nothing happens to the pointer (such as the rdata was not a valid dname, not a CNAME, ...).
dname_len,:length of dname is returned.

References packed_rrset_data::count, lruhash_entry::data, dname_valid(), ub_packed_rrset_key::entry, LDNS_RR_TYPE_CNAME, LDNS_RR_TYPE_DNAME, ub_packed_rrset_key::rk, packed_rrset_data::rr_data, packed_rrset_data::rr_len, and packed_rrset_key::type.

Referenced by handle_cname_response(), reply_check_cname_chain(), reply_find_answer_rrset(), reply_find_final_cname_target(), response_type_from_cache(), response_type_from_server(), synth_dname_msg(), and val_chase_cname().

void packed_rrset_ttl_add ( struct packed_rrset_data data,
time_t  add 
)

Fixup TTLs in fixed data packed_rrset_data blob.

Parameters
data,:rrset data structure. Otherwise correctly filled in.
add,:how many seconds to add, pass time(0) for example.

References packed_rrset_data::count, packed_rrset_data::rr_ttl, packed_rrset_data::rrsig_count, and packed_rrset_data::ttl.

Referenced by dns_cache_store(), packed_rrset_copy_alloc(), and store_rrset().

const char* rrset_trust_to_string ( enum rrset_trust  s)
const char* sec_status_to_string ( enum sec_status  s)
void log_rrset_key ( enum verbosity_value  v,
const char *  str,
struct ub_packed_rrset_key rrset 
)

Print string with neat domain name, type, class from rrset.

Parameters
v,:at what verbosity level to print this.
str,:string of message.
rrset,:structure with name, type and class.

References packed_rrset_key::dname, log_nametypeclass(), ub_packed_rrset_key::rk, packed_rrset_key::rrset_class, packed_rrset_key::type, and verbosity.

Referenced by iter_lookup_parent_glue_from_cache(), iter_lookup_parent_NS_from_cache(), iter_store_parentside_neg(), iter_store_parentside_NS(), processQueryResponse(), and processTargetResponse().

int packed_rr_to_string ( struct ub_packed_rrset_key rrset,
size_t  i,
time_t  now,
char *  dest,
size_t  dest_len 
)

Convert RR from RRset to string.

Parameters
rrset,:structure with data.
i,:index of rr or RRSIG.
now,:time that is subtracted from ttl before printout. Can be 0.
dest,:destination string buffer. Must be nonNULL.
dest_len,:length of dest buffer (>0).
Returns
false on failure.

References packed_rrset_data::count, packed_rrset_key::dname, packed_rrset_key::dname_len, LDNS_RR_TYPE_RRSIG, log_assert, log_info(), 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_wire2str_rr_buf(), and packed_rrset_key::type.

Referenced by do_list_local_data(), dump_rrset_line(), log_packed_rrset(), and print_rrset().

void log_packed_rrset ( enum verbosity_value  v,
const char *  str,
struct ub_packed_rrset_key rrset 
)

Print the string with prefix, one rr per line.

Parameters
v,:at what verbosity level to print this.
str,:string of message.
rrset,:with name, and rdata, and rrsigs.

References packed_rrset_data::count, log_info(), packed_rr_to_string(), packed_rrset_data::rrsig_count, and verbosity.

Referenced by autr_debug_print_tp().

time_t ub_packed_rrset_ttl ( struct ub_packed_rrset_key key)

Get TTL of rrset.

RRset data must be filled in correctly.

Parameters
key,:rrset key, with data to examine.
Returns
ttl value.

References packed_rrset_data::ttl.

Referenced by ds_response_to_ke(), iter_store_parentside_neg(), and val_nsec_prove_nodata_dsreply().

struct ub_packed_rrset_key* packed_rrset_copy_region ( struct ub_packed_rrset_key key,
struct regional region,
time_t  now 
)
read

Allocate rrset in region - no more locks needed.

Parameters
key,:a (just from rrset cache looked up) rrset key + valid, packed data record.
region,:where to alloc the copy
now,:adjust the TTLs to be relative (subtract from all TTLs).
Returns
new region-alloced rrset key or NULL on alloc failure.

References packed_rrset_data::count, lruhash_entry::data, packed_rrset_key::dname, packed_rrset_key::dname_len, ub_packed_rrset_key::entry, lruhash_entry::hash, ub_packed_rrset_key::id, lruhash_entry::key, packed_rrset_ptr_fixup(), packed_rrset_sizeof(), regional_alloc(), regional_alloc_init(), ub_packed_rrset_key::rk, packed_rrset_data::rr_ttl, packed_rrset_data::rrsig_count, and packed_rrset_data::ttl.

Referenced by addr_to_additional(), dns_msg_authadd(), find_add_ds(), grab_nsec(), load_ref(), rrset_msg(), store_rrsets(), synth_dname_msg(), tomsg(), and val_find_DS().

struct ub_packed_rrset_key* packed_rrset_copy_alloc ( struct ub_packed_rrset_key key,
struct alloc_cache alloc,
time_t  now 
)
read

Allocate rrset with malloc (from region or you are holding the lock).

Parameters
key,:key with data entry.
alloc,:alloc_cache to create rrset_keys
now,:adjust the TTLs to be absolute (add to all TTLs).
Returns
new region-alloced rrset key or NULL on alloc failure.

References alloc_special_obtain(), alloc_special_release(), lruhash_entry::data, packed_rrset_key::dname, packed_rrset_key::dname_len, ub_packed_rrset_key::entry, lruhash_entry::hash, memdup(), packed_rrset_ptr_fixup(), packed_rrset_sizeof(), packed_rrset_ttl_add(), and ub_packed_rrset_key::rk.

Referenced by iter_store_parentside_rrset().