forked from quic-go/quic-go
Merge pull request #1176 from lucas-clemente/fix-1711
don't send an ACK frame for Retry packets
This commit is contained in:
10
session.go
10
session.go
@@ -536,9 +536,13 @@ func (s *session) handlePacketImpl(p *receivedPacket) error {
|
|||||||
// Only do this after decrypting, so we are sure the packet is not attacker-controlled
|
// Only do this after decrypting, so we are sure the packet is not attacker-controlled
|
||||||
s.largestRcvdPacketNumber = utils.MaxPacketNumber(s.largestRcvdPacketNumber, hdr.PacketNumber)
|
s.largestRcvdPacketNumber = utils.MaxPacketNumber(s.largestRcvdPacketNumber, hdr.PacketNumber)
|
||||||
|
|
||||||
isRetransmittable := ackhandler.HasRetransmittableFrames(packet.frames)
|
// If this is a Retry packet, there's no need to send an ACK.
|
||||||
if err = s.receivedPacketHandler.ReceivedPacket(hdr.PacketNumber, p.rcvTime, isRetransmittable); err != nil {
|
// The session will be closed and recreated as soon as the crypto setup processed the HRR.
|
||||||
return err
|
if hdr.Type != protocol.PacketTypeRetry {
|
||||||
|
isRetransmittable := ackhandler.HasRetransmittableFrames(packet.frames)
|
||||||
|
if err := s.receivedPacketHandler.ReceivedPacket(hdr.PacketNumber, p.rcvTime, isRetransmittable); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.handleFrames(packet.frames, packet.encryptionLevel)
|
return s.handleFrames(packet.frames, packet.encryptionLevel)
|
||||||
|
|||||||
@@ -569,6 +569,17 @@ var _ = Describe("Session", func() {
|
|||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("doesn't inform the ReceivedPacketHandler about Retry packets", func() {
|
||||||
|
now := time.Now().Add(time.Hour)
|
||||||
|
rph := mockackhandler.NewMockReceivedPacketHandler(mockCtrl)
|
||||||
|
sess.receivedPacketHandler = rph
|
||||||
|
// don't EXPECT any call to ReceivedPacket
|
||||||
|
hdr.PacketNumber = 5
|
||||||
|
hdr.Type = protocol.PacketTypeRetry
|
||||||
|
err := sess.handlePacketImpl(&receivedPacket{header: hdr, rcvTime: now})
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
It("closes when handling a packet fails", func(done Done) {
|
It("closes when handling a packet fails", func(done Done) {
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
testErr := errors.New("unpack error")
|
testErr := errors.New("unpack error")
|
||||||
|
|||||||
Reference in New Issue
Block a user