calculate loss alarm based on send time of last retransmittable packet

This commit is contained in:
Marten Seemann
2018-03-17 11:13:55 +00:00
parent 076e03a094
commit 46f8930fef
2 changed files with 16 additions and 11 deletions

View File

@@ -30,9 +30,11 @@ const (
)
type sentPacketHandler struct {
lastSentPacketNumber protocol.PacketNumber
nextPacketSendTime time.Time
skippedPackets []protocol.PacketNumber
lastSentPacketNumber protocol.PacketNumber
lastSentRetransmittablePacketTime time.Time
nextPacketSendTime time.Time
skippedPackets []protocol.PacketNumber
largestAcked protocol.PacketNumber
largestReceivedPacketWithAck protocol.PacketNumber
@@ -115,8 +117,8 @@ func (h *sentPacketHandler) SentPacket(packet *Packet) {
packet.sendTime = time.Now()
if isRetransmittable := h.sentPacketImpl(packet); isRetransmittable {
h.packetHistory.SentPacket(packet)
h.updateLossDetectionAlarm()
}
h.updateLossDetectionAlarm(packet.sendTime)
}
func (h *sentPacketHandler) SentPacketsAsRetransmission(packets []*Packet, retransmissionOf protocol.PacketNumber) {
@@ -129,7 +131,7 @@ func (h *sentPacketHandler) SentPacketsAsRetransmission(packets []*Packet, retra
}
}
h.packetHistory.SentPacketsAsRetransmission(p, retransmissionOf)
h.updateLossDetectionAlarm(now)
h.updateLossDetectionAlarm()
}
func (h *sentPacketHandler) sentPacketImpl(packet *Packet) bool /* isRetransmittable */ {
@@ -154,6 +156,7 @@ func (h *sentPacketHandler) sentPacketImpl(packet *Packet) bool /* isRetransmitt
if isRetransmittable {
packet.largestAcked = largestAcked
h.lastSentRetransmittablePacketTime = packet.sendTime
h.bytesInFlight += packet.Length
}
h.congestion.OnPacketSent(packet.sendTime, h.bytesInFlight, packet.PacketNumber, packet.Length, isRetransmittable)
@@ -209,7 +212,7 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *wire.AckFrame, withPacketNumbe
if err := h.detectLostPackets(rcvTime); err != nil {
return err
}
h.updateLossDetectionAlarm(rcvTime)
h.updateLossDetectionAlarm()
h.garbageCollectSkippedPackets()
h.stopWaitingManager.ReceivedAck(ackFrame)
@@ -264,7 +267,7 @@ func (h *sentPacketHandler) maybeUpdateRTT(largestAcked protocol.PacketNumber, a
return false
}
func (h *sentPacketHandler) updateLossDetectionAlarm(now time.Time) {
func (h *sentPacketHandler) updateLossDetectionAlarm() {
// Cancel the alarm if no packets are outstanding
if h.packetHistory.Len() == 0 {
h.alarm = time.Time{}
@@ -273,13 +276,13 @@ func (h *sentPacketHandler) updateLossDetectionAlarm(now time.Time) {
// TODO(#497): TLP
if !h.handshakeComplete {
h.alarm = now.Add(h.computeHandshakeTimeout())
h.alarm = h.lastSentRetransmittablePacketTime.Add(h.computeHandshakeTimeout())
} else if !h.lossTime.IsZero() {
// Early retransmit timer or time loss detection.
h.alarm = h.lossTime
} else {
// RTO
h.alarm = now.Add(h.computeRTOTimeout())
h.alarm = h.lastSentRetransmittablePacketTime.Add(h.computeRTOTimeout())
}
}
@@ -336,7 +339,7 @@ func (h *sentPacketHandler) OnAlarm() error {
if err != nil {
return err
}
h.updateLossDetectionAlarm(now)
h.updateLossDetectionAlarm()
return nil
}

View File

@@ -114,12 +114,14 @@ var _ = Describe("SentPacketHandler", func() {
It("stores the sent time", func() {
handler.SentPacket(retransmittablePacket(1))
Expect(getPacket(1).sendTime.Unix()).To(BeNumerically("~", time.Now().Unix(), 1))
Expect(getPacket(1).sendTime).To(BeTemporally("~", time.Now(), 100*time.Millisecond))
Expect(handler.lastSentRetransmittablePacketTime).To(BeTemporally("~", time.Now(), 100*time.Millisecond))
})
It("does not store non-retransmittable packets", func() {
handler.SentPacket(nonRetransmittablePacket(1))
Expect(handler.packetHistory.Len()).To(BeZero())
Expect(handler.lastSentRetransmittablePacketTime).To(BeZero())
})
Context("skipped packet numbers", func() {