msgreply.c File Reference

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

#include "config.h"
#include "util/data/msgreply.h"
#include "util/storage/lookup3.h"
#include "util/log.h"
#include "util/alloc.h"
#include "util/netevent.h"
#include "util/net_help.h"
#include "util/data/dname.h"
#include "util/regional.h"
#include "util/data/msgparse.h"
#include "util/data/msgencode.h"

Defines

#define COMPARE_IT(x, y)
 tiny subroutine for msgreply_compare

Functions

static int parse_create_qinfo (ldns_buffer *pkt, struct msg_parse *msg, struct query_info *qinf, struct regional *region)
 allocate qinfo, return 0 on error
static struct reply_infoconstruct_reply_info_base (struct regional *region, uint16_t flags, size_t qd, uint32_t ttl, size_t an, size_t ns, size_t ar, size_t total, enum sec_status sec)
 constructor for replyinfo
static int parse_create_repinfo (struct msg_parse *msg, struct reply_info **rep, struct regional *region)
 allocate replyinfo, return 0 on error
static int repinfo_alloc_rrset_keys (struct reply_info *rep, struct alloc_cache *alloc, struct regional *region)
 allocate (special) rrset keys, return 0 on error
static int rdata_copy (ldns_buffer *pkt, struct packed_rrset_data *data, uint8_t *to, struct rr_parse *rr, uint32_t *rr_ttl, uint16_t type)
 do the rdata copy
static int parse_rr_copy (ldns_buffer *pkt, struct rrset_parse *pset, struct packed_rrset_data *data)
 copy over the data into packed rrset
static int parse_create_rrset (ldns_buffer *pkt, struct rrset_parse *pset, struct packed_rrset_data **data, struct regional *region)
 create rrset return 0 on failure
static enum rrset_trust get_rrset_trust (struct msg_parse *msg, struct rrset_parse *rrset)
 get trust value for rrset
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.
static int parse_copy_decompress (ldns_buffer *pkt, struct msg_parse *msg, struct reply_info *rep, struct regional *region)
 Copy and decompress rrs.
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.
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.
static int reply_info_sortref_cmp (const void *a, const void *b)
 helper compare function to sort in lock order
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_parse (struct query_info *m, ldns_buffer *query)
 Parse wire query into a queryinfo structure, return 0 on parse error.
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 *k, 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.
static int repinfo_copy_rrsets (struct reply_info *dest, struct reply_info *from, struct regional *region)
 copy rrsets from replyinfo to dest replyinfo
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.
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.
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.
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.

Variables

uint32_t MAX_TTL = 3600 * 24 * 10
 MAX TTL default for messages and rrsets.


Detailed Description

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


Define Documentation

#define COMPARE_IT ( x,
 ) 

Value:

if( (x) < (y) ) return -1; \
        else if( (x) > (y) ) return +1; \
        log_assert( (x) == (y) );
tiny subroutine for msgreply_compare

Referenced by query_info_compare().


Function Documentation

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

static int parse_copy_decompress ( ldns_buffer *  pkt,
struct msg_parse msg,
struct reply_info rep,
struct regional region 
) [static]

Copy and decompress rrs.

Parameters:
pkt,: the packet for compression pointer resolution.
msg,: the parsed message
rep,: reply info to put rrs into.
region,: if not NULL, used for allocation.
Returns:
0 on failure.

References lruhash_entry::data, ub_packed_rrset_key::entry, log_assert, MAX_TTL, NORR_TTL, parse_copy_decompress_rrset(), rrset_parse::rrset_all_next, reply_info::rrset_count, msg_parse::rrset_first, reply_info::rrsets, sec_status_unchecked, reply_info::security, packed_rrset_data::ttl, and reply_info::ttl.

Referenced by parse_create_msg().

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 dns_alloc_msg(), parse_reply(), and reply_info_parse().

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

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::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_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 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 apply_settings(), context_finalize(), 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::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().

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

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(), and primeResponseToKE().

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

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 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 
)


Variable Documentation

uint32_t MAX_TTL = 3600 * 24 * 10

MAX TTL default for messages and rrsets.

Maximum TTL that is allowed.

the MAX_TTL global

Referenced by config_apply(), parse_copy_decompress(), and parse_rr_copy().


Generated on Thu Mar 26 09:45:01 2009 for unbound by  doxygen 1.5.8