dns_message_parser/encode/
dns.rs

1use crate::encode::Encoder;
2use crate::{Dns, EncodeResult, Flags};
3
4impl Encoder {
5    pub(super) fn flags(&mut self, flags: &Flags) {
6        let mut buffer = 0u8;
7        if flags.qr {
8            buffer |= 0b1000_0000;
9        }
10        let opcode = flags.opcode as u8;
11        buffer |= opcode << 3;
12        if flags.aa {
13            buffer |= 0b0000_0100;
14        }
15        if flags.tc {
16            buffer |= 0b0000_0010;
17        }
18        if flags.rd {
19            buffer |= 0b0000_0001;
20        }
21        self.u8(buffer);
22
23        let mut buffer = 0u8;
24        if flags.ra {
25            buffer |= 0b1000_0000;
26        }
27        if flags.ad {
28            buffer |= 0b0010_0000;
29        }
30        if flags.cd {
31            buffer |= 0b0001_0000;
32        }
33        let rcode = flags.rcode as u8;
34        buffer |= rcode;
35        self.u8(buffer);
36    }
37
38    pub(super) fn dns(&mut self, dns: &Dns) -> EncodeResult<()> {
39        self.u16(dns.id);
40        self.flags(&dns.flags);
41        self.u16(dns.questions.len() as u16);
42        self.u16(dns.answers.len() as u16);
43        self.u16(dns.authorities.len() as u16);
44        self.u16(dns.additionals.len() as u16);
45
46        for question in &dns.questions {
47            self.question(question)?;
48        }
49
50        for answer in &dns.answers {
51            self.rr(answer)?;
52        }
53
54        for authority in &dns.authorities {
55            self.rr(authority)?;
56        }
57
58        for additional in &dns.additionals {
59            self.rr(additional)?;
60        }
61
62        Ok(())
63    }
64}
65
66impl_encode_without_result!(Flags, flags);
67
68impl_encode!(Dns, dns);