forked from quic-go/quic-go
parse and write ACKs that for packet number 0
This commit is contained in:
@@ -89,7 +89,7 @@ func ParseAckFrame(r *bytes.Reader, version protocol.VersionNumber) (*AckFrame,
|
|||||||
return nil, ErrInvalidFirstAckRange
|
return nil, ErrInvalidFirstAckRange
|
||||||
}
|
}
|
||||||
|
|
||||||
if ackBlockLength > largestAcked {
|
if ackBlockLength > largestAcked+1 {
|
||||||
return nil, ErrInvalidAckRanges
|
return nil, ErrInvalidAckRanges
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ var _ = Describe("AckFrame", func() {
|
|||||||
Expect(b.Len()).To(BeZero())
|
Expect(b.Len()).To(BeZero())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("parses a frame where the largest acked is 0", func() {
|
It("parses a frame that acks packet number 0", func() {
|
||||||
b := bytes.NewReader([]byte{0x40,
|
b := bytes.NewReader([]byte{0x40,
|
||||||
0x0, // largest acked
|
0x0, // largest acked
|
||||||
0x0, 0x0, // delay time
|
0x0, 0x0, // delay time
|
||||||
0x0, // block length
|
0x1, // block length
|
||||||
0,
|
0,
|
||||||
})
|
})
|
||||||
frame, err := ParseAckFrame(b, protocol.VersionWhatever)
|
frame, err := ParseAckFrame(b, protocol.VersionWhatever)
|
||||||
@@ -57,6 +57,21 @@ var _ = Describe("AckFrame", func() {
|
|||||||
Expect(b.Len()).To(BeZero())
|
Expect(b.Len()).To(BeZero())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("parses a frame that acks multiple packets, starting with 0", func() {
|
||||||
|
b := bytes.NewReader([]byte{0x40,
|
||||||
|
0x10, // largest acked
|
||||||
|
0x0, 0x0, // delay time
|
||||||
|
0x11, // block length
|
||||||
|
0,
|
||||||
|
})
|
||||||
|
frame, err := ParseAckFrame(b, protocol.VersionWhatever)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x10)))
|
||||||
|
Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(0)))
|
||||||
|
Expect(frame.HasMissingRanges()).To(BeFalse())
|
||||||
|
Expect(b.Len()).To(BeZero())
|
||||||
|
})
|
||||||
|
|
||||||
It("parses a frame with multiple timestamps", func() {
|
It("parses a frame with multiple timestamps", func() {
|
||||||
b := bytes.NewReader([]byte{0x40,
|
b := bytes.NewReader([]byte{0x40,
|
||||||
0x10, // largest acked
|
0x10, // largest acked
|
||||||
@@ -79,7 +94,7 @@ var _ = Describe("AckFrame", func() {
|
|||||||
b := bytes.NewReader([]byte{0x40,
|
b := bytes.NewReader([]byte{0x40,
|
||||||
0x1c, // largest acked
|
0x1c, // largest acked
|
||||||
0x0, 0x0, // delay time
|
0x0, 0x0, // delay time
|
||||||
0x1d, // block length
|
0x1e, // block length
|
||||||
0,
|
0,
|
||||||
})
|
})
|
||||||
_, err := ParseAckFrame(b, protocol.VersionWhatever)
|
_, err := ParseAckFrame(b, protocol.VersionWhatever)
|
||||||
@@ -499,6 +514,21 @@ var _ = Describe("AckFrame", func() {
|
|||||||
Expect(r.Len()).To(BeZero())
|
Expect(r.Len()).To(BeZero())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("writes an ACK that also acks packet 0", func() {
|
||||||
|
frameOrig := &AckFrame{
|
||||||
|
LargestAcked: 1,
|
||||||
|
LowestAcked: 0,
|
||||||
|
}
|
||||||
|
err := frameOrig.Write(b, versionBigEndian)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
r := bytes.NewReader(b.Bytes())
|
||||||
|
frame, err := ParseAckFrame(r, versionBigEndian)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
|
||||||
|
Expect(frame.HasMissingRanges()).To(BeFalse())
|
||||||
|
Expect(r.Len()).To(BeZero())
|
||||||
|
})
|
||||||
|
|
||||||
It("writes the correct block length in a simple ACK frame", func() {
|
It("writes the correct block length in a simple ACK frame", func() {
|
||||||
frameOrig := &AckFrame{
|
frameOrig := &AckFrame{
|
||||||
LargestAcked: 20,
|
LargestAcked: 20,
|
||||||
@@ -533,10 +563,10 @@ var _ = Describe("AckFrame", func() {
|
|||||||
It("writes an ACK frame with one packet missing", func() {
|
It("writes an ACK frame with one packet missing", func() {
|
||||||
frameOrig := &AckFrame{
|
frameOrig := &AckFrame{
|
||||||
LargestAcked: 40,
|
LargestAcked: 40,
|
||||||
LowestAcked: 1,
|
LowestAcked: 0,
|
||||||
AckRanges: []AckRange{
|
AckRanges: []AckRange{
|
||||||
{First: 25, Last: 40},
|
{First: 25, Last: 40},
|
||||||
{First: 1, Last: 23},
|
{First: 0, Last: 23},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
err := frameOrig.Write(b, versionBigEndian)
|
err := frameOrig.Write(b, versionBigEndian)
|
||||||
|
|||||||
Reference in New Issue
Block a user