use old AckHandler to fulfil IncomingPacketAckHandler interface

This commit is contained in:
Marten Seemann
2016-04-22 15:05:55 +07:00
parent 9cc161e2f4
commit 07419c25c5
3 changed files with 79 additions and 76 deletions

View File

@@ -1,55 +0,0 @@
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,
LastPacketNumber: packetNumber,
}
ranges = append(ranges, r)
inRange = true
} else {
ranges[len(ranges)-1].LastPacketNumber++
}
} else {
inRange = false
}
}
return ranges
}

View File

@@ -0,0 +1,57 @@
package ackhandler
import (
"github.com/lucas-clemente/quic-go/frames"
"github.com/lucas-clemente/quic-go/protocol"
)
// 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) {
if packetNumber > h.largestObserved {
h.largestObserved = packetNumber
}
h.observed[packetNumber] = true
}
// GetNackRanges gets all the NACK ranges
func (h *incomingPacketAckHandler) 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,
LastPacketNumber: packetNumber,
}
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
}

View File

@@ -7,56 +7,58 @@ import (
. "github.com/onsi/gomega"
)
var _ = Describe("AckHandler", func() {
var _ = Describe("incomingPacketAckHandler", func() {
var handler *incomingPacketAckHandler
BeforeEach(func() {
handler = NewIncomingPacketAckHandler().(*incomingPacketAckHandler)
})
It("Returns no NACK ranges for continously received packets", func() {
ackHandler, _ := NewAckHandler()
for i := 0; i < 100; i++ {
ackHandler.HandlePacket(protocol.PacketNumber(i))
handler.ReceivedPacket(protocol.PacketNumber(i), false)
}
Expect(ackHandler.LargestObserved).To(Equal(protocol.PacketNumber(99)))
Expect(len(ackHandler.GetNackRanges())).To(Equal(0))
Expect(handler.largestObserved).To(Equal(protocol.PacketNumber(99)))
Expect(len(handler.GetNackRanges())).To(Equal(0))
})
It("handles a single lost package", func() {
ackHandler, _ := NewAckHandler()
for i := 0; i < 10; i++ {
if i == 5 {
continue
}
ackHandler.HandlePacket(protocol.PacketNumber(i))
handler.ReceivedPacket(protocol.PacketNumber(i), false)
}
Expect(ackHandler.LargestObserved).To(Equal(protocol.PacketNumber(9)))
nackRanges := ackHandler.GetNackRanges()
Expect(handler.largestObserved).To(Equal(protocol.PacketNumber(9)))
nackRanges := handler.GetNackRanges()
Expect(len(nackRanges)).To(Equal(1))
Expect(nackRanges[0].FirstPacketNumber).To(Equal(protocol.PacketNumber(5)))
Expect(nackRanges[0].LastPacketNumber).To(Equal(protocol.PacketNumber(5)))
})
It("handles two consecutive lost packages", func() {
ackHandler, _ := NewAckHandler()
for i := 0; i < 10; i++ {
if i == 5 || i == 6 {
continue
}
ackHandler.HandlePacket(protocol.PacketNumber(i))
handler.ReceivedPacket(protocol.PacketNumber(i), false)
}
Expect(ackHandler.LargestObserved).To(Equal(protocol.PacketNumber(9)))
nackRanges := ackHandler.GetNackRanges()
Expect(handler.largestObserved).To(Equal(protocol.PacketNumber(9)))
nackRanges := handler.GetNackRanges()
Expect(len(nackRanges)).To(Equal(1))
Expect(nackRanges[0].FirstPacketNumber).To(Equal(protocol.PacketNumber(5)))
Expect(nackRanges[0].LastPacketNumber).To(Equal(protocol.PacketNumber(6)))
})
It("handles two non-consecutively lost packages", func() {
ackHandler, _ := NewAckHandler()
for i := 0; i < 10; i++ {
if i == 3 || i == 7 {
continue
}
ackHandler.HandlePacket(protocol.PacketNumber(i))
handler.ReceivedPacket(protocol.PacketNumber(i), false)
}
Expect(ackHandler.LargestObserved).To(Equal(protocol.PacketNumber(9)))
nackRanges := ackHandler.GetNackRanges()
Expect(handler.largestObserved).To(Equal(protocol.PacketNumber(9)))
nackRanges := handler.GetNackRanges()
Expect(len(nackRanges)).To(Equal(2))
Expect(nackRanges[0].FirstPacketNumber).To(Equal(protocol.PacketNumber(3)))
Expect(nackRanges[0].LastPacketNumber).To(Equal(protocol.PacketNumber(3)))
@@ -65,15 +67,14 @@ var _ = Describe("AckHandler", func() {
})
It("handles two sequences of lost packages", func() {
ackHandler, _ := NewAckHandler()
for i := 0; i < 10; i++ {
if i == 2 || i == 3 || i == 4 || i == 7 || i == 8 {
continue
}
ackHandler.HandlePacket(protocol.PacketNumber(i))
handler.ReceivedPacket(protocol.PacketNumber(i), false)
}
Expect(ackHandler.LargestObserved).To(Equal(protocol.PacketNumber(9)))
nackRanges := ackHandler.GetNackRanges()
Expect(handler.largestObserved).To(Equal(protocol.PacketNumber(9)))
nackRanges := handler.GetNackRanges()
Expect(len(nackRanges)).To(Equal(2))
Expect(nackRanges[0].FirstPacketNumber).To(Equal(protocol.PacketNumber(2)))
Expect(nackRanges[0].LastPacketNumber).To(Equal(protocol.PacketNumber(4)))