|
|
|
|
@@ -68,10 +68,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
It("accepts two consecutive packets", func() {
|
|
|
|
|
packet1 := Packet{PacketNumber: 1, Frames: []wire.Frame{&streamFrame}, Length: 1}
|
|
|
|
|
packet2 := Packet{PacketNumber: 2, Frames: []wire.Frame{&streamFrame}, Length: 2}
|
|
|
|
|
err := handler.SentPacket(&packet1)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
err = handler.SentPacket(&packet2)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
handler.SentPacket(&packet1)
|
|
|
|
|
handler.SentPacket(&packet2)
|
|
|
|
|
Expect(handler.lastSentPacketNumber).To(Equal(protocol.PacketNumber(2)))
|
|
|
|
|
Expect(handler.packetHistory.Front().Value.PacketNumber).To(Equal(protocol.PacketNumber(1)))
|
|
|
|
|
Expect(handler.packetHistory.Back().Value.PacketNumber).To(Equal(protocol.PacketNumber(2)))
|
|
|
|
|
@@ -82,11 +80,9 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
It("accepts packet number 0", func() {
|
|
|
|
|
packet1 := Packet{PacketNumber: 0, Frames: []wire.Frame{&streamFrame}, Length: 1}
|
|
|
|
|
packet2 := Packet{PacketNumber: 1, Frames: []wire.Frame{&streamFrame}, Length: 2}
|
|
|
|
|
err := handler.SentPacket(&packet1)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
handler.SentPacket(&packet1)
|
|
|
|
|
Expect(handler.lastSentPacketNumber).To(BeZero())
|
|
|
|
|
err = handler.SentPacket(&packet2)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
handler.SentPacket(&packet2)
|
|
|
|
|
Expect(handler.lastSentPacketNumber).To(Equal(protocol.PacketNumber(1)))
|
|
|
|
|
Expect(handler.packetHistory.Front().Value.PacketNumber).To(Equal(protocol.PacketNumber(0)))
|
|
|
|
|
Expect(handler.packetHistory.Back().Value.PacketNumber).To(Equal(protocol.PacketNumber(1)))
|
|
|
|
|
@@ -96,14 +92,12 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
|
|
|
|
|
It("stores the sent time", func() {
|
|
|
|
|
packet := Packet{PacketNumber: 1, Frames: []wire.Frame{&streamFrame}, Length: 1}
|
|
|
|
|
err := handler.SentPacket(&packet)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
handler.SentPacket(&packet)
|
|
|
|
|
Expect(handler.packetHistory.Front().Value.sendTime.Unix()).To(BeNumerically("~", time.Now().Unix(), 1))
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("does not store non-retransmittable packets", func() {
|
|
|
|
|
err := handler.SentPacket(&Packet{PacketNumber: 1, Length: 1})
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
handler.SentPacket(&Packet{PacketNumber: 1, Length: 1})
|
|
|
|
|
Expect(handler.packetHistory.Len()).To(BeZero())
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
@@ -111,10 +105,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
It("works with non-consecutive packet numbers", func() {
|
|
|
|
|
packet1 := Packet{PacketNumber: 1, Frames: []wire.Frame{&streamFrame}, Length: 1}
|
|
|
|
|
packet2 := Packet{PacketNumber: 3, Frames: []wire.Frame{&streamFrame}, Length: 2}
|
|
|
|
|
err := handler.SentPacket(&packet1)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
err = handler.SentPacket(&packet2)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
handler.SentPacket(&packet1)
|
|
|
|
|
handler.SentPacket(&packet2)
|
|
|
|
|
Expect(handler.lastSentPacketNumber).To(Equal(protocol.PacketNumber(3)))
|
|
|
|
|
el := handler.packetHistory.Front()
|
|
|
|
|
Expect(el.Value.PacketNumber).To(Equal(protocol.PacketNumber(1)))
|
|
|
|
|
@@ -129,12 +121,9 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
packet1 := Packet{PacketNumber: 1, Frames: []wire.Frame{&streamFrame}, Length: 1}
|
|
|
|
|
packet2 := Packet{PacketNumber: 3, Frames: []wire.Frame{&streamFrame}, Length: 2}
|
|
|
|
|
packet3 := Packet{PacketNumber: 5, Frames: []wire.Frame{&streamFrame}, Length: 2}
|
|
|
|
|
err := handler.SentPacket(&packet1)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
err = handler.SentPacket(&packet2)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
err = handler.SentPacket(&packet3)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
handler.SentPacket(&packet1)
|
|
|
|
|
handler.SentPacket(&packet2)
|
|
|
|
|
handler.SentPacket(&packet3)
|
|
|
|
|
Expect(handler.skippedPackets).To(HaveLen(2))
|
|
|
|
|
Expect(handler.skippedPackets).To(Equal([]protocol.PacketNumber{2, 4}))
|
|
|
|
|
})
|
|
|
|
|
@@ -142,10 +131,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
It("recognizes multiple consecutive skipped packets", func() {
|
|
|
|
|
packet1 := Packet{PacketNumber: 1, Frames: []wire.Frame{&streamFrame}, Length: 1}
|
|
|
|
|
packet2 := Packet{PacketNumber: 4, Frames: []wire.Frame{&streamFrame}, Length: 2}
|
|
|
|
|
err := handler.SentPacket(&packet1)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
err = handler.SentPacket(&packet2)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
handler.SentPacket(&packet1)
|
|
|
|
|
handler.SentPacket(&packet2)
|
|
|
|
|
Expect(handler.skippedPackets).To(HaveLen(2))
|
|
|
|
|
Expect(handler.skippedPackets).To(Equal([]protocol.PacketNumber{2, 3}))
|
|
|
|
|
})
|
|
|
|
|
@@ -153,8 +140,7 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
It("limits the lengths of the skipped packet slice", func() {
|
|
|
|
|
for i := 0; i < protocol.MaxTrackedSkippedPackets+5; i++ {
|
|
|
|
|
packet := Packet{PacketNumber: protocol.PacketNumber(2*i + 1), Frames: []wire.Frame{&streamFrame}, Length: 1}
|
|
|
|
|
err := handler.SentPacket(&packet)
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
handler.SentPacket(&packet)
|
|
|
|
|
}
|
|
|
|
|
Expect(handler.skippedPackets).To(HaveLen(protocol.MaxUndecryptablePackets))
|
|
|
|
|
Expect(handler.skippedPackets[0]).To(Equal(protocol.PacketNumber(10)))
|
|
|
|
|
@@ -186,20 +172,6 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
Context("DoS mitigation", func() {
|
|
|
|
|
It("checks the size of the packet history, for unacked packets", func() {
|
|
|
|
|
i := protocol.PacketNumber(1)
|
|
|
|
|
for ; i <= protocol.MaxTrackedSentPackets; i++ {
|
|
|
|
|
err := handler.SentPacket(retransmittablePacket(i))
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
}
|
|
|
|
|
err := handler.SentPacket(retransmittablePacket(i))
|
|
|
|
|
Expect(err).To(MatchError("Too many outstanding non-acked and non-retransmitted packets"))
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// TODO: add a test that the length of the retransmission queue is considered, even if packets have already been ACKed. Relevant once we drop support for QUIC 33 and earlier
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
Context("ACK processing", func() {
|
|
|
|
|
var packets []*Packet
|
|
|
|
|
|
|
|
|
|
@@ -219,8 +191,7 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
{PacketNumber: 12, Frames: []wire.Frame{&streamFrame}, Length: 1},
|
|
|
|
|
}
|
|
|
|
|
for _, packet := range packets {
|
|
|
|
|
err := handler.SentPacket(packet)
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
handler.SentPacket(packet)
|
|
|
|
|
}
|
|
|
|
|
// Increase RTT, because the tests would be flaky otherwise
|
|
|
|
|
handler.rttStats.UpdateRTT(time.Hour, 0, time.Now())
|
|
|
|
|
@@ -327,7 +298,7 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("rejects an ACK that acks packets with a higher encryption level", func() {
|
|
|
|
|
err := handler.SentPacket(&Packet{
|
|
|
|
|
handler.SentPacket(&Packet{
|
|
|
|
|
PacketNumber: 13,
|
|
|
|
|
EncryptionLevel: protocol.EncryptionForwardSecure,
|
|
|
|
|
Frames: []wire.Frame{&streamFrame},
|
|
|
|
|
@@ -337,8 +308,7 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
LargestAcked: 13,
|
|
|
|
|
LowestAcked: 13,
|
|
|
|
|
}
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
err = handler.ReceivedAck(&ack, 1, protocol.EncryptionSecure, time.Now())
|
|
|
|
|
err := handler.ReceivedAck(&ack, 1, protocol.EncryptionSecure, time.Now())
|
|
|
|
|
Expect(err).To(MatchError("Received ACK with encryption level encrypted (not forward-secure) that acks a packet 13 (encryption level forward-secure)"))
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
@@ -518,8 +488,7 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
{PacketNumber: 15, Frames: []wire.Frame{&streamFrame}, Length: 1},
|
|
|
|
|
}
|
|
|
|
|
for _, packet := range morePackets {
|
|
|
|
|
err := handler.SentPacket(packet)
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
handler.SentPacket(packet)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
@@ -625,14 +594,11 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
packet1 := Packet{PacketNumber: 1, Frames: []wire.Frame{&streamFrame}, Length: 1}
|
|
|
|
|
packet2 := Packet{PacketNumber: 2, Frames: []wire.Frame{&streamFrame}, Length: 2}
|
|
|
|
|
packet3 := Packet{PacketNumber: 3, Frames: []wire.Frame{&streamFrame}, Length: 3}
|
|
|
|
|
err := handler.SentPacket(&packet1)
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
handler.SentPacket(&packet1)
|
|
|
|
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(1)))
|
|
|
|
|
err = handler.SentPacket(&packet2)
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
handler.SentPacket(&packet2)
|
|
|
|
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(1 + 2)))
|
|
|
|
|
err = handler.SentPacket(&packet3)
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
handler.SentPacket(&packet3)
|
|
|
|
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(1 + 2 + 3)))
|
|
|
|
|
|
|
|
|
|
// Increase RTT, because the tests would be flaky otherwise
|
|
|
|
|
@@ -647,8 +613,7 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
{First: 1, Last: 1},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
err = handler.ReceivedAck(&ack, 1, protocol.EncryptionUnencrypted, time.Now())
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
handler.ReceivedAck(&ack, 1, protocol.EncryptionUnencrypted, time.Now())
|
|
|
|
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2)))
|
|
|
|
|
|
|
|
|
|
handler.packetHistory.Front().Value.sendTime = time.Now().Add(-time.Hour)
|
|
|
|
|
@@ -680,8 +645,7 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
Length: 42,
|
|
|
|
|
Frames: []wire.Frame{&wire.PingFrame{}},
|
|
|
|
|
}
|
|
|
|
|
err := handler.SentPacket(p)
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
handler.SentPacket(p)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("should call MaybeExitSlowStart and OnPacketAcked", func() {
|
|
|
|
|
@@ -805,13 +769,11 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
|
|
|
|
|
Context("Delay-based loss detection", func() {
|
|
|
|
|
It("detects a packet as lost", func() {
|
|
|
|
|
err := handler.SentPacket(retransmittablePacket(1))
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
err = handler.SentPacket(retransmittablePacket(2))
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
handler.SentPacket(retransmittablePacket(1))
|
|
|
|
|
handler.SentPacket(retransmittablePacket(2))
|
|
|
|
|
Expect(handler.lossTime.IsZero()).To(BeTrue())
|
|
|
|
|
|
|
|
|
|
err = handler.ReceivedAck(&wire.AckFrame{LargestAcked: 2, LowestAcked: 2}, 1, protocol.EncryptionForwardSecure, time.Now().Add(time.Hour))
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 2, LowestAcked: 2}, 1, protocol.EncryptionForwardSecure, time.Now().Add(time.Hour))
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
Expect(handler.lossTime.IsZero()).To(BeFalse())
|
|
|
|
|
|
|
|
|
|
@@ -826,15 +788,12 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("does not detect packets as lost without ACKs", func() {
|
|
|
|
|
err := handler.SentPacket(nonRetransmittablePacket(1))
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
err = handler.SentPacket(retransmittablePacket(2))
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
err = handler.SentPacket(retransmittablePacket(3))
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
handler.SentPacket(nonRetransmittablePacket(1))
|
|
|
|
|
handler.SentPacket(retransmittablePacket(2))
|
|
|
|
|
handler.SentPacket(retransmittablePacket(3))
|
|
|
|
|
Expect(handler.lossTime.IsZero()).To(BeTrue())
|
|
|
|
|
|
|
|
|
|
err = handler.ReceivedAck(&wire.AckFrame{LargestAcked: 1, LowestAcked: 1}, 1, protocol.EncryptionUnencrypted, time.Now().Add(time.Hour))
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 1, LowestAcked: 1}, 1, protocol.EncryptionUnencrypted, time.Now().Add(time.Hour))
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
Expect(handler.lossTime.IsZero()).To(BeTrue())
|
|
|
|
|
Expect(time.Until(handler.GetAlarmTimeout())).To(BeNumerically("~", handler.computeRTOTimeout(), time.Minute))
|
|
|
|
|
@@ -855,16 +814,12 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
It("detects the handshake timeout", func() {
|
|
|
|
|
// send handshake packets: 1, 2, 4
|
|
|
|
|
// send a forward-secure packet: 3
|
|
|
|
|
err := handler.SentPacket(handshakePacket(1))
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
err = handler.SentPacket(handshakePacket(2))
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
err = handler.SentPacket(retransmittablePacket(3))
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
err = handler.SentPacket(handshakePacket(4))
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
handler.SentPacket(handshakePacket(1))
|
|
|
|
|
handler.SentPacket(handshakePacket(2))
|
|
|
|
|
handler.SentPacket(retransmittablePacket(3))
|
|
|
|
|
handler.SentPacket(handshakePacket(4))
|
|
|
|
|
|
|
|
|
|
err = handler.ReceivedAck(&wire.AckFrame{LargestAcked: 1, LowestAcked: 1}, 1, protocol.EncryptionSecure, time.Now())
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 1, LowestAcked: 1}, 1, protocol.EncryptionSecure, time.Now())
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
Expect(handler.lossTime.IsZero()).To(BeTrue())
|
|
|
|
|
handshakeTimeout := handler.computeHandshakeTimeout()
|
|
|
|
|
@@ -887,10 +842,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
|
|
|
|
|
Context("RTO retransmission", func() {
|
|
|
|
|
It("queues two packets if RTO expires", func() {
|
|
|
|
|
err := handler.SentPacket(retransmittablePacket(1))
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
err = handler.SentPacket(retransmittablePacket(2))
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
handler.SentPacket(retransmittablePacket(1))
|
|
|
|
|
handler.SentPacket(retransmittablePacket(2))
|
|
|
|
|
|
|
|
|
|
handler.rttStats.UpdateRTT(time.Hour, 0, time.Now())
|
|
|
|
|
Expect(handler.lossTime.IsZero()).To(BeTrue())
|
|
|
|
|
|