store the end of the NACK range instead of its length

This commit is contained in:
Marten Seemann
2016-04-21 18:28:50 +07:00
parent 88cd62e7fe
commit e5559d37d3
4 changed files with 32 additions and 32 deletions

View File

@@ -11,7 +11,7 @@ import (
// NackRange is a NACK range
type NackRange struct {
FirstPacketNumber protocol.PacketNumber
Length uint8
LastPacketNumber protocol.PacketNumber
}
// An AckFrame in QUIC
@@ -45,15 +45,15 @@ func (f *AckFrame) Write(b *bytes.Buffer) error {
for i, nackRange := range f.NackRanges {
var missingPacketSequenceNumberDelta uint64
if i == 0 {
if protocol.PacketNumber(uint64(nackRange.FirstPacketNumber)+uint64(nackRange.Length)) > f.LargestObserved {
if nackRange.LastPacketNumber > f.LargestObserved {
return errors.New("AckFrame: Invalid NACK ranges")
}
missingPacketSequenceNumberDelta = uint64(f.LargestObserved-nackRange.FirstPacketNumber) - uint64(nackRange.Length) + 1
missingPacketSequenceNumberDelta = uint64(f.LargestObserved) - uint64(nackRange.LastPacketNumber)
} else {
lastNackRange := f.NackRanges[i-1]
missingPacketSequenceNumberDelta = uint64(lastNackRange.FirstPacketNumber-nackRange.FirstPacketNumber) - uint64(nackRange.Length)
missingPacketSequenceNumberDelta = uint64(lastNackRange.FirstPacketNumber) - uint64(nackRange.LastPacketNumber) - 1
}
rangeLength := nackRange.Length - 1
rangeLength := uint8(nackRange.LastPacketNumber - nackRange.FirstPacketNumber)
if rangeLength > 255 {
return errors.New("AckFrame: NACK ranges larger 256 packets not yet supported")
}
@@ -183,9 +183,7 @@ func ParseAckFrame(r *bytes.Reader) (*AckFrame, error) {
}
rangeLength := uint8(rangeLengthByte)
nackRange := NackRange{
Length: uint8(rangeLength + 1),
}
nackRange := NackRange{}
if i == 0 {
nackRange.FirstPacketNumber = frame.LargestObserved - protocol.PacketNumber(missingPacketSequenceNumberDelta+uint64(rangeLength))
} else {
@@ -195,6 +193,7 @@ func ParseAckFrame(r *bytes.Reader) (*AckFrame, error) {
lastNackRange := frame.NackRanges[len(frame.NackRanges)-1]
nackRange.FirstPacketNumber = lastNackRange.FirstPacketNumber - protocol.PacketNumber(missingPacketSequenceNumberDelta+uint64(rangeLength)) - 1
}
nackRange.LastPacketNumber = protocol.PacketNumber(uint64(nackRange.FirstPacketNumber) + uint64(rangeLength))
frame.NackRanges = append(frame.NackRanges, nackRange)
}
}

View File

@@ -43,7 +43,7 @@ var _ = Describe("AckFrame", func() {
Expect(frame.HasNACK()).To(Equal(true))
Expect(len(frame.NackRanges)).To(Equal(1))
Expect(frame.NackRanges[0].FirstPacketNumber).To(Equal(protocol.PacketNumber(1)))
Expect(frame.NackRanges[0].Length).To(Equal(uint8(2)))
Expect(frame.NackRanges[0].LastPacketNumber).To(Equal(protocol.PacketNumber(2)))
Expect(b.Len()).To(Equal(0))
})
@@ -55,22 +55,23 @@ var _ = Describe("AckFrame", func() {
Expect(frame.HasNACK()).To(Equal(true))
Expect(len(frame.NackRanges)).To(Equal(1))
// ToDo: check NACK range
Expect(frame.NackRanges[0].Length).To(Equal(uint8(4)))
// Expect(frame.NackRanges[0].Length).To(Equal(uint8(4)))
Expect(b.Len()).To(Equal(0))
})
It("parses a frame containing multiple NACK ranges", func() {
// sent packets 1, 3, 7, 15
b := bytes.NewReader([]byte{0x60, 0x2, 0xf, 0xb8, 0x1, 0x1, 0x0, 0xe5, 0x58, 0x4, 0x0, 0x3, 0x1, 0x6, 0x1, 0x2, 0x1, 0x0})
frame, err := ParseAckFrame(b)
Expect(err).ToNot(HaveOccurred())
Expect(frame.HasNACK()).To(Equal(true))
Expect(len(frame.NackRanges)).To(Equal(3))
Expect(frame.NackRanges[0].FirstPacketNumber).To(Equal(protocol.PacketNumber(8)))
Expect(frame.NackRanges[0].Length).To(Equal(uint8(7)))
Expect(frame.NackRanges[0].LastPacketNumber).To(Equal(protocol.PacketNumber(14)))
Expect(frame.NackRanges[1].FirstPacketNumber).To(Equal(protocol.PacketNumber(4)))
Expect(frame.NackRanges[1].Length).To(Equal(uint8(3)))
Expect(frame.NackRanges[1].LastPacketNumber).To(Equal(protocol.PacketNumber(6)))
Expect(frame.NackRanges[2].FirstPacketNumber).To(Equal(protocol.PacketNumber(2)))
Expect(frame.NackRanges[2].Length).To(Equal(uint8(1)))
Expect(frame.NackRanges[2].LastPacketNumber).To(Equal(protocol.PacketNumber(2)))
Expect(b.Len()).To(Equal(0))
})
@@ -80,7 +81,7 @@ var _ = Describe("AckFrame", func() {
})
It("gets the highest in order packet number for an ACK with one NACK ranges", func() {
nackRange := NackRange{FirstPacketNumber: 3, Length: 2}
nackRange := NackRange{FirstPacketNumber: 3, LastPacketNumber: 4}
frame := AckFrame{
LargestObserved: 6,
NackRanges: []NackRange{nackRange},
@@ -90,9 +91,9 @@ var _ = Describe("AckFrame", func() {
It("gets the highest in order packet number for an ACK with one NACK ranges", func() {
nackRanges := []NackRange{
NackRange{FirstPacketNumber: 9, Length: 3},
NackRange{FirstPacketNumber: 7, Length: 1},
NackRange{FirstPacketNumber: 4, Length: 2},
NackRange{FirstPacketNumber: 9, LastPacketNumber: 11},
NackRange{FirstPacketNumber: 7, LastPacketNumber: 7},
NackRange{FirstPacketNumber: 4, LastPacketNumber: 5},
}
frame := &AckFrame{
LargestObserved: 15,
@@ -118,7 +119,7 @@ var _ = Describe("AckFrame", func() {
b := &bytes.Buffer{}
nackRange := NackRange{
FirstPacketNumber: 2,
Length: 1,
LastPacketNumber: 2,
}
frame := AckFrame{
Entropy: 2,
@@ -139,11 +140,11 @@ var _ = Describe("AckFrame", func() {
b := &bytes.Buffer{}
nackRange1 := NackRange{
FirstPacketNumber: 4,
Length: 3,
LastPacketNumber: 6,
}
nackRange2 := NackRange{
FirstPacketNumber: 2,
Length: 1,
LastPacketNumber: 2,
}
frame := AckFrame{
Entropy: 2,
@@ -182,7 +183,7 @@ var _ = Describe("AckFrame", func() {
NackRanges: []NackRange{
NackRange{
FirstPacketNumber: 2,
Length: 1,
LastPacketNumber: 2,
},
},
}
@@ -210,9 +211,9 @@ var _ = Describe("AckFrame", func() {
It("is self-consistent for ACK frames with NACK ranges", func() {
b := &bytes.Buffer{}
nackRanges := []NackRange{
NackRange{FirstPacketNumber: 9, Length: 3},
NackRange{FirstPacketNumber: 7, Length: 1},
NackRange{FirstPacketNumber: 2, Length: 2},
NackRange{FirstPacketNumber: 9, LastPacketNumber: 11},
NackRange{FirstPacketNumber: 7, LastPacketNumber: 7},
NackRange{FirstPacketNumber: 2, LastPacketNumber: 3},
}
frameOrig := &AckFrame{
LargestObserved: 15,