From eeab7a5fcab1d7d506f2375a37b51ae1a1d5457c Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 27 Oct 2018 12:10:01 +0700 Subject: [PATCH] allow the server to retransmit Initial packets --- session.go | 2 +- session_test.go | 52 ++++++++++++++++++++++++------------------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/session.go b/session.go index ab9ce5844..7ea1c3979 100644 --- a/session.go +++ b/session.go @@ -1066,7 +1066,7 @@ func (s *session) maybeSendRetransmission() (bool, error) { // Don't retransmit Initial packets if we already received a response. // An Initial might have been retransmitted multiple times before we receive a response. // As soon as we receive one response, we don't need to send any more Initials. - if s.receivedFirstPacket && retransmitPacket.PacketType == protocol.PacketTypeInitial { + if s.perspective == protocol.PerspectiveClient && s.receivedFirstPacket && retransmitPacket.PacketType == protocol.PacketTypeInitial { s.logger.Debugf("Skipping retransmission of packet %d. Already received a response to an Initial.", retransmitPacket.PacketNumber) continue } diff --git a/session_test.go b/session_test.go index 7d5fe7723..132c673d5 100644 --- a/session_test.go +++ b/session_test.go @@ -776,32 +776,6 @@ var _ = Describe("Session", func() { Expect(mconn.written).To(Receive(ContainSubstring("PRST"))) }) - It("doesn't retransmit an Initial packet if it already received a response", func() { - unpacker := NewMockUnpacker(mockCtrl) - unpacker.EXPECT().Unpack(gomock.Any(), gomock.Any(), gomock.Any()).Return(&unpackedPacket{}, nil) - sess.unpacker = unpacker - sph := mockackhandler.NewMockSentPacketHandler(mockCtrl) - sph.EXPECT().GetPacketNumberLen(gomock.Any()).Return(protocol.PacketNumberLen2).AnyTimes() - sph.EXPECT().DequeuePacketForRetransmission().Return(&ackhandler.Packet{ - PacketNumber: 10, - PacketType: protocol.PacketTypeInitial, - }) - sph.EXPECT().DequeuePacketForRetransmission() - rph := mockackhandler.NewMockReceivedPacketHandler(mockCtrl) - rph.EXPECT().ReceivedPacket(gomock.Any(), gomock.Any(), gomock.Any()) - sess.receivedPacketHandler = rph - sess.sentPacketHandler = sph - err := sess.handlePacketImpl(&receivedPacket{ - header: &wire.Header{}, - data: []byte{0}, - }) - Expect(err).ToNot(HaveOccurred()) - Expect(sess.receivedFirstPacket).To(BeTrue()) - sent, err := sess.maybeSendRetransmission() - Expect(err).NotTo(HaveOccurred()) - Expect(sent).To(BeFalse()) - }) - It("sends a retransmission and a regular packet in the same run", func() { packetToRetransmit := &ackhandler.Packet{ PacketNumber: 10, @@ -1670,6 +1644,32 @@ var _ = Describe("Client Session", func() { Eventually(sess.Context().Done()).Should(BeClosed()) }) + It("doesn't retransmit an Initial packet if it already received a response", func() { + unpacker := NewMockUnpacker(mockCtrl) + unpacker.EXPECT().Unpack(gomock.Any(), gomock.Any(), gomock.Any()).Return(&unpackedPacket{}, nil) + sess.unpacker = unpacker + sph := mockackhandler.NewMockSentPacketHandler(mockCtrl) + sph.EXPECT().GetPacketNumberLen(gomock.Any()).Return(protocol.PacketNumberLen2).AnyTimes() + sph.EXPECT().DequeuePacketForRetransmission().Return(&ackhandler.Packet{ + PacketNumber: 10, + PacketType: protocol.PacketTypeInitial, + }) + sph.EXPECT().DequeuePacketForRetransmission() + rph := mockackhandler.NewMockReceivedPacketHandler(mockCtrl) + rph.EXPECT().ReceivedPacket(gomock.Any(), gomock.Any(), gomock.Any()) + sess.receivedPacketHandler = rph + sess.sentPacketHandler = sph + err := sess.handlePacketImpl(&receivedPacket{ + header: &wire.Header{}, + data: []byte{0}, + }) + Expect(err).ToNot(HaveOccurred()) + Expect(sess.receivedFirstPacket).To(BeTrue()) + sent, err := sess.maybeSendRetransmission() + Expect(err).NotTo(HaveOccurred()) + Expect(sent).To(BeFalse()) + }) + Context("receiving packets", func() { var hdr *wire.Header