forked from quic-go/quic-go
calculate the EntropyByte of every sent packet
This commit is contained in:
@@ -10,6 +10,8 @@ import (
|
|||||||
|
|
||||||
type outgoingPacketAckHandler struct {
|
type outgoingPacketAckHandler struct {
|
||||||
lastSentPacketNumber protocol.PacketNumber
|
lastSentPacketNumber protocol.PacketNumber
|
||||||
|
highestInOrderAckedPacketNumber protocol.PacketNumber
|
||||||
|
highestInOrderAckedEntropy EntropyAccumulator
|
||||||
packetHistory map[protocol.PacketNumber]*Packet
|
packetHistory map[protocol.PacketNumber]*Packet
|
||||||
packetHistoryMutex sync.Mutex
|
packetHistoryMutex sync.Mutex
|
||||||
}
|
}
|
||||||
@@ -31,6 +33,20 @@ func (h *outgoingPacketAckHandler) SentPacket(packet *Packet) error {
|
|||||||
if h.lastSentPacketNumber+1 != packet.PacketNumber {
|
if h.lastSentPacketNumber+1 != packet.PacketNumber {
|
||||||
return errors.New("Packet number must be increased by exactly 1")
|
return errors.New("Packet number must be increased by exactly 1")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var lastPacketEntropy EntropyAccumulator
|
||||||
|
// ToDo: write tests for this
|
||||||
|
if packet.PacketNumber == 0 {
|
||||||
|
lastPacketEntropy = EntropyAccumulator(0)
|
||||||
|
} else {
|
||||||
|
if h.highestInOrderAckedPacketNumber == packet.PacketNumber-1 {
|
||||||
|
lastPacketEntropy = h.highestInOrderAckedEntropy
|
||||||
|
} else {
|
||||||
|
lastPacketEntropy = h.packetHistory[packet.PacketNumber-1].Entropy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lastPacketEntropy.Add(packet.PacketNumber, packet.EntropyBit)
|
||||||
|
packet.Entropy = lastPacketEntropy
|
||||||
h.lastSentPacketNumber = packet.PacketNumber
|
h.lastSentPacketNumber = packet.PacketNumber
|
||||||
h.packetHistory[packet.PacketNumber] = packet
|
h.packetHistory[packet.PacketNumber] = packet
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -13,9 +13,10 @@ var _ = Describe("AckHandler", func() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
Context("SentPacket", func() {
|
Context("SentPacket", func() {
|
||||||
It("accepts two consecutive packets", func() {
|
It("accepts three consecutive packets", func() {
|
||||||
|
entropy := EntropyAccumulator(0)
|
||||||
packet1 := Packet{PacketNumber: 1, Plaintext: []byte{0x13, 0x37}, EntropyBit: true}
|
packet1 := Packet{PacketNumber: 1, Plaintext: []byte{0x13, 0x37}, EntropyBit: true}
|
||||||
packet2 := Packet{PacketNumber: 2, Plaintext: []byte{0xBE, 0xEF}, EntropyBit: false}
|
packet2 := Packet{PacketNumber: 2, Plaintext: []byte{0xBE, 0xEF}, EntropyBit: true}
|
||||||
err := handler.SentPacket(&packet1)
|
err := handler.SentPacket(&packet1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
err = handler.SentPacket(&packet2)
|
err = handler.SentPacket(&packet2)
|
||||||
@@ -23,6 +24,12 @@ var _ = Describe("AckHandler", func() {
|
|||||||
Expect(handler.lastSentPacketNumber).To(Equal(protocol.PacketNumber(2)))
|
Expect(handler.lastSentPacketNumber).To(Equal(protocol.PacketNumber(2)))
|
||||||
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(1)))
|
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(1)))
|
||||||
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(2)))
|
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(2)))
|
||||||
|
entropy.Add(packet1.PacketNumber, packet1.EntropyBit)
|
||||||
|
Expect(handler.packetHistory[1].PacketNumber).To(Equal(protocol.PacketNumber(1)))
|
||||||
|
Expect(handler.packetHistory[1].Entropy).To(Equal(entropy))
|
||||||
|
entropy.Add(packet2.PacketNumber, packet2.EntropyBit)
|
||||||
|
Expect(handler.packetHistory[2].PacketNumber).To(Equal(protocol.PacketNumber(2)))
|
||||||
|
Expect(handler.packetHistory[2].Entropy).To(Equal(entropy))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("rejects packets with the same packet number", func() {
|
It("rejects packets with the same packet number", func() {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ type Packet struct {
|
|||||||
PacketNumber protocol.PacketNumber
|
PacketNumber protocol.PacketNumber
|
||||||
Plaintext []byte
|
Plaintext []byte
|
||||||
EntropyBit bool
|
EntropyBit bool
|
||||||
|
Entropy EntropyAccumulator
|
||||||
|
|
||||||
MissingReports uint8
|
MissingReports uint8
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user