diff --git a/conn_id_manager.go b/conn_id_manager.go index ee1729a74..92bffe206 100644 --- a/conn_id_manager.go +++ b/conn_id_manager.go @@ -70,7 +70,7 @@ func (h *connIDManager) Add(f *wire.NewConnectionIDFrame) error { func (h *connIDManager) add(f *wire.NewConnectionIDFrame) error { // If the NEW_CONNECTION_ID frame is reordered, such that its sequence number is smaller than the currently active // connection ID or if it was already retired, send the RETIRE_CONNECTION_ID frame immediately. - if f.SequenceNumber <= h.activeSequenceNumber || f.SequenceNumber < h.highestRetired { + if f.SequenceNumber < h.activeSequenceNumber || f.SequenceNumber < h.highestRetired { h.queueControlFrame(&wire.RetireConnectionIDFrame{ SequenceNumber: f.SequenceNumber, }) diff --git a/conn_id_manager_test.go b/conn_id_manager_test.go index 3c3a6cfb1..34243f6fc 100644 --- a/conn_id_manager_test.go +++ b/conn_id_manager_test.go @@ -201,6 +201,27 @@ var _ = Describe("Connection ID Manager", func() { Expect(frameQueue[0].(*wire.RetireConnectionIDFrame).SequenceNumber).To(BeEquivalentTo(9)) }) + It("accepts retransmissions for the connection ID that is in use", func() { + connID := protocol.ConnectionID{1, 2, 3, 4} + + Expect(m.Add(&wire.NewConnectionIDFrame{ + SequenceNumber: 1, + ConnectionID: connID, + })).To(Succeed()) + Expect(frameQueue).To(BeEmpty()) + Expect(m.Get()).To(Equal(connID)) + Expect(frameQueue).To(HaveLen(1)) + Expect(frameQueue[0]).To(BeAssignableToTypeOf(&wire.RetireConnectionIDFrame{})) + Expect(frameQueue[0].(*wire.RetireConnectionIDFrame).SequenceNumber).To(BeZero()) + frameQueue = nil + + Expect(m.Add(&wire.NewConnectionIDFrame{ + SequenceNumber: 1, + ConnectionID: connID, + })).To(Succeed()) + Expect(frameQueue).To(BeEmpty()) + }) + It("errors when the peer sends too connection IDs", func() { for i := uint8(1); i < protocol.MaxActiveConnectionIDs; i++ { Expect(m.Add(&wire.NewConnectionIDFrame{