forked from quic-go/quic-go
parse and write STOP_WAITING frames for packet number 0
This commit is contained in:
@@ -6,7 +6,6 @@ import (
|
|||||||
|
|
||||||
"github.com/lucas-clemente/quic-go/internal/protocol"
|
"github.com/lucas-clemente/quic-go/internal/protocol"
|
||||||
"github.com/lucas-clemente/quic-go/internal/utils"
|
"github.com/lucas-clemente/quic-go/internal/utils"
|
||||||
"github.com/lucas-clemente/quic-go/qerr"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// A StopWaitingFrame in QUIC
|
// A StopWaitingFrame in QUIC
|
||||||
@@ -73,8 +72,8 @@ func ParseStopWaitingFrame(r *bytes.Reader, packetNumber protocol.PacketNumber,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if leastUnackedDelta >= uint64(packetNumber) {
|
if leastUnackedDelta > uint64(packetNumber) {
|
||||||
return nil, qerr.Error(qerr.InvalidStopWaitingData, "invalid LeastUnackedDelta")
|
return nil, errors.New("invalid LeastUnackedDelta")
|
||||||
}
|
}
|
||||||
frame.LeastUnacked = protocol.PacketNumber(uint64(packetNumber) - leastUnackedDelta)
|
frame.LeastUnacked = protocol.PacketNumber(uint64(packetNumber) - leastUnackedDelta)
|
||||||
return frame, nil
|
return frame, nil
|
||||||
|
|||||||
@@ -27,13 +27,20 @@ var _ = Describe("StopWaitingFrame", func() {
|
|||||||
Expect(b.Len()).To(BeZero())
|
Expect(b.Len()).To(BeZero())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("rejects frames that would have 0 as LeastUnacked", func() {
|
It("parses a frame with 0 as LeastUnacked", func() {
|
||||||
b := bytes.NewReader([]byte{0x6, 0x8})
|
b := bytes.NewReader([]byte{0x6, 0x8})
|
||||||
_, err := ParseStopWaitingFrame(b, 8, 1, protocol.VersionWhatever)
|
frame, err := ParseStopWaitingFrame(b, 8, 1, protocol.VersionWhatever)
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(frame.LeastUnacked).To(Equal(protocol.PacketNumber(0)))
|
||||||
Expect(b.Len()).To(BeZero())
|
Expect(b.Len()).To(BeZero())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("rejects frames that underflow LeastUnacked", func() {
|
||||||
|
b := bytes.NewReader([]byte{0x6, 0x9})
|
||||||
|
_, err := ParseStopWaitingFrame(b, 8, 1, protocol.VersionWhatever)
|
||||||
|
Expect(err).To(MatchError("invalid LeastUnackedDelta"))
|
||||||
|
})
|
||||||
|
|
||||||
It("errors on EOFs", func() {
|
It("errors on EOFs", func() {
|
||||||
data := []byte{0x06, 0x03}
|
data := []byte{0x06, 0x03}
|
||||||
_, err := ParseStopWaitingFrame(bytes.NewReader(data), 5, 1, protocol.VersionWhatever)
|
_, err := ParseStopWaitingFrame(bytes.NewReader(data), 5, 1, protocol.VersionWhatever)
|
||||||
@@ -46,7 +53,6 @@ var _ = Describe("StopWaitingFrame", func() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
Context("when writing", func() {
|
Context("when writing", func() {
|
||||||
Context("in big endian", func() {
|
|
||||||
It("writes a sample frame", func() {
|
It("writes a sample frame", func() {
|
||||||
b := &bytes.Buffer{}
|
b := &bytes.Buffer{}
|
||||||
frame := &StopWaitingFrame{
|
frame := &StopWaitingFrame{
|
||||||
@@ -59,6 +65,17 @@ var _ = Describe("StopWaitingFrame", func() {
|
|||||||
Expect(b.Bytes()[0]).To(Equal(uint8(0x06)))
|
Expect(b.Bytes()[0]).To(Equal(uint8(0x06)))
|
||||||
Expect(b.Bytes()[1:7]).To(Equal([]byte{0, 0, 0, 0, 0, 3}))
|
Expect(b.Bytes()[1:7]).To(Equal([]byte{0, 0, 0, 0, 0, 3}))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("writes a frame for LeastUnacked = 0", func() {
|
||||||
|
b := &bytes.Buffer{}
|
||||||
|
frame := &StopWaitingFrame{
|
||||||
|
LeastUnacked: 0,
|
||||||
|
PacketNumber: 8,
|
||||||
|
PacketNumberLen: protocol.PacketNumberLen1,
|
||||||
|
}
|
||||||
|
err := frame.Write(b, versionBigEndian)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(b.Bytes()).To(Equal([]byte{0x6, 0x8}))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("errors when PacketNumber was not set", func() {
|
It("errors when PacketNumber was not set", func() {
|
||||||
|
|||||||
Reference in New Issue
Block a user