forked from quic-go/quic-go
handle Retry packets in the session
This commit is contained in:
@@ -14,6 +14,7 @@ type SentPacketHandler interface {
|
||||
SentPacketsAsRetransmission(packets []*Packet, retransmissionOf protocol.PacketNumber)
|
||||
ReceivedAck(ackFrame *wire.AckFrame, withPacketNumber protocol.PacketNumber, encLevel protocol.EncryptionLevel, recvTime time.Time) error
|
||||
SetHandshakeComplete()
|
||||
ResetForRetry() error
|
||||
|
||||
// The SendMode determines if and what kind of packets can be sent.
|
||||
SendMode() SendMode
|
||||
|
||||
@@ -578,3 +578,22 @@ func (h *sentPacketHandler) computePTOTimeout() time.Duration {
|
||||
duration := utils.MaxDuration(h.rttStats.SmoothedOrInitialRTT()+4*h.rttStats.MeanDeviation(), granularity)
|
||||
return duration << h.ptoCount
|
||||
}
|
||||
|
||||
func (h *sentPacketHandler) ResetForRetry() error {
|
||||
h.cryptoCount = 0
|
||||
h.bytesInFlight = 0
|
||||
var packets []*Packet
|
||||
h.packetHistory.Iterate(func(p *Packet) (bool, error) {
|
||||
if p.canBeRetransmitted {
|
||||
packets = append(packets, p)
|
||||
}
|
||||
return true, nil
|
||||
})
|
||||
for _, p := range packets {
|
||||
h.logger.Debugf("Queueing packet %#x for retransmission.", p.PacketNumber)
|
||||
h.retransmissionQueue = append(h.retransmissionQueue, p)
|
||||
}
|
||||
h.packetHistory = newSentPacketHistory()
|
||||
h.updateLossDetectionAlarm()
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -873,4 +873,28 @@ var _ = Describe("SentPacketHandler", func() {
|
||||
Expect(handler.PopPacketNumber()).To(BeNumerically(">", 42))
|
||||
})
|
||||
})
|
||||
|
||||
Context("resetting for retry", func() {
|
||||
It("queues outstanding packets for retransmission and cancels alarms", func() {
|
||||
packet := &Packet{
|
||||
PacketNumber: 42,
|
||||
EncryptionLevel: protocol.EncryptionInitial,
|
||||
Frames: []wire.Frame{&wire.CryptoFrame{Data: []byte("foobar")}},
|
||||
Length: 100,
|
||||
}
|
||||
handler.SentPacket(packet)
|
||||
Expect(handler.GetAlarmTimeout()).ToNot(BeZero())
|
||||
Expect(handler.bytesInFlight).ToNot(BeZero())
|
||||
Expect(handler.DequeuePacketForRetransmission()).To(BeNil())
|
||||
Expect(handler.SendMode()).To(Equal(SendAny))
|
||||
// now receive a Retry
|
||||
Expect(handler.ResetForRetry()).To(Succeed())
|
||||
Expect(handler.bytesInFlight).To(BeZero())
|
||||
Expect(handler.GetAlarmTimeout()).To(BeZero())
|
||||
Expect(handler.SendMode()).To(Equal(SendRetransmission))
|
||||
p := handler.DequeuePacketForRetransmission()
|
||||
Expect(p.PacketNumber).To(Equal(packet.PacketNumber))
|
||||
Expect(p.Frames).To(Equal(packet.Frames))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user