From a79e9ee35e8249a1922dcaba23036105bc3304de Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 4 Dec 2017 12:43:39 +0700 Subject: [PATCH] parse and write STOP_WAITING frames for packet number 0 --- internal/wire/stop_waiting_frame.go | 5 +-- internal/wire/stop_waiting_frame_test.go | 49 ++++++++++++++++-------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/internal/wire/stop_waiting_frame.go b/internal/wire/stop_waiting_frame.go index 9eb068dc..6d01cb53 100644 --- a/internal/wire/stop_waiting_frame.go +++ b/internal/wire/stop_waiting_frame.go @@ -6,7 +6,6 @@ import ( "github.com/lucas-clemente/quic-go/internal/protocol" "github.com/lucas-clemente/quic-go/internal/utils" - "github.com/lucas-clemente/quic-go/qerr" ) // A StopWaitingFrame in QUIC @@ -73,8 +72,8 @@ func ParseStopWaitingFrame(r *bytes.Reader, packetNumber protocol.PacketNumber, if err != nil { return nil, err } - if leastUnackedDelta >= uint64(packetNumber) { - return nil, qerr.Error(qerr.InvalidStopWaitingData, "invalid LeastUnackedDelta") + if leastUnackedDelta > uint64(packetNumber) { + return nil, errors.New("invalid LeastUnackedDelta") } frame.LeastUnacked = protocol.PacketNumber(uint64(packetNumber) - leastUnackedDelta) return frame, nil diff --git a/internal/wire/stop_waiting_frame_test.go b/internal/wire/stop_waiting_frame_test.go index 58613f3f..ec22c306 100644 --- a/internal/wire/stop_waiting_frame_test.go +++ b/internal/wire/stop_waiting_frame_test.go @@ -27,13 +27,20 @@ var _ = Describe("StopWaitingFrame", func() { 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}) - _, err := ParseStopWaitingFrame(b, 8, 1, protocol.VersionWhatever) - Expect(err).To(HaveOccurred()) + frame, err := ParseStopWaitingFrame(b, 8, 1, protocol.VersionWhatever) + Expect(err).ToNot(HaveOccurred()) + Expect(frame.LeastUnacked).To(Equal(protocol.PacketNumber(0))) 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() { data := []byte{0x06, 0x03} _, err := ParseStopWaitingFrame(bytes.NewReader(data), 5, 1, protocol.VersionWhatever) @@ -46,19 +53,29 @@ var _ = Describe("StopWaitingFrame", func() { }) Context("when writing", func() { - Context("in big endian", func() { - It("writes a sample frame", func() { - b := &bytes.Buffer{} - frame := &StopWaitingFrame{ - LeastUnacked: 10, - PacketNumber: 13, - PacketNumberLen: protocol.PacketNumberLen6, - } - err := frame.Write(b, versionBigEndian) - Expect(err).ToNot(HaveOccurred()) - Expect(b.Bytes()[0]).To(Equal(uint8(0x06))) - Expect(b.Bytes()[1:7]).To(Equal([]byte{0, 0, 0, 0, 0, 3})) - }) + It("writes a sample frame", func() { + b := &bytes.Buffer{} + frame := &StopWaitingFrame{ + LeastUnacked: 10, + PacketNumber: 13, + PacketNumberLen: protocol.PacketNumberLen6, + } + err := frame.Write(b, versionBigEndian) + Expect(err).ToNot(HaveOccurred()) + Expect(b.Bytes()[0]).To(Equal(uint8(0x06))) + 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() {