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