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}