Files
quic-go/ackhandler/ack_handler.go
2016-04-20 12:15:03 +02:00

56 lines
1.3 KiB
Go

package ackhandler
import (
"github.com/lucas-clemente/quic-go/frames"
"github.com/lucas-clemente/quic-go/protocol"
)
// The AckHandler handles ACKs
type AckHandler struct {
LargestObserved protocol.PacketNumber
Observed map[protocol.PacketNumber]bool
}
// NewAckHandler creates a new AckHandler
func NewAckHandler() (*AckHandler, error) {
ackHandler := &AckHandler{
Observed: make(map[protocol.PacketNumber]bool),
}
return ackHandler, nil
}
// HandlePacket handles a packet
func (h *AckHandler) HandlePacket(packetNumber protocol.PacketNumber) {
if packetNumber > h.LargestObserved {
h.LargestObserved = packetNumber
}
h.Observed[packetNumber] = true
}
// GetNackRanges gets all the NACK ranges
func (h *AckHandler) GetNackRanges() []*frames.NackRange {
// ToDo: improve performance
var ranges []*frames.NackRange
inRange := false
// ToDo: fix types
for i := 0; i < int(h.LargestObserved); i++ {
packetNumber := protocol.PacketNumber(i)
_, ok := h.Observed[packetNumber]
if !ok {
if !inRange {
r := &frames.NackRange{
FirstPacketNumber: packetNumber,
Length: 1,
}
ranges = append(ranges, r)
inRange = true
} else {
ranges[len(ranges)-1].Length++
}
} else {
inRange = false
}
}
return ranges
}