dns_message_parser/encode/
dns.rs1use 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);