calculate highest in-order ACKed packet from an ACK frame

This commit is contained in:
Marten Seemann
2016-04-20 19:37:20 +07:00
parent 184890cb4a
commit cfb74dbf06
2 changed files with 37 additions and 2 deletions

View File

@@ -18,8 +18,8 @@ type NackRange struct {
type AckFrame struct {
Entropy byte
LargestObserved protocol.PacketNumber
DelayTime uint16 // Todo: properly interpret this value as described in the specification
NackRanges []NackRange
DelayTime uint16 // Todo: properly interpret this value as described in the specification
NackRanges []NackRange // has to be ordered. The NACK range with the highest FirstPacketNumber goes first, the NACK range with the lowest FirstPacketNumber goes last
}
// Write writes an ACK frame.
@@ -73,6 +73,14 @@ func (f *AckFrame) HasNACK() bool {
return false
}
// GetHighestInOrderPacket gets the highest in order packet number that is confirmed by this ACK
func (f *AckFrame) GetHighestInOrderPacket() protocol.PacketNumber {
if f.HasNACK() {
return (f.NackRanges[len(f.NackRanges)-1].FirstPacketNumber - 1)
}
return f.LargestObserved
}
// ParseAckFrame reads an ACK frame
func ParseAckFrame(r *bytes.Reader) (*AckFrame, error) {
frame := &AckFrame{}

View File

@@ -73,6 +73,33 @@ var _ = Describe("AckFrame", func() {
Expect(frame.NackRanges[2].Length).To(Equal(uint8(1)))
Expect(b.Len()).To(Equal(0))
})
It("gets the highest in order packet number for an ACK without NACK ranges", func() {
frame := AckFrame{LargestObserved: 5}
Expect(frame.GetHighestInOrderPacket()).To(Equal(protocol.PacketNumber(5)))
})
It("gets the highest in order packet number for an ACK with one NACK ranges", func() {
nackRange := NackRange{FirstPacketNumber: 3, Length: 2}
frame := AckFrame{
LargestObserved: 6,
NackRanges: []NackRange{nackRange},
}
Expect(frame.GetHighestInOrderPacket()).To(Equal(protocol.PacketNumber(2)))
})
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},
}
frame := &AckFrame{
LargestObserved: 15,
NackRanges: nackRanges,
}
Expect(frame.GetHighestInOrderPacket()).To(Equal(protocol.PacketNumber(3)))
})
})
Context("when writing", func() {