dns_message_parser/decode/
dns.rs1use crate::decode::Decoder;
2use crate::{DecodeError, DecodeResult, Dns, Flags, Opcode, RCode, MAXIMUM_DNS_PACKET_SIZE};
3use std::convert::TryFrom;
4
5impl<'a, 'b: 'a> Decoder<'a, 'b> {
6 fn flags(&mut self) -> DecodeResult<Flags> {
7 let buffer = self.u8()?;
8 let qr = (buffer & 0b1000_0000) != 0;
9 let opcode = (buffer & 0b0111_1000) >> 3;
10 let opcode = match Opcode::try_from(opcode) {
11 Ok(opcode) => opcode,
12 Err(buffer) => return Err(DecodeError::Opcode(buffer)),
13 };
14 let aa = (buffer & 0b0000_0100) != 0;
15 let tc = (buffer & 0b0000_0010) != 0;
16 let rd = (buffer & 0b0000_0001) != 0;
17 let buffer = self.u8()?;
18 let ra = (buffer & 0b1000_0000) != 0;
19 let z = buffer & 0b0100_0000;
20 if z != 0 {
21 return Err(DecodeError::ZNotZeroes(z));
22 }
23 let ad = (buffer & 0b0010_0000) != 0;
24 let cd = (buffer & 0b0001_0000) != 0;
25 let rcode = buffer & 0b0000_1111;
26 match RCode::try_from(rcode) {
27 Ok(rcode) => Ok(Flags {
28 qr,
29 opcode,
30 aa,
31 tc,
32 rd,
33 ra,
34 ad,
35 cd,
36 rcode,
37 }),
38 Err(buffer) => Err(DecodeError::RCode(buffer)),
39 }
40 }
41}
42
43impl<'a, 'b: 'a> Decoder<'b, 'b> {
44 fn dns(&'a mut self) -> DecodeResult<Dns> {
45 if self.offset != 0 {
46 return Err(DecodeError::Offset(self.offset));
47 }
48
49 let bytes_len = self.bytes.len();
50 if bytes_len < 12 {
51 return Err(DecodeError::NotEnoughBytes(bytes_len, 12));
52 } else if bytes_len > MAXIMUM_DNS_PACKET_SIZE {
53 return Err(DecodeError::DnsPacketTooBig(bytes_len));
54 }
55
56 let id = self.u16()?;
57 let flags = self.flags()?;
58 let question_count = self.u16()?;
59 let answer_count = self.u16()?;
60 let authority_count = self.u16()?;
61 let additional_count = self.u16()?;
62
63 let mut questions = Vec::with_capacity(question_count as usize);
64 for _ in 0..question_count {
65 questions.push(self.question()?);
66 }
67 let mut answers = Vec::with_capacity(answer_count as usize);
68 for _ in 0..answer_count {
69 answers.push(self.rr()?);
70 }
71 let mut authorities = Vec::with_capacity(authority_count as usize);
72 for _ in 0..authority_count {
73 authorities.push(self.rr()?);
74 }
75 let mut additionals = Vec::with_capacity(additional_count as usize);
76 for _ in 0..additional_count {
77 additionals.push(self.rr()?);
78 }
79
80 let is_finished = self.is_finished()?;
81 let dns = Dns {
82 id,
83 flags,
84 questions,
85 answers,
86 authorities,
87 additionals,
88 };
89
90 if is_finished {
91 Ok(dns)
92 } else {
93 Err(DecodeError::RemainingBytes(self.offset, dns))
94 }
95 }
96}
97
98impl_decode!(Flags, flags);
99
100impl_decode!(Dns, dns);