msgreply.h File Reference

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_entryquery_info_entrysetup (struct query_info *q, struct reply_info *r, hashvalue_t h)
 Setup query info entry.
struct reply_inforeply_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_keyreply_find_answer_rrset (struct query_info *qinfo, struct reply_info *rep)
 Find answer rrset in reply, the one matching qinfo.
struct ub_packed_rrset_keyreply_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_keyreply_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_keyreply_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.

Detailed Description

This file contains a data structure to store a message and its reply.


Define Documentation

#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().


Function Documentation

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.

Parameters:
m,: the prealloced queryinfo structure to put query into. must be unused, or _clear()ed.
query,: the wireformat packet query. starts with ID.
Returns:
: 0 on format error.

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.

Parameters:
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.
Returns:
: zero is OK, or DNS error code in case of error o FORMERR for parse errors. o SERVFAIL for memory allocation errors.

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.

Parameters:
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.
Returns:
0 if allocation failed.

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.

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

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

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

Parameters:
m,: the queryinfo structure.
Returns:
: 0 on alloc failure.

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.

Parameters:
m1,: struct query_info* , void* here to ease use as function pointer.
m2,: struct query_info* , void* here to ease use as function pointer.
Returns:
: 0 = same, -1 m1 is smaller, +1 m1 is larger.

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.

Parameters:
q,: query info to copy. Emptied as if clear is called.
r,: reply to init data.
h,: hash value.
Returns:
: newly allocated message reply cache item.

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.

Parameters:
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.
Returns:
new reply info or NULL on memory error.

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.

Parameters:
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.
Returns:
false on alloc failure.

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.

Parameters:
qinfo,: what to start with.
rep,: looks in answer section of this message.
Returns:
: pointer dname, or NULL if not found.

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.

Parameters:
rep,: reply to check.
Returns:
: true if valid, false if invalid.

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.

Parameters:
rep,: reply to check
Returns:
: true if all RRs are secure. False if not. True if there are zero RRs.

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.

Parameters:
qinfo,: what to look for.
rep,: looks in answer section of this message.
Returns:
: pointer to rrset, or NULL if not found.

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.

Parameters:
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).
Returns:
: pointer to rrset, or NULL if not found.

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.

Parameters:
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).
Returns:
: pointer to rrset, or NULL if not found.

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.

Parameters:
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).
Returns:
: pointer to rrset, or NULL if not found.

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.

Parameters:
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 
)
Generated on Thu Apr 22 00:30:18 2010 for unbound by  doxygen 1.6.3