calculate the EntropyByte of every sent packet

This commit is contained in:
Marten Seemann
2016-04-21 16:32:41 +07:00
parent 011932f357
commit e18697a5bc
3 changed files with 29 additions and 5 deletions

View File

@@ -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

View File

@@ -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() {

View File

@@ -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
} }