This file contains a data structure to store a message and its reply. More...
#include "util/storage/lruhash.h"
#include "util/data/packed_rrset.h"
Data Structures | |
struct | query_info |
Structure to store query information that makes answers to queries different. More... | |
struct | rrset_ref |
Information to reference an rrset. More... | |
struct | reply_info |
Structure to store DNS query and the reply packet. More... | |
struct | msgreply_entry |
Structure to keep hash table entry for message replies. More... | |
Defines | |
#define | PREFETCH_TTL_CALC(ttl) ((ttl) - (ttl)/10) |
calculate the prefetch TTL as 90% of original. | |
Functions | |
int | query_info_parse (struct query_info *m, ldns_buffer *query) |
Parse wire query into a queryinfo structure, return 0 on parse error. | |
int | reply_info_parse (ldns_buffer *pkt, struct alloc_cache *alloc, struct query_info *qinf, struct reply_info **rep, struct regional *region, struct edns_data *edns) |
Parse query reply. | |
int | parse_create_msg (ldns_buffer *pkt, struct msg_parse *msg, struct alloc_cache *alloc, struct query_info *qinf, struct reply_info **rep, struct regional *region) |
Allocate and decompress parsed message and rrsets. | |
void | reply_info_sortref (struct reply_info *rep) |
Sorts the ref array. | |
void | reply_info_set_ttls (struct reply_info *rep, uint32_t timenow) |
Set TTLs inside the replyinfo to absolute values. | |
void | reply_info_parsedelete (struct reply_info *rep, struct alloc_cache *alloc) |
Delete reply_info and packed_rrsets (while they are not yet added to the hashtables. | |
int | query_info_allocqname (struct query_info *m) |
Allocate and copy the qname (obtained from query_info_parse()). | |
int | query_info_compare (void *m1, void *m2) |
Compare two queryinfo structures, on query and type, class. | |
void | query_info_clear (struct query_info *m) |
clear out query info structure | |
size_t | msgreply_sizefunc (void *k, void *d) |
calculate size of struct query_info + reply_info | |
void | query_entry_delete (void *q, void *arg) |
delete msgreply_entry key structure | |
void | reply_info_delete (void *d, void *arg) |
delete reply_info data structure | |
hashvalue_t | query_info_hash (struct query_info *q) |
calculate hash value of query_info, lowercases the qname | |
struct msgreply_entry * | query_info_entrysetup (struct query_info *q, struct reply_info *r, hashvalue_t h) |
Setup query info entry. | |
struct reply_info * | reply_info_copy (struct reply_info *rep, struct alloc_cache *alloc, struct regional *region) |
Copy reply_info and all rrsets in it and allocate. | |
int | parse_copy_decompress_rrset (ldns_buffer *pkt, struct msg_parse *msg, struct rrset_parse *pset, struct regional *region, struct ub_packed_rrset_key *pk) |
Copy a parsed rrset into given key, decompressing and allocating rdata. | |
uint8_t * | reply_find_final_cname_target (struct query_info *qinfo, struct reply_info *rep) |
Find final cname target in reply, the one matching qinfo. | |
int | reply_check_cname_chain (struct reply_info *rep) |
Check if cname chain in cached reply is still valid. | |
int | reply_all_rrsets_secure (struct reply_info *rep) |
Check security status of all RRs in the message. | |
struct ub_packed_rrset_key * | reply_find_answer_rrset (struct query_info *qinfo, struct reply_info *rep) |
Find answer rrset in reply, the one matching qinfo. | |
struct ub_packed_rrset_key * | reply_find_rrset_section_an (struct reply_info *rep, uint8_t *name, size_t namelen, uint16_t type, uint16_t dclass) |
Find rrset in reply, inside the answer section. | |
struct ub_packed_rrset_key * | reply_find_rrset_section_ns (struct reply_info *rep, uint8_t *name, size_t namelen, uint16_t type, uint16_t dclass) |
Find rrset in reply, inside the authority section. | |
struct ub_packed_rrset_key * | reply_find_rrset (struct reply_info *rep, uint8_t *name, size_t namelen, uint16_t type, uint16_t dclass) |
Find rrset in reply, inside any section. | |
void | log_dns_msg (const char *str, struct query_info *qinfo, struct reply_info *rep) |
Debug send the query info and reply info to the log in readable form. | |
void | log_query_info (enum verbosity_value v, const char *str, struct query_info *qinf) |
Print string with neat domain name, type, class from query info. |
This file contains a data structure to store a message and its reply.
#define PREFETCH_TTL_CALC | ( | ttl | ) | ((ttl) - (ttl)/10) |
calculate the prefetch TTL as 90% of original.
Calculation without numerical overflow (uin32_t)
Referenced by error_response_cache(), load_msg(), parse_copy_decompress(), processFinished(), rrset_msg(), synth_dname_msg(), and tomsg().
int query_info_parse | ( | struct query_info * | m, | |
ldns_buffer * | query | |||
) |
Parse wire query into a queryinfo structure, return 0 on parse error.
initialises the (prealloced) queryinfo structure as well. This query structure contains a pointer back info the buffer! This pointer avoids memory allocation. allocqname does memory allocation.
m,: | the prealloced queryinfo structure to put query into. must be unused, or _clear()ed. | |
query,: | the wireformat packet query. starts with ID. |
References query_info::qclass, query_info::qname, query_info::qname_len, query_info::qtype, and query_dname_len().
Referenced by worker_handle_request().
int reply_info_parse | ( | ldns_buffer * | pkt, | |
struct alloc_cache * | alloc, | |||
struct query_info * | qinf, | |||
struct reply_info ** | rep, | |||
struct regional * | region, | |||
struct edns_data * | edns | |||
) |
Parse query reply.
Fills in preallocated query_info structure (with ptr into buffer). Allocates reply_info and packed_rrsets. These are not yet added to any caches or anything, this is only parsing. Returns formerror on qdcount > 1.
pkt,: | the packet buffer. Must be positioned after the query section. | |
alloc,: | creates packed rrset key structures. | |
rep,: | allocated reply_info is returned (only on no error). | |
qinf,: | query_info is returned (only on no error). | |
region,: | where to store temporary data (for parsing). | |
edns,: | where to store edns information, does not need to be inited. |
References parse_create_msg(), parse_extract_edns(), parse_packet(), query_info::qname, query_info_clear(), regional_alloc(), and reply_info_parsedelete().
Referenced by entry_to_repinfo(), perftestpkt(), and testpkt().
int parse_create_msg | ( | ldns_buffer * | pkt, | |
struct msg_parse * | msg, | |||
struct alloc_cache * | alloc, | |||
struct query_info * | qinf, | |||
struct reply_info ** | rep, | |||
struct regional * | region | |||
) |
Allocate and decompress parsed message and rrsets.
pkt,: | for name decompression. | |
msg,: | parsed message in scratch region. | |
alloc,: | alloc cache for special rrset key structures. Not used if region!=NULL, it can be NULL in that case. | |
qinf,: | where to store query info. qinf itself is allocated by the caller. | |
rep,: | reply info is allocated and returned. | |
region,: | if this parameter is NULL then malloc and the alloc is used. otherwise, everything is allocated in this region. In a region, no special rrset key structures are needed (not shared), and no rrset_ref array in the reply is built up. |
References log_assert, parse_copy_decompress(), parse_create_qinfo(), parse_create_repinfo(), and repinfo_alloc_rrset_keys().
Referenced by createResponse(), dns_alloc_msg(), parse_reply(), and reply_info_parse().
void reply_info_sortref | ( | struct reply_info * | rep | ) |
Sorts the ref array.
rep,: | reply info. rrsets must be filled in. |
References reply_info::ref, reply_info_sortref_cmp(), and reply_info::rrset_count.
Referenced by dns_cache_store_msg().
void reply_info_set_ttls | ( | struct reply_info * | rep, | |
uint32_t | timenow | |||
) |
Set TTLs inside the replyinfo to absolute values.
rep,: | reply info. rrsets must be filled in. Also refs must be filled in. | |
timenow,: | the current time. |
References packed_rrset_data::count, lruhash_entry::data, ub_packed_rrset_key::entry, rrset_ref::key, reply_info::prefetch_ttl, reply_info::ref, packed_rrset_data::rr_ttl, reply_info::rrset_count, packed_rrset_data::rrsig_count, packed_rrset_data::ttl, and reply_info::ttl.
Referenced by dns_cache_store_msg().
void reply_info_parsedelete | ( | struct reply_info * | rep, | |
struct alloc_cache * | alloc | |||
) |
Delete reply_info and packed_rrsets (while they are not yet added to the hashtables.
). Returns rrsets to the alloc cache.
rep,: | reply_info to delete. | |
alloc,: | where to return rrset structures to. |
References reply_info::rrset_count, reply_info::rrsets, and ub_packed_rrset_parsedelete().
Referenced by dns_cache_store(), dstest_entry(), extract_keys(), nsec3_hash_test_entry(), perftestpkt(), reply_info_copy(), reply_info_parse(), testpkt(), and verifytest_entry().
int query_info_allocqname | ( | struct query_info * | m | ) |
Allocate and copy the qname (obtained from query_info_parse()).
m,: | the queryinfo structure. |
References log_err(), query_info::qname, and query_info::qname_len.
int query_info_compare | ( | void * | m1, | |
void * | m2 | |||
) |
Compare two queryinfo structures, on query and type, class.
It is _not_ sorted in canonical ordering.
m1,: | struct query_info* , void* here to ease use as function pointer. | |
m2,: | struct query_info* , void* here to ease use as function pointer. |
References COMPARE_IT, log_assert, query_info::qclass, query_info::qname, query_info::qname_len, query_info::qtype, and query_dname_compare().
Referenced by context_finalize(), daemon_apply_cfg(), fptr_whitelist_hash_compfunc(), and mesh_state_compare().
struct msgreply_entry* query_info_entrysetup | ( | struct query_info * | q, | |
struct reply_info * | r, | |||
hashvalue_t | h | |||
) | [read] |
Setup query info entry.
q,: | query info to copy. Emptied as if clear is called. | |
r,: | reply to init data. | |
h,: | hash value. |
References lruhash_entry::data, msgreply_entry::entry, lruhash_entry::hash, lruhash_entry::key, msgreply_entry::key, lruhash_entry::lock, query_info::qname, and query_info::qname_len.
Referenced by dns_cache_store_msg().
struct reply_info* reply_info_copy | ( | struct reply_info * | rep, | |
struct alloc_cache * | alloc, | |||
struct regional * | region | |||
) | [read] |
Copy reply_info and all rrsets in it and allocate.
rep,: | what to copy, probably inside region, no ref[] array in it. | |
alloc,: | how to allocate rrset keys. Not used if region!=NULL, it can be NULL in that case. | |
region,: | if this parameter is NULL then malloc and the alloc is used. otherwise, everything is allocated in this region. In a region, no special rrset key structures are needed (not shared), and no rrset_ref array in the reply is built up. |
References reply_info::an_numrrsets, reply_info::ar_numrrsets, construct_reply_info_base(), reply_info::flags, reply_info::ns_numrrsets, reply_info::prefetch_ttl, reply_info::qdcount, repinfo_alloc_rrset_keys(), repinfo_copy_rrsets(), reply_info_parsedelete(), reply_info::rrset_count, reply_info::security, and reply_info::ttl.
Referenced by dns_cache_store(), and dns_copy_msg().
int parse_copy_decompress_rrset | ( | ldns_buffer * | pkt, | |
struct msg_parse * | msg, | |||
struct rrset_parse * | pset, | |||
struct regional * | region, | |||
struct ub_packed_rrset_key * | pk | |||
) |
Copy a parsed rrset into given key, decompressing and allocating rdata.
pkt,: | packet for decompression | |
msg,: | the parser message (for flags for trust). | |
pset,: | the parsed rrset to copy. | |
region,: | if NULL - malloc, else data is allocated in this region. | |
pk,: | a freshly obtained rrsetkey structure. No dname is set yet, will be set on return. Note that TTL will still be relative on return. |
copy & decompress dname
copy over type and class
read data part.
References lruhash_entry::data, rrset_parse::dname, packed_rrset_key::dname, rrset_parse::dname_len, packed_rrset_key::dname_len, dname_pkt_copy(), ub_packed_rrset_key::entry, rrset_parse::flags, packed_rrset_key::flags, get_rrset_trust(), rrset_parse::hash, lruhash_entry::hash, lruhash_entry::key, parse_create_rrset(), regional_alloc(), ub_packed_rrset_key::rk, rrset_parse::rrset_class, packed_rrset_key::rrset_class, packed_rrset_data::trust, rrset_parse::type, and packed_rrset_key::type.
Referenced by parse_copy_decompress(), and store_rrset().
uint8_t* reply_find_final_cname_target | ( | struct query_info * | qinfo, | |
struct reply_info * | rep | |||
) |
Find final cname target in reply, the one matching qinfo.
Follows CNAMEs.
qinfo,: | what to start with. | |
rep,: | looks in answer section of this message. |
References reply_info::an_numrrsets, packed_rrset_key::dname, packed_rrset_key::dname_len, get_cname_target(), query_info::qclass, query_info::qname, query_info::qname_len, query_dname_compare(), ub_packed_rrset_key::rk, packed_rrset_key::rrset_class, reply_info::rrsets, and packed_rrset_key::type.
Referenced by libworker_enter_result().
int reply_check_cname_chain | ( | struct reply_info * | rep | ) |
Check if cname chain in cached reply is still valid.
rep,: | reply to check. |
References reply_info::an_numrrsets, packed_rrset_key::dname, packed_rrset_key::dname_len, get_cname_target(), query_dname_compare(), ub_packed_rrset_key::rk, reply_info::rrsets, and packed_rrset_key::type.
Referenced by answer_from_cache(), and tomsg().
int reply_all_rrsets_secure | ( | struct reply_info * | rep | ) |
Check security status of all RRs in the message.
rep,: | reply to check |
References lruhash_entry::data, ub_packed_rrset_key::entry, reply_info::rrset_count, reply_info::rrsets, and sec_status_secure.
Referenced by answer_from_cache(), and tomsg().
struct ub_packed_rrset_key* reply_find_answer_rrset | ( | struct query_info * | qinfo, | |
struct reply_info * | rep | |||
) | [read] |
Find answer rrset in reply, the one matching qinfo.
Follows CNAMEs, so the result may have a different owner name.
qinfo,: | what to look for. | |
rep,: | looks in answer section of this message. |
References reply_info::an_numrrsets, packed_rrset_key::dname, packed_rrset_key::dname_len, get_cname_target(), query_info::qclass, query_info::qname, query_info::qname_len, query_info::qtype, query_dname_compare(), ub_packed_rrset_key::rk, packed_rrset_key::rrset_class, reply_info::rrsets, and packed_rrset_key::type.
Referenced by ds_response_to_ke(), libworker_enter_result(), process_dnskey_response(), and processTargetResponse().
struct ub_packed_rrset_key* reply_find_rrset_section_an | ( | struct reply_info * | rep, | |
uint8_t * | name, | |||
size_t | namelen, | |||
uint16_t | type, | |||
uint16_t | dclass | |||
) | [read] |
Find rrset in reply, inside the answer section.
Does not follow CNAMEs.
rep,: | looks in answer section of this message. | |
name,: | what to look for. | |
namelen,: | length of name. | |
type,: | looks for (host order). | |
dclass,: | looks for (host order). |
References reply_info::an_numrrsets, packed_rrset_key::dname, packed_rrset_key::dname_len, query_dname_compare(), ub_packed_rrset_key::rk, packed_rrset_key::rrset_class, reply_info::rrsets, and packed_rrset_key::type.
Referenced by iter_msg_from_zone(), process_prime_response(), and processQueryResponse().
struct ub_packed_rrset_key* reply_find_rrset_section_ns | ( | struct reply_info * | rep, | |
uint8_t * | name, | |||
size_t | namelen, | |||
uint16_t | type, | |||
uint16_t | dclass | |||
) | [read] |
Find rrset in reply, inside the authority section.
Does not follow CNAMEs.
rep,: | looks in authority section of this message. | |
name,: | what to look for. | |
namelen,: | length of name. | |
type,: | looks for (host order). | |
dclass,: | looks for (host order). |
References reply_info::an_numrrsets, packed_rrset_key::dname, packed_rrset_key::dname_len, reply_info::ns_numrrsets, query_dname_compare(), ub_packed_rrset_key::rk, packed_rrset_key::rrset_class, reply_info::rrsets, and packed_rrset_key::type.
Referenced by iter_indicates_dnssec(), iter_msg_from_zone(), processQueryResponse(), and val_nsec_prove_nodata_dsreply().
struct ub_packed_rrset_key* reply_find_rrset | ( | struct reply_info * | rep, | |
uint8_t * | name, | |||
size_t | namelen, | |||
uint16_t | type, | |||
uint16_t | dclass | |||
) | [read] |
Find rrset in reply, inside any section.
Does not follow CNAMEs.
rep,: | looks in answer,authority and additional section of this message. | |
name,: | what to look for. | |
namelen,: | length of name. | |
type,: | looks for (host order). | |
dclass,: | looks for (host order). |
References packed_rrset_key::dname, packed_rrset_key::dname_len, query_dname_compare(), ub_packed_rrset_key::rk, packed_rrset_key::rrset_class, reply_info::rrset_count, reply_info::rrsets, and packed_rrset_key::type.
Referenced by iter_store_inzone_glue().
void log_dns_msg | ( | const char * | str, | |
struct query_info * | qinfo, | |||
struct reply_info * | rep | |||
) |
Debug send the query info and reply info to the log in readable form.
str,: | descriptive string printed with packet content. | |
qinfo,: | query section. | |
rep,: | rest of message. |
References reply_info::flags, log_info(), regional_create(), regional_destroy(), and reply_info_encode().
Referenced by createResponse(), process_response(), processInit(), processInitRequest(), processInitRequest3(), processQueryResponse(), val_classify_response(), validate_cname_noanswer_response(), and validate_nodata_response().
void log_query_info | ( | enum verbosity_value | v, | |
const char * | str, | |||
struct query_info * | qinf | |||
) |
Print string with neat domain name, type, class from query info.
v,: | at what verbosity level to print this. | |
str,: | string of message. | |
qinf,: | query info structure with name, type and class. |
References log_nametypeclass(), query_info::qclass, query_info::qname, and query_info::qtype.
Referenced by ds_response_to_ke(), error_supers(), generate_request(), generate_sub_request(), iter_operate(), mesh_continue(), mesh_log_list(), prime_supers(), probe_anchor(), process_dnskey_response(), process_response(), processClassResponse(), processFindKey(), processFinished(), processInitRequest(), processInitRequest2(), processInitRequest3(), processQueryTargets(), processTargetResponse(), processValidate(), pythonmod_inform_super(), val_inform_super(), and val_operate().