msgparse.h File Reference

Contains message parsing data structures. More...

#include "util/storage/lruhash.h"
#include "sldns/pkthdr.h"
#include "sldns/rrdef.h"

Data Structures

struct  msg_parse
 Data stored in scratch pad memory during parsing. More...
 
struct  rrset_parse
 Data stored for an rrset during parsing. More...
 
struct  rr_parse
 Data stored for an RR during parsing. More...
 
struct  edns_data
 EDNS data storage rdata is parsed in a list (has accessor functions). More...
 
struct  edns_option
 EDNS option. More...
 

Macros

#define PARSE_TABLE_SIZE   32
 number of buckets in parse rrset hash table. More...
 
#define NORR_TTL   5 /* seconds */
 Negative cache time (for entries without any RRs.)
 
#define LABEL_IS_PTR(x)   ( ((x)&0xc0) == 0xc0 )
 Check if label length is first octet of a compression pointer, pass u8.
 
#define PTR_OFFSET(x, y)   ( ((x)&0x3f)<<8 | (y) )
 Calculate destination offset of a compression pointer. More...
 
#define PTR_CREATE(offset)   ((uint16_t)(0xc000 | (offset)))
 create a compression pointer to the given offset.
 
#define EDNS_RCODE_BADVERS   16 /** bad EDNS version */
 error codes, extended with EDNS, so > 15.
 
#define PTR_MAX_OFFSET   0x3fff
 largest valid compression offset
 

Functions

size_t get_rdf_size (sldns_rdf_type rdf)
 Obtain size in the packet of an rr type, that is before dname type. More...
 
int parse_packet (struct sldns_buffer *pkt, struct msg_parse *msg, struct regional *region)
 Parse the packet. More...
 
int parse_extract_edns_from_response_msg (struct msg_parse *msg, struct edns_data *edns, struct regional *region)
 After parsing the packet, extract EDNS data from packet. More...
 
int skip_pkt_rrs (struct sldns_buffer *pkt, int num)
 Skip RRs from packet. More...
 
int parse_edns_from_query_pkt (struct sldns_buffer *pkt, struct edns_data *edns, struct config_file *cfg, struct comm_point *c, struct comm_reply *repinfo, time_t now, struct regional *region, struct cookie_secrets *cookie_secrets)
 If EDNS data follows a query section, extract it and initialize edns struct. More...
 
hashvalue_type pkt_hash_rrset (struct sldns_buffer *pkt, uint8_t *dname, uint16_t type, uint16_t dclass, uint32_t rrset_flags)
 Calculate hash value for rrset in packet. More...
 
struct rrset_parsemsgparse_hashtable_lookup (struct msg_parse *msg, struct sldns_buffer *pkt, hashvalue_type h, uint32_t rrset_flags, uint8_t *dname, size_t dnamelen, uint16_t type, uint16_t dclass)
 Lookup in msg hashtable to find a rrset. More...
 
void msgparse_bucket_remove (struct msg_parse *msg, struct rrset_parse *rrset)
 Remove rrset from hash table. More...
 
void log_edns_opt_list (enum verbosity_value level, const char *info_str, struct edns_option *list)
 Log the edns options in the edns option list. More...
 
int msgparse_rrset_remove_rr (const char *str, struct sldns_buffer *pkt, struct rrset_parse *rrset, struct rr_parse *prev, struct rr_parse *rr, struct sockaddr_storage *addr, socklen_t addrlen)
 Remove RR from msgparse RRset. More...
 

Variables

time_t MAX_TTL
 Maximum TTL that is allowed. More...
 
time_t MIN_TTL
 Minimum TTL that is allowed. More...
 
time_t MAX_NEG_TTL
 Maximum Negative TTL that is allowed. More...
 
time_t MIN_NEG_TTL
 Minimum Negative TTL that is allowed. More...
 
int SERVE_EXPIRED
 If we serve expired entries and prefetch them.
 
time_t SERVE_EXPIRED_TTL
 Time to serve records after expiration.
 
time_t SERVE_EXPIRED_TTL_RESET
 Reset serve expired TTL after failed update attempt.
 
time_t SERVE_EXPIRED_REPLY_TTL
 TTL to use for expired records.
 
int SERVE_ORIGINAL_TTL
 If we serve the original TTL or decrementing TTLs.
 

Detailed Description

Contains message parsing data structures.

These point back into the packet buffer.

During parsing RRSIGS are put together with the rrsets they (claim to) sign. This process works as follows: o if RRSIG follows the data rrset, it is added to the rrset rrsig list. o if no matching data rrset is found, the RRSIG becomes a new rrset. o If the data rrset later follows the RRSIG o See if the RRSIG rrset contains multiple types, and needs to have the rrsig(s) for that data type split off. o Put the data rr as data type in the rrset and rrsig in list. o RRSIGs are allowed to move to a different section. The section of the data item is used for the final rrset. o multiple signatures over an RRset are possible.

For queries of qtype=RRSIG, some special handling is needed, to avoid splitting the RRSIG in the answer section. o duplicate, not split, RRSIGs from the answer section, if qtype=RRSIG. o check for doubles in the rrsig list when adding an RRSIG to data, so that a data rrset is signed by RRSIGs with different rdata. when qtype=RRSIG. This will move the RRSIG from the answer section to sign the data further in the packet (if possible). If then after that, more RRSIGs are found that sign the data as well, doubles are removed.

Macro Definition Documentation

◆ PARSE_TABLE_SIZE

#define PARSE_TABLE_SIZE   32

number of buckets in parse rrset hash table.

Must be power of 2.

◆ PTR_OFFSET

#define PTR_OFFSET (   x,
 
)    ( ((x)&0x3f)<<8 | (y) )

Calculate destination offset of a compression pointer.

pass first and second octets of the compression pointer.

Function Documentation

◆ get_rdf_size()

size_t get_rdf_size ( sldns_rdf_type  rdf)

Obtain size in the packet of an rr type, that is before dname type.

Do TYPE_DNAME, and type STR, yourself. Gives size for most regular types.

Parameters
rdfthe rdf type from the descriptor.
Returns
: size in octets. 0 on failure.

References LDNS_RDF_TYPE_A, LDNS_RDF_TYPE_AAAA, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_CERT_ALG, LDNS_RDF_TYPE_CLASS, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT32, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TSIGTIME, LDNS_RDF_TYPE_TYPE, and log_assert.

Referenced by analyze_rdata(), calc_size(), canonical_compare_byfield(), compress_rdata(), and decompress_rr_into_buffer().

◆ parse_packet()

int parse_packet ( struct sldns_buffer pkt,
struct msg_parse msg,
struct regional region 
)

Parse the packet.

Parameters
pktpacket, position at call must be at start of packet. at end position is after packet.
msgwhere to store results.
regionhow to alloc results.
Returns
: 0 if OK, or rcode on error.

References sldns_buffer_remaining().

Referenced by createResponse(), and parse_reply_in_temp_region().

◆ parse_extract_edns_from_response_msg()

int parse_extract_edns_from_response_msg ( struct msg_parse msg,
struct edns_data edns,
struct regional region 
)

After parsing the packet, extract EDNS data from packet.

If not present this is noted in the data structure. If a parse error happens, an error code is returned.

Quirks: o ignores OPT rdata. o ignores OPT owner name. o ignores extra OPT records, except the last one in the packet.

Parameters
msgparsed message structure. Modified on exit, if EDNS was present it is removed from the additional section.
ednsthe edns data is stored here. Does not have to be initialised.
regionregion to alloc results in (edns option contents)
Returns
: 0 on success. or an RCODE on an error. RCODE formerr if OPT in wrong section, and so on.

References LDNS_RR_TYPE_OPT, msg_parse::rrset_first, and rrset_parse::type.

◆ skip_pkt_rrs()

int skip_pkt_rrs ( sldns_buffer pkt,
int  num 
)

Skip RRs from packet.

Parameters
pktthe packet. position at start must be right after the query section. At end, right after EDNS data or no movement if failed.
numLimit of the number of records we want to parse.
Returns
: 0 on success, 1 on failure.

Skip RRs from packet.

References skip_pkt_rr().

◆ parse_edns_from_query_pkt()

int parse_edns_from_query_pkt ( struct sldns_buffer pkt,
struct edns_data edns,
struct config_file cfg,
struct comm_point c,
struct comm_reply repinfo,
time_t  now,
struct regional region,
struct cookie_secrets cookie_secrets 
)

If EDNS data follows a query section, extract it and initialize edns struct.

Parameters
pktthe packet. position at start must be right after the query section. At end, right after EDNS data or no movement if failed.
ednsthe edns data allocated by the caller. Does not have to be initialised.
cfgthe configuration (with nsid value etc.)
ccommpoint to determine transport (if needed)
repinfocommreply to determine the client address
nowcurrent time
regionregion to alloc results in (edns option contents)
cookie_secretsthe cookie secrets for EDNS COOKIE validation.
Returns
: 0 on success, or an RCODE on error. RCODE formerr if OPT is badly formatted and so on.

References log_assert.

◆ pkt_hash_rrset()

hashvalue_type pkt_hash_rrset ( struct sldns_buffer pkt,
uint8_t *  dname,
uint16_t  type,
uint16_t  dclass,
uint32_t  rrset_flags 
)

Calculate hash value for rrset in packet.

Parameters
pktthe packet.
dnamepointer to uncompressed dname, or compressed dname in packet.
typerrset type in host order.
dclassrrset class in network order.
rrset_flagsrrset flags (same as packed_rrset flags).
Returns
hash value

References rrset_parse::dname, dname_pkt_hash(), hashlittle(), and rrset_parse::type.

Referenced by change_rrsig_rrset(), mark_additional_rrset(), and synth_cname_rrset().

◆ msgparse_hashtable_lookup()

struct rrset_parse* msgparse_hashtable_lookup ( struct msg_parse msg,
struct sldns_buffer pkt,
hashvalue_type  h,
uint32_t  rrset_flags,
uint8_t *  dname,
size_t  dnamelen,
uint16_t  type,
uint16_t  dclass 
)

Lookup in msg hashtable to find a rrset.

Parameters
msgwith the hashtable.
pktpacket for compressed names.
hhash value
rrset_flagsflags of rrset sought for.
dnamename of rrset sought for.
dnamelenlen of dname.
typerrset type, host order.
dclassrrset class, network order.
Returns
NULL or the rrset_parse if found.

References rrset_parse::dname, msg_parse::hashtable, PARSE_TABLE_SIZE, rrset_parse::rrset_bucket_next, rrset_parse_equals(), and rrset_parse::type.

Referenced by find_rrset(), and mark_additional_rrset().

◆ msgparse_bucket_remove()

void msgparse_bucket_remove ( struct msg_parse msg,
struct rrset_parse rrset 
)

Remove rrset from hash table.

Parameters
msgwith hashtable.
rrsetwith hash value and id info.

References rrset_parse::hash, msg_parse::hashtable, PARSE_TABLE_SIZE, and rrset_parse::rrset_bucket_next.

◆ log_edns_opt_list()

void log_edns_opt_list ( enum verbosity_value  level,
const char *  info_str,
struct edns_option list 
)

Log the edns options in the edns option list.

Parameters
levelthe verbosity level.
info_strthe informational string to be printed before the options.
listthe edns option list.

References verbosity.

◆ msgparse_rrset_remove_rr()

int msgparse_rrset_remove_rr ( const char *  str,
sldns_buffer pkt,
struct rrset_parse rrset,
struct rr_parse prev,
struct rr_parse rr,
struct sockaddr_storage *  addr,
socklen_t  addrlen 
)

Remove RR from msgparse RRset.

Parameters
strthis string is used for logging if verbose. If NULL, there is no logging of the remove.
pktpacket in buffer that is removed from. Used to log the name of the item removed.
rrsetRRset that the RR is removed from.
prevprevious RR in list, or NULL.
rrRR that is removed.
addraddress used for logging, if verbose, or NULL then it is not used.
addrlenlength of addr, if that is not NULL.
Returns
true if rrset is entirely bad, it would then need to be removed.

Remove RR from msgparse RRset.

Variable Documentation

◆ MAX_TTL

time_t MAX_TTL
extern

Maximum TTL that is allowed.

Maximum TTL that is allowed.

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

◆ MIN_TTL

time_t MIN_TTL
extern

Minimum TTL that is allowed.

Minimum TTL that is allowed.

Referenced by adjust_ttl(), config_apply(), and config_set_option().

◆ MAX_NEG_TTL

time_t MAX_NEG_TTL
extern

Maximum Negative TTL that is allowed.

Maximum Negative TTL that is allowed.

Referenced by config_apply(), config_set_option(), and msgparse_test().

◆ MIN_NEG_TTL

time_t MIN_NEG_TTL
extern

Minimum Negative TTL that is allowed.

Minimum Negative TTL that is allowed.

Referenced by config_apply(), and config_set_option().