mirror of
https://github.com/refraction-networking/uquic.git
synced 2025-04-07 06:07:36 +03:00
parent
73a64fde5f
commit
7604f7927d
7 changed files with 40 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue