summaryrefslogtreecommitdiffstats
path: root/dom/media/webrtc/transport/transportlayerdtls.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webrtc/transport/transportlayerdtls.cpp')
-rw-r--r--dom/media/webrtc/transport/transportlayerdtls.cpp103
1 files changed, 43 insertions, 60 deletions
diff --git a/dom/media/webrtc/transport/transportlayerdtls.cpp b/dom/media/webrtc/transport/transportlayerdtls.cpp
index 4ab8aaa029..1279726bce 100644
--- a/dom/media/webrtc/transport/transportlayerdtls.cpp
+++ b/dom/media/webrtc/transport/transportlayerdtls.cpp
@@ -9,12 +9,14 @@
#include "transportlayerdtls.h"
#include <algorithm>
+#include <iomanip>
#include <queue>
#include <sstream>
#include "dtlsidentity.h"
#include "keyhi.h"
#include "logging.h"
+#include "mozilla/glean/GleanMetrics.h"
#include "mozilla/Telemetry.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/Unused.h"
@@ -889,6 +891,7 @@ void TransportLayerDtls::Handshake() {
if (!cert_ok_) {
MOZ_MTLOG(ML_ERROR, LAYER_INFO << "Certificate check never occurred");
TL_SET_STATE(TS_ERROR);
+ RecordHandshakeCompletionTelemetry("CERT_FAILURE");
return;
}
if (!CheckAlpn()) {
@@ -897,11 +900,13 @@ void TransportLayerDtls::Handshake() {
// (assuming the close_notify isn't dropped).
ssl_fd_ = nullptr;
TL_SET_STATE(TS_ERROR);
+ RecordHandshakeCompletionTelemetry("ALPN_FAILURE");
return;
}
TL_SET_STATE(TS_OPEN);
+ RecordHandshakeCompletionTelemetry("SUCCESS");
RecordTlsTelemetry();
timer_ = nullptr;
} else {
@@ -932,6 +937,7 @@ void TransportLayerDtls::Handshake() {
MOZ_MTLOG(ML_ERROR, LAYER_INFO << "DTLS handshake error " << err << " ("
<< err_msg << ")");
TL_SET_STATE(TS_ERROR);
+ RecordHandshakeCompletionTelemetry(err_msg);
break;
}
}
@@ -1468,6 +1474,17 @@ void TransportLayerDtls::TimerCallback(nsITimer* timer, void* arg) {
dtls->Handshake();
}
+void TransportLayerDtls::RecordHandshakeCompletionTelemetry(
+ const char* aResult) {
+ if (role_ == CLIENT) {
+ mozilla::glean::webrtcdtls::client_handshake_result.Get(nsCString(aResult))
+ .Add(1);
+ } else {
+ mozilla::glean::webrtcdtls::server_handshake_result.Get(nsCString(aResult))
+ .Add(1);
+ }
+}
+
void TransportLayerDtls::RecordTlsTelemetry() {
MOZ_ASSERT(state_ == TS_OPEN);
SSLChannelInfo info;
@@ -1478,54 +1495,29 @@ void TransportLayerDtls::RecordTlsTelemetry() {
return;
}
- uint16_t telemetry_cipher = 0;
-
- switch (info.cipherSuite) {
- /* Old DHE ciphers: candidates for removal, see bug 1227519 */
- case TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
- telemetry_cipher = 1;
- break;
- case TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
- telemetry_cipher = 2;
- break;
- /* Current ciphers */
- case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
- telemetry_cipher = 3;
- break;
- case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
- telemetry_cipher = 4;
- break;
- case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
- telemetry_cipher = 5;
- break;
- case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
- telemetry_cipher = 6;
- break;
- case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
- telemetry_cipher = 7;
+ switch (info.protocolVersion) {
+ case SSL_LIBRARY_VERSION_TLS_1_1:
+ mozilla::glean::webrtcdtls::protocol_version.Get("1.0"_ns).Add(1);
break;
- case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
- telemetry_cipher = 8;
+ case SSL_LIBRARY_VERSION_TLS_1_2:
+ mozilla::glean::webrtcdtls::protocol_version.Get("1.2"_ns).Add(1);
break;
- case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
- telemetry_cipher = 9;
- break;
- case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
- telemetry_cipher = 10;
- break;
- /* TLS 1.3 ciphers */
- case TLS_AES_128_GCM_SHA256:
- telemetry_cipher = 11;
- break;
- case TLS_CHACHA20_POLY1305_SHA256:
- telemetry_cipher = 12;
- break;
- case TLS_AES_256_GCM_SHA384:
- telemetry_cipher = 13;
+ case SSL_LIBRARY_VERSION_TLS_1_3:
+ mozilla::glean::webrtcdtls::protocol_version.Get("1.3"_ns).Add(1);
break;
+ default:
+ MOZ_CRASH("Unknown SSL version");
}
- Telemetry::Accumulate(Telemetry::WEBRTC_DTLS_CIPHER, telemetry_cipher);
+ {
+ std::ostringstream oss;
+ // Record TLS cipher-suite ID as a string (eg;
+ // TLS_DHE_RSA_WITH_AES_128_CBC_SHA is 0x0033)
+ oss << "0x" << std::setfill('0') << std::setw(4) << std::hex
+ << info.cipherSuite;
+ mozilla::glean::webrtcdtls::cipher.Get(nsCString(oss.str().c_str())).Add(1);
+ MOZ_MTLOG(ML_DEBUG, "cipher: " << oss.str());
+ }
uint16_t cipher;
nsresult rv = GetSrtpCipher(&cipher);
@@ -1535,24 +1527,15 @@ void TransportLayerDtls::RecordTlsTelemetry() {
return;
}
- auto cipher_label = mozilla::Telemetry::LABELS_WEBRTC_SRTP_CIPHER::Unknown;
-
- switch (cipher) {
- case kDtlsSrtpAes128CmHmacSha1_80:
- cipher_label = Telemetry::LABELS_WEBRTC_SRTP_CIPHER::Aes128CmHmacSha1_80;
- break;
- case kDtlsSrtpAes128CmHmacSha1_32:
- cipher_label = Telemetry::LABELS_WEBRTC_SRTP_CIPHER::Aes128CmHmacSha1_32;
- break;
- case kDtlsSrtpAeadAes128Gcm:
- cipher_label = Telemetry::LABELS_WEBRTC_SRTP_CIPHER::AeadAes128Gcm;
- break;
- case kDtlsSrtpAeadAes256Gcm:
- cipher_label = Telemetry::LABELS_WEBRTC_SRTP_CIPHER::AeadAes256Gcm;
- break;
+ {
+ std::ostringstream oss;
+ // Record SRTP cipher-suite ID as a string (eg;
+ // SRTP_AES128_CM_HMAC_SHA1_80 is 0x0001)
+ oss << "0x" << std::setfill('0') << std::setw(4) << std::hex << cipher;
+ mozilla::glean::webrtcdtls::srtp_cipher.Get(nsCString(oss.str().c_str()))
+ .Add(1);
+ MOZ_MTLOG(ML_DEBUG, "srtp cipher: " << oss.str());
}
-
- Telemetry::AccumulateCategorical(cipher_label);
}
} // namespace mozilla