dnssector/
question_iterator.rs

1use crate::constants::*;
2use crate::dns_sector::*;
3use crate::parsed_packet::*;
4use crate::rr_iterator::*;
5
6#[derive(Debug)]
7pub struct QuestionIterator<'t> {
8    rr_iterator: RRIterator<'t>,
9}
10
11impl<'t> TypedIterable for QuestionIterator<'t> {}
12
13impl<'t> DNSIterable for QuestionIterator<'t> {
14    #[inline]
15    fn offset(&self) -> Option<usize> {
16        self.rr_iterator.offset
17    }
18
19    #[inline]
20    fn offset_next(&self) -> usize {
21        self.rr_iterator.offset_next
22    }
23
24    fn set_offset(&mut self, offset: usize) {
25        debug_assert!(offset <= self.packet().len());
26        self.rr_iterator.offset = Some(offset);
27    }
28
29    fn set_offset_next(&mut self, offset: usize) {
30        debug_assert!(offset <= self.packet().len());
31        self.rr_iterator.offset_next = offset;
32    }
33
34    fn invalidate(&mut self) {
35        self.rr_iterator.offset = None;
36    }
37
38    fn recompute_rr(&mut self) {
39        self.rr_iterator.recompute();
40    }
41
42    fn recompute_sections(&mut self) {
43        self.rr_iterator.parsed_packet.recompute().unwrap();
44    }
45
46    #[inline]
47    fn raw(&self) -> RRRaw<'_> {
48        RRRaw {
49            packet: self.rr_iterator.parsed_packet.packet(),
50            offset: self.rr_iterator.offset.unwrap(),
51            name_end: self.rr_iterator.name_end,
52        }
53    }
54
55    #[inline]
56    fn raw_mut(&mut self) -> RRRawMut<'_> {
57        RRRawMut {
58            packet: self.rr_iterator.parsed_packet.packet_mut(),
59            offset: self.rr_iterator.offset.unwrap(),
60            name_end: self.rr_iterator.name_end,
61        }
62    }
63
64    #[inline]
65    fn parsed_packet(&self) -> &ParsedPacket {
66        self.rr_iterator.parsed_packet
67    }
68
69    #[inline]
70    fn parsed_packet_mut(&mut self) -> &mut ParsedPacket {
71        self.rr_iterator.parsed_packet
72    }
73
74    fn next(mut self) -> Option<Self> {
75        {
76            let rr_iterator = &mut self.rr_iterator;
77            debug_assert_eq!(rr_iterator.section, Section::Question);
78            if rr_iterator.offset.is_none() {
79                let count = DNSSector::qdcount(rr_iterator.parsed_packet.packet());
80                if count == 0 {
81                    return None;
82                }
83                debug_assert_eq!(count, 1);
84                rr_iterator.rrs_left = count;
85                rr_iterator.offset_next = rr_iterator.parsed_packet.offset_question.unwrap();
86            }
87            if rr_iterator.rrs_left == 0 {
88                return None;
89            }
90            rr_iterator.rrs_left -= 1;
91            rr_iterator.offset = Some(rr_iterator.offset_next);
92            rr_iterator.name_end = RRIterator::skip_name(
93                rr_iterator.parsed_packet.packet(),
94                rr_iterator.offset.unwrap(),
95            );
96            let offset_next = rr_iterator.name_end + DNS_RR_QUESTION_HEADER_SIZE;
97            rr_iterator.offset_next = offset_next;
98        }
99        Some(self)
100    }
101}
102
103impl<'t> QuestionIterator<'t> {
104    pub fn new(rr_iterator: RRIterator<'t>) -> Self {
105        QuestionIterator { rr_iterator }
106    }
107}