summaryrefslogtreecommitdiffstats
path: root/third_party/rust/neqo-transport/src/recovery.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/neqo-transport/src/recovery.rs')
-rw-r--r--third_party/rust/neqo-transport/src/recovery.rs52
1 files changed, 45 insertions, 7 deletions
diff --git a/third_party/rust/neqo-transport/src/recovery.rs b/third_party/rust/neqo-transport/src/recovery.rs
index dbea3aaf57..22a635d9f3 100644
--- a/third_party/rust/neqo-transport/src/recovery.rs
+++ b/third_party/rust/neqo-transport/src/recovery.rs
@@ -21,6 +21,7 @@ use crate::{
ackrate::AckRate,
cid::ConnectionIdEntry,
crypto::CryptoRecoveryToken,
+ ecn::EcnCount,
packet::PacketNumber,
path::{Path, PathRef},
qlog::{self, QlogMetric},
@@ -665,12 +666,14 @@ impl LossRecovery {
}
/// Returns (acked packets, lost packets)
+ #[allow(clippy::too_many_arguments)]
pub fn on_ack_received<R>(
&mut self,
primary_path: &PathRef,
pn_space: PacketNumberSpace,
largest_acked: u64,
acked_ranges: R,
+ ack_ecn: Option<EcnCount>,
ack_delay: Duration,
now: Instant,
) -> (Vec<SentPacket>, Vec<SentPacket>)
@@ -692,10 +695,10 @@ impl LossRecovery {
let (acked_packets, any_ack_eliciting) =
space.remove_acked(acked_ranges, &mut self.stats.borrow_mut());
- if acked_packets.is_empty() {
+ let Some(largest_acked_pkt) = acked_packets.first() else {
// No new information.
return (Vec::new(), Vec::new());
- }
+ };
// Track largest PN acked per space
let prev_largest_acked = space.largest_acked_sent_time;
@@ -704,7 +707,6 @@ impl LossRecovery {
// If the largest acknowledged is newly acked and any newly acked
// packet was ack-eliciting, update the RTT. (-recovery 5.1)
- let largest_acked_pkt = acked_packets.first().expect("must be there");
space.largest_acked_sent_time = Some(largest_acked_pkt.time_sent);
if any_ack_eliciting && largest_acked_pkt.on_primary_path() {
self.rtt_sample(
@@ -744,7 +746,7 @@ impl LossRecovery {
// when it shouldn't.
primary_path
.borrow_mut()
- .on_packets_acked(&acked_packets, now);
+ .on_packets_acked(&acked_packets, ack_ecn, now);
self.pto_state = None;
@@ -1022,7 +1024,7 @@ mod tests {
time::{Duration, Instant},
};
- use neqo_common::qlog::NeqoQlog;
+ use neqo_common::{qlog::NeqoQlog, IpTosEcn};
use test_fixture::{now, DEFAULT_ADDR};
use super::{
@@ -1031,6 +1033,7 @@ mod tests {
use crate::{
cc::CongestionControlAlgorithm,
cid::{ConnectionId, ConnectionIdEntry},
+ ecn::EcnCount,
packet::PacketType,
path::{Path, PathRef},
rtt::RttEstimate,
@@ -1060,6 +1063,7 @@ mod tests {
pn_space: PacketNumberSpace,
largest_acked: u64,
acked_ranges: Vec<RangeInclusive<u64>>,
+ ack_ecn: Option<EcnCount>,
ack_delay: Duration,
now: Instant,
) -> (Vec<SentPacket>, Vec<SentPacket>) {
@@ -1068,6 +1072,7 @@ mod tests {
pn_space,
largest_acked,
acked_ranges,
+ ack_ecn,
ack_delay,
now,
)
@@ -1208,6 +1213,7 @@ mod tests {
lr.on_packet_sent(SentPacket::new(
PacketType::Short,
pn,
+ IpTosEcn::default(),
pn_time(pn),
true,
Vec::new(),
@@ -1223,6 +1229,7 @@ mod tests {
PacketNumberSpace::ApplicationData,
pn,
vec![pn..=pn],
+ None,
ACK_DELAY,
pn_time(pn) + delay,
);
@@ -1233,6 +1240,7 @@ mod tests {
lrs.on_packet_sent(SentPacket::new(
PacketType::Short,
pn,
+ IpTosEcn::default(),
pn_time(pn),
true,
Vec::new(),
@@ -1353,6 +1361,7 @@ mod tests {
lr.on_packet_sent(SentPacket::new(
PacketType::Short,
0,
+ IpTosEcn::default(),
pn_time(0),
true,
Vec::new(),
@@ -1361,6 +1370,7 @@ mod tests {
lr.on_packet_sent(SentPacket::new(
PacketType::Short,
1,
+ IpTosEcn::default(),
pn_time(0) + TEST_RTT / 4,
true,
Vec::new(),
@@ -1370,6 +1380,7 @@ mod tests {
PacketNumberSpace::ApplicationData,
1,
vec![1..=1],
+ None,
ACK_DELAY,
pn_time(0) + (TEST_RTT * 5 / 4),
);
@@ -1393,6 +1404,7 @@ mod tests {
PacketNumberSpace::ApplicationData,
2,
vec![2..=2],
+ None,
ACK_DELAY,
pn2_ack_time,
);
@@ -1422,6 +1434,7 @@ mod tests {
PacketNumberSpace::ApplicationData,
4,
vec![2..=4],
+ None,
ACK_DELAY,
pn_time(4),
);
@@ -1450,6 +1463,7 @@ mod tests {
PacketNumberSpace::Initial,
0,
vec![],
+ None,
Duration::from_millis(0),
pn_time(0),
);
@@ -1463,6 +1477,7 @@ mod tests {
lr.on_packet_sent(SentPacket::new(
PacketType::Initial,
0,
+ IpTosEcn::default(),
pn_time(0),
true,
Vec::new(),
@@ -1471,6 +1486,7 @@ mod tests {
lr.on_packet_sent(SentPacket::new(
PacketType::Handshake,
0,
+ IpTosEcn::default(),
pn_time(1),
true,
Vec::new(),
@@ -1479,6 +1495,7 @@ mod tests {
lr.on_packet_sent(SentPacket::new(
PacketType::Short,
0,
+ IpTosEcn::default(),
pn_time(2),
true,
Vec::new(),
@@ -1491,10 +1508,25 @@ mod tests {
PacketType::Handshake,
PacketType::Short,
] {
- let sent_pkt = SentPacket::new(*sp, 1, pn_time(3), true, Vec::new(), ON_SENT_SIZE);
+ let sent_pkt = SentPacket::new(
+ *sp,
+ 1,
+ IpTosEcn::default(),
+ pn_time(3),
+ true,
+ Vec::new(),
+ ON_SENT_SIZE,
+ );
let pn_space = PacketNumberSpace::from(sent_pkt.pt);
lr.on_packet_sent(sent_pkt);
- lr.on_ack_received(pn_space, 1, vec![1..=1], Duration::from_secs(0), pn_time(3));
+ lr.on_ack_received(
+ pn_space,
+ 1,
+ vec![1..=1],
+ None,
+ Duration::from_secs(0),
+ pn_time(3),
+ );
let mut lost = Vec::new();
lr.spaces.get_mut(pn_space).unwrap().detect_lost_packets(
pn_time(3),
@@ -1516,6 +1548,7 @@ mod tests {
lr.on_packet_sent(SentPacket::new(
PacketType::Initial,
0,
+ IpTosEcn::default(),
pn_time(3),
true,
Vec::new(),
@@ -1530,6 +1563,7 @@ mod tests {
lr.on_packet_sent(SentPacket::new(
PacketType::Initial,
0,
+ IpTosEcn::default(),
now(),
true,
Vec::new(),
@@ -1542,6 +1576,7 @@ mod tests {
PacketNumberSpace::Initial,
0,
vec![0..=0],
+ None,
Duration::new(0, 0),
now() + rtt,
);
@@ -1549,6 +1584,7 @@ mod tests {
lr.on_packet_sent(SentPacket::new(
PacketType::Handshake,
0,
+ IpTosEcn::default(),
now(),
true,
Vec::new(),
@@ -1557,6 +1593,7 @@ mod tests {
lr.on_packet_sent(SentPacket::new(
PacketType::Short,
0,
+ IpTosEcn::default(),
now(),
true,
Vec::new(),
@@ -1594,6 +1631,7 @@ mod tests {
lr.on_packet_sent(SentPacket::new(
PacketType::Initial,
1,
+ IpTosEcn::default(),
now(),
true,
Vec::new(),