From 69c1df2f440d939a76ec5c61d15b3aa99bbb13f4 Mon Sep 17 00:00:00 2001 From: Philipp Hancke Date: Fri, 22 Apr 2022 15:46:24 +0200 Subject: [PATCH] stats: add dtlsRole to transport MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://w3c.github.io/webrtc-stats/#dom-rtctransportstats-dtlsrole BUG=webrtc:13978 Change-Id: Ib158427d2df0307884381bdd46c411f60f56a371 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/259761 Reviewed-by: Henrik Boström Reviewed-by: Harald Alvestrand Commit-Queue: Philipp Hancke Cr-Commit-Position: refs/heads/main@{#36730} --- api/stats/rtcstats_objects.h | 8 ++++++++ pc/jsep_transport.cc | 4 ++++ pc/rtc_stats_collector.cc | 9 +++++++++ pc/rtc_stats_collector_unittest.cc | 4 ++++ pc/rtc_stats_integrationtest.cc | 1 + pc/transport_stats.h | 1 + stats/rtcstats_objects.cc | 8 ++++++++ 7 files changed, 35 insertions(+) diff --git a/api/stats/rtcstats_objects.h b/api/stats/rtcstats_objects.h index bcf606f848..a6d78f8ddb 100644 --- a/api/stats/rtcstats_objects.h +++ b/api/stats/rtcstats_objects.h @@ -90,6 +90,13 @@ struct RTCContentType { static const char* const kScreenshare; }; +// https://w3c.github.io/webrtc-stats/#dom-rtcdtlsrole +struct RTCDtlsRole { + static const char* const kUnknown; + static const char* const kClient; + static const char* const kServer; +}; + // https://w3c.github.io/webrtc-stats/#certificatestats-dict* class RTC_EXPORT RTCCertificateStats final : public RTCStats { public: @@ -689,6 +696,7 @@ class RTC_EXPORT RTCTransportStats final : public RTCStats { RTCStatsMember remote_certificate_id; RTCStatsMember tls_version; RTCStatsMember dtls_cipher; + RTCStatsMember dtls_role; RTCStatsMember srtp_cipher; RTCStatsMember selected_candidate_pair_changes; }; diff --git a/pc/jsep_transport.cc b/pc/jsep_transport.cc index b6fb1897c6..65dd703e6c 100644 --- a/pc/jsep_transport.cc +++ b/pc/jsep_transport.cc @@ -714,6 +714,10 @@ bool JsepTransport::GetTransportStats(DtlsTransportInternal* dtls_transport, dtls_transport->GetSrtpCryptoSuite(&substats.srtp_crypto_suite); dtls_transport->GetSslCipherSuite(&substats.ssl_cipher_suite); substats.dtls_state = dtls_transport->dtls_state(); + rtc::SSLRole dtls_role; + if (dtls_transport->GetDtlsRole(&dtls_role)) { + substats.dtls_role = dtls_role; + } if (!dtls_transport->ice_transport()->GetStats( &substats.ice_transport_stats)) { return false; diff --git a/pc/rtc_stats_collector.cc b/pc/rtc_stats_collector.cc index 0a8f531ac6..5ceeba8c8c 100644 --- a/pc/rtc_stats_collector.cc +++ b/pc/rtc_stats_collector.cc @@ -2118,6 +2118,15 @@ void RTCStatsCollector::ProduceTransportStats_n( snprintf(bytes, sizeof(bytes), "%04X", channel_stats.ssl_version_bytes); transport_stats->tls_version = bytes; } + + if (channel_stats.dtls_role) { + transport_stats->dtls_role = *channel_stats.dtls_role == rtc::SSL_CLIENT + ? webrtc::RTCDtlsRole::kClient + : webrtc::RTCDtlsRole::kServer; + } else { + transport_stats->dtls_role = webrtc::RTCDtlsRole::kUnknown; + } + if (channel_stats.ssl_cipher_suite != rtc::kTlsNullWithNullNull && rtc::SSLStreamAdapter::SslCipherSuiteToName( channel_stats.ssl_cipher_suite) diff --git a/pc/rtc_stats_collector_unittest.cc b/pc/rtc_stats_collector_unittest.cc index 82de9f0cb5..942d308b04 100644 --- a/pc/rtc_stats_collector_unittest.cc +++ b/pc/rtc_stats_collector_unittest.cc @@ -2460,6 +2460,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) { expected_rtp_transport.bytes_received = 1337; expected_rtp_transport.packets_received = 4; expected_rtp_transport.dtls_state = RTCDtlsTransportState::kNew; + expected_rtp_transport.dtls_role = RTCDtlsRole::kUnknown; expected_rtp_transport.selected_candidate_pair_changes = 1; ASSERT_TRUE(report->Get(expected_rtp_transport.id())); @@ -2501,6 +2502,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) { expected_rtcp_transport.bytes_received = 42; expected_rtcp_transport.packets_received = 4; expected_rtcp_transport.dtls_state = RTCDtlsTransportState::kConnecting; + expected_rtcp_transport.dtls_role = RTCDtlsRole::kUnknown; expected_rtcp_transport.selected_candidate_pair_changes = 0; expected_rtp_transport.rtcp_transport_stats_id = expected_rtcp_transport.id(); @@ -2600,6 +2602,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStatsWithCrypto) { rtp_transport_channel_stats.ice_transport_stats .selected_candidate_pair_changes = 1; rtp_transport_channel_stats.ssl_version_bytes = 0x0203; + rtp_transport_channel_stats.dtls_role = rtc::SSL_CLIENT; // 0x2F is TLS_RSA_WITH_AES_128_CBC_SHA according to IANA rtp_transport_channel_stats.ssl_cipher_suite = 0x2F; rtp_transport_channel_stats.srtp_crypto_suite = rtc::kSrtpAes128CmSha1_80; @@ -2620,6 +2623,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStatsWithCrypto) { expected_rtp_transport.packets_received = 0; // Crypto parameters expected_rtp_transport.tls_version = "0203"; + expected_rtp_transport.dtls_role = RTCDtlsRole::kClient; expected_rtp_transport.dtls_cipher = "TLS_RSA_WITH_AES_128_CBC_SHA"; expected_rtp_transport.srtp_cipher = "AES_CM_128_HMAC_SHA1_80"; diff --git a/pc/rtc_stats_integrationtest.cc b/pc/rtc_stats_integrationtest.cc index 956f414109..07a8bdcc87 100644 --- a/pc/rtc_stats_integrationtest.cc +++ b/pc/rtc_stats_integrationtest.cc @@ -1136,6 +1136,7 @@ class RTCStatsReportVerifier { RTCCertificateStats::kType); verifier.TestMemberIsDefined(transport.tls_version); verifier.TestMemberIsDefined(transport.dtls_cipher); + verifier.TestMemberIsDefined(transport.dtls_role); verifier.TestMemberIsDefined(transport.srtp_cipher); verifier.TestMemberIsPositive( transport.selected_candidate_pair_changes); diff --git a/pc/transport_stats.h b/pc/transport_stats.h index 2f43d45808..e554385954 100644 --- a/pc/transport_stats.h +++ b/pc/transport_stats.h @@ -31,6 +31,7 @@ struct TransportChannelStats { int ssl_version_bytes = 0; int srtp_crypto_suite = rtc::kSrtpInvalidCryptoSuite; int ssl_cipher_suite = rtc::kTlsNullWithNullNull; + absl::optional dtls_role; webrtc::DtlsTransportState dtls_state = webrtc::DtlsTransportState::kNew; IceTransportStats ice_transport_stats; }; diff --git a/stats/rtcstats_objects.cc b/stats/rtcstats_objects.cc index 3b962b68ae..ae90bf394d 100644 --- a/stats/rtcstats_objects.cc +++ b/stats/rtcstats_objects.cc @@ -62,6 +62,11 @@ const char* const RTCQualityLimitationReason::kOther = "other"; const char* const RTCContentType::kUnspecified = "unspecified"; const char* const RTCContentType::kScreenshare = "screenshare"; +// https://w3c.github.io/webrtc-stats/#dom-rtcdtlsrole +const char* const RTCDtlsRole::kUnknown = "unknown"; +const char* const RTCDtlsRole::kClient = "client"; +const char* const RTCDtlsRole::kServer = "server"; + // clang-format off WEBRTC_RTCSTATS_IMPL(RTCCertificateStats, RTCStats, "certificate", &fingerprint, @@ -1082,6 +1087,7 @@ WEBRTC_RTCSTATS_IMPL(RTCTransportStats, RTCStats, "transport", &remote_certificate_id, &tls_version, &dtls_cipher, + &dtls_role, &srtp_cipher, &selected_candidate_pair_changes) // clang-format on @@ -1103,6 +1109,7 @@ RTCTransportStats::RTCTransportStats(std::string&& id, int64_t timestamp_us) remote_certificate_id("remoteCertificateId"), tls_version("tlsVersion"), dtls_cipher("dtlsCipher"), + dtls_role("dtlsRole"), srtp_cipher("srtpCipher"), selected_candidate_pair_changes("selectedCandidatePairChanges") {} @@ -1119,6 +1126,7 @@ RTCTransportStats::RTCTransportStats(const RTCTransportStats& other) remote_certificate_id(other.remote_certificate_id), tls_version(other.tls_version), dtls_cipher(other.dtls_cipher), + dtls_role(other.dtls_role), srtp_cipher(other.srtp_cipher), selected_candidate_pair_changes(other.selected_candidate_pair_changes) {}