s2n_quic_core/ack/
transmission.rs1use crate::{ack, packet::number::PacketNumber};
5use core::ops::RangeInclusive;
6
7pub type AckRange = RangeInclusive<PacketNumber>;
8
9#[derive(Clone, Debug, Default)]
10pub struct Set {
11 stable: Option<Transmission>,
21
22 latest: Option<Transmission>,
24}
25
26impl Set {
27 #[inline]
29 pub fn on_transmit(&mut self, transmission: Transmission) {
30 self.latest = Some(transmission);
31
32 if self.stable.is_none() {
34 self.stable = Some(transmission);
35 }
36 }
37
38 #[inline]
40 pub fn on_update<A: ack::Set>(&mut self, ack_set: &A) -> Option<AckRange> {
41 if let Some(ack_range) = self
42 .latest
43 .as_ref()
44 .and_then(|transmission| transmission.ack_range(ack_set))
45 {
46 self.stable = None;
48 self.latest = None;
49 return Some(ack_range);
50 }
51
52 if let Some(ack_range) = self
53 .stable
54 .as_ref()
55 .and_then(|transmission| transmission.ack_range(ack_set))
56 {
57 self.stable = self.latest;
59 return Some(ack_range);
60 }
61
62 None
63 }
64
65 #[cfg(test)]
68 pub fn is_empty(&self) -> bool {
69 self.stable.is_none() && self.latest.is_none()
70 }
71}
72
73#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd)]
74pub struct Transmission {
75 pub sent_in_packet: PacketNumber,
76 pub largest_received_packet_number_acked: PacketNumber,
77}
78
79impl Transmission {
80 #[inline]
82 pub fn ack_range<A: ack::Set>(&self, ack_set: &A) -> Option<AckRange> {
83 if ack_set.contains(self.sent_in_packet) {
88 let pn_zero = self
90 .largest_received_packet_number_acked
91 .space()
92 .new_packet_number(Default::default());
93
94 Some(pn_zero..=self.largest_received_packet_number_acked)
95 } else {
96 None
97 }
98 }
99}
100
101#[cfg(test)]
102mod tests {
103 use super::*;
104 use crate::ack::testing::transmissions_iter;
105
106 #[test]
108 fn latest_ack_test() {
109 let mut set = Set::default();
110 assert!(set.is_empty());
111
112 let mut transmissions = transmissions_iter();
113
114 for transmission_count in 0..10 {
115 let stable = transmissions.next().unwrap();
116 set.on_transmit(stable);
117
118 let mut latest = stable;
120 for _ in 0..transmission_count {
121 latest = transmissions.next().unwrap();
122 set.on_transmit(latest);
123 }
124
125 assert_eq!(
127 set.on_update(&latest.sent_in_packet).unwrap().end(),
128 &latest.largest_received_packet_number_acked
129 );
130
131 assert!(set.is_empty());
133 }
134 }
135
136 #[test]
138 fn stable_ack_test() {
139 let mut set = Set::default();
140 assert!(set.is_empty());
141
142 let mut transmissions = transmissions_iter();
143
144 let mut stable = transmissions.next().unwrap();
146 set.on_transmit(stable);
147
148 for transmission_count in 0..10 {
149 let mut latest = stable;
151 for _ in 0..transmission_count {
152 latest = transmissions.next().unwrap();
153 set.on_transmit(latest);
154 }
155
156 assert_eq!(
158 set.on_update(&stable.sent_in_packet).unwrap().end(),
159 &stable.largest_received_packet_number_acked
160 );
161
162 stable = latest;
164
165 if transmission_count == 0 {
168 assert!(set.is_empty());
169 set.on_transmit(stable);
170 }
171 }
172 }
173
174 #[test]
175 #[cfg_attr(miri, ignore)] fn size_of_snapshots() {
177 use core::mem::size_of;
178 use insta::assert_debug_snapshot;
179
180 assert_debug_snapshot!("Transmission", size_of::<Transmission>());
181 assert_debug_snapshot!("Set", size_of::<Set>());
182 }
183}