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())
}