diff --git a/quic/client/QuicClientTransport.cpp b/quic/client/QuicClientTransport.cpp index 13936be18..fc9626099 100644 --- a/quic/client/QuicClientTransport.cpp +++ b/quic/client/QuicClientTransport.cpp @@ -55,6 +55,8 @@ QuicClientTransport::QuicClientTransport( conn_->selfConnectionIds.emplace_back(srcConnId, kInitialSequenceNumber); clientConn_->initialDestinationConnectionId = ConnectionId::createRandom(kMinInitialDestinationConnIdLength); + clientConn_->originalDestinationConnectionId = + clientConn_->initialDestinationConnectionId; conn_->clientChosenDestConnectionId = clientConn_->initialDestinationConnectionId; VLOG(4) << "initial dcid: " @@ -159,7 +161,7 @@ void QuicClientTransport::processPacketData( } const ConnectionId* originalDstConnId = - &(*clientConn_->initialDestinationConnectionId); + &(*clientConn_->originalDestinationConnectionId); if (!clientConn_->clientHandshakeLayer->verifyRetryIntegrityTag( *originalDstConnId, *retryPacket)) { diff --git a/quic/client/state/ClientStateMachine.cpp b/quic/client/state/ClientStateMachine.cpp index 60b6e63b8..5feef703e 100644 --- a/quic/client/state/ClientStateMachine.cpp +++ b/quic/client/state/ClientStateMachine.cpp @@ -30,6 +30,8 @@ std::unique_ptr undoAllClientStateForRetry( newConn->clientConnectionId = conn->clientConnectionId; newConn->initialDestinationConnectionId = conn->initialDestinationConnectionId; + newConn->originalDestinationConnectionId = + conn->originalDestinationConnectionId; // TODO: don't carry server connection id over to the new connection. newConn->serverConnectionId = conn->serverConnectionId; newConn->ackStates.initialAckState.nextPacketNum = @@ -100,7 +102,7 @@ void processServerInitialParams( initialSourceConnId.value() != conn.readCodec->getServerConnectionId() || originalDestinationConnId.value() != - conn.initialDestinationConnectionId) { + conn.originalDestinationConnectionId) { throw QuicTransportException( "Initial CID does not match.", TransportErrorCode::TRANSPORT_PARAMETER_ERROR); diff --git a/quic/client/state/ClientStateMachine.h b/quic/client/state/ClientStateMachine.h index 7d1646db5..85063aac6 100644 --- a/quic/client/state/ClientStateMachine.h +++ b/quic/client/state/ClientStateMachine.h @@ -30,9 +30,16 @@ struct QuicClientConnectionState : public QuicConnectionStateBase { // The retry token sent by the server. std::string retryToken; - // Initial destination connection id. + // This is the destination connection id that will be sent in the outgoing + // client initial packet. It is modified in the event of a retry. folly::Optional initialDestinationConnectionId; + // This is the original destination connection id. It is the same as the + // initialDestinationConnectionId when there is no retry involved. When + // there is retry involved, this is the value of the destination connection + // id sent in the very first initial packet. + folly::Optional originalDestinationConnectionId; + std::shared_ptr handshakeFactory; ClientHandshake* clientHandshakeLayer; diff --git a/quic/fizz/client/test/QuicClientTransportTest.cpp b/quic/fizz/client/test/QuicClientTransportTest.cpp index 460dcd179..a742cf7dc 100644 --- a/quic/fizz/client/test/QuicClientTransportTest.cpp +++ b/quic/fizz/client/test/QuicClientTransportTest.cpp @@ -4449,6 +4449,7 @@ TEST_F(QuicClientTransportVersionAndRetryTest, RetryPacket) { client->getNonConstConn().qLogger = qLogger; client->getNonConstConn().readCodec->setClientConnectionId(clientConnId); client->getNonConstConn().initialDestinationConnectionId = initialDstConnId; + client->getNonConstConn().originalDestinationConnectionId = initialDstConnId; StreamId streamId = *client->createBidirectionalStream(); auto write = IOBuf::copyBuffer("ice cream");