send a StopWaiting with every ACK in QUIC 34

fixes #185
This commit is contained in:
Marten Seemann 2016-07-29 18:00:05 +07:00
parent 73a64fde5f
commit 7604f7927d
7 changed files with 40 additions and 3 deletions

View file

@ -13,6 +13,8 @@ type SentPacketHandler interface {
SentPacket(packet *ackhandlerlegacy.Packet) error
ReceivedAck(ackFrame *frames.AckFrame, withPacketNumber protocol.PacketNumber) error
GetStopWaitingFrame() *frames.StopWaitingFrame
ProbablyHasPacketForRetransmission() bool
DequeuePacketForRetransmission() (packet *ackhandlerlegacy.Packet)
@ -35,6 +37,7 @@ type ReceivedPacketHandler interface {
}
// StopWaitingManager manages StopWaitings for sent packets
// TODO: remove once we drop support for QUIC 33
type StopWaitingManager interface {
RegisterPacketForRetransmission(packet *ackhandlerlegacy.Packet)
GetStopWaitingFrame() *frames.StopWaitingFrame

View file

@ -272,6 +272,16 @@ func (h *sentPacketHandler) GetLargestAcked() protocol.PacketNumber {
return h.LargestAcked
}
func (h *sentPacketHandler) GetStopWaitingFrame() *frames.StopWaitingFrame {
if h.LargestAcked == 0 {
return nil
}
return &frames.StopWaitingFrame{
LeastUnacked: h.LargestAcked + 1,
}
}
func (h *sentPacketHandler) CongestionAllowsSending() bool {
return h.BytesInFlight() <= h.congestion.GetCongestionWindow()
}

View file

@ -350,6 +350,17 @@ var _ = Describe("SentPacketHandler", func() {
})
})
Context("StopWaitings", func() {
It("does not get a StopWaiting if no ACKs haven't been received yet", func() {
Expect(handler.GetStopWaitingFrame()).To(BeNil())
})
It("gets a StopWaitingFrame", func() {
handler.LargestAcked = 1336
Expect(handler.GetStopWaitingFrame()).To(Equal(&frames.StopWaitingFrame{LeastUnacked: 1337}))
})
})
Context("calculating RTT", func() {
It("calculates the RTT", func() {
now := time.Now()

View file

@ -12,6 +12,8 @@ type SentPacketHandler interface {
SentPacket(packet *Packet) error
ReceivedAck(ackFrame *frames.AckFrame, withPacketNumber protocol.PacketNumber) error
GetStopWaitingFrame() *frames.StopWaitingFrame
ProbablyHasPacketForRetransmission() bool
DequeuePacketForRetransmission() (packet *Packet)

View file

@ -312,6 +312,10 @@ func (h *sentPacketHandler) GetLargestAcked() protocol.PacketNumber {
return h.LargestObserved
}
func (h *sentPacketHandler) GetStopWaitingFrame() *frames.StopWaitingFrame {
panic("Legacy AckHandler should use StopWaitingManager")
}
func (h *sentPacketHandler) CongestionAllowsSending() bool {
return h.BytesInFlight() <= h.congestion.GetCongestionWindow()
}

View file

@ -513,6 +513,10 @@ func (s *Session) sendPacket() error {
var stopWaitingFrame *frames.StopWaitingFrame
if s.version <= protocol.Version33 {
stopWaitingFrame = s.stopWaitingManager.GetStopWaitingFrame()
} else {
if ack != nil {
stopWaitingFrame = s.sentPacketHandler.GetStopWaitingFrame()
}
}
packet, err := s.packer.PackPacket(stopWaitingFrame, controlFrames, s.sentPacketHandler.GetLargestAcked(), maySendOnlyAck)
if err != nil {

View file

@ -56,9 +56,12 @@ func (h *mockSentPacketHandler) ReceivedAck(ackFrame *frames.AckFrame, withPacke
}
func (h *mockSentPacketHandler) BytesInFlight() protocol.ByteCount { return 0 }
func (h *mockSentPacketHandler) GetLargestAcked() protocol.PacketNumber { return 1 }
func (h *mockSentPacketHandler) CongestionAllowsSending() bool { return true }
func (h *mockSentPacketHandler) CheckForError() error { return nil }
func (h *mockSentPacketHandler) TimeOfFirstRTO() time.Time { panic("not implemented") }
func (h *mockSentPacketHandler) GetStopWaitingFrame() *frames.StopWaitingFrame {
panic("not implemented")
}
func (h *mockSentPacketHandler) CongestionAllowsSending() bool { return true }
func (h *mockSentPacketHandler) CheckForError() error { return nil }
func (h *mockSentPacketHandler) TimeOfFirstRTO() time.Time { panic("not implemented") }
func (h *mockSentPacketHandler) ProbablyHasPacketForRetransmission() bool {
return len(h.retransmissionQueue) > 0