mirror of
https://github.com/refraction-networking/uquic.git
synced 2025-04-07 06:07:36 +03:00
fix AckFrame writing with gap lengths which are a multiple of 255
fixes #306
This commit is contained in:
parent
76e67803ac
commit
05265bd3c5
2 changed files with 62 additions and 5 deletions
|
@ -287,7 +287,7 @@ func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error
|
|||
|
||||
if i == int(num)-1 { // last block
|
||||
lengthWritten = uint64(length)
|
||||
gapWritten = uint8(gap % 0xFF)
|
||||
gapWritten = uint8(1 + ((gap - 1) % 255))
|
||||
} else {
|
||||
lengthWritten = 0
|
||||
gapWritten = 0xFF
|
||||
|
@ -403,10 +403,10 @@ func (f *AckFrame) numWritableNackRanges() uint64 {
|
|||
}
|
||||
|
||||
lastAckRange := f.AckRanges[i-1]
|
||||
gap := lastAckRange.FirstPacketNumber - ackRange.LastPacketNumber
|
||||
rangeLength := uint64(gap) / (0xFF + 1)
|
||||
if uint64(gap)%(0xFF+1) != 0 {
|
||||
rangeLength++
|
||||
gap := lastAckRange.FirstPacketNumber - ackRange.LastPacketNumber - 1
|
||||
rangeLength := 1 + uint64(gap)/0xFF
|
||||
if uint64(gap)%0xFF == 0 {
|
||||
rangeLength--
|
||||
}
|
||||
|
||||
if numRanges+rangeLength < 0xFF {
|
||||
|
|
|
@ -447,6 +447,63 @@ var _ = Describe("AckFrame", func() {
|
|||
Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
|
||||
})
|
||||
|
||||
It("writes two blocks for 510 lost packets", func() {
|
||||
frameOrig := &AckFrame{
|
||||
LargestAcked: 600,
|
||||
LowestAcked: 1,
|
||||
AckRanges: []AckRange{
|
||||
{FirstPacketNumber: 20 + 510, LastPacketNumber: 600},
|
||||
{FirstPacketNumber: 1, LastPacketNumber: 19},
|
||||
},
|
||||
}
|
||||
Expect(frameOrig.numWritableNackRanges()).To(Equal(uint64(3)))
|
||||
err := frameOrig.Write(b, 0)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
r := bytes.NewReader(b.Bytes())
|
||||
frame, err := ParseAckFrame(r, 0)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
|
||||
Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
|
||||
})
|
||||
|
||||
It("writes three blocks for 511 lost packets", func() {
|
||||
frameOrig := &AckFrame{
|
||||
LargestAcked: 600,
|
||||
LowestAcked: 1,
|
||||
AckRanges: []AckRange{
|
||||
{FirstPacketNumber: 20 + 511, LastPacketNumber: 600},
|
||||
{FirstPacketNumber: 1, LastPacketNumber: 19},
|
||||
},
|
||||
}
|
||||
Expect(frameOrig.numWritableNackRanges()).To(Equal(uint64(4)))
|
||||
err := frameOrig.Write(b, 0)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
r := bytes.NewReader(b.Bytes())
|
||||
frame, err := ParseAckFrame(r, 0)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
|
||||
Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
|
||||
})
|
||||
|
||||
It("writes three blocks for 512 lost packets", func() {
|
||||
frameOrig := &AckFrame{
|
||||
LargestAcked: 600,
|
||||
LowestAcked: 1,
|
||||
AckRanges: []AckRange{
|
||||
{FirstPacketNumber: 20 + 512, LastPacketNumber: 600},
|
||||
{FirstPacketNumber: 1, LastPacketNumber: 19},
|
||||
},
|
||||
}
|
||||
Expect(frameOrig.numWritableNackRanges()).To(Equal(uint64(4)))
|
||||
err := frameOrig.Write(b, 0)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
r := bytes.NewReader(b.Bytes())
|
||||
frame, err := ParseAckFrame(r, 0)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
|
||||
Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
|
||||
})
|
||||
|
||||
It("writes multiple blocks for a lot of lost packets", func() {
|
||||
frameOrig := &AckFrame{
|
||||
LargestAcked: 3000,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue