forked from quic-go/quic-go
@@ -83,6 +83,7 @@ func ParseAckFrameNew(r *bytes.Reader, version protocol.VersionNumber) (*AckFram
|
|||||||
}
|
}
|
||||||
frame.AckRanges = append(frame.AckRanges, ackRange)
|
frame.AckRanges = append(frame.AckRanges, ackRange)
|
||||||
|
|
||||||
|
var inLongBlock bool
|
||||||
for i := uint8(0); i < numAckBlocks; i++ {
|
for i := uint8(0); i < numAckBlocks; i++ {
|
||||||
var gap uint8
|
var gap uint8
|
||||||
gap, err = r.ReadByte()
|
gap, err = r.ReadByte()
|
||||||
@@ -95,13 +96,22 @@ func ParseAckFrameNew(r *bytes.Reader, version protocol.VersionNumber) (*AckFram
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ackRange := AckRange{
|
length := protocol.PacketNumber(ackBlockLength)
|
||||||
LastPacketNumber: frame.AckRanges[i].FirstPacketNumber - protocol.PacketNumber(gap) - 1,
|
|
||||||
|
if inLongBlock {
|
||||||
|
frame.AckRanges[len(frame.AckRanges)-1].FirstPacketNumber -= protocol.PacketNumber(gap) + length
|
||||||
|
frame.AckRanges[len(frame.AckRanges)-1].LastPacketNumber -= protocol.PacketNumber(gap)
|
||||||
|
} else {
|
||||||
|
ackRange := AckRange{
|
||||||
|
LastPacketNumber: frame.AckRanges[len(frame.AckRanges)-1].FirstPacketNumber - protocol.PacketNumber(gap) - 1,
|
||||||
|
}
|
||||||
|
ackRange.FirstPacketNumber = ackRange.LastPacketNumber - length + 1
|
||||||
|
frame.AckRanges = append(frame.AckRanges, ackRange)
|
||||||
}
|
}
|
||||||
ackRange.FirstPacketNumber = ackRange.LastPacketNumber - protocol.PacketNumber(ackBlockLength) + 1
|
|
||||||
frame.AckRanges = append(frame.AckRanges, ackRange)
|
inLongBlock = (ackBlockLength == 0)
|
||||||
}
|
}
|
||||||
frame.LowestAcked = frame.AckRanges[numAckBlocks].FirstPacketNumber
|
frame.LowestAcked = frame.AckRanges[len(frame.AckRanges)-1].FirstPacketNumber
|
||||||
} else {
|
} else {
|
||||||
// make sure that LowestAcked is not 0. 0 is not a valid PacketNumber
|
// make sure that LowestAcked is not 0. 0 is not a valid PacketNumber
|
||||||
// TODO: is this really the right behavior?
|
// TODO: is this really the right behavior?
|
||||||
|
|||||||
@@ -88,6 +88,60 @@ var _ = Describe("AckFrame", func() {
|
|||||||
Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
|
Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
|
||||||
Expect(b.Len()).To(BeZero())
|
Expect(b.Len()).To(BeZero())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Context("more than 256 lost packets in a row", func() {
|
||||||
|
It("parses a frame with one long range, spanning 2 blocks, of missing packets", func() { // 280 missing packets
|
||||||
|
b := bytes.NewReader([]byte{0x64, 0x44, 0x1, 0xa7, 0x0, 0x2, 0x19, 0xff, 0x0, 0x19, 0x13, 0x2, 0x1, 0xb, 0x59, 0x2, 0x0, 0x0, 0xb6, 0x0})
|
||||||
|
frame, err := ParseAckFrameNew(b, 0)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(frame.LargestObserved).To(Equal(protocol.PacketNumber(0x144)))
|
||||||
|
Expect(frame.AckRanges).To(HaveLen(2))
|
||||||
|
Expect(frame.AckRanges[0]).To(Equal(AckRange{FirstPacketNumber: 300, LastPacketNumber: 0x144}))
|
||||||
|
Expect(frame.AckRanges[1]).To(Equal(AckRange{FirstPacketNumber: 1, LastPacketNumber: 19}))
|
||||||
|
Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
|
||||||
|
Expect(b.Len()).To(BeZero())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("parses a frame with one long range, spanning mulitple blocks, of missing packets", func() { // 2345 missing packets
|
||||||
|
b := bytes.NewReader([]byte{0x64, 0x5b, 0x9, 0x66, 0x1, 0xa, 0x1f, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0x32, 0x13, 0x4, 0x3, 0xb4, 0xda, 0x1, 0x0, 0x2, 0xe0, 0x0, 0x1, 0x9a, 0x0, 0x0, 0x81, 0x0})
|
||||||
|
frame, err := ParseAckFrameNew(b, 0)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(frame.LargestObserved).To(Equal(protocol.PacketNumber(0x95b)))
|
||||||
|
Expect(frame.AckRanges).To(HaveLen(2))
|
||||||
|
Expect(frame.AckRanges[0]).To(Equal(AckRange{FirstPacketNumber: 2365, LastPacketNumber: 0x95b}))
|
||||||
|
Expect(frame.AckRanges[1]).To(Equal(AckRange{FirstPacketNumber: 1, LastPacketNumber: 19}))
|
||||||
|
Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
|
||||||
|
Expect(b.Len()).To(BeZero())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("parses a frame with multiple long ranges of missing packets", func() {
|
||||||
|
b := bytes.NewReader([]byte{0x65, 0x66, 0x9, 0x23, 0x1, 0x7, 0x7, 0x0, 0xff, 0x0, 0x0, 0xf5, 0x8a, 0x2, 0xc8, 0xe6, 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0x23, 0x13, 0x0, 0x2, 0x1, 0x13, 0xae, 0xb, 0x0, 0x0, 0x80, 0x5})
|
||||||
|
frame, err := ParseAckFrameNew(b, 0)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(frame.LargestObserved).To(Equal(protocol.PacketNumber(0x966)))
|
||||||
|
Expect(frame.AckRanges).To(HaveLen(4))
|
||||||
|
Expect(frame.AckRanges[0]).To(Equal(AckRange{FirstPacketNumber: 2400, LastPacketNumber: 0x966}))
|
||||||
|
Expect(frame.AckRanges[1]).To(Equal(AckRange{FirstPacketNumber: 1250, LastPacketNumber: 1899}))
|
||||||
|
Expect(frame.AckRanges[2]).To(Equal(AckRange{FirstPacketNumber: 820, LastPacketNumber: 1049}))
|
||||||
|
Expect(frame.AckRanges[3]).To(Equal(AckRange{FirstPacketNumber: 1, LastPacketNumber: 19}))
|
||||||
|
Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
|
||||||
|
Expect(b.Len()).To(BeZero())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("parses a frame with short ranges and one long range", func() {
|
||||||
|
b := bytes.NewReader([]byte{0x64, 0x8f, 0x3, 0x65, 0x1, 0x5, 0x3d, 0x1, 0x32, 0xff, 0x0, 0xff, 0x0, 0xf0, 0x1c, 0x2, 0x13, 0x3, 0x2, 0x23, 0xaf, 0x2, 0x0, 0x1, 0x3, 0x1, 0x0, 0x8e, 0x0})
|
||||||
|
frame, err := ParseAckFrameNew(b, 0)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(frame.LargestObserved).To(Equal(protocol.PacketNumber(0x38f)))
|
||||||
|
Expect(frame.AckRanges).To(HaveLen(4))
|
||||||
|
Expect(frame.AckRanges[0]).To(Equal(AckRange{FirstPacketNumber: 851, LastPacketNumber: 0x38f}))
|
||||||
|
Expect(frame.AckRanges[1]).To(Equal(AckRange{FirstPacketNumber: 800, LastPacketNumber: 849}))
|
||||||
|
Expect(frame.AckRanges[2]).To(Equal(AckRange{FirstPacketNumber: 22, LastPacketNumber: 49}))
|
||||||
|
Expect(frame.AckRanges[3]).To(Equal(AckRange{FirstPacketNumber: 1, LastPacketNumber: 19}))
|
||||||
|
Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
|
||||||
|
Expect(b.Len()).To(BeZero())
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user