diff options
author | Jonas Oreland <jonaso@webrtc.org> | 2020-03-20 16:11:56 +0100 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-20 16:55:38 +0000 |
commit | 71fda3613c1e5de4c4435cb98af6a2796a339dc7 (patch) | |
tree | 8fde1163f5048e30e0e7f880c19f9312ea704e8b /p2p | |
parent | 5b139d6f9bde6f3df79aa80a7e2ba7a17a8a8a2a (diff) | |
download | webrtc-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.cc | 56 | ||||
-rw-r--r-- | p2p/base/p2p_transport_channel_unittest.cc | 4 |
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(); } } |