forked from quic-go/quic-go
allow the server to retransmit Initial packets
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user