forked from quic-go/quic-go
add implementation for SentPacket in OutgoingPacketAckHandler
This commit is contained in:
45
ackhandler/outgoing_packet_ack_handler.go
Normal file
45
ackhandler/outgoing_packet_ack_handler.go
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package ackhandler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/lucas-clemente/quic-go/frames"
|
||||||
|
"github.com/lucas-clemente/quic-go/protocol"
|
||||||
|
)
|
||||||
|
|
||||||
|
type outgoingPacketAckHandler struct {
|
||||||
|
lastSentPacketNumber protocol.PacketNumber
|
||||||
|
packetHistory map[protocol.PacketNumber]*Packet
|
||||||
|
packetHistoryMutex sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewOutgoingPacketAckHandler creates a new outgoingPacketAckHandler
|
||||||
|
func NewOutgoingPacketAckHandler() OutgoingPacketAckHandler {
|
||||||
|
return &outgoingPacketAckHandler{
|
||||||
|
packetHistory: make(map[protocol.PacketNumber]*Packet),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *outgoingPacketAckHandler) SentPacket(packet *Packet) error {
|
||||||
|
h.packetHistoryMutex.Lock()
|
||||||
|
defer h.packetHistoryMutex.Unlock()
|
||||||
|
_, ok := h.packetHistory[packet.PacketNumber]
|
||||||
|
if ok {
|
||||||
|
return errors.New("Packet number already exists in Packet History")
|
||||||
|
}
|
||||||
|
if h.lastSentPacketNumber+1 != packet.PacketNumber {
|
||||||
|
return errors.New("Packet number must be increased by exactly 1")
|
||||||
|
}
|
||||||
|
h.lastSentPacketNumber = packet.PacketNumber
|
||||||
|
h.packetHistory[packet.PacketNumber] = packet
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *outgoingPacketAckHandler) ReceivedAck(ackFrame *frames.AckFrame) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *outgoingPacketAckHandler) DequeuePacketForRetransmission() (packet *Packet) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
40
ackhandler/outgoing_packet_ack_handler_test.go
Normal file
40
ackhandler/outgoing_packet_ack_handler_test.go
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
package ackhandler
|
||||||
|
|
||||||
|
import (
|
||||||
|
. "github.com/onsi/ginkgo"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe("AckHandler", func() {
|
||||||
|
Context("SentPacket", func() {
|
||||||
|
It("accepts two consecutive packets", func() {
|
||||||
|
packet1 := Packet{PacketNumber: 1, Plaintext: []byte{0x13, 0x37}, EntropyBit: true}
|
||||||
|
packet2 := Packet{PacketNumber: 2, Plaintext: []byte{0xBE, 0xEF}, EntropyBit: false}
|
||||||
|
handler := NewOutgoingPacketAckHandler()
|
||||||
|
err := handler.SentPacket(&packet1)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
err = handler.SentPacket(&packet2)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("rejects two packets with the same packet number", func() {
|
||||||
|
packet1 := Packet{PacketNumber: 1, Plaintext: []byte{0x13, 0x37}, EntropyBit: true}
|
||||||
|
packet2 := Packet{PacketNumber: 1, Plaintext: []byte{0xBE, 0xEF}, EntropyBit: false}
|
||||||
|
handler := NewOutgoingPacketAckHandler()
|
||||||
|
err := handler.SentPacket(&packet1)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
err = handler.SentPacket(&packet2)
|
||||||
|
Expect(err).To(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("rejects non-consecutive packets", func() {
|
||||||
|
packet1 := Packet{PacketNumber: 1, Plaintext: []byte{0x13, 0x37}, EntropyBit: true}
|
||||||
|
packet2 := Packet{PacketNumber: 3, Plaintext: []byte{0xBE, 0xEF}, EntropyBit: false}
|
||||||
|
handler := NewOutgoingPacketAckHandler()
|
||||||
|
err := handler.SentPacket(&packet1)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
err = handler.SentPacket(&packet2)
|
||||||
|
Expect(err).To(HaveOccurred())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user