stats: add dtlsRole to transport

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 <hbos@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Philipp Hancke <philipp.hancke@googlemail.com>
Cr-Commit-Position: refs/heads/main@{#36730}
This commit is contained in:
Philipp Hancke 2022-04-22 15:46:24 +02:00 committed by WebRTC LUCI CQ
parent 8c354882f8
commit 69c1df2f44
7 changed files with 35 additions and 0 deletions

View File

@ -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<std::string> remote_certificate_id;
RTCStatsMember<std::string> tls_version;
RTCStatsMember<std::string> dtls_cipher;
RTCStatsMember<std::string> dtls_role;
RTCStatsMember<std::string> srtp_cipher;
RTCStatsMember<uint32_t> selected_candidate_pair_changes;
};

View File

@ -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;

View File

@ -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)

View File

@ -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";

View File

@ -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<uint32_t>(
transport.selected_candidate_pair_changes);

View File

@ -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<rtc::SSLRole> dtls_role;
webrtc::DtlsTransportState dtls_state = webrtc::DtlsTransportState::kNew;
IceTransportStats ice_transport_stats;
};

View File

@ -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) {}