dns_parser/
structs.rs

1use {QueryType, QueryClass, Name, Class, Header, RData};
2use rdata::opt;
3
4
5/// Parsed DNS packet
6#[derive(Debug)]
7#[allow(missing_docs)]  // should be covered by spec
8pub struct Packet<'a> {
9    pub header: Header,
10    pub questions: Vec<Question<'a>>,
11    pub answers: Vec<ResourceRecord<'a>>,
12    pub nameservers: Vec<ResourceRecord<'a>>,
13    pub additional: Vec<ResourceRecord<'a>>,
14    /// Optional Pseudo-RR
15    /// When present it is sent as an RR in the additional section. In this RR
16    /// the `class` and `ttl` fields store max udp packet size and flags
17    /// respectively. To keep `ResourceRecord` clean we store the OPT record
18    /// here.
19    pub opt: Option<opt::Record<'a>>,
20}
21
22/// A parsed chunk of data in the Query section of the packet
23#[derive(Debug)]
24#[allow(missing_docs)]  // should be covered by spec
25pub struct Question<'a> {
26    pub qname: Name<'a>,
27    /// Whether or not we prefer unicast responses.
28    /// This is used in multicast DNS.
29    pub prefer_unicast: bool,
30    pub qtype: QueryType,
31    pub qclass: QueryClass,
32}
33
34/// A single DNS record
35///
36/// We aim to provide whole range of DNS records available. But as time is
37/// limited we have some types of packets which are parsed and other provided
38/// as unparsed slice of bytes.
39#[derive(Debug)]
40#[allow(missing_docs)]  // should be covered by spec
41pub struct ResourceRecord<'a> {
42    pub name: Name<'a>,
43    /// Whether or not the set of resource records is fully contained in the
44    /// packet, or whether there will be more resource records in future
45    /// packets. Only used for multicast DNS.
46    pub multicast_unique: bool,
47    pub cls: Class,
48    pub ttl: u32,
49    pub data: RData<'a>,
50}