#include "util/locks.h"
#include "util/rbtree.h"
Data Structures | |
struct | val_neg_cache |
The negative cache. More... | |
struct | val_neg_zone |
Per Zone aggressive negative caching data. More... | |
struct | val_neg_data |
Data element for aggressive negative caching. More... | |
Functions | |
struct val_neg_cache * | val_neg_create (struct config_file *cfg, size_t maxiter) |
Create negative cache. | |
size_t | val_neg_get_mem (struct val_neg_cache *neg) |
see how much memory is in use by the negative cache. | |
void | neg_cache_delete (struct val_neg_cache *neg) |
Destroy negative cache. | |
int | val_neg_data_compare (const void *a, const void *b) |
Comparison function for rbtree val neg data elements. | |
int | val_neg_zone_compare (const void *a, const void *b) |
Comparison function for rbtree val neg zone elements. | |
void | val_neg_addreply (struct val_neg_cache *neg, struct reply_info *rep) |
Insert NSECs from this message into the negative cache for reference. | |
void | val_neg_addreferral (struct val_neg_cache *neg, struct reply_info *rep, uint8_t *zone) |
Insert NSECs from this referral into the negative cache for reference. | |
int | val_neg_dlvlookup (struct val_neg_cache *neg, uint8_t *qname, size_t len, uint16_t qclass, struct rrset_cache *rrset_cache, uint32_t now) |
Perform a DLV style lookup During the lookup, we could find out that data has expired. | |
struct dns_msg * | val_neg_getmsg (struct val_neg_cache *neg, struct query_info *qinfo, struct regional *region, struct rrset_cache *rrset_cache, ldns_buffer *buf, uint32_t now) |
For the given query, try to get a reply out of the negative cache. | |
void | neg_insert_data (struct val_neg_cache *neg, struct val_neg_zone *zone, struct ub_packed_rrset_key *nsec) |
Insert data into the data tree of a zone Does not do locking. | |
void | neg_delete_data (struct val_neg_cache *neg, struct val_neg_data *el) |
Delete a data element from the negative cache. | |
struct val_neg_zone * | neg_find_zone (struct val_neg_cache *neg, uint8_t *nm, size_t len, uint16_t dclass) |
Find the given zone, from the SOA owner name and class Does not do locking. | |
struct val_neg_zone * | neg_create_zone (struct val_neg_cache *neg, uint8_t *nm, size_t nm_len, uint16_t dclass) |
Create a new zone. | |
void | val_neg_zone_take_inuse (struct val_neg_zone *zone) |
take a zone into use. |
The functions help with aggressive negative caching. This creates new denials of existance, and proofs for absence of types from cached NSEC records.
struct val_neg_cache* val_neg_create | ( | struct config_file * | cfg, | |
size_t | maxiter | |||
) | [read] |
Create negative cache.
cfg,: | config options. | |
maxiter,: | max nsec3 iterations allowed. |
References val_neg_cache::lock, log_err(), val_neg_cache::max, config_file::neg_cache_size, val_neg_cache::nsec3_max_iter, rbtree_init(), val_neg_cache::tree, and val_neg_zone_compare().
Referenced by neg_test(), and val_apply_cfg().
size_t val_neg_get_mem | ( | struct val_neg_cache * | neg | ) |
see how much memory is in use by the negative cache.
neg,: | negative cache |
References val_neg_cache::lock, and val_neg_cache::use.
Referenced by val_get_mem().
void neg_cache_delete | ( | struct val_neg_cache * | neg | ) |
Destroy negative cache.
There must no longer be any other threads.
neg,: | negative cache. |
References val_neg_cache::lock, neg_clear_zones(), traverse_postorder(), and val_neg_cache::tree.
Referenced by neg_test(), and val_deinit().
void val_neg_addreply | ( | struct val_neg_cache * | neg, | |
struct reply_info * | rep | |||
) |
Insert NSECs from this message into the negative cache for reference.
neg,: | negative cache | |
rep,: | reply with NSECs. Errors are ignored, means that storage is omitted. |
References reply_info::an_numrrsets, calc_data_need(), calc_zone_need(), rbtree_t::count, packed_rrset_key::dname, packed_rrset_key::dname_len, dname_subdomain_c(), val_neg_cache::lock, log_err(), log_nametypeclass(), val_neg_zone::name, neg_create_zone(), neg_delete_zone(), neg_find_zone(), neg_insert_data(), neg_make_space(), reply_info::ns_numrrsets, reply_find_soa(), reply_has_nsec(), ub_packed_rrset_key::rk, packed_rrset_key::rrset_class, reply_info::rrsets, val_neg_zone::tree, packed_rrset_key::type, val_neg_zone_take_inuse(), and VERB_ALGO.
Referenced by process_dlv_response().
void val_neg_addreferral | ( | struct val_neg_cache * | neg, | |
struct reply_info * | rep, | |||
uint8_t * | zone | |||
) |
Insert NSECs from this referral into the negative cache for reference.
neg,: | negative cache | |
rep,: | referral reply with NS, NSECs. | |
zone,: | bailiwick for the referral. Errors are ignored, means that storage is omitted. |
References reply_info::an_numrrsets, calc_data_need(), calc_zone_need(), rbtree_t::count, packed_rrset_key::dname, dname_subdomain_c(), val_neg_cache::lock, log_err(), log_nametypeclass(), val_neg_zone::name, neg_create_zone(), neg_delete_zone(), neg_find_zone(), neg_insert_data(), neg_make_space(), reply_info::ns_numrrsets, reply_nsec_signer(), ub_packed_rrset_key::rk, reply_info::rrsets, val_neg_zone::tree, packed_rrset_key::type, val_neg_zone_take_inuse(), and VERB_ALGO.
Referenced by processQueryResponse().
int val_neg_dlvlookup | ( | struct val_neg_cache * | neg, | |
uint8_t * | qname, | |||
size_t | len, | |||
uint16_t | qclass, | |||
struct rrset_cache * | rrset_cache, | |||
uint32_t | now | |||
) |
Perform a DLV style lookup During the lookup, we could find out that data has expired.
In that case the neg_cache entries are removed, and lookup fails.
neg,: | negative cache. | |
qname,: | name to look for | |
len,: | length of qname. | |
qclass,: | class to look in. | |
rrset_cache,: | the rrset cache, for NSEC lookups. | |
now,: | current time for ttl checks. |
References lruhash_entry::data, val_neg_zone::dclass, dname_count_labels(), ub_packed_rrset_key::entry, val_neg_data::in_use, val_neg_zone::in_use, val_neg_data::labs, val_neg_data::len, lruhash_entry::lock, val_neg_cache::lock, log_nametypeclass(), val_neg_data::name, val_neg_zone::name, neg_closest_data(), neg_closest_zone_parent(), neg_delete_data(), neg_lru_touch(), val_neg_zone::nsec3_hash, nsec_proves_nodata(), PACKED_RRSET_NSEC_AT_APEX, val_neg_data::parent, val_neg_zone::parent, query_info::qclass, query_info::qname, query_info::qtype, query_dname_compare(), rrset_cache_lookup(), sec_status_secure, packed_rrset_data::security, packed_rrset_data::ttl, val_nsec_proves_name_error(), VERB_ALGO, and verbose().
Referenced by processDLVLookup(), and val_dlv_init().
struct dns_msg* val_neg_getmsg | ( | struct val_neg_cache * | neg, | |
struct query_info * | qinfo, | |||
struct regional * | region, | |||
struct rrset_cache * | rrset_cache, | |||
ldns_buffer * | buf, | |||
uint32_t | now | |||
) | [read] |
For the given query, try to get a reply out of the negative cache.
The reply still needs to be validated.
neg,: | negative cache. | |
qinfo,: | query | |
region,: | where to allocate reply. | |
rrset_cache,: | rrset cache. | |
buf,: | temporary buffer. | |
now,: | to check TTLs against. |
References dname_count_labels(), dname_remove_label(), dns_msg_authadd(), dns_msg_create(), grab_nsec(), val_neg_zone::in_use, val_neg_cache::lock, neg_closest_zone_parent(), neg_nsec3_proof_ds(), val_neg_zone::parent, query_info::qclass, query_info::qname, query_info::qname_len, and query_info::qtype.
Referenced by processInitRequest().
void neg_insert_data | ( | struct val_neg_cache * | neg, | |
struct val_neg_zone * | zone, | |||
struct ub_packed_rrset_key * | nsec | |||
) |
Insert data into the data tree of a zone Does not do locking.
neg,: | negative cache | |
zone,: | zone to insert into | |
nsec,: | record to insert. |
References val_neg_data::count, lruhash_entry::data, packed_rrset_key::dname, dname_count_labels(), packed_rrset_key::dname_len, ub_packed_rrset_key::entry, val_neg_data::in_use, val_neg_data::labs, log_assert, log_err(), log_nametypeclass(), memdup(), val_neg_data::name, neg_closest_data_parent(), neg_data_chain(), neg_lru_front(), neg_lru_touch(), val_neg_data::node, nsec3_get_params(), val_neg_zone::nsec3_hash, val_neg_zone::nsec3_iter, val_neg_zone::nsec3_salt, val_neg_zone::nsec3_saltlen, val_neg_data::parent, query_dname_compare(), rbtree_insert(), ub_packed_rrset_key::rk, packed_rrset_key::rrset_class, packed_rrset_data::rrsig_count, sec_status_secure, sec_status_unchecked, packed_rrset_data::security, val_neg_zone::tree, packed_rrset_key::type, val_neg_cache::use, VERB_ALGO, wipeout(), and val_neg_data::zone.
Referenced by add_item(), val_neg_addreferral(), and val_neg_addreply().
void neg_delete_data | ( | struct val_neg_cache * | neg, | |
struct val_neg_data * | el | |||
) |
Delete a data element from the negative cache.
May delete other data elements to keep tree coherent, or only mark the element as 'not in use'. Does not do locking.
neg,: | negative cache. | |
el,: | data element to delete. |
References rbtree_t::count, val_neg_data::count, val_neg_data::in_use, val_neg_data::len, log_assert, val_neg_data::name, neg_delete_zone(), neg_lru_remove(), val_neg_data::node, val_neg_data::parent, rbtree_delete(), val_neg_zone::tree, val_neg_cache::use, and val_neg_data::zone.
Referenced by neg_make_space(), remove_item(), val_neg_dlvlookup(), and wipeout().
struct val_neg_zone* neg_find_zone | ( | struct val_neg_cache * | neg, | |
uint8_t * | nm, | |||
size_t | len, | |||
uint16_t | dclass | |||
) | [read] |
Find the given zone, from the SOA owner name and class Does not do locking.
neg,: | negative cache | |
nm,: | what to look for. | |
len,: | length of nm | |
dclass,: | class to look for. |
References val_neg_zone::dclass, dname_count_labels(), rbnode_t::key, val_neg_zone::labs, val_neg_zone::len, val_neg_zone::name, val_neg_zone::node, rbtree_search(), and val_neg_cache::tree.
Referenced by add_item(), val_neg_addreferral(), and val_neg_addreply().
struct val_neg_zone* neg_create_zone | ( | struct val_neg_cache * | neg, | |
uint8_t * | nm, | |||
size_t | nm_len, | |||
uint16_t | dclass | |||
) | [read] |
Create a new zone.
Does not do locking.
neg,: | negative cache | |
nm,: | what to look for. | |
nm_len,: | length of name. | |
dclass,: | class of zone, host order. |
References val_neg_zone::count, dname_count_labels(), val_neg_zone::labs, log_assert, val_neg_zone::name, neg_closest_zone_parent(), neg_zone_chain(), val_neg_zone::node, val_neg_zone::parent, query_dname_compare(), rbtree_insert(), val_neg_cache::tree, and val_neg_cache::use.
Referenced by add_item(), val_neg_addreferral(), and val_neg_addreply().
void val_neg_zone_take_inuse | ( | struct val_neg_zone * | zone | ) |
take a zone into use.
increases counts of parents. Does not do locking.
zone,: | zone to take into use. |
References val_neg_zone::count, val_neg_zone::in_use, and val_neg_zone::parent.
Referenced by add_item(), val_neg_addreferral(), and val_neg_addreply().