forked from quic-go/quic-go
cache last StopWaiting in StopWaitingManager and return it if forced
ref #259
This commit is contained in:
@@ -266,7 +266,7 @@ func (h *sentPacketHandler) GetLeastUnacked() protocol.PacketNumber {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (h *sentPacketHandler) GetStopWaitingFrame() *frames.StopWaitingFrame {
|
func (h *sentPacketHandler) GetStopWaitingFrame() *frames.StopWaitingFrame {
|
||||||
return h.stopWaitingManager.GetStopWaitingFrame()
|
return h.stopWaitingManager.GetStopWaitingFrame(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *sentPacketHandler) CongestionAllowsSending() bool {
|
func (h *sentPacketHandler) CongestionAllowsSending() bool {
|
||||||
|
|||||||
@@ -9,17 +9,24 @@ import (
|
|||||||
type stopWaitingManager struct {
|
type stopWaitingManager struct {
|
||||||
largestLeastUnackedSent protocol.PacketNumber
|
largestLeastUnackedSent protocol.PacketNumber
|
||||||
nextLeastUnacked protocol.PacketNumber
|
nextLeastUnacked protocol.PacketNumber
|
||||||
|
|
||||||
|
lastStopWaitingFrame *frames.StopWaitingFrame
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *stopWaitingManager) GetStopWaitingFrame() *frames.StopWaitingFrame {
|
func (s *stopWaitingManager) GetStopWaitingFrame(force bool) *frames.StopWaitingFrame {
|
||||||
if s.nextLeastUnacked <= s.largestLeastUnackedSent {
|
if s.nextLeastUnacked <= s.largestLeastUnackedSent {
|
||||||
|
if force {
|
||||||
|
return s.lastStopWaitingFrame
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
s.largestLeastUnackedSent = s.nextLeastUnacked
|
s.largestLeastUnackedSent = s.nextLeastUnacked
|
||||||
return &frames.StopWaitingFrame{
|
swf := &frames.StopWaitingFrame{
|
||||||
LeastUnacked: s.nextLeastUnacked,
|
LeastUnacked: s.nextLeastUnacked,
|
||||||
}
|
}
|
||||||
|
s.lastStopWaitingFrame = swf
|
||||||
|
return swf
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *stopWaitingManager) ReceivedAck(ack *frames.AckFrame) {
|
func (s *stopWaitingManager) ReceivedAck(ack *frames.AckFrame) {
|
||||||
|
|||||||
@@ -13,35 +13,43 @@ var _ = Describe("StopWaitingManager", func() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
It("returns nil in the beginning", func() {
|
It("returns nil in the beginning", func() {
|
||||||
Expect(manager.GetStopWaitingFrame()).To(BeNil())
|
Expect(manager.GetStopWaitingFrame(false)).To(BeNil())
|
||||||
|
Expect(manager.GetStopWaitingFrame(true)).To(BeNil())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("returns a StopWaitingFrame, when a new ACK arrives", func() {
|
It("returns a StopWaitingFrame, when a new ACK arrives", func() {
|
||||||
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 10})
|
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 10})
|
||||||
Expect(manager.GetStopWaitingFrame()).To(Equal(&frames.StopWaitingFrame{LeastUnacked: 11}))
|
Expect(manager.GetStopWaitingFrame(false)).To(Equal(&frames.StopWaitingFrame{LeastUnacked: 11}))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("does not decrease the LeastUnacked", func() {
|
It("does not decrease the LeastUnacked", func() {
|
||||||
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 10})
|
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 10})
|
||||||
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 9})
|
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 9})
|
||||||
Expect(manager.GetStopWaitingFrame()).To(Equal(&frames.StopWaitingFrame{LeastUnacked: 11}))
|
Expect(manager.GetStopWaitingFrame(false)).To(Equal(&frames.StopWaitingFrame{LeastUnacked: 11}))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("does not send the same StopWaitingFrame twice", func() {
|
It("does not send the same StopWaitingFrame twice", func() {
|
||||||
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 10})
|
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 10})
|
||||||
Expect(manager.GetStopWaitingFrame()).ToNot(BeNil())
|
Expect(manager.GetStopWaitingFrame(false)).ToNot(BeNil())
|
||||||
Expect(manager.GetStopWaitingFrame()).To(BeNil())
|
Expect(manager.GetStopWaitingFrame(false)).To(BeNil())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("gets the same StopWaitingFrame twice, if forced", func() {
|
||||||
|
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 10})
|
||||||
|
Expect(manager.GetStopWaitingFrame(false)).ToNot(BeNil())
|
||||||
|
Expect(manager.GetStopWaitingFrame(true)).ToNot(BeNil())
|
||||||
|
Expect(manager.GetStopWaitingFrame(true)).ToNot(BeNil())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("increases the LeastUnacked when a retransmission is queued", func() {
|
It("increases the LeastUnacked when a retransmission is queued", func() {
|
||||||
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 10})
|
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 10})
|
||||||
manager.QueuedRetransmissionForPacketNumber(20)
|
manager.QueuedRetransmissionForPacketNumber(20)
|
||||||
Expect(manager.GetStopWaitingFrame()).To(Equal(&frames.StopWaitingFrame{LeastUnacked: 21}))
|
Expect(manager.GetStopWaitingFrame(false)).To(Equal(&frames.StopWaitingFrame{LeastUnacked: 21}))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("does not decrease the LeastUnacked when a retransmission is queued", func() {
|
It("does not decrease the LeastUnacked when a retransmission is queued", func() {
|
||||||
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 10})
|
manager.ReceivedAck(&frames.AckFrame{LargestAcked: 10})
|
||||||
manager.QueuedRetransmissionForPacketNumber(9)
|
manager.QueuedRetransmissionForPacketNumber(9)
|
||||||
Expect(manager.GetStopWaitingFrame()).To(Equal(&frames.StopWaitingFrame{LeastUnacked: 11}))
|
Expect(manager.GetStopWaitingFrame(false)).To(Equal(&frames.StopWaitingFrame{LeastUnacked: 11}))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user