|
Electroneum
|


Go to the source code of this file.
Classes | |
| struct | msg_parse |
| struct | rrset_parse |
| struct | rr_parse |
| struct | edns_data |
| struct | edns_option |
Macros | |
| #define | PARSE_TABLE_SIZE 32 |
| #define | NORR_TTL 5 /* seconds */ |
| #define | LABEL_IS_PTR(x) ( ((x)&0xc0) == 0xc0 ) |
| #define | PTR_OFFSET(x, y) ( ((x)&0x3f)<<8 | (y) ) |
| #define | PTR_CREATE(offset) ((uint16_t)(0xc000 | (offset))) |
| #define | EDNS_RCODE_BADVERS 16 /** bad EDNS version */ |
| #define | PTR_MAX_OFFSET 0x3fff |
Functions | |
| size_t | get_rdf_size (sldns_rdf_type rdf) |
| int | parse_packet (struct sldns_buffer *pkt, struct msg_parse *msg, struct regional *region) |
| int | parse_extract_edns (struct msg_parse *msg, struct edns_data *edns, struct regional *region) |
| int | parse_edns_from_pkt (struct sldns_buffer *pkt, struct edns_data *edns, struct regional *region) |
| hashvalue_type | pkt_hash_rrset (struct sldns_buffer *pkt, uint8_t *dname, uint16_t type, uint16_t dclass, uint32_t rrset_flags) |
| 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) |
| void | msgparse_bucket_remove (struct msg_parse *msg, struct rrset_parse *rrset) |
| void | log_edns_opt_list (enum verbosity_value level, const char *info_str, struct edns_option *list) |
Variables | |
| time_t | MAX_TTL |
| time_t | MIN_TTL |
| time_t | MAX_NEG_TTL |
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.
Definition in file msgparse.h.
| #define EDNS_RCODE_BADVERS 16 /** bad EDNS version */ |
error codes, extended with EDNS, so > 15.
Definition at line 200 of file msgparse.h.
| #define LABEL_IS_PTR | ( | x | ) | ( ((x)&0xc0) == 0xc0 ) |
Check if label length is first octet of a compression pointer, pass u8.
Definition at line 192 of file msgparse.h.
| #define NORR_TTL 5 /* seconds */ |
Negative cache time (for entries without any RRs.)
Definition at line 83 of file msgparse.h.
| #define PARSE_TABLE_SIZE 32 |
number of buckets in parse rrset hash table. Must be power of 2.
Definition at line 75 of file msgparse.h.
| #define PTR_CREATE | ( | offset | ) | ((uint16_t)(0xc000 | (offset))) |
create a compression pointer to the given offset.
Definition at line 197 of file msgparse.h.
| #define PTR_MAX_OFFSET 0x3fff |
largest valid compression offset
Definition at line 202 of file msgparse.h.
| #define PTR_OFFSET | ( | x, | |
| y | |||
| ) | ( ((x)&0x3f)<<8 | (y) ) |
Calculate destination offset of a compression pointer. pass first and second octets of the compression pointer.
Definition at line 195 of file msgparse.h.
| 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.
| rdf | the rdf type from the descriptor. |
| 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.
| level | the verbosity level. |
| info_str | the informational string to be printed before the options. |
| list | the edns option list. |
| void msgparse_bucket_remove | ( | struct msg_parse * | msg, |
| struct rrset_parse * | rrset | ||
| ) |
Remove rrset from hash table.
| msg | with hashtable. |
| rrset | with hash value and id info. |
| 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.
| msg | with the hashtable. |
| pkt | packet for compressed names. |
| h | hash value |
| rrset_flags | flags of rrset sought for. |
| dname | name of rrset sought for. |
| dnamelen | len of dname. |
| type | rrset type, host order. |
| dclass | rrset class, network order. |
| int parse_edns_from_pkt | ( | struct sldns_buffer * | pkt, |
| struct edns_data * | edns, | ||
| struct regional * | region | ||
| ) |
If EDNS data follows a query section, extract it and initialize edns struct.
| pkt | the packet. position at start must be right after the query section. At end, right after EDNS data or no movement if failed. |
| edns | the edns data allocated by the caller. Does not have to be initialised. |
| region | region to alloc results in (edns option contents) |
| int parse_extract_edns | ( | 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.
| msg | parsed message structure. Modified on exit, if EDNS was present it is removed from the additional section. |
| edns | the edns data is stored here. Does not have to be initialised. |
| region | region to alloc results in (edns option contents) |
| int parse_packet | ( | struct sldns_buffer * | pkt, |
| struct msg_parse * | msg, | ||
| struct regional * | region | ||
| ) |
Parse the packet.
| pkt | packet, position at call must be at start of packet. at end position is after packet. |
| msg | where to store results. |
| region | how to alloc results. |
| 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.
| pkt | the packet. |
| dname | pointer to uncompressed dname, or compressed dname in packet. |
| type | rrset type in host order. |
| dclass | rrset class in network order. |
| rrset_flags | rrset flags (same as packed_rrset flags). |
| time_t MAX_NEG_TTL |
Maximum Negative TTL that is allowed
| time_t MAX_TTL |
Maximum TTL that is allowed.
| time_t MIN_TTL |
Minimum TTL that is allowed.