aboutsummaryrefslogtreecommitdiff
path: root/p2p
diff options
context:
space:
mode:
authorJonas Oreland <jonaso@webrtc.org>2020-03-20 16:11:56 +0100
committerCommit Bot <commit-bot@chromium.org>2020-03-20 16:55:38 +0000
commit71fda3613c1e5de4c4435cb98af6a2796a339dc7 (patch)
tree8fde1163f5048e30e0e7f880c19f9312ea704e8b /p2p
parent5b139d6f9bde6f3df79aa80a7e2ba7a17a8a8a2a (diff)
downloadwebrtc-71fda3613c1e5de4c4435cb98af6a2796a339dc7.tar.gz
Extend NetworkRoute with more info about local/remote endpoints
This patch extends the NetworkRoute struct with more information about local/remote endpoints. It adds - adapter type - adapter id - relay (previously it was "only" network_id) The patch leaves the {local/remote}_network_id fields around and populated since downstream projects depend on them. They will be removed once they have migrated. OWNER: srte@ call/ test/ OWNER: asapersson@ video/ OWNER: hta@ p2p/ pc/ rtc_base/ BUG: webrtc:11434 Change-Id: I9bcec385b40d707db385fef40b2c7a315dd35dd0 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/170628 Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Åsa Persson <asapersson@webrtc.org> Commit-Queue: Jonas Oreland <jonaso@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30848}
Diffstat (limited to 'p2p')
-rw-r--r--p2p/base/p2p_transport_channel.cc56
-rw-r--r--p2p/base/p2p_transport_channel_unittest.cc4
2 files changed, 54 insertions, 6 deletions
diff --git a/p2p/base/p2p_transport_channel.cc b/p2p/base/p2p_transport_channel.cc
index 906aa598d0..d935a45303 100644
--- a/p2p/base/p2p_transport_channel.cc
+++ b/p2p/base/p2p_transport_channel.cc
@@ -57,6 +57,43 @@ uint32_t GetWeakPingIntervalInFieldTrial() {
return cricket::WEAK_PING_INTERVAL;
}
+rtc::AdapterType GuessAdapterTypeFromNetworkCost(int network_cost) {
+ // The current network costs have been unchanged since they were added
+ // to webrtc. If they ever were to change we would need to reconsider
+ // this method.
+ switch (network_cost) {
+ case rtc::kNetworkCostMin:
+ return rtc::ADAPTER_TYPE_ETHERNET;
+ case rtc::kNetworkCostLow:
+ return rtc::ADAPTER_TYPE_WIFI;
+ case rtc::kNetworkCostHigh:
+ return rtc::ADAPTER_TYPE_CELLULAR;
+ case rtc::kNetworkCostUnknown:
+ return rtc::ADAPTER_TYPE_UNKNOWN;
+ case rtc::kNetworkCostMax:
+ return rtc::ADAPTER_TYPE_ANY;
+ }
+ return rtc::ADAPTER_TYPE_UNKNOWN;
+}
+
+rtc::RouteEndpoint CreateRouteEndpointFromCandidate(
+ bool local,
+ const cricket::Candidate& candidate,
+ bool uses_turn) {
+ auto adapter_type = candidate.network_type();
+ if (!local && adapter_type == rtc::ADAPTER_TYPE_UNKNOWN) {
+ adapter_type = GuessAdapterTypeFromNetworkCost(candidate.network_cost());
+ }
+
+ // TODO(bugs.webrtc.org/9446) : Rewrite if information about remote network
+ // adapter becomes available. The implication of this implementation is that
+ // we will only ever report 1 adapter per type. In practice this is probably
+ // fine, since the endpoint also contains network-id.
+ uint16_t adapter_id = static_cast<int>(adapter_type);
+ return rtc::RouteEndpoint(adapter_type, adapter_id, candidate.network_id(),
+ uses_turn);
+}
+
} // unnamed namespace
namespace cricket {
@@ -1687,10 +1724,21 @@ void P2PTransportChannel::SwitchSelectedConnection(Connection* conn,
network_route_.emplace(rtc::NetworkRoute());
network_route_->connected = ReadyToSend(selected_connection_);
- network_route_->local_network_id =
- selected_connection_->local_candidate().network_id();
- network_route_->remote_network_id =
- selected_connection_->remote_candidate().network_id();
+ network_route_->local = CreateRouteEndpointFromCandidate(
+ /* local= */ true, selected_connection_->local_candidate(),
+ /* uses_turn= */ selected_connection_->port()->Type() ==
+ RELAY_PORT_TYPE);
+ network_route_->remote = CreateRouteEndpointFromCandidate(
+ /* local= */ false, selected_connection_->remote_candidate(),
+ /* uses_turn= */ selected_connection_->remote_candidate().type() ==
+ RELAY_PORT_TYPE);
+
+ // Downstream projects depend on the old representation,
+ // populate that until they have been migrated.
+ // TODO(jonaso): remove.
+ network_route_->local_network_id = network_route_->local.network_id();
+ network_route_->remote_network_id = network_route_->remote.network_id();
+
network_route_->last_sent_packet_id = last_sent_packet_id_;
network_route_->packet_overhead =
selected_connection_->local_candidate().address().ipaddr().overhead() +
diff --git a/p2p/base/p2p_transport_channel_unittest.cc b/p2p/base/p2p_transport_channel_unittest.cc
index ee7456a739..c66a9f7ce0 100644
--- a/p2p/base/p2p_transport_channel_unittest.cc
+++ b/p2p/base/p2p_transport_channel_unittest.cc
@@ -3221,9 +3221,9 @@ class P2PTransportChannelPingTest : public ::testing::Test,
return !last_network_route_.has_value();
} else {
return pair->local_candidate().network_id() ==
- last_network_route_->local_network_id &&
+ last_network_route_->local.network_id() &&
pair->remote_candidate().network_id() ==
- last_network_route_->remote_network_id;
+ last_network_route_->remote.network_id();
}
}