From ee81e8c8e846052d140a25552b9ea002137cc04a Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Fri, 9 Jun 2023 16:24:25 -0700 Subject: [PATCH] quic: correct rttvar updates RFC errata 7539 adjusts RFC 9002 Section 5.3 to update rttvar before smoothed_rtt. https://www.rfc-editor.org/errata/eid7539 For golang/go#58547 Change-Id: I154ed54d3d693c3b42355de39c5907c7cc906fde Reviewed-on: https://go-review.googlesource.com/c/net/+/502215 Reviewed-by: Jonathan Amsterdam Run-TryBot: Damien Neil TryBot-Result: Gopher Robot --- internal/quic/rtt.go | 2 +- internal/quic/rtt_test.go | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/internal/quic/rtt.go b/internal/quic/rtt.go index 5bd8861b05..4942f8cca1 100644 --- a/internal/quic/rtt.go +++ b/internal/quic/rtt.go @@ -67,7 +67,7 @@ func (r *rttState) updateSample(now time.Time, handshakeConfirmed bool, spaceID if adjustedRTT < r.minRTT { adjustedRTT = latestRTT } - r.smoothedRTT = ((7 * r.smoothedRTT) + adjustedRTT) / 8 rttvarSample := abs(r.smoothedRTT - adjustedRTT) r.rttvar = (3*r.rttvar + rttvarSample) / 4 + r.smoothedRTT = ((7 * r.smoothedRTT) + adjustedRTT) / 8 } diff --git a/internal/quic/rtt_test.go b/internal/quic/rtt_test.go index 63789c288c..2f20b36298 100644 --- a/internal/quic/rtt_test.go +++ b/internal/quic/rtt_test.go @@ -134,15 +134,15 @@ func TestRTTInitialRTT(t *testing.T) { handshakeConfirmed = true rtt.updateSample(now, handshakeConfirmed, handshakeSpace, 40*time.Millisecond, ackDelay, maxAckDelay) adjustedRTT = 15 * time.Millisecond // latest_rtt (40ms) - max_ack_delay (25ms) - smoothedRTT = (7*smoothedRTT + adjustedRTT) / 8 - if got, want := rtt.smoothedRTT, smoothedRTT; got != want { - t.Errorf("smoothed_rtt = %v, want %v", got, want) - } rttvarSample = abs(smoothedRTT - adjustedRTT) rttvar = (3*rttvar + rttvarSample) / 4 if got, want := rtt.rttvar, rttvar; got != want { t.Errorf("rttvar = %v, want %v", got, want) } + smoothedRTT = (7*smoothedRTT + adjustedRTT) / 8 + if got, want := rtt.smoothedRTT, smoothedRTT; got != want { + t.Errorf("smoothed_rtt = %v, want %v", got, want) + } // "[...] MUST NOT subtract the acknowledgment delay from // the RTT sample if the resulting value is smaller than the min_rtt." @@ -156,13 +156,13 @@ func TestRTTInitialRTT(t *testing.T) { } // latest_rtt (30ms) - ack_delay (25ms) = 5ms, which is less than min_rtt (10ms) adjustedRTT = 30 * time.Millisecond // latest_rtt - smoothedRTT = (7*smoothedRTT + adjustedRTT) / 8 - if got, want := rtt.smoothedRTT, smoothedRTT; got != want { - t.Errorf("smoothed_rtt = %v, want %v", got, want) - } rttvarSample = abs(smoothedRTT - adjustedRTT) rttvar = (3*rttvar + rttvarSample) / 4 if got, want := rtt.rttvar, rttvar; got != want { t.Errorf("rttvar = %v, want %v", got, want) } + smoothedRTT = (7*smoothedRTT + adjustedRTT) / 8 + if got, want := rtt.smoothedRTT, smoothedRTT; got != want { + t.Errorf("smoothed_rtt = %v, want %v", got, want) + } }