check for consistent ACK ranges when writing QUIC 34 ACK frames

ref #182
This commit is contained in:
Marten Seemann
2016-06-22 15:35:14 +07:00
parent 9d3dd34017
commit 1d412f2af6
2 changed files with 39 additions and 7 deletions

View File

@@ -59,7 +59,7 @@ var _ = Describe("AckFrame", func() {
// Length: 0x1d => LowestAcked would be -1
b := bytes.NewReader([]byte{0x40, 0x1c, 0x8e, 0x0, 0x1d, 0x1, 0x1, 0x6b, 0x26, 0x3, 0x0})
_, err := ParseAckFrameNew(b, 0)
Expect(err).To(MatchError(errInvalidAckRanges))
Expect(err).To(MatchError(ErrInvalidAckRanges))
})
Context("ACK blocks", func() {
@@ -80,7 +80,7 @@ var _ = Describe("AckFrame", func() {
// like the test before, but increased the last ACK range, such that the FirstPacketNumber would be negative
b := bytes.NewReader([]byte{0x60, 0x18, 0x94, 0x1, 0x1, 0x3, 0x2, 0x15, 0x2, 0x1, 0x5c, 0xd5, 0x0, 0x0, 0x0, 0x95, 0x0})
_, err := ParseAckFrameNew(b, 0)
Expect(err).To(MatchError(errInvalidAckRanges))
Expect(err).To(MatchError(ErrInvalidAckRanges))
})
It("parses a frame with multiple single packets missing", func() {
@@ -284,6 +284,32 @@ var _ = Describe("AckFrame", func() {
Expect(r.Len()).To(BeZero())
})
It("rejects a frame with incorrect LargestObserved value", func() {
frame := &AckFrameNew{
LargestObserved: 26,
LowestAcked: 1,
AckRanges: []AckRange{
AckRange{FirstPacketNumber: 12, LastPacketNumber: 25},
AckRange{FirstPacketNumber: 1, LastPacketNumber: 10},
},
}
err := frame.Write(b, 0)
Expect(err).To(MatchError(errInconsistentAckLargestObserved))
})
It("rejects a frame with incorrect LargestObserved value", func() {
frame := &AckFrameNew{
LargestObserved: 25,
LowestAcked: 2,
AckRanges: []AckRange{
AckRange{FirstPacketNumber: 12, LastPacketNumber: 25},
AckRange{FirstPacketNumber: 1, LastPacketNumber: 10},
},
}
err := frame.Write(b, 0)
Expect(err).To(MatchError(errInconsistentAckLowestAcked))
})
Context("longer ACK blocks", func() {
It("only writes one block for 254 lost packets", func() {
frameOrig := &AckFrameNew{