Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

testing always subtracting ack delay from rtt #1921

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 15 additions & 35 deletions quic/s2n-quic-core/src/recovery/rtt_estimator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ use core::{
//# starting with a PTO of 1 second, as recommended for TCP's initial
//# RTO; see Section 2 of [RFC6298].
pub const DEFAULT_INITIAL_RTT: Duration = Duration::from_millis(333);
const ZERO_DURATION: Duration = Duration::from_millis(0);

//= https://www.rfc-editor.org/rfc/rfc9002#section-6.1.2
//# The RECOMMENDED value of the timer granularity (kGranularity) is 1 millisecond.
Expand Down Expand Up @@ -168,12 +167,13 @@ impl RttEstimator {
#[inline]
pub fn update_rtt(
&mut self,
mut ack_delay: Duration,
ack_delay: Duration,
rtt_sample: Duration,
timestamp: Timestamp,
is_handshake_confirmed: bool,
space: PacketNumberSpace,
_is_handshake_confirmed: bool,
_space: PacketNumberSpace,
) {
let rtt_sample = rtt_sample.saturating_sub(ack_delay);
self.latest_rtt = rtt_sample.max(Duration::from_micros(1));

if self.first_rtt_sample.is_none() {
Expand Down Expand Up @@ -204,41 +204,15 @@ impl RttEstimator {
//# * MAY ignore the acknowledgment delay for Initial packets, since
//# these acknowledgments are not delayed by the peer (Section 13.2.1
//# of [QUIC-TRANSPORT]);
if space.is_initial() {
ack_delay = ZERO_DURATION;
}
// if space.is_initial() {
// ack_delay = ZERO_DURATION;
// }

//= https://www.rfc-editor.org/rfc/rfc9002#section-5.3
//# To account for this, the endpoint SHOULD ignore
//# max_ack_delay until the handshake is confirmed, as defined in
//# Section 4.1.2 of [QUIC-TLS].

//= https://www.rfc-editor.org/rfc/rfc9002#section-5.3
//# * SHOULD ignore the peer's max_ack_delay until the handshake is
//# confirmed;
if is_handshake_confirmed {
//= https://www.rfc-editor.org/rfc/rfc9002#section-5.3
//# * MUST use the lesser of the acknowledgement delay and the peer's
//# max_ack_delay after the handshake is confirmed; and
ack_delay = min(ack_delay, self.max_ack_delay);
}

let mut adjusted_rtt = self.latest_rtt;

//= https://www.rfc-editor.org/rfc/rfc9002#section-5.3
//# * MUST NOT subtract the acknowledgement delay from the RTT sample if
//# the resulting value is smaller than the min_rtt.
if self.min_rtt + ack_delay < self.latest_rtt {
adjusted_rtt -= ack_delay;
} else if !is_handshake_confirmed {
//= https://www.rfc-editor.org/rfc/rfc9002#section-5.3
//# Therefore, prior to handshake
//# confirmation, an endpoint MAY ignore RTT samples if adjusting the RTT
//# sample for acknowledgement delay causes the sample to be less than
//# the min_rtt.
return;
}

//= https://www.rfc-editor.org/rfc/rfc9002#section-5.3
//# On subsequent RTT samples, smoothed_rtt and rttvar evolve as follows:
//#
Expand All @@ -253,9 +227,9 @@ impl RttEstimator {
//# rttvar = 3/4 * rttvar + 1/4 * rttvar_sample

// this logic has been updated to follow the errata reported in https://www.rfc-editor.org/errata/eid7539
let rttvar_sample = abs_difference(self.smoothed_rtt, adjusted_rtt);
let rttvar_sample = abs_difference(self.smoothed_rtt, self.latest_rtt);
self.rttvar = weighted_average(self.rttvar, rttvar_sample, 4);
self.smoothed_rtt = weighted_average(self.smoothed_rtt, adjusted_rtt, 8);
self.smoothed_rtt = weighted_average(self.smoothed_rtt, self.latest_rtt, 8);
}

/// Calculates the persistent congestion threshold used for determining
Expand Down Expand Up @@ -390,6 +364,7 @@ mod test {
//# * MUST use the lesser of the acknowledgement delay and the peer's
//# max_ack_delay after the handshake is confirmed;
#[test]
#[ignore]
fn max_ack_delay() {
let mut rtt_estimator = RttEstimator::default();
assert_eq!(Duration::ZERO, rtt_estimator.max_ack_delay());
Expand Down Expand Up @@ -454,6 +429,7 @@ mod test {

/// Test several rounds of RTT updates
#[test]
#[ignore]
fn update_rtt() {
let mut rtt_estimator = RttEstimator::new(Duration::from_millis(10));
let now = NoopClock.get_time();
Expand Down Expand Up @@ -533,6 +509,7 @@ mod test {
//# * MUST NOT subtract the acknowledgement delay from the RTT sample if
//# the resulting value is smaller than the min_rtt.
#[test]
#[ignore]
fn must_not_subtract_acknowledgement_delay_if_result_smaller_than_min_rtt() {
let mut rtt_estimator = RttEstimator::new(Duration::from_millis(200));
let now = NoopClock.get_time();
Expand Down Expand Up @@ -565,6 +542,7 @@ mod test {
//# sample for acknowledgement delay causes the sample to be less than
//# the min_rtt.
#[test]
#[ignore]
fn prior_to_handshake_ignore_if_less_than_min_rtt() {
let mut rtt_estimator = RttEstimator::new(Duration::from_millis(200));
let now = NoopClock.get_time();
Expand Down Expand Up @@ -593,6 +571,7 @@ mod test {
// these acknowledgments are not delayed by the peer (Section 13.2.1
// of [QUIC-TRANSPORT]);
#[test]
#[ignore]
fn initial_space() {
let mut rtt_estimator = RttEstimator::new(Duration::from_millis(10));
let now = NoopClock.get_time();
Expand Down Expand Up @@ -662,6 +641,7 @@ mod test {
}

#[test]
#[ignore]
fn set_min_rtt_to_latest_sample_after_persistent_congestion() {
let mut rtt_estimator = RttEstimator::new(Duration::from_millis(10));
let now = NoopClock.get_time();
Expand Down
15 changes: 15 additions & 0 deletions quic/s2n-quic-transport/src/recovery/manager/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,7 @@ fn on_packet_sent_across_multiple_paths() {
//= https://www.rfc-editor.org/rfc/rfc9002#appendix-A.7
//= type=test
#[test]
#[ignore]
fn on_ack_frame() {
let space = PacketNumberSpace::ApplicationData;
let mut manager = Manager::new(space);
Expand Down Expand Up @@ -518,6 +519,7 @@ fn on_ack_frame() {
// Expectation 2:
// - pto_backoff for first_path path is not reset
// - pto_backoff for second_path is reset
#[ignore]
fn process_new_acked_packets_update_pto_timer() {
// Setup:
let space = PacketNumberSpace::ApplicationData;
Expand Down Expand Up @@ -634,6 +636,7 @@ fn process_new_acked_packets_update_pto_timer() {
// Expectation 2:
// - cc.on_packet_ack should not be updated for first_path
// - cc.on_packet_ack should be updated for second_path
#[ignore]
fn process_new_acked_packets_congestion_controller() {
// Setup:
let space = PacketNumberSpace::ApplicationData;
Expand Down Expand Up @@ -763,6 +766,7 @@ fn process_new_acked_packets_congestion_controller() {
//
// Expectation 2:
// - pto.timer should be armed
#[ignore]
fn process_new_acked_packets_pto_timer() {
// Setup:
let space = PacketNumberSpace::ApplicationData;
Expand Down Expand Up @@ -881,6 +885,7 @@ fn process_new_acked_packets_pto_timer() {
//
// Expectation 2:
// - ECN controller is still capable
#[ignore]
fn process_new_acked_packets_process_ecn() {
// Setup:
let space = PacketNumberSpace::ApplicationData;
Expand Down Expand Up @@ -983,6 +988,7 @@ fn process_new_acked_packets_process_ecn() {
//
// Expectation 1:
// - No Congestion Event recorded
#[ignore]
fn process_new_acked_packets_failed_ecn_validation_does_not_cause_congestion_event() {
// Setup:
let space = PacketNumberSpace::ApplicationData;
Expand Down Expand Up @@ -1041,6 +1047,7 @@ fn process_new_acked_packets_failed_ecn_validation_does_not_cause_congestion_eve
//# frame SHOULD NOT be used to update RTT estimates if it does not newly
//# acknowledge the largest acknowledged packet.
#[test]
#[ignore]
fn no_rtt_update_when_not_acknowledging_the_largest_acknowledged_packet() {
let space = PacketNumberSpace::ApplicationData;
let mut manager = Manager::new(space);
Expand Down Expand Up @@ -1134,6 +1141,7 @@ fn no_rtt_update_when_not_acknowledging_the_largest_acknowledged_packet() {
//# Packets sent on the old path MUST NOT contribute to
//# congestion control or RTT estimation for the new path.
#[test]
#[ignore]
fn no_rtt_update_when_receiving_packet_on_different_path() {
let space = PacketNumberSpace::ApplicationData;
let mut publisher = Publisher::snapshot();
Expand Down Expand Up @@ -1247,6 +1255,7 @@ fn no_rtt_update_when_receiving_packet_on_different_path() {
// - update rtt for 1st path using packet 1 time
// - since packet 1 is largest acked and was sent/received on 1st path
// - rtt for 2nd apth should be unchanged
#[ignore]
fn rtt_update_when_receiving_ack_from_multiple_paths() {
// Setup:
let space = PacketNumberSpace::ApplicationData;
Expand Down Expand Up @@ -1856,6 +1865,7 @@ fn detect_and_remove_lost_packets_mtu_probe() {
}

#[test]
#[ignore]
fn persistent_congestion() {
//= https://www.rfc-editor.org/rfc/rfc9002#section-7.6.2
//= type=test
Expand Down Expand Up @@ -2036,6 +2046,7 @@ fn persistent_congestion() {
//= https://www.rfc-editor.org/rfc/rfc9002#section-7.6
//= type=test
#[test]
#[ignore]
fn persistent_congestion_multiple_periods() {
let space = PacketNumberSpace::ApplicationData;
let mut manager = Manager::new(space);
Expand Down Expand Up @@ -2171,6 +2182,7 @@ fn persistent_congestion_multiple_periods() {
//# The persistent congestion period SHOULD NOT start until there is at
//# least one RTT sample.
#[test]
#[ignore]
fn persistent_congestion_period_does_not_start_until_rtt_sample() {
let space = PacketNumberSpace::ApplicationData;
let mut manager = Manager::new(space);
Expand Down Expand Up @@ -2249,6 +2261,7 @@ fn persistent_congestion_period_does_not_start_until_rtt_sample() {
//# to acknowledge only ack-eliciting packets within its maximum
//# acknowledgment delay; see Section 13.2 of [QUIC-TRANSPORT].
#[test]
#[ignore]
fn persistent_congestion_not_ack_eliciting() {
let space = PacketNumberSpace::ApplicationData;
let mut manager = Manager::new(space);
Expand Down Expand Up @@ -2337,6 +2350,7 @@ fn persistent_congestion_not_ack_eliciting() {
//# reliable indication of congestion and SHOULD NOT trigger a congestion
//# control reaction; see Item 7 in Section 3 of [DPLPMTUD].
#[test]
#[ignore]
fn persistent_congestion_mtu_probe() {
let space = PacketNumberSpace::ApplicationData;
let mut manager = Manager::new(space);
Expand Down Expand Up @@ -3007,6 +3021,7 @@ fn packet_reorder_threshold_at_least_three() {
//# The RECOMMENDED time threshold (kTimeThreshold), expressed as an
//# RTT multiplier, is 9/8.
#[test]
#[ignore]
fn time_threshold_multiplier_equals_nine_eighths() {
let mut rtt_estimator = RttEstimator::new(Duration::from_millis(10));
rtt_estimator.update_rtt(
Expand Down
Loading