diff --git a/ackhandler/sent_packet_handler.go b/ackhandler/sent_packet_handler.go index c617b5b2..48060cc2 100644 --- a/ackhandler/sent_packet_handler.go +++ b/ackhandler/sent_packet_handler.go @@ -30,8 +30,7 @@ type sentPacketHandler struct { lastSentPacketTime time.Time skippedPackets []protocol.PacketNumber - LargestInOrderAcked protocol.PacketNumber - LargestAcked protocol.PacketNumber + LargestAcked protocol.PacketNumber largestReceivedPacketWithAck protocol.PacketNumber @@ -68,17 +67,7 @@ func NewSentPacketHandler() SentPacketHandler { func (h *sentPacketHandler) ackPacket(packetElement *ackhandlerlegacy.PacketElement) { packet := &packetElement.Value - h.bytesInFlight -= packet.Length - - if h.LargestInOrderAcked == packet.PacketNumber-1 { - h.LargestInOrderAcked++ - - if next := packetElement.Next(); next != nil { - h.LargestInOrderAcked = next.Value.PacketNumber - 1 - } - } - h.packetHistory.Remove(packetElement) } @@ -103,17 +92,6 @@ func (h *sentPacketHandler) queuePacketForRetransmission(packetElement *ackhandl h.bytesInFlight -= packet.Length h.retransmissionQueue = append(h.retransmissionQueue, packet) - // If this is the lowest packet that hasn't been acked or retransmitted yet ... - if packet.PacketNumber == h.LargestInOrderAcked+1 { - // ... increase the LargestInOrderAcked until it's one before the next packet that was not acked and not retransmitted - for el := packetElement; el != nil; el = el.Next() { - if h.LargestInOrderAcked == h.LargestAcked { - break - } - h.LargestInOrderAcked = el.Value.PacketNumber - 1 - } - } - h.packetHistory.Remove(packetElement) // strictly speaking, this is only necessary for RTO retransmissions @@ -121,6 +99,13 @@ func (h *sentPacketHandler) queuePacketForRetransmission(packetElement *ackhandl h.stopWaitingManager.QueuedRetransmissionForPacketNumber(packet.PacketNumber) } +func (h *sentPacketHandler) largestInOrderAcked() protocol.PacketNumber { + if f := h.packetHistory.Front(); f != nil { + return f.Value.PacketNumber - 1 + } + return h.LargestAcked +} + func (h *sentPacketHandler) SentPacket(packet *ackhandlerlegacy.Packet) error { if packet.PacketNumber <= h.lastSentPacketNumber { return errPacketNumberNotIncreasing @@ -169,7 +154,7 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *frames.AckFrame, withPacketNum h.largestReceivedPacketWithAck = withPacketNumber // ignore repeated ACK (ACKs that don't have a higher LargestAcked than the last ACK) - if ackFrame.LargestAcked <= h.LargestInOrderAcked { + if ackFrame.LargestAcked <= h.largestInOrderAcked() { return nil } @@ -277,7 +262,7 @@ func (h *sentPacketHandler) BytesInFlight() protocol.ByteCount { } func (h *sentPacketHandler) GetLeastUnacked() protocol.PacketNumber { - return h.LargestInOrderAcked + 1 + return h.largestInOrderAcked() + 1 } func (h *sentPacketHandler) GetStopWaitingFrame() *frames.StopWaitingFrame { @@ -303,10 +288,6 @@ func (h *sentPacketHandler) MaybeQueueRTOs() { for el := h.packetHistory.Front(); el != nil; el = el.Next() { packet := &el.Value - if packet.PacketNumber < h.LargestInOrderAcked { - continue - } - packetsLost := congestion.PacketVector{congestion.PacketInfo{ Number: packet.PacketNumber, Length: packet.Length, @@ -337,9 +318,10 @@ func (h *sentPacketHandler) TimeOfFirstRTO() time.Time { } func (h *sentPacketHandler) garbageCollectSkippedPackets() { + lioa := h.largestInOrderAcked() deleteIndex := 0 for i, p := range h.skippedPackets { - if p <= h.LargestInOrderAcked { + if p <= lioa { deleteIndex = i + 1 } } diff --git a/ackhandler/sent_packet_handler_test.go b/ackhandler/sent_packet_handler_test.go index 79be2063..984f34fb 100644 --- a/ackhandler/sent_packet_handler_test.go +++ b/ackhandler/sent_packet_handler_test.go @@ -75,7 +75,7 @@ var _ = Describe("SentPacketHandler", func() { } It("gets the LeastUnacked packet number", func() { - handler.LargestInOrderAcked = 0x1337 + handler.LargestAcked = 0x1337 Expect(handler.GetLeastUnacked()).To(Equal(protocol.PacketNumber(0x1337 + 1))) }) @@ -188,23 +188,23 @@ var _ = Describe("SentPacketHandler", func() { }) Context("garbage collection", func() { - It("keeps all packet numbers above the LargestInOrderAcked", func() { + It("keeps all packet numbers above the LargestAcked", func() { handler.skippedPackets = []protocol.PacketNumber{2, 5, 8, 10} - handler.LargestInOrderAcked = 1 + handler.LargestAcked = 1 handler.garbageCollectSkippedPackets() Expect(handler.skippedPackets).To(Equal([]protocol.PacketNumber{2, 5, 8, 10})) }) - It("doesn't keep packet numbers below the LargestInOrderAcked", func() { + It("doesn't keep packet numbers below the LargestAcked", func() { handler.skippedPackets = []protocol.PacketNumber{1, 5, 8, 10} - handler.LargestInOrderAcked = 5 + handler.LargestAcked = 5 handler.garbageCollectSkippedPackets() Expect(handler.skippedPackets).To(Equal([]protocol.PacketNumber{8, 10})) }) - It("deletes all packet numbers if LargestInOrderAcked is sufficiently high", func() { + It("deletes all packet numbers if LargestAcked is sufficiently high", func() { handler.skippedPackets = []protocol.PacketNumber{1, 5, 10} - handler.LargestInOrderAcked = 15 + handler.LargestAcked = 15 handler.garbageCollectSkippedPackets() Expect(handler.skippedPackets).To(BeEmpty()) }) @@ -326,14 +326,14 @@ var _ = Describe("SentPacketHandler", func() { }) Context("acks and nacks the right packets", func() { - It("adjusts the LargestInOrderAcked", func() { + It("adjusts the LargestAcked", func() { ack := frames.AckFrame{ LargestAcked: 5, LowestAcked: 1, } err := handler.ReceivedAck(&ack, 1) Expect(err).ToNot(HaveOccurred()) - Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(5))) + Expect(handler.LargestAcked).To(Equal(protocol.PacketNumber(5))) el := handler.packetHistory.Front() for i := 6; i <= 10; i++ { Expect(el.Value.PacketNumber).To(Equal(protocol.PacketNumber(i))) @@ -350,7 +350,6 @@ var _ = Describe("SentPacketHandler", func() { } err := handler.ReceivedAck(&ack, 1) Expect(err).ToNot(HaveOccurred()) - Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(0))) el := handler.packetHistory.Front() Expect(el.Value.PacketNumber).To(Equal(protocol.PacketNumber(1))) el = el.Next() @@ -373,8 +372,6 @@ var _ = Describe("SentPacketHandler", func() { } err := handler.ReceivedAck(&ack, 1) Expect(err).ToNot(HaveOccurred()) - Expect(handler.LargestInOrderAcked).To(BeZero()) - Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(0))) el := handler.packetHistory.Front() Expect(el.Value.PacketNumber).To(Equal(protocol.PacketNumber(1))) el = el.Next() @@ -396,7 +393,6 @@ var _ = Describe("SentPacketHandler", func() { } err := handler.ReceivedAck(&ack, 1) Expect(err).ToNot(HaveOccurred()) - Expect(handler.LargestInOrderAcked).To(BeZero()) el := handler.packetHistory.Front() Expect(el.Value.PacketNumber).To(Equal(protocol.PacketNumber(1))) Expect(el.Value.MissingReports).To(Equal(uint8(1))) @@ -419,7 +415,6 @@ var _ = Describe("SentPacketHandler", func() { } err := handler.ReceivedAck(&ack, 1) Expect(err).ToNot(HaveOccurred()) - Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(1))) el := handler.packetHistory.Front() Expect(el.Value.PacketNumber).To(Equal(protocol.PacketNumber(2))) Expect(el.Value.MissingReports).To(Equal(uint8(1))) @@ -459,7 +454,6 @@ var _ = Describe("SentPacketHandler", func() { err = handler.ReceivedAck(&ack2, 2) Expect(err).ToNot(HaveOccurred()) Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(len(packets) - 6))) - Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(largestObserved))) Expect(handler.packetHistory.Front().Value.PacketNumber).To(Equal(protocol.PacketNumber(7))) }) @@ -484,7 +478,6 @@ var _ = Describe("SentPacketHandler", func() { err = handler.ReceivedAck(&ack2, 2) Expect(err).ToNot(HaveOccurred()) Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(len(packets) - 7))) - Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(7))) Expect(handler.packetHistory.Front().Value.PacketNumber).To(Equal(protocol.PacketNumber(8))) }) @@ -616,79 +609,6 @@ var _ = Describe("SentPacketHandler", func() { Expect(packet.PacketNumber).To(Equal(protocol.PacketNumber(4))) }) - It("changes the LargestInOrderAcked after queueing the lowest packet for retransmission", func() { - ack := frames.AckFrame{ - LargestAcked: 7, - LowestAcked: 1, - AckRanges: []frames.AckRange{ - {FirstPacketNumber: 7, LastPacketNumber: 7}, - {FirstPacketNumber: 4, LastPacketNumber: 5}, - {FirstPacketNumber: 1, LastPacketNumber: 2}, - }, - } - err := handler.ReceivedAck(&ack, 1) - Expect(err).ToNot(HaveOccurred()) - Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(2))) - // this will trigger a retransmission of packet 3 - for i := uint8(0); i < protocol.RetransmissionThreshold; i++ { - el := getPacketElement(3) - Expect(el).ToNot(BeNil()) - handler.nackPacket(el) - } - Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(5))) - }) - - It("does not change the LargestInOrderAcked after queueing a higher packet for retransmission", func() { - ack := frames.AckFrame{ - LargestAcked: 7, - LowestAcked: 1, - AckRanges: []frames.AckRange{ - {FirstPacketNumber: 7, LastPacketNumber: 7}, - {FirstPacketNumber: 4, LastPacketNumber: 5}, - {FirstPacketNumber: 1, LastPacketNumber: 2}, - }, - } - err := handler.ReceivedAck(&ack, 1) - Expect(err).ToNot(HaveOccurred()) - Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(2))) - // this will trigger a retransmission of packet 6 - for i := uint8(0); i < protocol.RetransmissionThreshold; i++ { - el := getPacketElement(6) - Expect(el).ToNot(BeNil()) - handler.nackPacket(el) - } - Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(2))) - }) - - It("increases LargestInOrderAcked past packets queued for retransmission", func() { - ack := frames.AckFrame{ - LargestAcked: 7, - LowestAcked: 1, - AckRanges: []frames.AckRange{ - {FirstPacketNumber: 7, LastPacketNumber: 7}, - {FirstPacketNumber: 4, LastPacketNumber: 5}, - {FirstPacketNumber: 1, LastPacketNumber: 1}, - }, - } - err := handler.ReceivedAck(&ack, 1) - Expect(err).ToNot(HaveOccurred()) - // this will trigger a retransmission of packet 3 - for i := uint8(0); i < protocol.RetransmissionThreshold; i++ { - el := getPacketElement(3) - Expect(el).ToNot(BeNil()) - handler.nackPacket(el) - } - Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(1))) - // now, trigger retransmission of 2 ... - for i := uint8(0); i < protocol.RetransmissionThreshold; i++ { - el := getPacketElement(2) - Expect(el).ToNot(BeNil()) - handler.nackPacket(el) - } - // and check that it increased LargestInOrderAcked past 3 - Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(5))) - }) - Context("StopWaitings", func() { It("gets a StopWaitingFrame", func() { ack := frames.AckFrame{LargestAcked: 5, LowestAcked: 5}