Electroneum
msgreply.h File Reference
Include dependency graph for msgreply.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  query_info
 
struct  rrset_ref
 
struct  reply_info
 
struct  msgreply_entry
 

Macros

#define PREFETCH_TTL_CALC(ttl)   ((ttl) - (ttl)/10)
 

Functions

struct reply_infoconstruct_reply_info_base (struct regional *region, uint16_t flags, size_t qd, time_t ttl, time_t prettl, size_t an, size_t ns, size_t ar, size_t total, enum sec_status sec)
 
int query_info_parse (struct query_info *m, struct sldns_buffer *query)
 
int reply_info_parse (struct sldns_buffer *pkt, struct alloc_cache *alloc, struct query_info *qinf, struct reply_info **rep, struct regional *region, struct edns_data *edns)
 
int parse_create_msg (struct sldns_buffer *pkt, struct msg_parse *msg, struct alloc_cache *alloc, struct query_info *qinf, struct reply_info **rep, struct regional *region)
 
struct reply_infoparse_reply_in_temp_region (struct sldns_buffer *pkt, struct regional *region, struct query_info *qi)
 
void reply_info_sortref (struct reply_info *rep)
 
void reply_info_set_ttls (struct reply_info *rep, time_t timenow)
 
void reply_info_parsedelete (struct reply_info *rep, struct alloc_cache *alloc)
 
int query_info_compare (void *m1, void *m2)
 
void query_info_clear (struct query_info *m)
 
size_t msgreply_sizefunc (void *k, void *d)
 
void query_entry_delete (void *q, void *arg)
 
void reply_info_delete (void *d, void *arg)
 
hashvalue_type query_info_hash (struct query_info *q, uint16_t flags)
 
struct msgreply_entryquery_info_entrysetup (struct query_info *q, struct reply_info *r, hashvalue_type h)
 
struct reply_inforeply_info_copy (struct reply_info *rep, struct alloc_cache *alloc, struct regional *region)
 
int reply_info_alloc_rrset_keys (struct reply_info *rep, struct alloc_cache *alloc, struct regional *region)
 
int parse_copy_decompress_rrset (struct sldns_buffer *pkt, struct msg_parse *msg, struct rrset_parse *pset, struct regional *region, struct ub_packed_rrset_key *pk)
 
uint8_treply_find_final_cname_target (struct query_info *qinfo, struct reply_info *rep)
 
int reply_check_cname_chain (struct query_info *qinfo, struct reply_info *rep)
 
int reply_all_rrsets_secure (struct reply_info *rep)
 
struct ub_packed_rrset_keyreply_find_answer_rrset (struct query_info *qinfo, struct reply_info *rep)
 
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)
 
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)
 
struct ub_packed_rrset_keyreply_find_rrset (struct reply_info *rep, uint8_t *name, size_t namelen, uint16_t type, uint16_t dclass)
 
void log_dns_msg (const char *str, struct query_info *qinfo, struct reply_info *rep)
 
void log_reply_info (enum verbosity_value v, struct query_info *qinf, struct sockaddr_storage *addr, socklen_t addrlen, struct timeval dur, int cached, struct sldns_buffer *rmsg)
 
void log_query_info (enum verbosity_value v, const char *str, struct query_info *qinf)
 
int edns_opt_append (struct edns_data *edns, struct regional *region, uint16_t code, size_t len, uint8_t *data)
 
int edns_opt_list_append (struct edns_option **list, uint16_t code, size_t len, uint8_t *data, struct regional *region)
 
int edns_opt_list_remove (struct edns_option **list, uint16_t code)
 
struct edns_optionedns_opt_list_find (struct edns_option *list, uint16_t code)
 
int inplace_cb_reply_call (struct module_env *env, struct query_info *qinfo, struct module_qstate *qstate, struct reply_info *rep, int rcode, struct edns_data *edns, struct regional *region)
 
int inplace_cb_reply_cache_call (struct module_env *env, struct query_info *qinfo, struct module_qstate *qstate, struct reply_info *rep, int rcode, struct edns_data *edns, struct regional *region)
 
int inplace_cb_reply_local_call (struct module_env *env, struct query_info *qinfo, struct module_qstate *qstate, struct reply_info *rep, int rcode, struct edns_data *edns, struct regional *region)
 
int inplace_cb_reply_servfail_call (struct module_env *env, struct query_info *qinfo, struct module_qstate *qstate, struct reply_info *rep, int rcode, struct edns_data *edns, struct regional *region)
 
int inplace_cb_query_call (struct module_env *env, struct query_info *qinfo, uint16_t flags, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *zone, size_t zonelen, struct module_qstate *qstate, struct regional *region)
 
int inplace_cb_edns_back_parsed_call (struct module_env *env, struct module_qstate *qstate)
 
int inplace_cb_query_response_call (struct module_env *env, struct module_qstate *qstate, struct dns_msg *response)
 
struct edns_optionedns_opt_copy_region (struct edns_option *list, struct regional *region)
 
struct edns_optionedns_opt_copy_alloc (struct edns_option *list)
 
void edns_opt_list_free (struct edns_option *list)
 
int edns_opt_compare (struct edns_option *p, struct edns_option *q)
 
int edns_opt_list_compare (struct edns_option *p, struct edns_option *q)
 

Detailed Description

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

Definition in file msgreply.h.

Macro Definition Documentation

◆ PREFETCH_TTL_CALC

#define PREFETCH_TTL_CALC (   ttl)    ((ttl) - (ttl)/10)

calculate the prefetch TTL as 90% of original. Calculation without numerical overflow (uin32_t)

Definition at line 63 of file msgreply.h.

Function Documentation

◆ construct_reply_info_base()

struct reply_info* construct_reply_info_base ( struct regional region,
uint16_t  flags,
size_t  qd,
time_t  ttl,
time_t  prettl,
size_t  an,
size_t  ns,
size_t  ar,
size_t  total,
enum sec_status  sec 
)

Constructor for replyinfo.

Parameters
regionwhere to allocate the results, pass NULL to use malloc.
flagsflags for the replyinfo.
qdqd count
ttlTTL of replyinfo
prettlprefetch ttl
anan count
nsns count
arar count
totaltotal rrset count (presumably an+ns+ar).
secsecurity status of the reply info.
Returns
the reply_info base struct with the array for putting the rrsets in. The array has been zeroed. Returns NULL on malloc failure.

◆ edns_opt_append()

int edns_opt_append ( struct edns_data edns,
struct regional region,
uint16_t  code,
size_t  len,
uint8_t data 
)

Append edns option to edns data structure

Parameters
ednsthe edns data structure to append the edns option to.
regionregion to allocate the new edns option.
codethe edns option's code.
lenthe edns option's length.
datathe edns option's data.
Returns
false on failure.

◆ edns_opt_compare()

int edns_opt_compare ( struct edns_option p,
struct edns_option q 
)

Compare an edns option. (not entire list). Also compares contents.

◆ edns_opt_copy_alloc()

struct edns_option* edns_opt_copy_alloc ( struct edns_option list)

Copy edns option list allocated with malloc

◆ edns_opt_copy_region()

struct edns_option* edns_opt_copy_region ( struct edns_option list,
struct regional region 
)

Copy edns option list allocated to the new region

◆ edns_opt_list_append()

int edns_opt_list_append ( struct edns_option **  list,
uint16_t  code,
size_t  len,
uint8_t data,
struct regional region 
)

Append edns option to edns option list

Parameters
listthe edns option list to append the edns option to.
codethe edns option's code.
lenthe edns option's length.
datathe edns option's data.
regionregion to allocate the new edns option.
Returns
false on failure.

◆ edns_opt_list_compare()

int edns_opt_list_compare ( struct edns_option p,
struct edns_option q 
)

Compare edns option lists, also the order and contents of edns-options.

◆ edns_opt_list_find()

struct edns_option* edns_opt_list_find ( struct edns_option list,
uint16_t  code 
)

Find edns option in edns list

Parameters
listlist of edns options (eg. edns.opt_list)
codeopt code to find.
Returns
NULL or the edns_option element.

◆ edns_opt_list_free()

void edns_opt_list_free ( struct edns_option list)

Free edns option list allocated with malloc

◆ edns_opt_list_remove()

int edns_opt_list_remove ( struct edns_option **  list,
uint16_t  code 
)

Remove any option found on the edns option list that matches the code.

Parameters
listthe list of edns options.
codethe opt code to remove.
Returns
true when at least one edns option was removed, false otherwise.

◆ inplace_cb_edns_back_parsed_call()

int inplace_cb_edns_back_parsed_call ( struct module_env env,
struct module_qstate qstate 
)

Call the registered functions in the inplace_cb_edns_back_parsed linked list. This function is going to get called after parsing the EDNS data on the reply from a nameserver.

Parameters
envmodule environment.
qstatemodule qstate.
Returns
false on failure (a callback function returned an error).

◆ inplace_cb_query_call()

int inplace_cb_query_call ( struct module_env env,
struct query_info qinfo,
uint16_t  flags,
struct sockaddr_storage addr,
socklen_t  addrlen,
uint8_t zone,
size_t  zonelen,
struct module_qstate qstate,
struct regional region 
)

Call the registered functions in the inplace_cb_query linked list. This function is going to get called just before sending a query to a nameserver.

Parameters
envmodule environment.
qinfoquery info.
flagsflags of the query.
addrto which server to send the query.
addrlenlength of addr.
zonename of the zone of the delegation point. wireformat dname. This is the delegation point name for which the server is deemed authoritative.
zonelenlength of zone.
qstatemodule qstate.
regionregion to store data.
Returns
false on failure (a callback function returned an error).

◆ inplace_cb_query_response_call()

int inplace_cb_query_response_call ( struct module_env env,
struct module_qstate qstate,
struct dns_msg response 
)

Call the registered functions in the inplace_cb_query_response linked list. This function is going to get called after receiving a reply from a nameserver.

Parameters
envmodule environment.
qstatemodule qstate.
responsereceived response
Returns
false on failure (a callback function returned an error).

◆ inplace_cb_reply_cache_call()

int inplace_cb_reply_cache_call ( struct module_env env,
struct query_info qinfo,
struct module_qstate qstate,
struct reply_info rep,
int  rcode,
struct edns_data edns,
struct regional region 
)

Call the registered functions in the inplace_cb_reply_cache linked list. This function is going to get called while answering from cache.

Parameters
envmodule environment.
qinfoquery info.
qstatemodule qstate. NULL when replying from cache.
repReply info.
rcodereturn code.
ednsedns data of the reply. Edns input can be found here.
regionregion to store data.
Returns
false on failure (a callback function returned an error).

◆ inplace_cb_reply_call()

int inplace_cb_reply_call ( struct module_env env,
struct query_info qinfo,
struct module_qstate qstate,
struct reply_info rep,
int  rcode,
struct edns_data edns,
struct regional region 
)

Call the registered functions in the inplace_cb_reply linked list. This function is going to get called while answering with a resolved query.

Parameters
envmodule environment.
qinfoquery info.
qstatemodule qstate.
repReply info. Could be NULL.
rcodereturn code.
ednsedns data of the reply.
regionregion to store data.
Returns
false on failure (a callback function returned an error).

◆ inplace_cb_reply_local_call()

int inplace_cb_reply_local_call ( struct module_env env,
struct query_info qinfo,
struct module_qstate qstate,
struct reply_info rep,
int  rcode,
struct edns_data edns,
struct regional region 
)

Call the registered functions in the inplace_cb_reply_local linked list. This function is going to get called while answering with local data.

Parameters
envmodule environment.
qinfoquery info.
qstatemodule qstate. NULL when replying from cache.
repReply info.
rcodereturn code.
ednsedns data of the reply. Edns input can be found here.
regionregion to store data.
Returns
false on failure (a callback function returned an error).

◆ inplace_cb_reply_servfail_call()

int inplace_cb_reply_servfail_call ( struct module_env env,
struct query_info qinfo,
struct module_qstate qstate,
struct reply_info rep,
int  rcode,
struct edns_data edns,
struct regional region 
)

Call the registered functions in the inplace_cb_reply linked list. This function is going to get called while answering with a servfail.

Parameters
envmodule environment.
qinfoquery info.
qstatemodule qstate. Contains the edns option lists. Could be NULL.
repReply info. NULL when servfail.
rcodereturn code. LDNS_RCODE_SERVFAIL.
ednsedns data of the reply. Edns input can be found here if qstate is NULL.
regionregion to store data.
Returns
false on failure (a callback function returned an error).

◆ log_dns_msg()

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
strdescriptive string printed with packet content.
qinfoquery section.
represt of message.

◆ log_query_info()

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.

Parameters
vat what verbosity level to print this.
strstring of message.
qinfquery info structure with name, type and class.

◆ log_reply_info()

void log_reply_info ( enum verbosity_value  v,
struct query_info qinf,
struct sockaddr_storage addr,
socklen_t  addrlen,
struct timeval  dur,
int  cached,
struct sldns_buffer rmsg 
)

Print string with neat domain name, type, class, status code from, and size of a query response.

Parameters
vat what verbosity level to print this.
qinfquery section.
addraddress of the client.
addrlenlength of the client address.
durhow long it took to complete the query.
cachedwhether or not the reply is coming from the cache, or an outside network.
rmsgsldns buffer packet.

◆ msgreply_sizefunc()

size_t msgreply_sizefunc ( void *  k,
void *  d 
)

calculate size of struct query_info + reply_info

◆ parse_copy_decompress_rrset()

int parse_copy_decompress_rrset ( struct sldns_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
pktpacket for decompression
msgthe parser message (for flags for trust).
psetthe parsed rrset to copy.
regionif NULL - malloc, else data is allocated in this region.
pka 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.

◆ parse_create_msg()

int parse_create_msg ( struct sldns_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
pktfor name decompression.
msgparsed message in scratch region.
allocalloc cache for special rrset key structures. Not used if region!=NULL, it can be NULL in that case.
qinfwhere to store query info. qinf itself is allocated by the caller.
repreply info is allocated and returned.
regionif 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.

◆ parse_reply_in_temp_region()

struct reply_info* parse_reply_in_temp_region ( struct sldns_buffer pkt,
struct regional region,
struct query_info qi 
)

get msg reply struct (in temp region)

◆ query_entry_delete()

void query_entry_delete ( void *  q,
void *  arg 
)

delete msgreply_entry key structure

◆ query_info_clear()

void query_info_clear ( struct query_info m)

clear out query info structure

◆ query_info_compare()

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
m1struct query_info* , void* here to ease use as function pointer.
m2struct query_info* , void* here to ease use as function pointer.
Returns
: 0 = same, -1 m1 is smaller, +1 m1 is larger.

◆ query_info_entrysetup()

struct msgreply_entry* query_info_entrysetup ( struct query_info q,
struct reply_info r,
hashvalue_type  h 
)

Setup query info entry

Parameters
qquery info to copy. Emptied as if clear is called.
rreply to init data.
hhash value.
Returns
: newly allocated message reply cache item.

◆ query_info_hash()

hashvalue_type query_info_hash ( struct query_info q,
uint16_t  flags 
)

calculate hash value of query_info, lowercases the qname, uses CD flag for AAAA qtype

◆ query_info_parse()

int query_info_parse ( struct query_info m,
struct sldns_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
mthe prealloced queryinfo structure to put query into. must be unused, or _clear()ed.
querythe wireformat packet query. starts with ID.
Returns
: 0 on format error.

◆ reply_all_rrsets_secure()

int reply_all_rrsets_secure ( struct reply_info rep)

Check security status of all RRs in the message.

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

◆ reply_check_cname_chain()

int reply_check_cname_chain ( struct query_info qinfo,
struct reply_info rep 
)

Check if cname chain in cached reply is still valid.

Parameters
qinfoquery info with query name.
repreply to check.
Returns
: true if valid, false if invalid.

◆ reply_find_answer_rrset()

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. Follows CNAMEs, so the result may have a different owner name.

Parameters
qinfowhat to look for.
replooks in answer section of this message.
Returns
: pointer to rrset, or NULL if not found.

◆ reply_find_final_cname_target()

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
qinfowhat to start with.
replooks in answer section of this message.
Returns
: pointer dname, or NULL if not found.

◆ reply_find_rrset()

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. Does not follow CNAMEs.

Parameters
replooks in answer,authority and additional section of this message.
namewhat to look for.
namelenlength of name.
typelooks for (host order).
dclasslooks for (host order).
Returns
: pointer to rrset, or NULL if not found.

◆ reply_find_rrset_section_an()

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. Does not follow CNAMEs.

Parameters
replooks in answer section of this message.
namewhat to look for.
namelenlength of name.
typelooks for (host order).
dclasslooks for (host order).
Returns
: pointer to rrset, or NULL if not found.

◆ reply_find_rrset_section_ns()

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. Does not follow CNAMEs.

Parameters
replooks in authority section of this message.
namewhat to look for.
namelenlength of name.
typelooks for (host order).
dclasslooks for (host order).
Returns
: pointer to rrset, or NULL if not found.

◆ reply_info_alloc_rrset_keys()

int reply_info_alloc_rrset_keys ( struct reply_info rep,
struct alloc_cache alloc,
struct regional region 
)

Allocate (special) rrset keys.

Parameters
repreply info in which the rrset keys to be allocated, rrset[] array should have bee allocated with NULL pointers.
allochow to allocate rrset keys. Not used if region!=NULL, it can be NULL in that case.
regionif this parameter is NULL then the alloc is used. otherwise, rrset keys are allocated in this region. In a region, no special rrset key structures are needed (not shared). and no rrset_ref array in the reply needs to be built up.
Returns
1 on success, 0 on error

◆ reply_info_copy()

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.

Parameters
repwhat to copy, probably inside region, no ref[] array in it.
allochow to allocate rrset keys. Not used if region!=NULL, it can be NULL in that case.
regionif 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.

◆ reply_info_delete()

void reply_info_delete ( void *  d,
void *  arg 
)

delete reply_info data structure

◆ reply_info_parse()

int reply_info_parse ( struct sldns_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
pktthe packet buffer. Must be positioned after the query section.
alloccreates packed rrset key structures.
repallocated reply_info is returned (only on no error).
qinfquery_info is returned (only on no error).
regionwhere to store temporary data (for parsing).
ednswhere 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.

◆ reply_info_parsedelete()

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
repreply_info to delete.
allocwhere to return rrset structures to.

◆ reply_info_set_ttls()

void reply_info_set_ttls ( struct reply_info rep,
time_t  timenow 
)

Set TTLs inside the replyinfo to absolute values.

Parameters
repreply info. rrsets must be filled in. Also refs must be filled in.
timenowthe current time.

◆ reply_info_sortref()

void reply_info_sortref ( struct reply_info rep)

Sorts the ref array.

Parameters
repreply info. rrsets must be filled in.