| Index: net/quic/crypto/quic_crypto_client_config.cc
|
| diff --git a/net/quic/crypto/quic_crypto_client_config.cc b/net/quic/crypto/quic_crypto_client_config.cc
|
| index 8b6dfb79d0d69b998898d58579a5576b029e824c..4828c3afa236a423cead61cbc6451c37671e70f2 100644
|
| --- a/net/quic/crypto/quic_crypto_client_config.cc
|
| +++ b/net/quic/crypto/quic_crypto_client_config.cc
|
| @@ -32,25 +32,21 @@ namespace net {
|
|
|
| namespace {
|
|
|
| -enum ServerConfigState {
|
| - // WARNING: Do not change the numerical values of any of server config state.
|
| - // Do not remove deprecated server config states - just comment them as
|
| - // deprecated.
|
| - SERVER_CONFIG_EMPTY = 0,
|
| - SERVER_CONFIG_INVALID = 1,
|
| - SERVER_CONFIG_CORRUPTED = 2,
|
| - SERVER_CONFIG_EXPIRED = 3,
|
| - SERVER_CONFIG_INVALID_EXPIRY = 4,
|
| -
|
| - // NOTE: Add new server config states only immediately above this line. Make
|
| - // sure to update the QuicServerConfigState enum in
|
| - // tools/metrics/histograms/histograms.xml accordingly.
|
| - SERVER_CONFIG_COUNT
|
| -};
|
| -
|
| -void RecordServerConfigState(ServerConfigState server_config_state) {
|
| - UMA_HISTOGRAM_ENUMERATION("Net.QuicClientHelloServerConfigState",
|
| - server_config_state, SERVER_CONFIG_COUNT);
|
| +// Tracks the reason (the state of the server config) for sending inchoate
|
| +// ClientHello to the server.
|
| +void RecordInchoateClientHelloReason(
|
| + QuicCryptoClientConfig::CachedState::ServerConfigState state) {
|
| + UMA_HISTOGRAM_ENUMERATION(
|
| + "Net.QuicInchoateClientHelloReason", state,
|
| + QuicCryptoClientConfig::CachedState::SERVER_CONFIG_COUNT);
|
| +}
|
| +
|
| +// Tracks the state of the QUIC server information loaded from the disk cache.
|
| +void RecordDiskCacheServerConfigState(
|
| + QuicCryptoClientConfig::CachedState::ServerConfigState state) {
|
| + UMA_HISTOGRAM_ENUMERATION(
|
| + "Net.QuicServerInfo.DiskCacheState", state,
|
| + QuicCryptoClientConfig::CachedState::SERVER_CONFIG_COUNT);
|
| }
|
|
|
| } // namespace
|
| @@ -72,12 +68,12 @@ QuicCryptoClientConfig::CachedState::~CachedState() {}
|
|
|
| bool QuicCryptoClientConfig::CachedState::IsComplete(QuicWallTime now) const {
|
| if (server_config_.empty()) {
|
| - RecordServerConfigState(SERVER_CONFIG_EMPTY);
|
| + RecordInchoateClientHelloReason(SERVER_CONFIG_EMPTY);
|
| return false;
|
| }
|
|
|
| if (!server_config_valid_) {
|
| - RecordServerConfigState(SERVER_CONFIG_INVALID);
|
| + RecordInchoateClientHelloReason(SERVER_CONFIG_INVALID);
|
| return false;
|
| }
|
|
|
| @@ -85,13 +81,13 @@ bool QuicCryptoClientConfig::CachedState::IsComplete(QuicWallTime now) const {
|
| if (!scfg) {
|
| // Should be impossible short of cache corruption.
|
| DCHECK(false);
|
| - RecordServerConfigState(SERVER_CONFIG_CORRUPTED);
|
| + RecordInchoateClientHelloReason(SERVER_CONFIG_CORRUPTED);
|
| return false;
|
| }
|
|
|
| uint64 expiry_seconds;
|
| if (scfg->GetUint64(kEXPY, &expiry_seconds) != QUIC_NO_ERROR) {
|
| - RecordServerConfigState(SERVER_CONFIG_INVALID_EXPIRY);
|
| + RecordInchoateClientHelloReason(SERVER_CONFIG_INVALID_EXPIRY);
|
| return false;
|
| }
|
| if (now.ToUNIXSeconds() >= expiry_seconds) {
|
| @@ -99,7 +95,7 @@ bool QuicCryptoClientConfig::CachedState::IsComplete(QuicWallTime now) const {
|
| "Net.QuicClientHelloServerConfig.InvalidDuration",
|
| base::TimeDelta::FromSeconds(now.ToUNIXSeconds() - expiry_seconds),
|
| base::TimeDelta::FromMinutes(1), base::TimeDelta::FromDays(20), 50);
|
| - RecordServerConfigState(SERVER_CONFIG_EXPIRED);
|
| + RecordInchoateClientHelloReason(SERVER_CONFIG_EXPIRED);
|
| return false;
|
| }
|
|
|
| @@ -123,7 +119,8 @@ QuicCryptoClientConfig::CachedState::GetServerConfig() const {
|
| return scfg_.get();
|
| }
|
|
|
| -QuicErrorCode QuicCryptoClientConfig::CachedState::SetServerConfig(
|
| +QuicCryptoClientConfig::CachedState::ServerConfigState
|
| +QuicCryptoClientConfig::CachedState::SetServerConfig(
|
| StringPiece server_config, QuicWallTime now, string* error_details) {
|
| const bool matches_existing = server_config == server_config_;
|
|
|
| @@ -141,18 +138,18 @@ QuicErrorCode QuicCryptoClientConfig::CachedState::SetServerConfig(
|
|
|
| if (!new_scfg) {
|
| *error_details = "SCFG invalid";
|
| - return QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER;
|
| + return SERVER_CONFIG_INVALID;
|
| }
|
|
|
| uint64 expiry_seconds;
|
| if (new_scfg->GetUint64(kEXPY, &expiry_seconds) != QUIC_NO_ERROR) {
|
| *error_details = "SCFG missing EXPY";
|
| - return QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER;
|
| + return SERVER_CONFIG_INVALID_EXPIRY;
|
| }
|
|
|
| if (now.ToUNIXSeconds() >= expiry_seconds) {
|
| *error_details = "SCFG has expired";
|
| - return QUIC_CRYPTO_SERVER_CONFIG_EXPIRED;
|
| + return SERVER_CONFIG_EXPIRED;
|
| }
|
|
|
| if (!matches_existing) {
|
| @@ -160,7 +157,7 @@ QuicErrorCode QuicCryptoClientConfig::CachedState::SetServerConfig(
|
| SetProofInvalid();
|
| scfg_.reset(new_scfg_storage.release());
|
| }
|
| - return QUIC_NO_ERROR;
|
| + return SERVER_CONFIG_VALID;
|
| }
|
|
|
| void QuicCryptoClientConfig::CachedState::InvalidateServerConfig() {
|
| @@ -228,13 +225,15 @@ bool QuicCryptoClientConfig::CachedState::Initialize(
|
| DCHECK(server_config_.empty());
|
|
|
| if (server_config.empty()) {
|
| + RecordDiskCacheServerConfigState(SERVER_CONFIG_EMPTY);
|
| return false;
|
| }
|
|
|
| string error_details;
|
| - QuicErrorCode error = SetServerConfig(server_config, now,
|
| - &error_details);
|
| - if (error != QUIC_NO_ERROR) {
|
| + ServerConfigState state = SetServerConfig(server_config, now,
|
| + &error_details);
|
| + RecordDiskCacheServerConfigState(state);
|
| + if (state != SERVER_CONFIG_VALID) {
|
| DVLOG(1) << "SetServerConfig failed with " << error_details;
|
| return false;
|
| }
|
| @@ -325,7 +324,10 @@ QuicCryptoClientConfig::CachedState* QuicCryptoClientConfig::LookupOrCreate(
|
|
|
| CachedState* cached = new CachedState;
|
| cached_states_.insert(make_pair(server_id, cached));
|
| - PopulateFromCanonicalConfig(server_id, cached);
|
| + bool cache_populated = PopulateFromCanonicalConfig(server_id, cached);
|
| + UMA_HISTOGRAM_BOOLEAN(
|
| + "Net.QuicCryptoClientConfig.PopulatedFromCanonicalConfig",
|
| + cache_populated);
|
| return cached;
|
| }
|
|
|
| @@ -591,9 +593,15 @@ QuicErrorCode QuicCryptoClientConfig::CacheNewServerConfig(
|
| return QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND;
|
| }
|
|
|
| - QuicErrorCode error = cached->SetServerConfig(scfg, now, error_details);
|
| - if (error != QUIC_NO_ERROR) {
|
| - return error;
|
| + CachedState::ServerConfigState state = cached->SetServerConfig(
|
| + scfg, now, error_details);
|
| + if (state == CachedState::SERVER_CONFIG_EXPIRED) {
|
| + return QUIC_CRYPTO_SERVER_CONFIG_EXPIRED;
|
| + }
|
| + // TODO(rtenneti): Return more specific error code than returning
|
| + // QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER.
|
| + if (state != CachedState::SERVER_CONFIG_VALID) {
|
| + return QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER;
|
| }
|
|
|
| StringPiece token;
|
| @@ -829,7 +837,7 @@ void QuicCryptoClientConfig::DisableEcdsa() {
|
| disable_ecdsa_ = true;
|
| }
|
|
|
| -void QuicCryptoClientConfig::PopulateFromCanonicalConfig(
|
| +bool QuicCryptoClientConfig::PopulateFromCanonicalConfig(
|
| const QuicServerId& server_id,
|
| CachedState* server_state) {
|
| DCHECK(server_state->IsEmpty());
|
| @@ -840,7 +848,7 @@ void QuicCryptoClientConfig::PopulateFromCanonicalConfig(
|
| }
|
| }
|
| if (i == canonical_suffixes_.size())
|
| - return;
|
| + return false;
|
|
|
| QuicServerId suffix_server_id(canonical_suffixes_[i], server_id.port(),
|
| server_id.is_https(),
|
| @@ -849,20 +857,21 @@ void QuicCryptoClientConfig::PopulateFromCanonicalConfig(
|
| // This is the first host we've seen which matches the suffix, so make it
|
| // canonical.
|
| canonical_server_map_[suffix_server_id] = server_id;
|
| - return;
|
| + return false;
|
| }
|
|
|
| const QuicServerId& canonical_server_id =
|
| canonical_server_map_[suffix_server_id];
|
| CachedState* canonical_state = cached_states_[canonical_server_id];
|
| if (!canonical_state->proof_valid()) {
|
| - return;
|
| + return false;
|
| }
|
|
|
| // Update canonical version to point at the "most recent" entry.
|
| canonical_server_map_[suffix_server_id] = server_id;
|
|
|
| server_state->InitializeFrom(*canonical_state);
|
| + return true;
|
| }
|
|
|
| } // namespace net
|
|
|