|
|
|
|
@@ -1,7 +1,6 @@
|
|
|
|
|
package ackhandler
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"sort"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/golang/mock/gomock"
|
|
|
|
|
@@ -30,7 +29,9 @@ func retransmittablePacket(p *Packet) *Packet {
|
|
|
|
|
|
|
|
|
|
func nonRetransmittablePacket(p *Packet) *Packet {
|
|
|
|
|
p = retransmittablePacket(p)
|
|
|
|
|
p.Frames = []wire.Frame{&wire.AckFrame{}}
|
|
|
|
|
p.Frames = []wire.Frame{
|
|
|
|
|
&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
|
|
|
|
|
}
|
|
|
|
|
return p
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -40,20 +41,6 @@ func handshakePacket(p *Packet) *Packet {
|
|
|
|
|
return p
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func createAck(ranges []wire.AckRange) *wire.AckFrame {
|
|
|
|
|
sort.Slice(ranges, func(i, j int) bool {
|
|
|
|
|
return ranges[i].Smallest > ranges[j].Smallest
|
|
|
|
|
})
|
|
|
|
|
ack := &wire.AckFrame{
|
|
|
|
|
LowestAcked: ranges[len(ranges)-1].Smallest,
|
|
|
|
|
LargestAcked: ranges[0].Largest,
|
|
|
|
|
}
|
|
|
|
|
if len(ranges) > 1 {
|
|
|
|
|
ack.AckRanges = ranges
|
|
|
|
|
}
|
|
|
|
|
return ack
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
var (
|
|
|
|
|
handler *sentPacketHandler
|
|
|
|
|
@@ -210,13 +197,20 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("rejects ACKs for skipped packets", func() {
|
|
|
|
|
ack := createAck([]wire.AckRange{{Smallest: 10, Largest: 12}})
|
|
|
|
|
ack := &wire.AckFrame{
|
|
|
|
|
AckRanges: []wire.AckRange{{Smallest: 10, Largest: 12}},
|
|
|
|
|
}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1337, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).To(MatchError("InvalidAckData: Received an ACK for a skipped packet number"))
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("accepts an ACK that correctly nacks a skipped packet", func() {
|
|
|
|
|
ack := createAck([]wire.AckRange{{Smallest: 10, Largest: 10}, {Smallest: 12, Largest: 12}})
|
|
|
|
|
ack := &wire.AckFrame{
|
|
|
|
|
AckRanges: []wire.AckRange{
|
|
|
|
|
{Smallest: 12, Largest: 12},
|
|
|
|
|
{Smallest: 10, Largest: 10},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1337, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.largestAcked).ToNot(BeZero())
|
|
|
|
|
@@ -237,15 +231,15 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
|
|
|
|
|
Context("ACK validation", func() {
|
|
|
|
|
It("accepts ACKs sent in packet 0", func() {
|
|
|
|
|
ack := createAck([]wire.AckRange{{Smallest: 0, Largest: 5}})
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 5}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 0, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.largestAcked).To(Equal(protocol.PacketNumber(5)))
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("rejects duplicate ACKs", func() {
|
|
|
|
|
ack1 := createAck([]wire.AckRange{{Smallest: 0, Largest: 3}})
|
|
|
|
|
ack2 := createAck([]wire.AckRange{{Smallest: 0, Largest: 4}})
|
|
|
|
|
ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 3}}}
|
|
|
|
|
ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 4}}}
|
|
|
|
|
err := handler.ReceivedAck(ack1, 1337, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.largestAcked).To(Equal(protocol.PacketNumber(3)))
|
|
|
|
|
@@ -258,8 +252,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
|
|
|
|
|
It("rejects out of order ACKs", func() {
|
|
|
|
|
// acks packets 0, 1, 2, 3
|
|
|
|
|
ack1 := createAck([]wire.AckRange{{Smallest: 0, Largest: 3}})
|
|
|
|
|
ack2 := createAck([]wire.AckRange{{Smallest: 0, Largest: 4}})
|
|
|
|
|
ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 3}}}
|
|
|
|
|
ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 4}}}
|
|
|
|
|
err := handler.ReceivedAck(ack1, 1337, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
// this wouldn't happen in practive
|
|
|
|
|
@@ -270,14 +264,14 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("rejects ACKs with a too high LargestAcked packet number", func() {
|
|
|
|
|
ack := createAck([]wire.AckRange{{Smallest: 0, Largest: 9999}})
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 9999}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).To(MatchError("InvalidAckData: Received ACK for an unsent package"))
|
|
|
|
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(10)))
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("ignores repeated ACKs", func() {
|
|
|
|
|
ack := createAck([]wire.AckRange{{Smallest: 1, Largest: 3}})
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 3}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1337, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(7)))
|
|
|
|
|
@@ -290,7 +284,7 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
|
|
|
|
|
Context("acks and nacks the right packets", func() {
|
|
|
|
|
It("adjusts the LargestAcked, and adjusts the bytes in flight", func() {
|
|
|
|
|
ack := createAck([]wire.AckRange{{Smallest: 0, Largest: 5}})
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 5}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.largestAcked).To(Equal(protocol.PacketNumber(5)))
|
|
|
|
|
@@ -299,7 +293,7 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("acks packet 0", func() {
|
|
|
|
|
ack := createAck([]wire.AckRange{{Smallest: 0, Largest: 0}})
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 0}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(getPacket(0)).To(BeNil())
|
|
|
|
|
@@ -307,38 +301,50 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("handles an ACK frame with one missing packet range", func() {
|
|
|
|
|
ack := createAck([]wire.AckRange{{Smallest: 1, Largest: 3}, {Smallest: 6, Largest: 9}}) // lose 4 and 5
|
|
|
|
|
ack := &wire.AckFrame{ // lose 4 and 5
|
|
|
|
|
AckRanges: []wire.AckRange{
|
|
|
|
|
{Smallest: 6, Largest: 9},
|
|
|
|
|
{Smallest: 1, Largest: 3},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
expectInPacketHistory([]protocol.PacketNumber{0, 4, 5})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("does not ack packets below the LowestAcked", func() {
|
|
|
|
|
ack := createAck([]wire.AckRange{{Smallest: 3, Largest: 8}})
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 3, Largest: 8}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
expectInPacketHistory([]protocol.PacketNumber{0, 1, 2, 9})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("handles an ACK with multiple missing packet ranges", func() {
|
|
|
|
|
ack := createAck([]wire.AckRange{ // packets 2, 4 and 5, and 8 were lost
|
|
|
|
|
{Smallest: 9, Largest: 9},
|
|
|
|
|
{Smallest: 6, Largest: 7},
|
|
|
|
|
{Smallest: 3, Largest: 3},
|
|
|
|
|
{Smallest: 1, Largest: 1},
|
|
|
|
|
})
|
|
|
|
|
ack := &wire.AckFrame{ // packets 2, 4 and 5, and 8 were lost
|
|
|
|
|
AckRanges: []wire.AckRange{
|
|
|
|
|
{Smallest: 9, Largest: 9},
|
|
|
|
|
{Smallest: 6, Largest: 7},
|
|
|
|
|
{Smallest: 3, Largest: 3},
|
|
|
|
|
{Smallest: 1, Largest: 1},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
expectInPacketHistory([]protocol.PacketNumber{0, 2, 4, 5, 8})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("processes an ACK frame that would be sent after a late arrival of a packet", func() {
|
|
|
|
|
ack1 := createAck([]wire.AckRange{{Smallest: 1, Largest: 2}, {Smallest: 4, Largest: 6}}) // 3 lost
|
|
|
|
|
ack1 := &wire.AckFrame{ // 3 lost
|
|
|
|
|
AckRanges: []wire.AckRange{
|
|
|
|
|
{Smallest: 4, Largest: 6},
|
|
|
|
|
{Smallest: 1, Largest: 2},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
err := handler.ReceivedAck(ack1, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
expectInPacketHistory([]protocol.PacketNumber{0, 3, 7, 8, 9})
|
|
|
|
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(5)))
|
|
|
|
|
ack2 := createAck([]wire.AckRange{{Smallest: 1, Largest: 6}}) // now ack 3
|
|
|
|
|
ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 6}}} // now ack 3
|
|
|
|
|
err = handler.ReceivedAck(ack2, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
expectInPacketHistory([]protocol.PacketNumber{0, 7, 8, 9})
|
|
|
|
|
@@ -346,12 +352,17 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("processes an ACK frame that would be sent after a late arrival of a packet and another packet", func() {
|
|
|
|
|
ack1 := createAck([]wire.AckRange{{Smallest: 0, Largest: 2}, {Smallest: 4, Largest: 6}})
|
|
|
|
|
ack1 := &wire.AckFrame{
|
|
|
|
|
AckRanges: []wire.AckRange{
|
|
|
|
|
{Smallest: 4, Largest: 6},
|
|
|
|
|
{Smallest: 0, Largest: 2},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
err := handler.ReceivedAck(ack1, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
expectInPacketHistory([]protocol.PacketNumber{3, 7, 8, 9})
|
|
|
|
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(4)))
|
|
|
|
|
ack2 := createAck([]wire.AckRange{{Smallest: 1, Largest: 7}})
|
|
|
|
|
ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 7}}}
|
|
|
|
|
err = handler.ReceivedAck(ack2, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2)))
|
|
|
|
|
@@ -359,16 +370,18 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("processes an ACK that contains old ACK ranges", func() {
|
|
|
|
|
ack1 := createAck([]wire.AckRange{{Smallest: 1, Largest: 6}})
|
|
|
|
|
ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 6}}}
|
|
|
|
|
err := handler.ReceivedAck(ack1, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
expectInPacketHistory([]protocol.PacketNumber{0, 7, 8, 9})
|
|
|
|
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(4)))
|
|
|
|
|
ack2 := createAck([]wire.AckRange{
|
|
|
|
|
{Smallest: 1, Largest: 1},
|
|
|
|
|
{Smallest: 3, Largest: 3},
|
|
|
|
|
{Smallest: 8, Largest: 8},
|
|
|
|
|
})
|
|
|
|
|
ack2 := &wire.AckFrame{
|
|
|
|
|
AckRanges: []wire.AckRange{
|
|
|
|
|
{Smallest: 8, Largest: 8},
|
|
|
|
|
{Smallest: 3, Largest: 3},
|
|
|
|
|
{Smallest: 1, Largest: 1},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
err = handler.ReceivedAck(ack2, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
expectInPacketHistory([]protocol.PacketNumber{0, 7, 9})
|
|
|
|
|
@@ -384,13 +397,16 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
getPacket(2).SendTime = now.Add(-5 * time.Minute)
|
|
|
|
|
getPacket(6).SendTime = now.Add(-1 * time.Minute)
|
|
|
|
|
// Now, check that the proper times are used when calculating the deltas
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 1}, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 10*time.Minute, 1*time.Second))
|
|
|
|
|
err = handler.ReceivedAck(&wire.AckFrame{LargestAcked: 2}, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 2}}}
|
|
|
|
|
err = handler.ReceivedAck(ack, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 5*time.Minute, 1*time.Second))
|
|
|
|
|
err = handler.ReceivedAck(&wire.AckFrame{LargestAcked: 6}, 3, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 6}}}
|
|
|
|
|
err = handler.ReceivedAck(ack, 3, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 1*time.Minute, 1*time.Second))
|
|
|
|
|
})
|
|
|
|
|
@@ -400,7 +416,11 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
// make sure the rttStats have a min RTT, so that the delay is used
|
|
|
|
|
handler.rttStats.UpdateRTT(5*time.Minute, 0, time.Now())
|
|
|
|
|
getPacket(1).SendTime = now.Add(-10 * time.Minute)
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 1, DelayTime: 5 * time.Minute}, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack := &wire.AckFrame{
|
|
|
|
|
AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}},
|
|
|
|
|
DelayTime: 5 * time.Minute,
|
|
|
|
|
}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 5*time.Minute, 1*time.Second))
|
|
|
|
|
})
|
|
|
|
|
@@ -408,9 +428,11 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
|
|
|
|
|
Context("determining which ACKs we have received an ACK for", func() {
|
|
|
|
|
BeforeEach(func() {
|
|
|
|
|
ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 80, Largest: 100}}}
|
|
|
|
|
ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 50, Largest: 200}}}
|
|
|
|
|
morePackets := []*Packet{
|
|
|
|
|
{PacketNumber: 13, Frames: []wire.Frame{&wire.AckFrame{LowestAcked: 80, LargestAcked: 100}, &streamFrame}, Length: 1},
|
|
|
|
|
{PacketNumber: 14, Frames: []wire.Frame{&wire.AckFrame{LowestAcked: 50, LargestAcked: 200}, &streamFrame}, Length: 1},
|
|
|
|
|
{PacketNumber: 13, Frames: []wire.Frame{ack1, &streamFrame}, Length: 1},
|
|
|
|
|
{PacketNumber: 14, Frames: []wire.Frame{ack2, &streamFrame}, Length: 1},
|
|
|
|
|
{PacketNumber: 15, Frames: []wire.Frame{&streamFrame}, Length: 1},
|
|
|
|
|
}
|
|
|
|
|
for _, packet := range morePackets {
|
|
|
|
|
@@ -419,25 +441,27 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("determines which ACK we have received an ACK for", func() {
|
|
|
|
|
err := handler.ReceivedAck(createAck([]wire.AckRange{{Smallest: 13, Largest: 15}}), 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 13, Largest: 15}}}, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(201)))
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("doesn't do anything when the acked packet didn't contain an ACK", func() {
|
|
|
|
|
err := handler.ReceivedAck(createAck([]wire.AckRange{{Smallest: 13, Largest: 13}}), 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 13, Largest: 13}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(101)))
|
|
|
|
|
err = handler.ReceivedAck(createAck([]wire.AckRange{{Smallest: 15, Largest: 15}}), 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 15, Largest: 15}}}
|
|
|
|
|
err = handler.ReceivedAck(ack, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(101)))
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("doesn't decrease the value", func() {
|
|
|
|
|
err := handler.ReceivedAck(createAck([]wire.AckRange{{Smallest: 14, Largest: 14}}), 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 14, Largest: 14}}}, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(201)))
|
|
|
|
|
err = handler.ReceivedAck(createAck([]wire.AckRange{{Smallest: 13, Largest: 13}}), 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
err = handler.ReceivedAck(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 13, Largest: 13}}}, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(201)))
|
|
|
|
|
})
|
|
|
|
|
@@ -462,7 +486,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
handler.SentPacketsAsRetransmission([]*Packet{retransmittablePacket(&Packet{PacketNumber: 6, Length: 11})}, 5)
|
|
|
|
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(11)))
|
|
|
|
|
// ack 5
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LowestAcked: 5, LargestAcked: 5}, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 5, Largest: 5}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
expectInPacketHistory([]protocol.PacketNumber{6})
|
|
|
|
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(11)))
|
|
|
|
|
@@ -474,7 +499,12 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
losePacket(5)
|
|
|
|
|
handler.SentPacketsAsRetransmission([]*Packet{retransmittablePacket(&Packet{PacketNumber: 7, Length: 11})}, 5)
|
|
|
|
|
// ack 5 and 7
|
|
|
|
|
ack := createAck([]wire.AckRange{{Smallest: 5, Largest: 5}, {Smallest: 7, Largest: 7}})
|
|
|
|
|
ack := &wire.AckFrame{
|
|
|
|
|
AckRanges: []wire.AckRange{
|
|
|
|
|
{Smallest: 7, Largest: 7},
|
|
|
|
|
{Smallest: 5, Largest: 5},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.packetHistory.Len()).To(BeZero())
|
|
|
|
|
@@ -493,8 +523,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
handler.SentPacket(retransmittablePacket(&Packet{PacketNumber: 1}))
|
|
|
|
|
handler.SentPacket(retransmittablePacket(&Packet{PacketNumber: 2}))
|
|
|
|
|
handler.SentPacket(retransmittablePacket(&Packet{PacketNumber: 3}))
|
|
|
|
|
ack := wire.AckFrame{LargestAcked: 3, LowestAcked: 3}
|
|
|
|
|
err := handler.ReceivedAck(&ack, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 3, Largest: 3}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.GetStopWaitingFrame(false)).To(Equal(&wire.StopWaitingFrame{LeastUnacked: 4}))
|
|
|
|
|
})
|
|
|
|
|
@@ -543,7 +573,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
handler.SentPacket(retransmittablePacket(&Packet{PacketNumber: 1}))
|
|
|
|
|
handler.SentPacket(retransmittablePacket(&Packet{PacketNumber: 2}))
|
|
|
|
|
handler.SentPacket(retransmittablePacket(&Packet{PacketNumber: 3}))
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 2, LowestAcked: 1}, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 2}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
@@ -579,7 +610,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
cong.EXPECT().OnPacketLost(protocol.PacketNumber(4), protocol.ByteCount(1), protocol.ByteCount(5)),
|
|
|
|
|
)
|
|
|
|
|
handler.SentPacket(retransmittablePacket(&Packet{PacketNumber: 5}))
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 5, LowestAcked: 5}, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 5, Largest: 5}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
@@ -601,7 +633,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(3)),
|
|
|
|
|
cong.EXPECT().OnPacketLost(protocol.PacketNumber(1), protocol.ByteCount(1), protocol.ByteCount(3)),
|
|
|
|
|
)
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 2, LowestAcked: 2}, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
@@ -616,10 +649,12 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(2)),
|
|
|
|
|
cong.EXPECT().OnPacketLost(protocol.PacketNumber(1), protocol.ByteCount(1), protocol.ByteCount(2)),
|
|
|
|
|
)
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 2, LowestAcked: 2}, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
// don't EXPECT any further calls to the congestion controller
|
|
|
|
|
err = handler.ReceivedAck(&wire.AckFrame{LargestAcked: 2, LowestAcked: 1}, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 2}}}
|
|
|
|
|
err = handler.ReceivedAck(ack, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
@@ -636,7 +671,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(4)),
|
|
|
|
|
cong.EXPECT().OnPacketLost(protocol.PacketNumber(1), protocol.ByteCount(1), protocol.ByteCount(4)),
|
|
|
|
|
)
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 2, LowestAcked: 2}, 1, protocol.EncryptionForwardSecure, time.Now().Add(-30*time.Minute))
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now().Add(-30*time.Minute))
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
// receive the second ACK
|
|
|
|
|
gomock.InOrder(
|
|
|
|
|
@@ -644,7 +680,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
cong.EXPECT().OnPacketAcked(protocol.PacketNumber(4), protocol.ByteCount(1), protocol.ByteCount(2)),
|
|
|
|
|
cong.EXPECT().OnPacketLost(protocol.PacketNumber(3), protocol.ByteCount(1), protocol.ByteCount(2)),
|
|
|
|
|
)
|
|
|
|
|
err = handler.ReceivedAck(&wire.AckFrame{LargestAcked: 4, LowestAcked: 4}, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 4, Largest: 4}}}
|
|
|
|
|
err = handler.ReceivedAck(ack, 2, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
@@ -799,7 +836,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
// Send a probe packet and receive an ACK for it.
|
|
|
|
|
// This verifies the RTO.
|
|
|
|
|
handler.SentPacket(retransmittablePacket(&Packet{PacketNumber: 3}))
|
|
|
|
|
err = handler.ReceivedAck(&wire.AckFrame{LargestAcked: 3, LowestAcked: 3}, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 3, Largest: 3}}}
|
|
|
|
|
err = handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.packetHistory.Len()).To(BeZero())
|
|
|
|
|
Expect(handler.bytesInFlight).To(BeZero())
|
|
|
|
|
@@ -829,7 +867,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
// Send a probe packet and receive an ACK for it.
|
|
|
|
|
// This verifies the RTO.
|
|
|
|
|
handler.SentPacket(retransmittablePacket(&Packet{PacketNumber: 6}))
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 6, LowestAcked: 6}, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 6, Largest: 6}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.packetHistory.Len()).To(BeZero())
|
|
|
|
|
Expect(handler.bytesInFlight).To(BeZero())
|
|
|
|
|
@@ -843,7 +882,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(handler.DequeuePacketForRetransmission()).ToNot(BeNil())
|
|
|
|
|
handler.SentPacketsAsRetransmission([]*Packet{retransmittablePacket(&Packet{PacketNumber: 6})}, 5)
|
|
|
|
|
err = handler.ReceivedAck(&wire.AckFrame{LargestAcked: 5, LowestAcked: 5}, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 5, Largest: 5}}}
|
|
|
|
|
err = handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, time.Now())
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
err = handler.OnAlarm()
|
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
@@ -866,7 +906,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
handler.SentPacket(retransmittablePacket(&Packet{PacketNumber: 2, SendTime: now.Add(-time.Second)}))
|
|
|
|
|
Expect(handler.lossTime.IsZero()).To(BeTrue())
|
|
|
|
|
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 2, LowestAcked: 2}, 1, protocol.EncryptionForwardSecure, now)
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, now)
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
Expect(handler.DequeuePacketForRetransmission()).ToNot(BeNil())
|
|
|
|
|
Expect(handler.DequeuePacketForRetransmission()).To(BeNil())
|
|
|
|
|
@@ -882,7 +923,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
handler.SentPacket(retransmittablePacket(&Packet{PacketNumber: 3, SendTime: now.Add(-time.Second)}))
|
|
|
|
|
Expect(handler.lossTime.IsZero()).To(BeTrue())
|
|
|
|
|
|
|
|
|
|
err := handler.ReceivedAck(&wire.AckFrame{LargestAcked: 2, LowestAcked: 2}, 1, protocol.EncryptionForwardSecure, now.Add(-time.Second))
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, now.Add(-time.Second))
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
Expect(handler.rttStats.SmoothedRTT()).To(Equal(time.Second))
|
|
|
|
|
|
|
|
|
|
@@ -916,7 +958,8 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
handler.SentPacket(handshakePacket(&Packet{PacketNumber: 4, SendTime: lastHandshakePacketSendTime}))
|
|
|
|
|
handler.SentPacket(retransmittablePacket(&Packet{PacketNumber: 5, SendTime: now}))
|
|
|
|
|
|
|
|
|
|
err := handler.ReceivedAck(createAck([]wire.AckRange{{Smallest: 1, Largest: 1}}), 1, protocol.EncryptionForwardSecure, now)
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}
|
|
|
|
|
err := handler.ReceivedAck(ack, 1, protocol.EncryptionForwardSecure, now)
|
|
|
|
|
// RTT is now 1 minute
|
|
|
|
|
Expect(handler.rttStats.SmoothedRTT()).To(Equal(time.Minute))
|
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
@@ -944,7 +987,7 @@ var _ = Describe("SentPacketHandler", func() {
|
|
|
|
|
Frames: []wire.Frame{&streamFrame},
|
|
|
|
|
Length: 1,
|
|
|
|
|
})
|
|
|
|
|
ack := createAck([]wire.AckRange{{Smallest: 13, Largest: 13}})
|
|
|
|
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 13, Largest: 13}}}
|
|
|
|
|
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)"))
|
|
|
|
|
})
|
|
|
|
|
|