Chromium Code Reviews| 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 b37befea03e661e50600e9ec3b5b2136cac00d8d..f81310c1c739704ac29d410ac4e7d80eaeea58de 100644 |
| --- a/net/quic/crypto/quic_crypto_client_config.cc |
| +++ b/net/quic/crypto/quic_crypto_client_config.cc |
| @@ -4,6 +4,7 @@ |
| #include "net/quic/crypto/quic_crypto_client_config.h" |
| +#include "base/metrics/sparse_histogram.h" |
| #include "base/stl_util.h" |
| #include "base/strings/string_util.h" |
| #include "net/quic/crypto/cert_compressor.h" |
| @@ -592,16 +593,79 @@ QuicErrorCode QuicCryptoClientConfig::ProcessRejection( |
| COMPILE_ASSERT(sizeof(QuicTag) == sizeof(uint32), header_out_of_sync); |
| if (rej.GetTaglist(kRREJ, &reject_reasons, |
| &num_reject_reasons) == QUIC_NO_ERROR) { |
| -#if defined(DEBUG) |
| + uint32 packed_error = 0; |
| for (size_t i = 0; i < num_reject_reasons; ++i) { |
| - DVLOG(1) << "Reasons for rejection: " << reject_reasons[i]; |
| + HandshakeFailureReason reason = |
| + static_cast<HandshakeFailureReason>(reject_reasons[i]); |
| + packed_error |= RejectReasonToPackedError(reason); |
| } |
| -#endif |
| + UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicClientHelloRejectReasons", |
| + packed_error); |
| } |
| return QUIC_NO_ERROR; |
| } |
| +uint32 QuicCryptoClientConfig::RejectReasonToPackedError( |
| + HandshakeFailureReason reason) { |
| + enum RejectReasonShifted { |
| + HANDSHAKE_OK_SHIFTED = 0, |
| + |
| + CLIENT_NONCE_UNKNOWN_FAILURE_SHIFTED = 1u << 5, |
| + CLIENT_NONCE_INVALID_FAILURE_SHIFTED = 2u << 5, |
| + |
| + SERVER_NONCE_INVALID_FAILURE_SHIFTED = 1u << 10, |
| + SERVER_NONCE_DECRYPTION_FAILURE_SHIFTED = 2u << 10, |
| + SERVER_NONCE_NOT_UNIQUE_FAILURE_SHIFTED = 3u << 10, |
| + |
| + SERVER_CONFIG_INCHOATE_HELLO_FAILURE_SHIFTED = 1u << 15, |
| + SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE_SHIFTED = 2u << 15, |
| + |
| + SOURCE_ADDRESS_TOKEN_INVALID_FAILURE_SHIFTED = 1u << 20, |
| + SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE_SHIFTED = 2u << 20, |
| + SOURCE_ADDRESS_TOKEN_PARSE_FAILURE_SHIFTED = 3u << 20, |
| + SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE_SHIFTED = 4u << 20, |
| + SOURCE_ADDRESS_TOKEN_CLOCK_SKEW_FAILURE_SHIFTED = 5u << 20, |
| + SOURCE_ADDRESS_TOKEN_EXPIRED_FAILURE_SHIFTED = 6u << 20, |
| + |
| + UNKNOWN_REJECT_REASON_SHIFTED = 1u << 31, |
| + }; |
| + |
| + switch (reason) { |
| + case HANDSHAKE_OK: |
| + return HANDSHAKE_OK_SHIFTED; |
|
Ryan Hamilton
2014/06/23 23:09:43
As discussed offline, might as well just make the
ramant (doing other things)
2014/06/23 23:14:17
Done.
|
| + case CLIENT_NONCE_UNKNOWN_FAILURE: |
| + return CLIENT_NONCE_UNKNOWN_FAILURE_SHIFTED; |
| + case CLIENT_NONCE_INVALID_FAILURE: |
| + return CLIENT_NONCE_INVALID_FAILURE_SHIFTED; |
| + case SERVER_NONCE_INVALID_FAILURE: |
| + return SERVER_NONCE_INVALID_FAILURE_SHIFTED; |
| + case SERVER_NONCE_DECRYPTION_FAILURE: |
| + return SERVER_NONCE_DECRYPTION_FAILURE_SHIFTED; |
| + case SERVER_NONCE_NOT_UNIQUE_FAILURE: |
| + return SERVER_NONCE_NOT_UNIQUE_FAILURE_SHIFTED; |
| + case SERVER_CONFIG_INCHOATE_HELLO_FAILURE: |
| + return SERVER_CONFIG_INCHOATE_HELLO_FAILURE_SHIFTED; |
| + case SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE: |
| + return SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE_SHIFTED; |
| + case SOURCE_ADDRESS_TOKEN_INVALID_FAILURE: |
| + return SOURCE_ADDRESS_TOKEN_INVALID_FAILURE_SHIFTED; |
| + case SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE: |
| + return SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE_SHIFTED; |
| + case SOURCE_ADDRESS_TOKEN_PARSE_FAILURE: |
| + return SOURCE_ADDRESS_TOKEN_PARSE_FAILURE_SHIFTED; |
| + case SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE: |
| + return SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE_SHIFTED; |
| + case SOURCE_ADDRESS_TOKEN_CLOCK_SKEW_FAILURE: |
| + return SOURCE_ADDRESS_TOKEN_CLOCK_SKEW_FAILURE_SHIFTED; |
| + case SOURCE_ADDRESS_TOKEN_EXPIRED_FAILURE: |
| + return SOURCE_ADDRESS_TOKEN_EXPIRED_FAILURE_SHIFTED; |
| + default: |
| + NOTREACHED(); |
| + return UNKNOWN_REJECT_REASON_SHIFTED; |
| + } |
| +} |
| + |
| QuicErrorCode QuicCryptoClientConfig::ProcessServerHello( |
| const CryptoHandshakeMessage& server_hello, |
| QuicConnectionId connection_id, |