stats: implement transport iceState
https://w3c.github.io/webrtc-stats/#dom-rtctransportstats-selectedcandidatepairid BUG=webrtc:14022 Change-Id: I206bff7048d2df3e3aff0af55072097f49d54e8f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/261720 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@{#36840}
This commit is contained in:
committed by
WebRTC LUCI CQ
parent
cf4ed1516e
commit
1f49157b41
@ -104,6 +104,17 @@ struct RTCIceRole {
|
|||||||
static const char* const kControlling;
|
static const char* const kControlling;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// https://www.w3.org/TR/webrtc/#dom-rtcicetransportstate
|
||||||
|
struct RTCIceTransportState {
|
||||||
|
static const char* const kNew;
|
||||||
|
static const char* const kChecking;
|
||||||
|
static const char* const kConnected;
|
||||||
|
static const char* const kCompleted;
|
||||||
|
static const char* const kDisconnected;
|
||||||
|
static const char* const kFailed;
|
||||||
|
static const char* const kClosed;
|
||||||
|
};
|
||||||
|
|
||||||
// https://w3c.github.io/webrtc-stats/#certificatestats-dict*
|
// https://w3c.github.io/webrtc-stats/#certificatestats-dict*
|
||||||
class RTC_EXPORT RTCCertificateStats final : public RTCStats {
|
class RTC_EXPORT RTCCertificateStats final : public RTCStats {
|
||||||
public:
|
public:
|
||||||
@ -710,6 +721,7 @@ class RTC_EXPORT RTCTransportStats final : public RTCStats {
|
|||||||
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;
|
RTCStatsMember<std::string> ice_local_username_fragment;
|
||||||
|
RTCStatsMember<std::string> ice_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
@ -50,6 +50,7 @@ struct IceTransportStats {
|
|||||||
|
|
||||||
IceRole ice_role = ICEROLE_UNKNOWN;
|
IceRole ice_role = ICEROLE_UNKNOWN;
|
||||||
std::string ice_local_username_fragment;
|
std::string ice_local_username_fragment;
|
||||||
|
webrtc::IceTransportState ice_state = webrtc::IceTransportState::kNew;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<Candidate> Candidates;
|
typedef std::vector<Candidate> Candidates;
|
||||||
|
|||||||
@ -1666,6 +1666,7 @@ bool P2PTransportChannel::GetStats(IceTransportStats* ice_transport_stats) {
|
|||||||
|
|
||||||
ice_transport_stats->ice_role = GetIceRole();
|
ice_transport_stats->ice_role = GetIceRole();
|
||||||
ice_transport_stats->ice_local_username_fragment = ice_parameters_.ufrag;
|
ice_transport_stats->ice_local_username_fragment = ice_parameters_.ufrag;
|
||||||
|
ice_transport_stats->ice_state = ComputeIceTransportState();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -243,6 +243,28 @@ const char* DtlsTransportStateToRTCDtlsTransportState(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* IceTransportStateToRTCIceTransportState(IceTransportState state) {
|
||||||
|
switch (state) {
|
||||||
|
case IceTransportState::kNew:
|
||||||
|
return RTCIceTransportState::kNew;
|
||||||
|
case IceTransportState::kChecking:
|
||||||
|
return RTCIceTransportState::kChecking;
|
||||||
|
case IceTransportState::kConnected:
|
||||||
|
return RTCIceTransportState::kConnected;
|
||||||
|
case IceTransportState::kCompleted:
|
||||||
|
return RTCIceTransportState::kCompleted;
|
||||||
|
case IceTransportState::kFailed:
|
||||||
|
return RTCIceTransportState::kFailed;
|
||||||
|
case IceTransportState::kDisconnected:
|
||||||
|
return RTCIceTransportState::kDisconnected;
|
||||||
|
case IceTransportState::kClosed:
|
||||||
|
return RTCIceTransportState::kClosed;
|
||||||
|
default:
|
||||||
|
RTC_CHECK_NOTREACHED();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const char* NetworkTypeToStatsType(rtc::AdapterType type) {
|
const char* NetworkTypeToStatsType(rtc::AdapterType type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case rtc::ADAPTER_TYPE_CELLULAR:
|
case rtc::ADAPTER_TYPE_CELLULAR:
|
||||||
@ -2118,6 +2140,8 @@ void RTCStatsCollector::ProduceTransportStats_n(
|
|||||||
IceRoleToRTCIceRole(channel_stats.ice_transport_stats.ice_role);
|
IceRoleToRTCIceRole(channel_stats.ice_transport_stats.ice_role);
|
||||||
transport_stats->ice_local_username_fragment =
|
transport_stats->ice_local_username_fragment =
|
||||||
channel_stats.ice_transport_stats.ice_local_username_fragment;
|
channel_stats.ice_transport_stats.ice_local_username_fragment;
|
||||||
|
transport_stats->ice_state = IceTransportStateToRTCIceTransportState(
|
||||||
|
channel_stats.ice_transport_stats.ice_state);
|
||||||
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) {
|
||||||
|
|||||||
@ -2469,6 +2469,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) {
|
|||||||
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";
|
expected_rtp_transport.ice_local_username_fragment = "thelocalufrag";
|
||||||
|
expected_rtp_transport.ice_state = RTCIceTransportState::kNew;
|
||||||
|
|
||||||
ASSERT_TRUE(report->Get(expected_rtp_transport.id()));
|
ASSERT_TRUE(report->Get(expected_rtp_transport.id()));
|
||||||
EXPECT_EQ(
|
EXPECT_EQ(
|
||||||
@ -2496,6 +2497,8 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) {
|
|||||||
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 =
|
rtcp_transport_channel_stats.ice_transport_stats.ice_local_username_fragment =
|
||||||
"thelocalufrag";
|
"thelocalufrag";
|
||||||
|
rtcp_transport_channel_stats.ice_transport_stats.ice_state =
|
||||||
|
IceTransportState::kChecking;
|
||||||
pc_->SetTransportStats(kTransportName, {rtp_transport_channel_stats,
|
pc_->SetTransportStats(kTransportName, {rtp_transport_channel_stats,
|
||||||
rtcp_transport_channel_stats});
|
rtcp_transport_channel_stats});
|
||||||
|
|
||||||
@ -2515,6 +2518,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) {
|
|||||||
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_rtcp_transport.ice_local_username_fragment = "thelocalufrag";
|
||||||
|
expected_rtcp_transport.ice_state = RTCIceTransportState::kChecking;
|
||||||
|
|
||||||
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()));
|
||||||
@ -2618,6 +2622,8 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStatsWithCrypto) {
|
|||||||
cricket::ICEROLE_CONTROLLING;
|
cricket::ICEROLE_CONTROLLING;
|
||||||
rtp_transport_channel_stats.ice_transport_stats.ice_local_username_fragment =
|
rtp_transport_channel_stats.ice_transport_stats.ice_local_username_fragment =
|
||||||
"thelocalufrag";
|
"thelocalufrag";
|
||||||
|
rtp_transport_channel_stats.ice_transport_stats.ice_state =
|
||||||
|
IceTransportState::kConnected;
|
||||||
// 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;
|
||||||
@ -2639,6 +2645,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCTransportStatsWithCrypto) {
|
|||||||
expected_rtp_transport.packets_received = 0;
|
expected_rtp_transport.packets_received = 0;
|
||||||
expected_rtp_transport.ice_role = RTCIceRole::kControlling;
|
expected_rtp_transport.ice_role = RTCIceRole::kControlling;
|
||||||
expected_rtp_transport.ice_local_username_fragment = "thelocalufrag";
|
expected_rtp_transport.ice_local_username_fragment = "thelocalufrag";
|
||||||
|
expected_rtp_transport.ice_state = "connected";
|
||||||
// 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;
|
||||||
|
|||||||
@ -1145,6 +1145,7 @@ class RTCStatsReportVerifier {
|
|||||||
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);
|
verifier.TestMemberIsDefined(transport.ice_local_username_fragment);
|
||||||
|
verifier.TestMemberIsDefined(transport.ice_state);
|
||||||
return verifier.ExpectAllMembersSuccessfullyTested();
|
return verifier.ExpectAllMembersSuccessfullyTested();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -72,6 +72,15 @@ const char* const RTCIceRole::kUnknown = "unknown";
|
|||||||
const char* const RTCIceRole::kControlled = "controlled";
|
const char* const RTCIceRole::kControlled = "controlled";
|
||||||
const char* const RTCIceRole::kControlling = "controlling";
|
const char* const RTCIceRole::kControlling = "controlling";
|
||||||
|
|
||||||
|
// https://www.w3.org/TR/webrtc/#dom-rtcicetransportstate
|
||||||
|
const char* const RTCIceTransportState::kNew = "new";
|
||||||
|
const char* const RTCIceTransportState::kChecking = "checking";
|
||||||
|
const char* const RTCIceTransportState::kConnected = "connected";
|
||||||
|
const char* const RTCIceTransportState::kCompleted = "completed";
|
||||||
|
const char* const RTCIceTransportState::kDisconnected = "disconnected";
|
||||||
|
const char* const RTCIceTransportState::kFailed = "failed";
|
||||||
|
const char* const RTCIceTransportState::kClosed = "closed";
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
WEBRTC_RTCSTATS_IMPL(RTCCertificateStats, RTCStats, "certificate",
|
WEBRTC_RTCSTATS_IMPL(RTCCertificateStats, RTCStats, "certificate",
|
||||||
&fingerprint,
|
&fingerprint,
|
||||||
@ -1099,7 +1108,8 @@ WEBRTC_RTCSTATS_IMPL(RTCTransportStats, RTCStats, "transport",
|
|||||||
&srtp_cipher,
|
&srtp_cipher,
|
||||||
&selected_candidate_pair_changes,
|
&selected_candidate_pair_changes,
|
||||||
&ice_role,
|
&ice_role,
|
||||||
&ice_local_username_fragment)
|
&ice_local_username_fragment,
|
||||||
|
&ice_state)
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
RTCTransportStats::RTCTransportStats(const std::string& id,
|
RTCTransportStats::RTCTransportStats(const std::string& id,
|
||||||
@ -1123,7 +1133,8 @@ RTCTransportStats::RTCTransportStats(std::string&& id, int64_t timestamp_us)
|
|||||||
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") {}
|
ice_local_username_fragment("iceLocalUsernameFragment"),
|
||||||
|
ice_state("iceState") {}
|
||||||
|
|
||||||
RTCTransportStats::RTCTransportStats(const RTCTransportStats& other)
|
RTCTransportStats::RTCTransportStats(const RTCTransportStats& other)
|
||||||
: RTCStats(other.id(), other.timestamp_us()),
|
: RTCStats(other.id(), other.timestamp_us()),
|
||||||
@ -1142,7 +1153,8 @@ RTCTransportStats::RTCTransportStats(const RTCTransportStats& other)
|
|||||||
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) {}
|
ice_local_username_fragment(other.ice_local_username_fragment),
|
||||||
|
ice_state(other.ice_state) {}
|
||||||
|
|
||||||
RTCTransportStats::~RTCTransportStats() {}
|
RTCTransportStats::~RTCTransportStats() {}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user