cache last StopWaiting in StopWaitingManager and return it if forced

ref #259
This commit is contained in:
Marten Seemann
2016-08-18 12:40:27 +07:00
parent 3bf525ed16
commit 7d05ebf0bb
3 changed files with 25 additions and 10 deletions

View File

@@ -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 {

View File

@@ -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) {

View File

@@ -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}))
}) })
}) })