dnssector/
question_iterator.rs1use 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}