send a HANDSHAKE_DONE frame after handshake completion (as a server)

This commit is contained in:
Marten Seemann
2019-11-22 10:43:24 +08:00
parent 556e5c5559
commit 08ec2f69fc
2 changed files with 7 additions and 5 deletions

View File

@@ -603,16 +603,14 @@ func (s *session) handleHandshakeComplete() {
s.connIDGenerator.SetHandshakeComplete()
s.sentPacketHandler.SetHandshakeComplete()
// The client completes the handshake first (after sending the CFIN).
// We need to make sure it learns about the server completing the handshake,
// in order to stop retransmitting handshake packets.
// They will stop retransmitting handshake packets when receiving the first 1-RTT packet.
if s.perspective == protocol.PerspectiveServer {
token, err := s.tokenGenerator.NewToken(s.conn.RemoteAddr())
if err != nil {
s.closeLocal(err)
}
s.queueControlFrame(&wire.NewTokenFrame{Token: token})
s.queueControlFrame(&wire.HandshakeDoneFrame{})
}
}
@@ -855,6 +853,7 @@ func (s *session) handleFrame(f wire.Frame, pn protocol.PacketNumber, encLevel p
err = s.handleNewConnectionIDFrame(frame)
case *wire.RetireConnectionIDFrame:
err = s.handleRetireConnectionIDFrame(frame)
case *wire.HandshakeDoneFrame:
default:
err = fmt.Errorf("unexpected frame type: %s", reflect.ValueOf(&frame).Elem().Type().Name())
}

View File

@@ -1239,10 +1239,13 @@ var _ = Describe("Session", func() {
Eventually(sess.Context().Done()).Should(BeClosed())
})
It("sends a 1-RTT packet when the handshake completes", func() {
It("sends a HANDSHAKE_DONE frame when the handshake completes", func() {
done := make(chan struct{})
sessionRunner.EXPECT().Retire(clientDestConnID)
packer.EXPECT().PackPacket().DoAndReturn(func() (*packedPacket, error) {
frames, _ := sess.framer.AppendControlFrames(nil, protocol.MaxByteCount)
Expect(frames).ToNot(BeEmpty())
Expect(frames[0].Frame).To(BeEquivalentTo(&wire.HandshakeDoneFrame{}))
defer close(done)
return &packedPacket{
header: &wire.ExtendedHeader{},