dns_server/
dns_question.rs

1use crate::dns_class::DnsClass;
2use crate::{DnsError, DnsName, DnsType};
3use fixed_buffer::FixedBuf;
4
5/// > The question section is used to carry the "question" in most queries, i.e., the parameters
6/// > that define what is being asked.  The section contains QDCOUNT (usually 1) entries, each of
7/// > the following format:
8/// >
9/// > ```text
10/// >                                 1  1  1  1  1  1
11/// >   0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
12/// > +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
13/// > |                                               |
14/// > /                     QNAME                     /
15/// > /                                               /
16/// > +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
17/// > |                     QTYPE                     |
18/// > +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
19/// > |                     QCLASS                    |
20/// > +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
21/// > ```
22#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23pub struct DnsQuestion {
24    pub name: DnsName,
25    pub typ: DnsType,
26    pub class: DnsClass,
27}
28impl DnsQuestion {
29    /// # Errors
30    /// Returns an error when `buf` does not contain a valid question struct.
31    pub fn read<const N: usize>(buf: &mut FixedBuf<N>) -> Result<Self, DnsError> {
32        let name = DnsName::read(buf)?;
33        let typ = DnsType::read(buf)?;
34        let class = DnsClass::read(buf)?;
35        if class != DnsClass::Internet && class != DnsClass::Any {
36            return Err(DnsError::InvalidClass);
37        }
38        Ok(DnsQuestion { name, typ, class })
39    }
40
41    /// # Errors
42    /// Returns an error when `buf` fills up.
43    pub fn write<const N: usize>(&self, out: &mut FixedBuf<N>) -> Result<(), DnsError> {
44        self.name.write(out)?;
45        self.typ.write(out)?;
46        self.class.write(out)?;
47        Ok(())
48    }
49}