This file contains the DNS cache. More...
#include "config.h"
#include "iterator/iter_delegpt.h"
#include "iterator/iter_utils.h"
#include "validator/val_nsec.h"
#include "validator/val_utils.h"
#include "services/cache/dns.h"
#include "services/cache/rrset.h"
#include "util/data/msgparse.h"
#include "util/data/msgreply.h"
#include "util/data/packed_rrset.h"
#include "util/data/dname.h"
#include "util/module.h"
#include "util/net_help.h"
#include "util/regional.h"
#include "util/config_file.h"
#include "sldns/sbuffer.h"
Functions | |
static void | store_rrsets (struct module_env *env, struct reply_info *rep, time_t now, time_t leeway, int pside, struct reply_info *qrep, struct regional *region, time_t qstarttime) |
store rrsets in the rrset cache. More... | |
void | msg_cache_remove (struct module_env *env, uint8_t *qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, uint16_t flags) |
delete message from message cache More... | |
void | dns_cache_store_msg (struct module_env *env, struct query_info *qinfo, hashvalue_type hash, struct reply_info *rep, time_t leeway, int pside, struct reply_info *qrep, uint32_t flags, struct regional *region, time_t qstarttime) |
Store message in the cache. More... | |
static struct ub_packed_rrset_key * | find_closest_of_type (struct module_env *env, uint8_t *qname, size_t qnamelen, uint16_t qclass, time_t now, uint16_t searchtype, int stripfront, int noexpiredabove, uint8_t *expiretop, size_t expiretoplen) |
find closest NS or DNAME and returns the rrset (locked) | |
static void | addr_to_additional (struct ub_packed_rrset_key *rrset, struct regional *region, struct dns_msg *msg, time_t now) |
add addr to additional section | |
struct msgreply_entry * | msg_cache_lookup (struct module_env *env, uint8_t *qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, uint16_t flags, time_t now, int wr) |
lookup message in message cache More... | |
static int | find_add_addrs (struct module_env *env, uint16_t qclass, struct regional *region, struct delegpt *dp, time_t now, struct dns_msg **msg) |
find and add A and AAAA records for nameservers in delegpt | |
int | cache_fill_missing (struct module_env *env, uint16_t qclass, struct regional *region, struct delegpt *dp, uint32_t flags) |
find and add A and AAAA records for missing nameservers in delegpt More... | |
static void | find_add_ds (struct module_env *env, struct regional *region, struct dns_msg *msg, struct delegpt *dp, time_t now) |
find and add DS or NSEC to delegation msg | |
struct dns_msg * | dns_msg_create (uint8_t *qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, struct regional *region, size_t capacity) |
Utility, create new, unpacked data structure for cache response. More... | |
int | dns_msg_authadd (struct dns_msg *msg, struct regional *region, struct ub_packed_rrset_key *rrset, time_t now) |
Add rrset to authority section in unpacked dns_msg message. More... | |
int | dns_msg_ansadd (struct dns_msg *msg, struct regional *region, struct ub_packed_rrset_key *rrset, time_t now) |
Add rrset to authority section in unpacked dns_msg message. More... | |
struct delegpt * | dns_cache_find_delegation (struct module_env *env, uint8_t *qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, struct regional *region, struct dns_msg **msg, time_t now, int noexpiredabove, uint8_t *expiretop, size_t expiretoplen) |
Find a delegation from the cache. More... | |
static struct dns_msg * | gen_dns_msg (struct regional *region, struct query_info *q, size_t num) |
allocate dns_msg from query_info and reply_info | |
struct dns_msg * | tomsg (struct module_env *env, struct query_info *q, struct reply_info *r, struct regional *region, time_t now, int allow_expired, struct regional *scratch) |
generate dns_msg from cached message More... | |
struct dns_msg * | dns_msg_deepcopy_region (struct dns_msg *origin, struct regional *region) |
Deep copy a dns_msg to a region. More... | |
static struct dns_msg * | rrset_msg (struct ub_packed_rrset_key *rrset, struct regional *region, time_t now, struct query_info *q) |
synthesize RRset-only response from cached RRset item | |
static struct dns_msg * | synth_dname_msg (struct ub_packed_rrset_key *rrset, struct regional *region, time_t now, struct query_info *q, enum sec_status *sec_status) |
synthesize DNAME+CNAME response from cached DNAME item | |
static struct dns_msg * | fill_any (struct module_env *env, uint8_t *qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, struct regional *region) |
Fill TYPE_ANY response with some data from cache. | |
struct dns_msg * | dns_cache_lookup (struct module_env *env, uint8_t *qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, uint16_t flags, struct regional *region, struct regional *scratch, int no_partial, uint8_t *dpname, size_t dpnamelen) |
Find cached message. More... | |
int | dns_cache_store (struct module_env *env, struct query_info *msgqinf, struct reply_info *msgrep, int is_referral, time_t leeway, int pside, struct regional *region, uint32_t flags, time_t qstarttime) |
Allocate a dns_msg with malloc/alloc structure and store in dns cache. More... | |
int | dns_cache_prefetch_adjust (struct module_env *env, struct query_info *qinfo, time_t adjust, uint16_t flags) |
Adjust the prefetch_ttl for a cached message. More... | |
This file contains the DNS cache.
|
static |
store rrsets in the rrset cache.
env | module environment with caches. |
rep | contains list of rrsets to store. |
now | current time. |
leeway | during prefetch how much leeway to update TTLs. This makes rrsets (other than type NS) timeout sooner so they get updated with a new full TTL. Type NS does not get this, because it must not be refreshed from the child domain, but keep counting down properly. |
pside | if from parentside discovered NS, so that its NS is okay in a prefetch situation to be updated (without becoming sticky). |
qrep | update rrsets here if cache is better |
region | for qrep allocs. |
qstarttime | time when delegations were looked up, this is perhaps earlier than the time in now. The time is used to determine if RRsets of type NS have expired, so that they can only be updated using lookups of delegation points that did not use them, since they had expired then. |
References module_env::alloc, lruhash_entry::data, ub_packed_rrset_key::entry, rrset_ref::id, ub_packed_rrset_key::id, rrset_ref::key, LDNS_RR_TYPE_NS, lruhash_entry::lock, packed_rrset_copy_region(), reply_info::prefetch_ttl, PREFETCH_TTL_CALC, reply_info::ref, ub_packed_rrset_key::rk, module_env::rrset_cache, rrset_cache_update(), reply_info::rrset_count, reply_info::rrsets, SERVE_EXPIRED_TTL, reply_info::serve_expired_ttl, reply_info::ttl, packed_rrset_data::ttl, and packed_rrset_key::type.
Referenced by dns_cache_store_msg().
void msg_cache_remove | ( | struct module_env * | env, |
uint8_t * | qname, | ||
size_t | qnamelen, | ||
uint16_t | qtype, | ||
uint16_t | qclass, | ||
uint16_t | flags | ||
) |
delete message from message cache
Remove entry from the message cache.
References query_info::local_alias, module_env::msg_cache, query_info::qclass, query_info::qname, query_info::qname_len, query_info::qtype, query_info_hash(), and slabhash_remove().
Referenced by dns_cache_store_msg().
void dns_cache_store_msg | ( | struct module_env * | env, |
struct query_info * | qinfo, | ||
hashvalue_type | hash, | ||
struct reply_info * | rep, | ||
time_t | leeway, | ||
int | pside, | ||
struct reply_info * | qrep, | ||
uint32_t | flags, | ||
struct regional * | region, | ||
time_t | qstarttime | ||
) |
Store message in the cache.
Stores in message cache and rrset cache. Both qinfo and rep should be malloced and are put in the cache. They should not be used after this call, as they are then in shared cache. Does not return errors, they are logged and only lead to less cache.
env | module environment with the DNS cache. |
qinfo | query info |
hash | hash over qinfo. |
rep | reply info, together with qinfo makes up the message. Adjusts the reply info TTLs to absolute time. |
leeway | TTL value, if not 0, other rrsets are considered expired that many seconds before actual TTL expiry. |
pside | if true, information came from a server which was fetched from the parentside of the zonecut. This means that the type NS can be updated to full TTL even in prefetch situations. |
qrep | message that can be altered with better rrs from cache. |
flags | customization flags for the cache policy. |
qstarttime | time when the query was started, and thus when the delegations were looked up. |
region | to allocate into for qmsg. |
References module_env::alloc, DNSCACHE_STORE_ZEROTTL, msgreply_entry::entry, rrset_ref::id, ub_packed_rrset_key::id, rrset_ref::key, log_err(), module_env::msg_cache, msg_cache_remove(), module_env::now, query_info::qclass, query_info::qname, query_info::qname_len, query_info::qtype, query_info_entrysetup(), reply_info::ref, reply_info_delete(), reply_info_set_ttls(), reply_info_sortref(), reply_info::rrset_count, reply_info::rrsets, slabhash_insert(), store_rrsets(), reply_info::ttl, VERB_ALGO, and verbose().
Referenced by dns_cache_store().
struct msgreply_entry* msg_cache_lookup | ( | struct module_env * | env, |
uint8_t * | qname, | ||
size_t | qnamelen, | ||
uint16_t | qtype, | ||
uint16_t | qclass, | ||
uint16_t | flags, | ||
time_t | now, | ||
int | wr | ||
) |
lookup message in message cache
lookup message in message cache the returned nonNULL entry is locked and has to be unlocked by the caller
References lruhash_entry::data, lruhash_entry::key, query_info::local_alias, lruhash_entry::lock, module_env::msg_cache, query_info::qclass, query_info::qname, query_info::qname_len, query_info::qtype, query_info_hash(), and slabhash_lookup().
Referenced by dns_cache_prefetch_adjust(), dns_cache_store(), error_response_cache(), and find_add_addrs().
int cache_fill_missing | ( | struct module_env * | env, |
uint16_t | qclass, | ||
struct regional * | region, | ||
struct delegpt * | dp, | ||
uint32_t | flags | ||
) |
find and add A and AAAA records for missing nameservers in delegpt
env | module environment with rrset cache |
qclass | which class to look in. |
region | where to store new dp info. |
dp | delegation point to fill missing entries. |
flags | rrset flags, or 0. |
References delegpt_ns::cache_lookup_count, delegpt_ns::next, module_env::now, and delegpt::nslist.
Referenced by error_supers().
struct dns_msg* dns_msg_create | ( | uint8_t * | qname, |
size_t | qnamelen, | ||
uint16_t | qtype, | ||
uint16_t | qclass, | ||
struct regional * | region, | ||
size_t | capacity | ||
) |
Utility, create new, unpacked data structure for cache response.
QR bit set, no AA. Query set as indicated. Space for number of rrsets.
qname | query section name |
qnamelen | len of qname |
qtype | query section type |
qclass | query section class |
region | where to alloc. |
capacity | number of rrsets space to create in the array. |
References BIT_QR, reply_info::flags, query_info::local_alias, query_info::qclass, reply_info::qdcount, dns_msg::qinfo, query_info::qname, query_info::qname_len, query_info::qtype, reply_info::reason_bogus, regional_alloc(), regional_alloc_init(), regional_alloc_zero(), dns_msg::rep, and RR_COUNT_MAX.
Referenced by dns_cache_find_delegation(), fill_any(), and val_find_DS().
int dns_msg_authadd | ( | struct dns_msg * | msg, |
struct regional * | region, | ||
struct ub_packed_rrset_key * | rrset, | ||
time_t | now | ||
) |
Add rrset to authority section in unpacked dns_msg message.
Must have enough space left, does not grow the array.
msg | msg to put it in. |
region | region to alloc in |
rrset | to add in authority section |
now | now. |
References reply_info::ns_numrrsets, packed_rrset_copy_region(), dns_msg::rep, reply_info::rrset_count, and reply_info::rrsets.
Referenced by add_soa(), and dns_cache_find_delegation().
int dns_msg_ansadd | ( | struct dns_msg * | msg, |
struct regional * | region, | ||
struct ub_packed_rrset_key * | rrset, | ||
time_t | now | ||
) |
Add rrset to authority section in unpacked dns_msg message.
Must have enough space left, does not grow the array.
msg | msg to put it in. |
region | region to alloc in |
rrset | to add in authority section |
now | now. |
References reply_info::an_numrrsets, packed_rrset_copy_region(), dns_msg::rep, reply_info::rrset_count, and reply_info::rrsets.
struct delegpt* dns_cache_find_delegation | ( | struct module_env * | env, |
uint8_t * | qname, | ||
size_t | qnamelen, | ||
uint16_t | qtype, | ||
uint16_t | qclass, | ||
struct regional * | region, | ||
struct dns_msg ** | msg, | ||
time_t | timenow, | ||
int | noexpiredabove, | ||
uint8_t * | expiretop, | ||
size_t | expiretoplen | ||
) |
Find a delegation from the cache.
env | module environment with the DNS cache. |
qname | query name. |
qnamelen | length of qname. |
qtype | query type. |
qclass | query class. |
region | where to allocate result delegation. |
msg | if not NULL, delegation message is returned here, synthesized from the cache. |
timenow | the time now, for checking if TTL on cache entries is OK. |
noexpiredabove | if set, no expired NS rrsets above the one found are tolerated. It only returns delegations where the delegations above it are valid. |
expiretop | if not NULL, name where check for expiry ends for noexpiredabove. |
expiretoplen | length of expiretop dname. |
References packed_rrset_data::count, lruhash_entry::data, delegpt_create(), delegpt_rrset_add_ns(), delegpt_set_name(), packed_rrset_key::dname, dns_msg_authadd(), dns_msg_create(), ub_packed_rrset_key::entry, find_add_addrs(), find_add_ds(), find_closest_of_type(), LDNS_RR_TYPE_NS, lruhash_entry::lock, log_err(), and ub_packed_rrset_key::rk.
Referenced by answer_norec_from_cache(), and generate_parentside_target_query().
struct dns_msg* tomsg | ( | struct module_env * | env, |
struct query_info * | q, | ||
struct reply_info * | r, | ||
struct regional * | region, | ||
time_t | now, | ||
int | allow_expired, | ||
struct regional * | scratch | ||
) |
generate dns_msg from cached message
env | module environment with the DNS cache. NULL if the LRU from cache does not need to be touched. |
q | query info, contains qname that will make up the dns message. |
r | reply info that, together with qname, will make up the dns message. |
region | where to allocate dns message. |
now | the time now, for check if TTL on cache entry is ok. |
allow_expired | if true and serve-expired is enabled, it will allow for expired dns_msg to be generated based on the configured serve-expired logic. |
scratch | where to allocate temporary data. |
References reply_info::an_numrrsets, reply_info::ar_numrrsets, reply_info::authoritative, module_env::cfg, reply_info::flags, gen_dns_msg(), LDNS_RR_TYPE_CNAME, LDNS_RR_TYPE_DNAME, reply_info::ns_numrrsets, packed_rrset_copy_region(), reply_info::prefetch_ttl, PREFETCH_TTL_CALC, reply_info::qdcount, reply_info::reason_bogus, reply_info::reason_bogus_str, reply_info::ref, regional_strdup(), dns_msg::rep, reply_all_rrsets_secure(), reply_check_cname_chain(), reply_info_can_answer_expired(), ub_packed_rrset_key::rk, rrset_array_lock(), rrset_array_unlock(), rrset_array_unlock_touch(), module_env::rrset_cache, reply_info::rrset_count, reply_info::rrsets, sec_status_secure, reply_info::security, reply_info::serve_expired_norec_ttl, config_file::serve_expired_reply_ttl, SERVE_EXPIRED_REPLY_TTL, SERVE_EXPIRED_TTL, reply_info::serve_expired_ttl, reply_info::ttl, and packed_rrset_key::type.
Referenced by dns_cache_lookup(), and mesh_serve_expired_lookup().
Deep copy a dns_msg to a region.
origin | the dns_msg to copy. |
region | the region to copy all the data to. |
References gen_dns_msg(), packed_rrset_copy_region(), dns_msg::qinfo, reply_info::reason_bogus_str, regional_strdup(), dns_msg::rep, reply_info::rrset_count, and reply_info::rrsets.
Referenced by val_inform_super().
struct dns_msg* dns_cache_lookup | ( | struct module_env * | env, |
uint8_t * | qname, | ||
size_t | qnamelen, | ||
uint16_t | qtype, | ||
uint16_t | qclass, | ||
uint16_t | flags, | ||
struct regional * | region, | ||
struct regional * | scratch, | ||
int | no_partial, | ||
uint8_t * | dpname, | ||
size_t | dpnamelen | ||
) |
Find cached message.
env | module environment with the DNS cache. |
qname | query name. |
qnamelen | length of qname. |
qtype | query type. |
qclass | query class. |
flags | flags with BIT_CD for AAAA queries in dns64 translation. |
region | where to allocate result. |
scratch | where to allocate temporary data. |
no_partial | if true, only complete messages and not a partial one (with only the start of the CNAME chain and not the rest). |
dpname | if not NULL, do not return NXDOMAIN above this name. |
dpnamelen | length of dpname. |
References lruhash_entry::data, ub_packed_rrset_key::entry, find_closest_of_type(), msgreply_entry::key, lruhash_entry::key, LDNS_RR_TYPE_CNAME, LDNS_RR_TYPE_DNAME, LDNS_RR_TYPE_DS, query_info::local_alias, lruhash_entry::lock, module_env::msg_cache, module_env::now, query_info::qclass, query_info::qname, query_info::qname_len, query_info::qtype, query_info_hash(), module_env::rrset_cache, rrset_cache_lookup(), rrset_msg(), sec_status_secure, sec_status_unchecked, slabhash_lookup(), synth_dname_msg(), tomsg(), and val_rrset_wildcard().
int dns_cache_store | ( | struct module_env * | env, |
struct query_info * | qinf, | ||
struct reply_info * | rep, | ||
int | is_referral, | ||
time_t | leeway, | ||
int | pside, | ||
struct regional * | region, | ||
uint32_t | flags, | ||
time_t | qstarttime | ||
) |
Allocate a dns_msg with malloc/alloc structure and store in dns cache.
env | environment, with alloc structure and dns cache. |
qinf | query info, the query for which answer is stored. this is allocated in a region, and will be copied to malloc area before insertion. |
rep | reply in dns_msg from dns_alloc_msg for example. this is allocated in a region, and will be copied to malloc area before insertion. |
is_referral | If true, then the given message to be stored is a referral. The cache implementation may use this as a hint. It will store only the RRsets, not the message. |
leeway | TTL value, if not 0, other rrsets are considered expired that many seconds before actual TTL expiry. |
pside | if true, information came from a server which was fetched from the parentside of the zonecut. This means that the type NS can be updated to full TTL even in prefetch situations. |
region | region to allocate better entries from cache into. (used when is_referral is false). |
flags | flags with BIT_CD for AAAA queries in dns64 translation. The higher 16 bits are used internally to customize the cache policy. (See DNSCACHE_STORE_xxx flags). |
qstarttime | time when the query was started, and thus when the delegations were looked up. |
References module_env::alloc, BIT_AA, BIT_CD, BIT_QR, BIT_RA, lruhash_entry::data, dns_cache_store_msg(), msgreply_entry::entry, ub_packed_rrset_key::entry, reply_info::flags, rrset_ref::id, ub_packed_rrset_key::id, rrset_ref::key, LDNS_RR_TYPE_NS, lruhash_entry::lock, memdup(), msg_cache_lookup(), module_env::need_to_validate, module_env::now, packed_rrset_ttl_add(), query_info::qclass, query_info::qname, query_info::qname_len, query_info::qtype, query_info_hash(), reply_info_copy(), reply_info_could_use_expired(), reply_info_delete(), reply_info_parsedelete(), ub_packed_rrset_key::rk, module_env::rrset_cache, rrset_cache_update(), reply_info::rrset_count, reply_info::rrsets, sec_status_bogus, sec_status_unchecked, reply_info::security, SERVE_EXPIRED, reply_info::ttl, packed_rrset_key::type, VERB_ALGO, and verbose().
Referenced by iter_dns_store(), and storeQueryInCache().
int dns_cache_prefetch_adjust | ( | struct module_env * | env, |
struct query_info * | qinfo, | ||
time_t | adjust, | ||
uint16_t | flags | ||
) |
Adjust the prefetch_ttl for a cached message.
This adds a value to the prefetch ttl - postponing the time when it will be prefetched for future incoming queries.
env | module environment with caches and time. |
qinfo | query info for the query that needs adjustment. |
adjust | time in seconds to add to the prefetch_leeway. |
flags | flags with BIT_CD for AAAA queries in dns64 translation. |
References lruhash_entry::data, msgreply_entry::entry, lruhash_entry::lock, msg_cache_lookup(), module_env::now, reply_info::prefetch_ttl, query_info::qclass, query_info::qname, query_info::qname_len, and query_info::qtype.
Referenced by error_response_cache().