forked from quic-go/quic-go
calculate highest in-order ACKed packet from an ACK frame
This commit is contained in:
@@ -18,8 +18,8 @@ type NackRange struct {
|
|||||||
type AckFrame struct {
|
type AckFrame struct {
|
||||||
Entropy byte
|
Entropy byte
|
||||||
LargestObserved protocol.PacketNumber
|
LargestObserved protocol.PacketNumber
|
||||||
DelayTime uint16 // Todo: properly interpret this value as described in the specification
|
DelayTime uint16 // Todo: properly interpret this value as described in the specification
|
||||||
NackRanges []NackRange
|
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.
|
// Write writes an ACK frame.
|
||||||
@@ -73,6 +73,14 @@ func (f *AckFrame) HasNACK() bool {
|
|||||||
return false
|
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
|
// ParseAckFrame reads an ACK frame
|
||||||
func ParseAckFrame(r *bytes.Reader) (*AckFrame, error) {
|
func ParseAckFrame(r *bytes.Reader) (*AckFrame, error) {
|
||||||
frame := &AckFrame{}
|
frame := &AckFrame{}
|
||||||
|
|||||||
@@ -73,6 +73,33 @@ var _ = Describe("AckFrame", func() {
|
|||||||
Expect(frame.NackRanges[2].Length).To(Equal(uint8(1)))
|
Expect(frame.NackRanges[2].Length).To(Equal(uint8(1)))
|
||||||
Expect(b.Len()).To(Equal(0))
|
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() {
|
Context("when writing", func() {
|
||||||
|
|||||||
Reference in New Issue
Block a user