add basic AckHandler

This commit is contained in:
Marten Seemann
2016-04-19 20:47:12 +07:00
parent 5381bfe220
commit 2ca580e73f
3 changed files with 149 additions and 0 deletions

52
ackhandler/ack_handler.go Normal file
View File

@@ -0,0 +1,52 @@
package ackhandler
import "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() []*NackRange {
// ToDo: improve performance
var ranges []*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 := &NackRange{
FirstPacketNumber: packetNumber,
Length: 1,
}
ranges = append(ranges, r)
inRange = true
} else {
ranges[len(ranges)-1].Length++
}
} else {
inRange = false
}
}
return ranges
}