stats: implement iceLocalUsernameFragment

https://www.w3.org/TR/webrtc-stats/#dom-rtctransportstats-icelocalusernamefragment

BUG=webrtc:14022

Change-Id: If56ebe66d83f4e535c2245f2ca3848469914679f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/261243
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Philipp Hancke <philipp.hancke@googlemail.com>
Cr-Commit-Position: refs/heads/main@{#36772}
This commit is contained in:
Philipp Hancke
2022-05-05 07:53:54 +02:00
committed by WebRTC LUCI CQ
parent d7fd0f9744
commit 95b1a3497c
7 changed files with 22 additions and 4 deletions

View File

@ -709,6 +709,7 @@ class RTC_EXPORT RTCTransportStats final : public RTCStats {
RTCStatsMember<std::string> srtp_cipher; RTCStatsMember<std::string> srtp_cipher;
RTCStatsMember<uint32_t> selected_candidate_pair_changes; RTCStatsMember<uint32_t> selected_candidate_pair_changes;
RTCStatsMember<std::string> ice_role; RTCStatsMember<std::string> ice_role;
RTCStatsMember<std::string> ice_local_username_fragment;
}; };
} // namespace webrtc } // namespace webrtc

View File

@ -49,6 +49,7 @@ struct IceTransportStats {
uint64_t packets_received = 0; uint64_t packets_received = 0;
IceRole ice_role = ICEROLE_UNKNOWN; IceRole ice_role = ICEROLE_UNKNOWN;
std::string ice_local_username_fragment;
}; };
typedef std::vector<Candidate> Candidates; typedef std::vector<Candidate> Candidates;

View File

@ -1665,6 +1665,7 @@ bool P2PTransportChannel::GetStats(IceTransportStats* ice_transport_stats) {
ice_transport_stats->packets_received = packets_received_; ice_transport_stats->packets_received = packets_received_;
ice_transport_stats->ice_role = GetIceRole(); ice_transport_stats->ice_role = GetIceRole();
ice_transport_stats->ice_local_username_fragment = ice_parameters_.ufrag;
return true; return true;
} }

View File

@ -2116,6 +2116,8 @@ void RTCStatsCollector::ProduceTransportStats_n(
channel_stats.ice_transport_stats.selected_candidate_pair_changes; channel_stats.ice_transport_stats.selected_candidate_pair_changes;
transport_stats->ice_role = transport_stats->ice_role =
IceRoleToRTCIceRole(channel_stats.ice_transport_stats.ice_role); IceRoleToRTCIceRole(channel_stats.ice_transport_stats.ice_role);
transport_stats->ice_local_username_fragment =
channel_stats.ice_transport_stats.ice_local_username_fragment;
for (const cricket::ConnectionInfo& info : for (const cricket::ConnectionInfo& info :
channel_stats.ice_transport_stats.connection_infos) { channel_stats.ice_transport_stats.connection_infos) {
if (info.best_connection) { if (info.best_connection) {

View File

@ -2449,6 +2449,8 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) {
rtp_transport_channel_stats.ice_transport_stats.packets_received = 4; rtp_transport_channel_stats.ice_transport_stats.packets_received = 4;
rtp_transport_channel_stats.ice_transport_stats rtp_transport_channel_stats.ice_transport_stats
.selected_candidate_pair_changes = 1; .selected_candidate_pair_changes = 1;
rtp_transport_channel_stats.ice_transport_stats.ice_local_username_fragment =
"thelocalufrag";
pc_->SetTransportStats(kTransportName, {rtp_transport_channel_stats}); pc_->SetTransportStats(kTransportName, {rtp_transport_channel_stats});
// Get stats without RTCP, an active connection or certificates. // Get stats without RTCP, an active connection or certificates.
@ -2466,6 +2468,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) {
expected_rtp_transport.dtls_role = RTCDtlsRole::kUnknown; expected_rtp_transport.dtls_role = RTCDtlsRole::kUnknown;
expected_rtp_transport.selected_candidate_pair_changes = 1; expected_rtp_transport.selected_candidate_pair_changes = 1;
expected_rtp_transport.ice_role = RTCIceRole::kUnknown; expected_rtp_transport.ice_role = RTCIceRole::kUnknown;
expected_rtp_transport.ice_local_username_fragment = "thelocalufrag";
ASSERT_TRUE(report->Get(expected_rtp_transport.id())); ASSERT_TRUE(report->Get(expected_rtp_transport.id()));
EXPECT_EQ( EXPECT_EQ(
@ -2491,6 +2494,8 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) {
rtcp_transport_channel_stats.ice_transport_stats.packets_sent = 1; rtcp_transport_channel_stats.ice_transport_stats.packets_sent = 1;
rtcp_transport_channel_stats.ice_transport_stats.bytes_received = 42; rtcp_transport_channel_stats.ice_transport_stats.bytes_received = 42;
rtcp_transport_channel_stats.ice_transport_stats.packets_received = 4; rtcp_transport_channel_stats.ice_transport_stats.packets_received = 4;
rtcp_transport_channel_stats.ice_transport_stats.ice_local_username_fragment =
"thelocalufrag";
pc_->SetTransportStats(kTransportName, {rtp_transport_channel_stats, pc_->SetTransportStats(kTransportName, {rtp_transport_channel_stats,
rtcp_transport_channel_stats}); rtcp_transport_channel_stats});
@ -2509,6 +2514,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) {
expected_rtcp_transport.dtls_role = RTCDtlsRole::kUnknown; expected_rtcp_transport.dtls_role = RTCDtlsRole::kUnknown;
expected_rtcp_transport.selected_candidate_pair_changes = 0; expected_rtcp_transport.selected_candidate_pair_changes = 0;
expected_rtcp_transport.ice_role = RTCIceRole::kUnknown; expected_rtcp_transport.ice_role = RTCIceRole::kUnknown;
expected_rtcp_transport.ice_local_username_fragment = "thelocalufrag";
expected_rtp_transport.rtcp_transport_stats_id = expected_rtcp_transport.id(); expected_rtp_transport.rtcp_transport_stats_id = expected_rtcp_transport.id();
ASSERT_TRUE(report->Get(expected_rtp_transport.id())); ASSERT_TRUE(report->Get(expected_rtp_transport.id()));
@ -2610,6 +2616,8 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStatsWithCrypto) {
rtp_transport_channel_stats.dtls_role = rtc::SSL_CLIENT; rtp_transport_channel_stats.dtls_role = rtc::SSL_CLIENT;
rtp_transport_channel_stats.ice_transport_stats.ice_role = rtp_transport_channel_stats.ice_transport_stats.ice_role =
cricket::ICEROLE_CONTROLLING; cricket::ICEROLE_CONTROLLING;
rtp_transport_channel_stats.ice_transport_stats.ice_local_username_fragment =
"thelocalufrag";
// 0x2F is TLS_RSA_WITH_AES_128_CBC_SHA according to IANA // 0x2F is TLS_RSA_WITH_AES_128_CBC_SHA according to IANA
rtp_transport_channel_stats.ssl_cipher_suite = 0x2F; rtp_transport_channel_stats.ssl_cipher_suite = 0x2F;
rtp_transport_channel_stats.srtp_crypto_suite = rtc::kSrtpAes128CmSha1_80; rtp_transport_channel_stats.srtp_crypto_suite = rtc::kSrtpAes128CmSha1_80;
@ -2629,10 +2637,11 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStatsWithCrypto) {
expected_rtp_transport.bytes_received = 0; expected_rtp_transport.bytes_received = 0;
expected_rtp_transport.packets_sent = 0; expected_rtp_transport.packets_sent = 0;
expected_rtp_transport.packets_received = 0; expected_rtp_transport.packets_received = 0;
expected_rtp_transport.ice_role = RTCIceRole::kControlling;
expected_rtp_transport.ice_local_username_fragment = "thelocalufrag";
// Crypto parameters // Crypto parameters
expected_rtp_transport.tls_version = "0203"; expected_rtp_transport.tls_version = "0203";
expected_rtp_transport.dtls_role = RTCDtlsRole::kClient; expected_rtp_transport.dtls_role = RTCDtlsRole::kClient;
expected_rtp_transport.ice_role = RTCIceRole::kControlling;
expected_rtp_transport.dtls_cipher = "TLS_RSA_WITH_AES_128_CBC_SHA"; expected_rtp_transport.dtls_cipher = "TLS_RSA_WITH_AES_128_CBC_SHA";
expected_rtp_transport.srtp_cipher = "AES_CM_128_HMAC_SHA1_80"; expected_rtp_transport.srtp_cipher = "AES_CM_128_HMAC_SHA1_80";

View File

@ -1144,6 +1144,7 @@ class RTCStatsReportVerifier {
verifier.TestMemberIsPositive<uint32_t>( verifier.TestMemberIsPositive<uint32_t>(
transport.selected_candidate_pair_changes); transport.selected_candidate_pair_changes);
verifier.TestMemberIsDefined(transport.ice_role); verifier.TestMemberIsDefined(transport.ice_role);
verifier.TestMemberIsDefined(transport.ice_local_username_fragment);
return verifier.ExpectAllMembersSuccessfullyTested(); return verifier.ExpectAllMembersSuccessfullyTested();
} }

View File

@ -1098,7 +1098,8 @@ WEBRTC_RTCSTATS_IMPL(RTCTransportStats, RTCStats, "transport",
&dtls_role, &dtls_role,
&srtp_cipher, &srtp_cipher,
&selected_candidate_pair_changes, &selected_candidate_pair_changes,
&ice_role) &ice_role,
&ice_local_username_fragment)
// clang-format on // clang-format on
RTCTransportStats::RTCTransportStats(const std::string& id, RTCTransportStats::RTCTransportStats(const std::string& id,
@ -1121,7 +1122,8 @@ RTCTransportStats::RTCTransportStats(std::string&& id, int64_t timestamp_us)
dtls_role("dtlsRole"), dtls_role("dtlsRole"),
srtp_cipher("srtpCipher"), srtp_cipher("srtpCipher"),
selected_candidate_pair_changes("selectedCandidatePairChanges"), selected_candidate_pair_changes("selectedCandidatePairChanges"),
ice_role("iceRole") {} ice_role("iceRole"),
ice_local_username_fragment("iceLocalUsernameFragment") {}
RTCTransportStats::RTCTransportStats(const RTCTransportStats& other) RTCTransportStats::RTCTransportStats(const RTCTransportStats& other)
: RTCStats(other.id(), other.timestamp_us()), : RTCStats(other.id(), other.timestamp_us()),
@ -1139,7 +1141,8 @@ RTCTransportStats::RTCTransportStats(const RTCTransportStats& other)
dtls_role(other.dtls_role), dtls_role(other.dtls_role),
srtp_cipher(other.srtp_cipher), srtp_cipher(other.srtp_cipher),
selected_candidate_pair_changes(other.selected_candidate_pair_changes), selected_candidate_pair_changes(other.selected_candidate_pair_changes),
ice_role(other.ice_role) {} ice_role(other.ice_role),
ice_local_username_fragment(other.ice_local_username_fragment) {}
RTCTransportStats::~RTCTransportStats() {} RTCTransportStats::~RTCTransportStats() {}