From ee8a0aeb1bc2e13d90b6f44d698dce1d7d64325a Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sun, 31 May 2020 10:43:04 +0700 Subject: [PATCH 1/2] improve unit tests for early retransmit --- internal/ackhandler/sent_packet_handler_test.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/internal/ackhandler/sent_packet_handler_test.go b/internal/ackhandler/sent_packet_handler_test.go index fb6df3181..915ce24c3 100644 --- a/internal/ackhandler/sent_packet_handler_test.go +++ b/internal/ackhandler/sent_packet_handler_test.go @@ -917,7 +917,7 @@ var _ = Describe("SentPacketHandler", func() { now := time.Now() handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, SendTime: now.Add(-2 * time.Second)})) handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2, SendTime: now.Add(-2 * time.Second)})) - handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 3, SendTime: now.Add(-time.Second)})) + handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 3, SendTime: now})) Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue()) ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}} @@ -926,13 +926,16 @@ var _ = Describe("SentPacketHandler", func() { // Packet 1 should be considered lost (1+1/8) RTTs after it was sent. Expect(handler.GetLossDetectionTimeout().Sub(getPacket(1, protocol.Encryption1RTT).SendTime)).To(Equal(time.Second * 9 / 8)) + expectInPacketHistory([]protocol.PacketNumber{1, 3}, protocol.Encryption1RTT) + Expect(handler.OnLossDetectionTimeout()).To(Succeed()) + expectInPacketHistory([]protocol.PacketNumber{3}, protocol.Encryption1RTT) }) It("sets the early retransmit alarm for crypto packets", func() { now := time.Now() handler.SentPacket(initialPacket(&Packet{PacketNumber: 1, SendTime: now.Add(-2 * time.Second)})) handler.SentPacket(initialPacket(&Packet{PacketNumber: 2, SendTime: now.Add(-2 * time.Second)})) - handler.SentPacket(initialPacket(&Packet{PacketNumber: 3, SendTime: now.Add(-time.Second)})) + handler.SentPacket(initialPacket(&Packet{PacketNumber: 3, SendTime: now})) Expect(handler.initialPackets.lossTime.IsZero()).To(BeTrue()) ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}} @@ -941,6 +944,9 @@ var _ = Describe("SentPacketHandler", func() { // Packet 1 should be considered lost (1+1/8) RTTs after it was sent. Expect(handler.GetLossDetectionTimeout().Sub(getPacket(1, protocol.EncryptionInitial).SendTime)).To(Equal(time.Second * 9 / 8)) + expectInPacketHistory([]protocol.PacketNumber{1, 3}, protocol.EncryptionInitial) + Expect(handler.OnLossDetectionTimeout()).To(Succeed()) + expectInPacketHistory([]protocol.PacketNumber{3}, protocol.EncryptionInitial) }) }) From 64ef72fd68b0cfe3477b5ef3c3e82748359b73ac Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sun, 31 May 2020 10:47:13 +0700 Subject: [PATCH 2/2] don't switch to PTO mode after early retransmit --- internal/ackhandler/sent_packet_handler.go | 1 + internal/ackhandler/sent_packet_handler_test.go | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/internal/ackhandler/sent_packet_handler.go b/internal/ackhandler/sent_packet_handler.go index 007c35ce5..584e7ef2a 100644 --- a/internal/ackhandler/sent_packet_handler.go +++ b/internal/ackhandler/sent_packet_handler.go @@ -603,6 +603,7 @@ func (h *sentPacketHandler) onVerifiedLossDetectionTimeout() error { for _, p := range lostPackets { h.congestion.OnPacketLost(p.PacketNumber, p.Length, priorInFlight) } + return nil } // PTO diff --git a/internal/ackhandler/sent_packet_handler_test.go b/internal/ackhandler/sent_packet_handler_test.go index 915ce24c3..1117a310b 100644 --- a/internal/ackhandler/sent_packet_handler_test.go +++ b/internal/ackhandler/sent_packet_handler_test.go @@ -913,6 +913,7 @@ var _ = Describe("SentPacketHandler", func() { }) It("sets the early retransmit alarm", func() { + handler.ReceivedPacket(protocol.EncryptionHandshake) handler.handshakeComplete = true now := time.Now() handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, SendTime: now.Add(-2 * time.Second)})) @@ -926,12 +927,16 @@ var _ = Describe("SentPacketHandler", func() { // Packet 1 should be considered lost (1+1/8) RTTs after it was sent. Expect(handler.GetLossDetectionTimeout().Sub(getPacket(1, protocol.Encryption1RTT).SendTime)).To(Equal(time.Second * 9 / 8)) + Expect(handler.SendMode()).To(Equal(SendAny)) + expectInPacketHistory([]protocol.PacketNumber{1, 3}, protocol.Encryption1RTT) Expect(handler.OnLossDetectionTimeout()).To(Succeed()) expectInPacketHistory([]protocol.PacketNumber{3}, protocol.Encryption1RTT) + Expect(handler.SendMode()).To(Equal(SendAny)) }) It("sets the early retransmit alarm for crypto packets", func() { + handler.ReceivedBytes(1000) now := time.Now() handler.SentPacket(initialPacket(&Packet{PacketNumber: 1, SendTime: now.Add(-2 * time.Second)})) handler.SentPacket(initialPacket(&Packet{PacketNumber: 2, SendTime: now.Add(-2 * time.Second)})) @@ -944,9 +949,12 @@ var _ = Describe("SentPacketHandler", func() { // Packet 1 should be considered lost (1+1/8) RTTs after it was sent. Expect(handler.GetLossDetectionTimeout().Sub(getPacket(1, protocol.EncryptionInitial).SendTime)).To(Equal(time.Second * 9 / 8)) + Expect(handler.SendMode()).To(Equal(SendAny)) + expectInPacketHistory([]protocol.PacketNumber{1, 3}, protocol.EncryptionInitial) Expect(handler.OnLossDetectionTimeout()).To(Succeed()) expectInPacketHistory([]protocol.PacketNumber{3}, protocol.EncryptionInitial) + Expect(handler.SendMode()).To(Equal(SendAny)) }) })