forked from quic-go/quic-go
68 lines
1.6 KiB
Go
68 lines
1.6 KiB
Go
package ackhandler
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/lucas-clemente/quic-go/frames"
|
|
"github.com/lucas-clemente/quic-go/protocol"
|
|
)
|
|
|
|
var ErrDuplicatePacket = errors.New("Duplicate Packet")
|
|
|
|
// The AckHandler handles ACKs
|
|
type incomingPacketAckHandler struct {
|
|
largestObserved protocol.PacketNumber
|
|
observed map[protocol.PacketNumber]bool
|
|
}
|
|
|
|
// NewIncomingPacketAckHandler creates a new outgoingPacketAckHandler
|
|
func NewIncomingPacketAckHandler() IncomingPacketAckHandler {
|
|
return &incomingPacketAckHandler{
|
|
observed: make(map[protocol.PacketNumber]bool),
|
|
}
|
|
}
|
|
|
|
func (h *incomingPacketAckHandler) ReceivedPacket(packetNumber protocol.PacketNumber, entropyBit bool) error {
|
|
if packetNumber == 0 {
|
|
return errors.New("Invalid packet number")
|
|
}
|
|
if h.observed[packetNumber] {
|
|
return ErrDuplicatePacket
|
|
}
|
|
|
|
if packetNumber > h.largestObserved {
|
|
h.largestObserved = packetNumber
|
|
}
|
|
h.observed[packetNumber] = true
|
|
return nil
|
|
}
|
|
|
|
// getNackRanges gets all the NACK ranges
|
|
func (h *incomingPacketAckHandler) getNackRanges() []frames.NackRange {
|
|
// ToDo: improve performance
|
|
var ranges []frames.NackRange
|
|
inRange := false
|
|
for i := protocol.PacketNumber(1); i < h.largestObserved; i++ {
|
|
_, ok := h.observed[i]
|
|
if !ok {
|
|
if !inRange {
|
|
r := frames.NackRange{
|
|
FirstPacketNumber: i,
|
|
LastPacketNumber: i,
|
|
}
|
|
ranges = append(ranges, r)
|
|
inRange = true
|
|
} else {
|
|
ranges[len(ranges)-1].LastPacketNumber++
|
|
}
|
|
} else {
|
|
inRange = false
|
|
}
|
|
}
|
|
return ranges
|
|
}
|
|
|
|
func (h *incomingPacketAckHandler) DequeueAckFrame() *frames.AckFrame {
|
|
return nil
|
|
}
|