diff --git a/ackhandler/sent_packet_handler.go b/ackhandler/sent_packet_handler.go index 2a1a47b6..e8329c75 100644 --- a/ackhandler/sent_packet_handler.go +++ b/ackhandler/sent_packet_handler.go @@ -24,7 +24,7 @@ var ( errAckForUnsentPacket = qerr.Error(qerr.InvalidAckData, "Received ACK for an unsent package") ) -var errDuplicatePacketNumber = errors.New("Packet number already exists in Packet History") +var errPacketNumberNotIncreasing = errors.New("Already sent a packet with a higher packet number.") type sentPacketHandler struct { lastSentPacketNumber protocol.PacketNumber @@ -121,7 +121,9 @@ func (h *sentPacketHandler) queuePacketForRetransmission(packetElement *ackhandl } func (h *sentPacketHandler) SentPacket(packet *ackhandlerlegacy.Packet) error { - // TODO: check for decreasing or duplicate packet numbers + if packet.PacketNumber <= h.lastSentPacketNumber { + return errPacketNumberNotIncreasing + } now := time.Now() h.lastSentPacketTime = now diff --git a/ackhandler/sent_packet_handler_test.go b/ackhandler/sent_packet_handler_test.go index b9c92d75..322a44c2 100644 --- a/ackhandler/sent_packet_handler_test.go +++ b/ackhandler/sent_packet_handler_test.go @@ -93,18 +93,30 @@ var _ = Describe("SentPacketHandler", func() { Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(3))) }) - PIt("rejects packets with the same packet number", func() { + It("rejects packets with the same packet number", func() { packet1 := ackhandlerlegacy.Packet{PacketNumber: 1, Frames: []frames.Frame{&streamFrame}, Length: 1} packet2 := ackhandlerlegacy.Packet{PacketNumber: 1, Frames: []frames.Frame{&streamFrame}, Length: 2} err := handler.SentPacket(&packet1) Expect(err).ToNot(HaveOccurred()) err = handler.SentPacket(&packet2) - Expect(err).To(MatchError(errDuplicatePacketNumber)) + Expect(err).To(MatchError(errPacketNumberNotIncreasing)) Expect(handler.lastSentPacketNumber).To(Equal(protocol.PacketNumber(1))) Expect(handler.packetHistory.Front().Value.PacketNumber).To(Equal(protocol.PacketNumber(1))) Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(1))) }) + It("rejects packets with decreasing packet number", func() { + packet1 := ackhandlerlegacy.Packet{PacketNumber: 2, Frames: []frames.Frame{&streamFrame}, Length: 1} + packet2 := ackhandlerlegacy.Packet{PacketNumber: 1, Frames: []frames.Frame{&streamFrame}, Length: 2} + err := handler.SentPacket(&packet1) + Expect(err).ToNot(HaveOccurred()) + err = handler.SentPacket(&packet2) + Expect(err).To(MatchError(errPacketNumberNotIncreasing)) + Expect(handler.lastSentPacketNumber).To(Equal(protocol.PacketNumber(2))) + Expect(handler.packetHistory.Front().Value.PacketNumber).To(Equal(protocol.PacketNumber(2))) + Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(1))) + }) + It("works with non-consecutive packet numbers", func() { packet1 := ackhandlerlegacy.Packet{PacketNumber: 1, Frames: []frames.Frame{&streamFrame}, Length: 1} packet2 := ackhandlerlegacy.Packet{PacketNumber: 3, Frames: []frames.Frame{&streamFrame}, Length: 2}