Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: webrtc/p2p/base/port.cc

Issue 1976683003: Update the type and cost of existing networks if its type is found later by network monitor (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Get network type from name matching only on IOS or Android. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 // Computes our estimate of the RTT given the current estimate. 68 // Computes our estimate of the RTT given the current estimate.
69 inline int ConservativeRTTEstimate(int rtt) { 69 inline int ConservativeRTTEstimate(int rtt) {
70 return std::max(MINIMUM_RTT, std::min(MAXIMUM_RTT, 2 * rtt)); 70 return std::max(MINIMUM_RTT, std::min(MAXIMUM_RTT, 2 * rtt));
71 } 71 }
72 72
73 // Weighting of the old rtt value to new data. 73 // Weighting of the old rtt value to new data.
74 const int RTT_RATIO = 3; // 3 : 1 74 const int RTT_RATIO = 3; // 3 : 1
75 75
76 // The delay before we begin checking if this port is useless. 76 // The delay before we begin checking if this port is useless.
77 const int kPortTimeoutDelay = 30 * 1000; // 30 seconds 77 const int kPortTimeoutDelay = 30 * 1000; // 30 seconds
78 } 78 } // namespace
79 79
80 namespace cricket { 80 namespace cricket {
81 81
82 // TODO(ronghuawu): Use "host", "srflx", "prflx" and "relay". But this requires 82 // TODO(ronghuawu): Use "host", "srflx", "prflx" and "relay". But this requires
83 // the signaling part be updated correspondingly as well. 83 // the signaling part be updated correspondingly as well.
84 const char LOCAL_PORT_TYPE[] = "local"; 84 const char LOCAL_PORT_TYPE[] = "local";
85 const char STUN_PORT_TYPE[] = "stun"; 85 const char STUN_PORT_TYPE[] = "stun";
86 const char PRFLX_PORT_TYPE[] = "prflx"; 86 const char PRFLX_PORT_TYPE[] = "prflx";
87 const char RELAY_PORT_TYPE[] = "relay"; 87 const char RELAY_PORT_TYPE[] = "relay";
88 88
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 void Port::Construct() { 189 void Port::Construct() {
190 // TODO(pthatcher): Remove this old behavior once we're sure no one 190 // TODO(pthatcher): Remove this old behavior once we're sure no one
191 // relies on it. If the username_fragment and password are empty, 191 // relies on it. If the username_fragment and password are empty,
192 // we should just create one. 192 // we should just create one.
193 if (ice_username_fragment_.empty()) { 193 if (ice_username_fragment_.empty()) {
194 ASSERT(password_.empty()); 194 ASSERT(password_.empty());
195 ice_username_fragment_ = rtc::CreateRandomString(ICE_UFRAG_LENGTH); 195 ice_username_fragment_ = rtc::CreateRandomString(ICE_UFRAG_LENGTH);
196 password_ = rtc::CreateRandomString(ICE_PWD_LENGTH); 196 password_ = rtc::CreateRandomString(ICE_PWD_LENGTH);
197 } 197 }
198 network_->SignalInactive.connect(this, &Port::OnNetworkInactive); 198 network_->SignalInactive.connect(this, &Port::OnNetworkInactive);
199 // TODO(honghaiz): Make it configurable from user setting. 199 network_->SignalNetworkTypeChanged.connect(this, &Port::OnNetworkTypeChanged);
200 network_cost_ = 200 network_cost_ = network_->GetCost();
201 (network_->type() == rtc::ADAPTER_TYPE_CELLULAR) ? kMaxNetworkCost : 0;
202 201
203 LOG_J(LS_INFO, this) << "Port created"; 202 LOG_J(LS_INFO, this) << "Port created with network cost " << network_cost_;
204 } 203 }
205 204
206 Port::~Port() { 205 Port::~Port() {
207 // Delete all of the remaining connections. We copy the list up front 206 // Delete all of the remaining connections. We copy the list up front
208 // because each deletion will cause it to be modified. 207 // because each deletion will cause it to be modified.
209 208
210 std::vector<Connection*> list; 209 std::vector<Connection*> list;
211 210
212 AddressMap::iterator iter = connections_.begin(); 211 AddressMap::iterator iter = connections_.begin();
213 while (iter != connections_.end()) { 212 while (iter != connections_.end()) {
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 if (dead()) { 624 if (dead()) {
626 Destroy(); 625 Destroy();
627 } 626 }
628 } 627 }
629 628
630 void Port::OnNetworkInactive(const rtc::Network* network) { 629 void Port::OnNetworkInactive(const rtc::Network* network) {
631 ASSERT(network == network_); 630 ASSERT(network == network_);
632 SignalNetworkInactive(this); 631 SignalNetworkInactive(this);
633 } 632 }
634 633
634 void Port::OnNetworkTypeChanged(const rtc::Network* network) {
635 ASSERT(network == network_);
636
637 UpdateNetworkCost();
638 }
639
635 std::string Port::ToString() const { 640 std::string Port::ToString() const {
636 std::stringstream ss; 641 std::stringstream ss;
637 ss << "Port[" << std::hex << this << std::dec << ":" << content_name_ << ":" 642 ss << "Port[" << std::hex << this << std::dec << ":" << content_name_ << ":"
638 << component_ << ":" << generation_ << ":" << type_ << ":" 643 << component_ << ":" << generation_ << ":" << type_ << ":"
639 << network_->ToString() << "]"; 644 << network_->ToString() << "]";
640 return ss.str(); 645 return ss.str();
641 } 646 }
642 647
648 // TODO(honghaiz): Make the network cost configurable from user setting.
649 void Port::UpdateNetworkCost() {
650 uint16_t new_cost = network_->GetCost();
651 if (network_cost_ == new_cost) {
652 return;
653 }
654 LOG(LS_INFO) << "Network cost changed from " << network_cost_
655 << " to " << new_cost
656 << ". Number of candidates created: " << candidates_.size()
657 << ". Number of connections created: " << connections_.size();
658 network_cost_ = new_cost;
659 for (cricket::Candidate& candidate : candidates_) {
660 candidate.set_network_cost(network_cost_);
661 }
662 // Network cost change will affect the connection selection criteria.
663 // Signal the network cost change if any connection has been created.
664 if (!connections_.empty()) {
665 SignalNetworkCostChanged(this);
666 }
667 }
668
643 void Port::EnablePortPackets() { 669 void Port::EnablePortPackets() {
644 enable_port_packets_ = true; 670 enable_port_packets_ = true;
645 } 671 }
646 672
647 void Port::OnConnectionDestroyed(Connection* conn) { 673 void Port::OnConnectionDestroyed(Connection* conn) {
648 AddressMap::iterator iter = 674 AddressMap::iterator iter =
649 connections_.find(conn->remote_candidate().address()); 675 connections_.find(conn->remote_candidate().address());
650 ASSERT(iter != connections_.end()); 676 ASSERT(iter != connections_.end());
651 connections_.erase(iter); 677 connections_.erase(iter);
652 678
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
988 } 1014 }
989 1015
990 if (port_->GetIceRole() == ICEROLE_CONTROLLED) { 1016 if (port_->GetIceRole() == ICEROLE_CONTROLLED) {
991 const StunByteStringAttribute* use_candidate_attr = 1017 const StunByteStringAttribute* use_candidate_attr =
992 msg->GetByteString(STUN_ATTR_USE_CANDIDATE); 1018 msg->GetByteString(STUN_ATTR_USE_CANDIDATE);
993 if (use_candidate_attr) { 1019 if (use_candidate_attr) {
994 set_nominated(true); 1020 set_nominated(true);
995 SignalNominated(this); 1021 SignalNominated(this);
996 } 1022 }
997 } 1023 }
1024 // Set the remote cost if the network_info attribute is available.
1025 const StunUInt32Attribute* network_attr =
1026 msg->GetUInt32(STUN_ATTR_NETWORK_INFO);
1027 if (network_attr) {
1028 uint32_t network_info = network_attr->value();
1029 uint16_t network_cost = static_cast<uint16_t>(network_info);
1030 if (network_cost != remote_candidate_.network_cost()) {
1031 remote_candidate_.set_network_cost(network_cost);
1032 // Network cost change will affect the connection ranking, so signal
1033 // state change so that the transport channel will re-sort connections.
1034 SignalStateChange(this);
pthatcher1 2016/05/17 21:23:11 If we always send the cost, then this could cause
honghaiz3 2016/05/18 07:41:47 Added note at the beginning of the added code.
1035 }
1036 }
998 } 1037 }
999 1038
1000 void Connection::OnReadyToSend() { 1039 void Connection::OnReadyToSend() {
1001 if (write_state_ == STATE_WRITABLE) { 1040 if (write_state_ == STATE_WRITABLE) {
1002 SignalReadyToSend(this); 1041 SignalReadyToSend(this);
1003 } 1042 }
1004 } 1043 }
1005 1044
1006 void Connection::Prune() { 1045 void Connection::Prune() {
1007 if (!pruned_ || active()) { 1046 if (!pruned_ || active()) {
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1158 } 1197 }
1159 1198
1160 std::string Connection::ToDebugId() const { 1199 std::string Connection::ToDebugId() const {
1161 std::stringstream ss; 1200 std::stringstream ss;
1162 ss << std::hex << this; 1201 ss << std::hex << this;
1163 return ss.str(); 1202 return ss.str();
1164 } 1203 }
1165 1204
1166 uint32_t Connection::ComputeNetworkCost() const { 1205 uint32_t Connection::ComputeNetworkCost() const {
1167 // TODO(honghaiz): Will add rtt as part of the network cost. 1206 // TODO(honghaiz): Will add rtt as part of the network cost.
1168 return local_candidate().network_cost() + remote_candidate_.network_cost(); 1207 return port()->network_cost() + remote_candidate_.network_cost();
1169 } 1208 }
1170 1209
1171 std::string Connection::ToString() const { 1210 std::string Connection::ToString() const {
1172 const char CONNECT_STATE_ABBREV[2] = { 1211 const char CONNECT_STATE_ABBREV[2] = {
1173 '-', // not connected (false) 1212 '-', // not connected (false)
1174 'C', // connected (true) 1213 'C', // connected (true)
1175 }; 1214 };
1176 const char RECEIVE_STATE_ABBREV[2] = { 1215 const char RECEIVE_STATE_ABBREV[2] = {
1177 '-', // not receiving (false) 1216 '-', // not receiving (false)
1178 'R', // receiving (true) 1217 'R', // receiving (true)
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
1449 ASSERT(sent < 0); 1488 ASSERT(sent < 0);
1450 error_ = port_->GetError(); 1489 error_ = port_->GetError();
1451 sent_packets_discarded_++; 1490 sent_packets_discarded_++;
1452 } else { 1491 } else {
1453 send_rate_tracker_.AddSamples(sent); 1492 send_rate_tracker_.AddSamples(sent);
1454 } 1493 }
1455 return sent; 1494 return sent;
1456 } 1495 }
1457 1496
1458 } // namespace cricket 1497 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698