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: Minor changes 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
« no previous file with comments | « webrtc/p2p/base/port.h ('k') | webrtc/p2p/base/port_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_->SignalTypeChanged.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 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 if (dead()) { 637 if (dead()) {
639 Destroy(); 638 Destroy();
640 } 639 }
641 } 640 }
642 641
643 void Port::OnNetworkInactive(const rtc::Network* network) { 642 void Port::OnNetworkInactive(const rtc::Network* network) {
644 ASSERT(network == network_); 643 ASSERT(network == network_);
645 SignalNetworkInactive(this); 644 SignalNetworkInactive(this);
646 } 645 }
647 646
647 void Port::OnNetworkTypeChanged(const rtc::Network* network) {
648 ASSERT(network == network_);
649
650 UpdateNetworkCost();
651 }
652
648 std::string Port::ToString() const { 653 std::string Port::ToString() const {
649 std::stringstream ss; 654 std::stringstream ss;
650 ss << "Port[" << std::hex << this << std::dec << ":" << content_name_ << ":" 655 ss << "Port[" << std::hex << this << std::dec << ":" << content_name_ << ":"
651 << component_ << ":" << generation_ << ":" << type_ << ":" 656 << component_ << ":" << generation_ << ":" << type_ << ":"
652 << network_->ToString() << "]"; 657 << network_->ToString() << "]";
653 return ss.str(); 658 return ss.str();
654 } 659 }
655 660
661 // TODO(honghaiz): Make the network cost configurable from user setting.
662 void Port::UpdateNetworkCost() {
663 uint16_t new_cost = network_->GetCost();
664 if (network_cost_ == new_cost) {
665 return;
666 }
667 LOG(LS_INFO) << "Network cost changed from " << network_cost_
668 << " to " << new_cost
669 << ". Number of candidates created: " << candidates_.size()
670 << ". Number of connections created: " << connections_.size();
671 network_cost_ = new_cost;
672 for (cricket::Candidate& candidate : candidates_) {
673 candidate.set_network_cost(network_cost_);
674 }
675 // Network cost change will affect the connection selection criteria.
676 // Signal the connection state change on each connection to force a
677 // re-sort in P2PTransportChannel.
678 for (auto kv : connections_) {
679 Connection* conn = kv.second;
680 conn->SignalStateChange(conn);
681 }
682 }
683
656 void Port::EnablePortPackets() { 684 void Port::EnablePortPackets() {
657 enable_port_packets_ = true; 685 enable_port_packets_ = true;
658 } 686 }
659 687
660 void Port::OnConnectionDestroyed(Connection* conn) { 688 void Port::OnConnectionDestroyed(Connection* conn) {
661 AddressMap::iterator iter = 689 AddressMap::iterator iter =
662 connections_.find(conn->remote_candidate().address()); 690 connections_.find(conn->remote_candidate().address());
663 ASSERT(iter != connections_.end()); 691 ASSERT(iter != connections_.end());
664 connections_.erase(iter); 692 connections_.erase(iter);
665 693
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 } 1029 }
1002 1030
1003 if (port_->GetIceRole() == ICEROLE_CONTROLLED) { 1031 if (port_->GetIceRole() == ICEROLE_CONTROLLED) {
1004 const StunByteStringAttribute* use_candidate_attr = 1032 const StunByteStringAttribute* use_candidate_attr =
1005 msg->GetByteString(STUN_ATTR_USE_CANDIDATE); 1033 msg->GetByteString(STUN_ATTR_USE_CANDIDATE);
1006 if (use_candidate_attr) { 1034 if (use_candidate_attr) {
1007 set_nominated(true); 1035 set_nominated(true);
1008 SignalNominated(this); 1036 SignalNominated(this);
1009 } 1037 }
1010 } 1038 }
1039 // Set the remote cost if the network_info attribute is available.
1040 // Note: If packets are re-ordered, we may get incorrect network cost
1041 // temporarily, but it should get the correct value shortly after that.
1042 const StunUInt32Attribute* network_attr =
1043 msg->GetUInt32(STUN_ATTR_NETWORK_INFO);
1044 if (network_attr) {
1045 uint32_t network_info = network_attr->value();
1046 uint16_t network_cost = static_cast<uint16_t>(network_info);
1047 if (network_cost != remote_candidate_.network_cost()) {
1048 remote_candidate_.set_network_cost(network_cost);
1049 // Network cost change will affect the connection ranking, so signal
1050 // state change to force a re-sort in P2PTransportChannel.
1051 SignalStateChange(this);
1052 }
1053 }
1011 } 1054 }
1012 1055
1013 void Connection::OnReadyToSend() { 1056 void Connection::OnReadyToSend() {
1014 if (write_state_ == STATE_WRITABLE) { 1057 if (write_state_ == STATE_WRITABLE) {
1015 SignalReadyToSend(this); 1058 SignalReadyToSend(this);
1016 } 1059 }
1017 } 1060 }
1018 1061
1019 void Connection::Prune() { 1062 void Connection::Prune() {
1020 if (!pruned_ || active()) { 1063 if (!pruned_ || active()) {
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1171 } 1214 }
1172 1215
1173 std::string Connection::ToDebugId() const { 1216 std::string Connection::ToDebugId() const {
1174 std::stringstream ss; 1217 std::stringstream ss;
1175 ss << std::hex << this; 1218 ss << std::hex << this;
1176 return ss.str(); 1219 return ss.str();
1177 } 1220 }
1178 1221
1179 uint32_t Connection::ComputeNetworkCost() const { 1222 uint32_t Connection::ComputeNetworkCost() const {
1180 // TODO(honghaiz): Will add rtt as part of the network cost. 1223 // TODO(honghaiz): Will add rtt as part of the network cost.
1181 return local_candidate().network_cost() + remote_candidate_.network_cost(); 1224 return port()->network_cost() + remote_candidate_.network_cost();
1182 } 1225 }
1183 1226
1184 std::string Connection::ToString() const { 1227 std::string Connection::ToString() const {
1185 const char CONNECT_STATE_ABBREV[2] = { 1228 const char CONNECT_STATE_ABBREV[2] = {
1186 '-', // not connected (false) 1229 '-', // not connected (false)
1187 'C', // connected (true) 1230 'C', // connected (true)
1188 }; 1231 };
1189 const char RECEIVE_STATE_ABBREV[2] = { 1232 const char RECEIVE_STATE_ABBREV[2] = {
1190 '-', // not receiving (false) 1233 '-', // not receiving (false)
1191 'R', // receiving (true) 1234 'R', // receiving (true)
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 ASSERT(sent < 0); 1505 ASSERT(sent < 0);
1463 error_ = port_->GetError(); 1506 error_ = port_->GetError();
1464 sent_packets_discarded_++; 1507 sent_packets_discarded_++;
1465 } else { 1508 } else {
1466 send_rate_tracker_.AddSamples(sent); 1509 send_rate_tracker_.AddSamples(sent);
1467 } 1510 }
1468 return sent; 1511 return sent;
1469 } 1512 }
1470 1513
1471 } // namespace cricket 1514 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/p2p/base/port.h ('k') | webrtc/p2p/base/port_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698