allow the server to retransmit Initial packets

This commit is contained in:
Marten Seemann
2018-10-27 12:10:01 +07:00
parent 7fe93a726f
commit eeab7a5fca
2 changed files with 27 additions and 27 deletions

View File

@@ -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
}

View File

@@ -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