introduce an invalid packet number to simplify ackhandler and congestion

This commit is contained in:
Marten Seemann
2019-05-13 14:49:32 +02:00
parent dca57baef6
commit e06961266c
5 changed files with 33 additions and 43 deletions

View File

@@ -1,5 +1,12 @@
package protocol
// A PacketNumber in QUIC
type PacketNumber int64
// InvalidPacketNumber is a packet number that is never sent.
// In QUIC, 0 is a valid packet number.
const InvalidPacketNumber = -1
// PacketNumberLen is the length of the packet number in bytes
type PacketNumberLen uint8
@@ -34,7 +41,10 @@ func DecodePacketNumber(
epochDelta = PacketNumber(1) << 32
}
epoch := lastPacketNumber & ^(epochDelta - 1)
prevEpochBegin := epoch - epochDelta
var prevEpochBegin PacketNumber
if epoch > epochDelta {
prevEpochBegin = epoch - epochDelta
}
nextEpochBegin := epoch + epochDelta
return closestTo(
lastPacketNumber+1,

View File

@@ -2,7 +2,6 @@ package protocol
import (
"fmt"
"math"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
@@ -10,6 +9,10 @@ import (
// Tests taken and extended from chrome
var _ = Describe("packet number calculation", func() {
It("InvalidPacketNumber is smaller than all valid packet numbers", func() {
Expect(InvalidPacketNumber).To(BeNumerically("<", 0))
})
It("works with the example from the draft", func() {
Expect(DecodePacketNumber(PacketNumberLen2, 0xa82f30ea, 0x9b32)).To(Equal(PacketNumber(0xa82f9b32)))
})
@@ -25,10 +28,10 @@ var _ = Describe("packet number calculation", func() {
epoch := getEpoch(length)
epochMask := epoch - 1
wirePacketNumber := expected & epochMask
Expect(DecodePacketNumber(length, PacketNumber(last), PacketNumber(wirePacketNumber))).To(Equal(PacketNumber(expected)))
ExpectWithOffset(1, DecodePacketNumber(length, PacketNumber(last), PacketNumber(wirePacketNumber))).To(Equal(PacketNumber(expected)))
}
for _, l := range []PacketNumberLen{PacketNumberLen1, PacketNumberLen2, PacketNumberLen4} {
for _, l := range []PacketNumberLen{PacketNumberLen1, PacketNumberLen2, PacketNumberLen3, PacketNumberLen4} {
length := l
Context(fmt.Sprintf("with %d bytes", length), func() {
@@ -113,29 +116,6 @@ var _ = Describe("packet number calculation", func() {
}
})
It("works near next max", func() {
maxNumber := uint64(math.MaxUint64)
maxEpoch := maxNumber & ^epochMask
// Cases where the last number was close to the end of the range
for i := uint64(0); i < 10; i++ {
// Subtract 1, because the expected next packet number is 1 more than the
// last packet number.
last := maxNumber - i - 1
// Small numbers should not wrap, because they have nowhere to go.
for j := uint64(0); j < 10; j++ {
check(length, maxEpoch+j, last)
}
// Large numbers should not wrap either.
for j := uint64(0); j < 10; j++ {
num := epoch - 1 - j
check(length, maxEpoch+num, last)
}
}
})
Context("shortening a packet number for the header", func() {
Context("shortening", func() {
It("sends out low packet numbers as 2 byte", func() {

View File

@@ -5,9 +5,6 @@ import (
"time"
)
// A PacketNumber in QUIC
type PacketNumber uint64
// The PacketType is the Long Header Type
type PacketType uint8