Skip to main content

dns_message/
wire_length.rs

1use crate::header::{Flags, Header};
2use crate::message::Message;
3use crate::question::{Label, NameElement, Question};
4use crate::resource_record::ResourceRecord;
5use mt::WireLength;
6
7impl WireLength<usize> for Header {
8    fn wire_length(&self) -> usize {
9        12
10    }
11}
12
13impl WireLength<usize> for &Flags {
14    fn wire_length(&self) -> usize {
15        2
16    }
17}
18
19impl<'a> WireLength<usize> for &Label<'a> {
20    fn wire_length(&self) -> usize {
21        1 + self.data.len()
22    }
23}
24
25impl<'a> WireLength<usize> for NameElement<'a> {
26    fn wire_length(&self) -> usize {
27        match self {
28            NameElement::Label(l) => l.wire_length(),
29            NameElement::Pointer(_) => 2,
30            NameElement::Root => 1,
31            NameElement::Reserved => 0,
32        }
33    }
34}
35
36impl<'a> WireLength<usize> for Question<'a> {
37    fn wire_length(&self) -> usize {
38        self.q_name.wire_length() + 4
39    }
40}
41
42impl<'a> WireLength<usize> for ResourceRecord<'a> {
43    fn wire_length(&self) -> usize {
44        self.rr_name.wire_length() + 10 + self.rr_data.len()
45    }
46}
47
48impl<'a> WireLength<usize> for Message<'a> {
49    fn wire_length(&self) -> usize {
50        self.header.wire_length()
51            + self.question.wire_length()
52            + self.answer.wire_length()
53            + self.authority.wire_length()
54            + self.additional.wire_length()
55    }
56}