| OLD | NEW |
| 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 12 matching lines...) Expand all Loading... |
| 23 #include "webrtc/base/scoped_ptr.h" | 23 #include "webrtc/base/scoped_ptr.h" |
| 24 #include "webrtc/base/stringencode.h" | 24 #include "webrtc/base/stringencode.h" |
| 25 #include "webrtc/base/stringutils.h" | 25 #include "webrtc/base/stringutils.h" |
| 26 | 26 |
| 27 namespace { | 27 namespace { |
| 28 | 28 |
| 29 // Determines whether we have seen at least the given maximum number of | 29 // Determines whether we have seen at least the given maximum number of |
| 30 // pings fail to have a response. | 30 // pings fail to have a response. |
| 31 inline bool TooManyFailures( | 31 inline bool TooManyFailures( |
| 32 const std::vector<cricket::Connection::SentPing>& pings_since_last_response, | 32 const std::vector<cricket::Connection::SentPing>& pings_since_last_response, |
| 33 uint32 maximum_failures, | 33 uint32_t maximum_failures, |
| 34 uint32 rtt_estimate, | 34 uint32_t rtt_estimate, |
| 35 uint32 now) { | 35 uint32_t now) { |
| 36 | |
| 37 // If we haven't sent that many pings, then we can't have failed that many. | 36 // If we haven't sent that many pings, then we can't have failed that many. |
| 38 if (pings_since_last_response.size() < maximum_failures) | 37 if (pings_since_last_response.size() < maximum_failures) |
| 39 return false; | 38 return false; |
| 40 | 39 |
| 41 // Check if the window in which we would expect a response to the ping has | 40 // Check if the window in which we would expect a response to the ping has |
| 42 // already elapsed. | 41 // already elapsed. |
| 43 uint32 expected_response_time = | 42 uint32_t expected_response_time = |
| 44 pings_since_last_response[maximum_failures - 1].sent_time + rtt_estimate; | 43 pings_since_last_response[maximum_failures - 1].sent_time + rtt_estimate; |
| 45 return now > expected_response_time; | 44 return now > expected_response_time; |
| 46 } | 45 } |
| 47 | 46 |
| 48 // Determines whether we have gone too long without seeing any response. | 47 // Determines whether we have gone too long without seeing any response. |
| 49 inline bool TooLongWithoutResponse( | 48 inline bool TooLongWithoutResponse( |
| 50 const std::vector<cricket::Connection::SentPing>& pings_since_last_response, | 49 const std::vector<cricket::Connection::SentPing>& pings_since_last_response, |
| 51 uint32 maximum_time, | 50 uint32_t maximum_time, |
| 52 uint32 now) { | 51 uint32_t now) { |
| 53 | |
| 54 if (pings_since_last_response.size() == 0) | 52 if (pings_since_last_response.size() == 0) |
| 55 return false; | 53 return false; |
| 56 | 54 |
| 57 auto first = pings_since_last_response[0]; | 55 auto first = pings_since_last_response[0]; |
| 58 return now > (first.sent_time + maximum_time); | 56 return now > (first.sent_time + maximum_time); |
| 59 } | 57 } |
| 60 | 58 |
| 61 // We will restrict RTT estimates (when used for determining state) to be | 59 // We will restrict RTT estimates (when used for determining state) to be |
| 62 // within a reasonable range. | 60 // within a reasonable range. |
| 63 const uint32 MINIMUM_RTT = 100; // 0.1 seconds | 61 const uint32_t MINIMUM_RTT = 100; // 0.1 seconds |
| 64 const uint32 MAXIMUM_RTT = 3000; // 3 seconds | 62 const uint32_t MAXIMUM_RTT = 3000; // 3 seconds |
| 65 | 63 |
| 66 // When we don't have any RTT data, we have to pick something reasonable. We | 64 // When we don't have any RTT data, we have to pick something reasonable. We |
| 67 // use a large value just in case the connection is really slow. | 65 // use a large value just in case the connection is really slow. |
| 68 const uint32 DEFAULT_RTT = MAXIMUM_RTT; | 66 const uint32_t DEFAULT_RTT = MAXIMUM_RTT; |
| 69 | 67 |
| 70 // Computes our estimate of the RTT given the current estimate. | 68 // Computes our estimate of the RTT given the current estimate. |
| 71 inline uint32 ConservativeRTTEstimate(uint32 rtt) { | 69 inline uint32_t ConservativeRTTEstimate(uint32_t rtt) { |
| 72 return std::max(MINIMUM_RTT, std::min(MAXIMUM_RTT, 2 * rtt)); | 70 return std::max(MINIMUM_RTT, std::min(MAXIMUM_RTT, 2 * rtt)); |
| 73 } | 71 } |
| 74 | 72 |
| 75 // Weighting of the old rtt value to new data. | 73 // Weighting of the old rtt value to new data. |
| 76 const int RTT_RATIO = 3; // 3 : 1 | 74 const int RTT_RATIO = 3; // 3 : 1 |
| 77 | 75 |
| 78 // The delay before we begin checking if this port is useless. | 76 // The delay before we begin checking if this port is useless. |
| 79 const int kPortTimeoutDelay = 30 * 1000; // 30 seconds | 77 const int kPortTimeoutDelay = 30 * 1000; // 30 seconds |
| 80 } | 78 } |
| 81 | 79 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 // etc.), and STUN or TURN server. If any of these are different, | 119 // etc.), and STUN or TURN server. If any of these are different, |
| 122 // then the foundation will be different. Two candidate pairs with | 120 // then the foundation will be different. Two candidate pairs with |
| 123 // the same foundation pairs are likely to have similar network | 121 // the same foundation pairs are likely to have similar network |
| 124 // characteristics. Foundations are used in the frozen algorithm. | 122 // characteristics. Foundations are used in the frozen algorithm. |
| 125 static std::string ComputeFoundation( | 123 static std::string ComputeFoundation( |
| 126 const std::string& type, | 124 const std::string& type, |
| 127 const std::string& protocol, | 125 const std::string& protocol, |
| 128 const rtc::SocketAddress& base_address) { | 126 const rtc::SocketAddress& base_address) { |
| 129 std::ostringstream ost; | 127 std::ostringstream ost; |
| 130 ost << type << base_address.ipaddr().ToString() << protocol; | 128 ost << type << base_address.ipaddr().ToString() << protocol; |
| 131 return rtc::ToString<uint32>(rtc::ComputeCrc32(ost.str())); | 129 return rtc::ToString<uint32_t>(rtc::ComputeCrc32(ost.str())); |
| 132 } | 130 } |
| 133 | 131 |
| 134 Port::Port(rtc::Thread* thread, | 132 Port::Port(rtc::Thread* thread, |
| 135 rtc::PacketSocketFactory* factory, | 133 rtc::PacketSocketFactory* factory, |
| 136 rtc::Network* network, | 134 rtc::Network* network, |
| 137 const rtc::IPAddress& ip, | 135 const rtc::IPAddress& ip, |
| 138 const std::string& username_fragment, | 136 const std::string& username_fragment, |
| 139 const std::string& password) | 137 const std::string& password) |
| 140 : thread_(thread), | 138 : thread_(thread), |
| 141 factory_(factory), | 139 factory_(factory), |
| (...skipping 13 matching lines...) Expand all Loading... |
| 155 shared_socket_(true), | 153 shared_socket_(true), |
| 156 candidate_filter_(CF_ALL) { | 154 candidate_filter_(CF_ALL) { |
| 157 Construct(); | 155 Construct(); |
| 158 } | 156 } |
| 159 | 157 |
| 160 Port::Port(rtc::Thread* thread, | 158 Port::Port(rtc::Thread* thread, |
| 161 const std::string& type, | 159 const std::string& type, |
| 162 rtc::PacketSocketFactory* factory, | 160 rtc::PacketSocketFactory* factory, |
| 163 rtc::Network* network, | 161 rtc::Network* network, |
| 164 const rtc::IPAddress& ip, | 162 const rtc::IPAddress& ip, |
| 165 uint16 min_port, | 163 uint16_t min_port, |
| 166 uint16 max_port, | 164 uint16_t max_port, |
| 167 const std::string& username_fragment, | 165 const std::string& username_fragment, |
| 168 const std::string& password) | 166 const std::string& password) |
| 169 : thread_(thread), | 167 : thread_(thread), |
| 170 factory_(factory), | 168 factory_(factory), |
| 171 type_(type), | 169 type_(type), |
| 172 send_retransmit_count_attribute_(false), | 170 send_retransmit_count_attribute_(false), |
| 173 network_(network), | 171 network_(network), |
| 174 ip_(ip), | 172 ip_(ip), |
| 175 min_port_(min_port), | 173 min_port_(min_port), |
| 176 max_port_(max_port), | 174 max_port_(max_port), |
| (...skipping 28 matching lines...) Expand all Loading... |
| 205 // because each deletion will cause it to be modified. | 203 // because each deletion will cause it to be modified. |
| 206 | 204 |
| 207 std::vector<Connection*> list; | 205 std::vector<Connection*> list; |
| 208 | 206 |
| 209 AddressMap::iterator iter = connections_.begin(); | 207 AddressMap::iterator iter = connections_.begin(); |
| 210 while (iter != connections_.end()) { | 208 while (iter != connections_.end()) { |
| 211 list.push_back(iter->second); | 209 list.push_back(iter->second); |
| 212 ++iter; | 210 ++iter; |
| 213 } | 211 } |
| 214 | 212 |
| 215 for (uint32 i = 0; i < list.size(); i++) | 213 for (uint32_t i = 0; i < list.size(); i++) |
| 216 delete list[i]; | 214 delete list[i]; |
| 217 } | 215 } |
| 218 | 216 |
| 219 Connection* Port::GetConnection(const rtc::SocketAddress& remote_addr) { | 217 Connection* Port::GetConnection(const rtc::SocketAddress& remote_addr) { |
| 220 AddressMap::const_iterator iter = connections_.find(remote_addr); | 218 AddressMap::const_iterator iter = connections_.find(remote_addr); |
| 221 if (iter != connections_.end()) | 219 if (iter != connections_.end()) |
| 222 return iter->second; | 220 return iter->second; |
| 223 else | 221 else |
| 224 return NULL; | 222 return NULL; |
| 225 } | 223 } |
| 226 | 224 |
| 227 void Port::AddAddress(const rtc::SocketAddress& address, | 225 void Port::AddAddress(const rtc::SocketAddress& address, |
| 228 const rtc::SocketAddress& base_address, | 226 const rtc::SocketAddress& base_address, |
| 229 const rtc::SocketAddress& related_address, | 227 const rtc::SocketAddress& related_address, |
| 230 const std::string& protocol, | 228 const std::string& protocol, |
| 231 const std::string& relay_protocol, | 229 const std::string& relay_protocol, |
| 232 const std::string& tcptype, | 230 const std::string& tcptype, |
| 233 const std::string& type, | 231 const std::string& type, |
| 234 uint32 type_preference, | 232 uint32_t type_preference, |
| 235 uint32 relay_preference, | 233 uint32_t relay_preference, |
| 236 bool final) { | 234 bool final) { |
| 237 if (protocol == TCP_PROTOCOL_NAME && type == LOCAL_PORT_TYPE) { | 235 if (protocol == TCP_PROTOCOL_NAME && type == LOCAL_PORT_TYPE) { |
| 238 ASSERT(!tcptype.empty()); | 236 ASSERT(!tcptype.empty()); |
| 239 } | 237 } |
| 240 | 238 |
| 241 Candidate c; | 239 Candidate c; |
| 242 c.set_id(rtc::CreateRandomString(8)); | 240 c.set_id(rtc::CreateRandomString(8)); |
| 243 c.set_component(component_); | 241 c.set_component(component_); |
| 244 c.set_type(type); | 242 c.set_type(type); |
| 245 c.set_protocol(protocol); | 243 c.set_protocol(protocol); |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 *remote_ufrag = username.substr(colon_pos + 1, username.size()); | 456 *remote_ufrag = username.substr(colon_pos + 1, username.size()); |
| 459 return true; | 457 return true; |
| 460 } | 458 } |
| 461 | 459 |
| 462 bool Port::MaybeIceRoleConflict( | 460 bool Port::MaybeIceRoleConflict( |
| 463 const rtc::SocketAddress& addr, IceMessage* stun_msg, | 461 const rtc::SocketAddress& addr, IceMessage* stun_msg, |
| 464 const std::string& remote_ufrag) { | 462 const std::string& remote_ufrag) { |
| 465 // Validate ICE_CONTROLLING or ICE_CONTROLLED attributes. | 463 // Validate ICE_CONTROLLING or ICE_CONTROLLED attributes. |
| 466 bool ret = true; | 464 bool ret = true; |
| 467 IceRole remote_ice_role = ICEROLE_UNKNOWN; | 465 IceRole remote_ice_role = ICEROLE_UNKNOWN; |
| 468 uint64 remote_tiebreaker = 0; | 466 uint64_t remote_tiebreaker = 0; |
| 469 const StunUInt64Attribute* stun_attr = | 467 const StunUInt64Attribute* stun_attr = |
| 470 stun_msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING); | 468 stun_msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING); |
| 471 if (stun_attr) { | 469 if (stun_attr) { |
| 472 remote_ice_role = ICEROLE_CONTROLLING; | 470 remote_ice_role = ICEROLE_CONTROLLING; |
| 473 remote_tiebreaker = stun_attr->value(); | 471 remote_tiebreaker = stun_attr->value(); |
| 474 } | 472 } |
| 475 | 473 |
| 476 // If |remote_ufrag| is same as port local username fragment and | 474 // If |remote_ufrag| is same as port local username fragment and |
| 477 // tie breaker value received in the ping message matches port | 475 // tie breaker value received in the ping message matches port |
| 478 // tiebreaker value this must be a loopback call. | 476 // tiebreaker value this must be a loopback call. |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 697 std::string username; | 695 std::string username; |
| 698 connection_->port()->CreateStunUsername( | 696 connection_->port()->CreateStunUsername( |
| 699 connection_->remote_candidate().username(), &username); | 697 connection_->remote_candidate().username(), &username); |
| 700 request->AddAttribute( | 698 request->AddAttribute( |
| 701 new StunByteStringAttribute(STUN_ATTR_USERNAME, username)); | 699 new StunByteStringAttribute(STUN_ATTR_USERNAME, username)); |
| 702 | 700 |
| 703 // connection_ already holds this ping, so subtract one from count. | 701 // connection_ already holds this ping, so subtract one from count. |
| 704 if (connection_->port()->send_retransmit_count_attribute()) { | 702 if (connection_->port()->send_retransmit_count_attribute()) { |
| 705 request->AddAttribute(new StunUInt32Attribute( | 703 request->AddAttribute(new StunUInt32Attribute( |
| 706 STUN_ATTR_RETRANSMIT_COUNT, | 704 STUN_ATTR_RETRANSMIT_COUNT, |
| 707 static_cast<uint32>( | 705 static_cast<uint32_t>(connection_->pings_since_last_response_.size() - |
| 708 connection_->pings_since_last_response_.size() - 1))); | 706 1))); |
| 709 } | 707 } |
| 710 | 708 |
| 711 // Adding ICE_CONTROLLED or ICE_CONTROLLING attribute based on the role. | 709 // Adding ICE_CONTROLLED or ICE_CONTROLLING attribute based on the role. |
| 712 if (connection_->port()->GetIceRole() == ICEROLE_CONTROLLING) { | 710 if (connection_->port()->GetIceRole() == ICEROLE_CONTROLLING) { |
| 713 request->AddAttribute(new StunUInt64Attribute( | 711 request->AddAttribute(new StunUInt64Attribute( |
| 714 STUN_ATTR_ICE_CONTROLLING, connection_->port()->IceTiebreaker())); | 712 STUN_ATTR_ICE_CONTROLLING, connection_->port()->IceTiebreaker())); |
| 715 // Since we are trying aggressive nomination, sending USE-CANDIDATE | 713 // Since we are trying aggressive nomination, sending USE-CANDIDATE |
| 716 // attribute in every ping. | 714 // attribute in every ping. |
| 717 // If we are dealing with a ice-lite end point, nomination flag | 715 // If we are dealing with a ice-lite end point, nomination flag |
| 718 // in Connection will be set to false by default. Once the connection | 716 // in Connection will be set to false by default. Once the connection |
| 719 // becomes "best connection", nomination flag will be turned on. | 717 // becomes "best connection", nomination flag will be turned on. |
| 720 if (connection_->use_candidate_attr()) { | 718 if (connection_->use_candidate_attr()) { |
| 721 request->AddAttribute(new StunByteStringAttribute( | 719 request->AddAttribute(new StunByteStringAttribute( |
| 722 STUN_ATTR_USE_CANDIDATE)); | 720 STUN_ATTR_USE_CANDIDATE)); |
| 723 } | 721 } |
| 724 } else if (connection_->port()->GetIceRole() == ICEROLE_CONTROLLED) { | 722 } else if (connection_->port()->GetIceRole() == ICEROLE_CONTROLLED) { |
| 725 request->AddAttribute(new StunUInt64Attribute( | 723 request->AddAttribute(new StunUInt64Attribute( |
| 726 STUN_ATTR_ICE_CONTROLLED, connection_->port()->IceTiebreaker())); | 724 STUN_ATTR_ICE_CONTROLLED, connection_->port()->IceTiebreaker())); |
| 727 } else { | 725 } else { |
| 728 ASSERT(false); | 726 ASSERT(false); |
| 729 } | 727 } |
| 730 | 728 |
| 731 // Adding PRIORITY Attribute. | 729 // Adding PRIORITY Attribute. |
| 732 // Changing the type preference to Peer Reflexive and local preference | 730 // Changing the type preference to Peer Reflexive and local preference |
| 733 // and component id information is unchanged from the original priority. | 731 // and component id information is unchanged from the original priority. |
| 734 // priority = (2^24)*(type preference) + | 732 // priority = (2^24)*(type preference) + |
| 735 // (2^8)*(local preference) + | 733 // (2^8)*(local preference) + |
| 736 // (2^0)*(256 - component ID) | 734 // (2^0)*(256 - component ID) |
| 737 uint32 prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24 | | 735 uint32_t prflx_priority = |
| 736 ICE_TYPE_PREFERENCE_PRFLX << 24 | |
| 738 (connection_->local_candidate().priority() & 0x00FFFFFF); | 737 (connection_->local_candidate().priority() & 0x00FFFFFF); |
| 739 request->AddAttribute( | 738 request->AddAttribute( |
| 740 new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); | 739 new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); |
| 741 | 740 |
| 742 // Adding Message Integrity attribute. | 741 // Adding Message Integrity attribute. |
| 743 request->AddMessageIntegrity(connection_->remote_candidate().password()); | 742 request->AddMessageIntegrity(connection_->remote_candidate().password()); |
| 744 // Adding Fingerprint. | 743 // Adding Fingerprint. |
| 745 request->AddFingerprint(); | 744 request->AddFingerprint(); |
| 746 } | 745 } |
| 747 | 746 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 810 } | 809 } |
| 811 | 810 |
| 812 Connection::~Connection() { | 811 Connection::~Connection() { |
| 813 } | 812 } |
| 814 | 813 |
| 815 const Candidate& Connection::local_candidate() const { | 814 const Candidate& Connection::local_candidate() const { |
| 816 ASSERT(local_candidate_index_ < port_->Candidates().size()); | 815 ASSERT(local_candidate_index_ < port_->Candidates().size()); |
| 817 return port_->Candidates()[local_candidate_index_]; | 816 return port_->Candidates()[local_candidate_index_]; |
| 818 } | 817 } |
| 819 | 818 |
| 820 uint64 Connection::priority() const { | 819 uint64_t Connection::priority() const { |
| 821 uint64 priority = 0; | 820 uint64_t priority = 0; |
| 822 // RFC 5245 - 5.7.2. Computing Pair Priority and Ordering Pairs | 821 // RFC 5245 - 5.7.2. Computing Pair Priority and Ordering Pairs |
| 823 // Let G be the priority for the candidate provided by the controlling | 822 // Let G be the priority for the candidate provided by the controlling |
| 824 // agent. Let D be the priority for the candidate provided by the | 823 // agent. Let D be the priority for the candidate provided by the |
| 825 // controlled agent. | 824 // controlled agent. |
| 826 // pair priority = 2^32*MIN(G,D) + 2*MAX(G,D) + (G>D?1:0) | 825 // pair priority = 2^32*MIN(G,D) + 2*MAX(G,D) + (G>D?1:0) |
| 827 IceRole role = port_->GetIceRole(); | 826 IceRole role = port_->GetIceRole(); |
| 828 if (role != ICEROLE_UNKNOWN) { | 827 if (role != ICEROLE_UNKNOWN) { |
| 829 uint32 g = 0; | 828 uint32_t g = 0; |
| 830 uint32 d = 0; | 829 uint32_t d = 0; |
| 831 if (role == ICEROLE_CONTROLLING) { | 830 if (role == ICEROLE_CONTROLLING) { |
| 832 g = local_candidate().priority(); | 831 g = local_candidate().priority(); |
| 833 d = remote_candidate_.priority(); | 832 d = remote_candidate_.priority(); |
| 834 } else { | 833 } else { |
| 835 g = remote_candidate_.priority(); | 834 g = remote_candidate_.priority(); |
| 836 d = local_candidate().priority(); | 835 d = local_candidate().priority(); |
| 837 } | 836 } |
| 838 priority = std::min(g, d); | 837 priority = std::min(g, d); |
| 839 priority = priority << 32; | 838 priority = priority << 32; |
| 840 priority += 2 * std::max(g, d) + (g > d ? 1 : 0); | 839 priority += 2 * std::max(g, d) + (g > d ? 1 : 0); |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1022 } | 1021 } |
| 1023 oss << "... " << (pings_since_last_response_.size() - max) << " more"; | 1022 oss << "... " << (pings_since_last_response_.size() - max) << " more"; |
| 1024 } else { | 1023 } else { |
| 1025 for (const SentPing& ping : pings_since_last_response_) { | 1024 for (const SentPing& ping : pings_since_last_response_) { |
| 1026 oss << rtc::hex_encode(ping.id) << " "; | 1025 oss << rtc::hex_encode(ping.id) << " "; |
| 1027 } | 1026 } |
| 1028 } | 1027 } |
| 1029 *s = oss.str(); | 1028 *s = oss.str(); |
| 1030 } | 1029 } |
| 1031 | 1030 |
| 1032 void Connection::UpdateState(uint32 now) { | 1031 void Connection::UpdateState(uint32_t now) { |
| 1033 uint32 rtt = ConservativeRTTEstimate(rtt_); | 1032 uint32_t rtt = ConservativeRTTEstimate(rtt_); |
| 1034 | 1033 |
| 1035 if (LOG_CHECK_LEVEL(LS_VERBOSE)) { | 1034 if (LOG_CHECK_LEVEL(LS_VERBOSE)) { |
| 1036 std::string pings; | 1035 std::string pings; |
| 1037 PrintPingsSinceLastResponse(&pings, 5); | 1036 PrintPingsSinceLastResponse(&pings, 5); |
| 1038 LOG_J(LS_VERBOSE, this) << "UpdateState()" | 1037 LOG_J(LS_VERBOSE, this) << "UpdateState()" |
| 1039 << ", ms since last received response=" | 1038 << ", ms since last received response=" |
| 1040 << now - last_ping_response_received_ | 1039 << now - last_ping_response_received_ |
| 1041 << ", ms since last received data=" | 1040 << ", ms since last received data=" |
| 1042 << now - last_data_received_ | 1041 << now - last_data_received_ |
| 1043 << ", rtt=" << rtt | 1042 << ", rtt=" << rtt |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1054 // allow for changes in network conditions. | 1053 // allow for changes in network conditions. |
| 1055 | 1054 |
| 1056 if ((write_state_ == STATE_WRITABLE) && | 1055 if ((write_state_ == STATE_WRITABLE) && |
| 1057 TooManyFailures(pings_since_last_response_, | 1056 TooManyFailures(pings_since_last_response_, |
| 1058 CONNECTION_WRITE_CONNECT_FAILURES, | 1057 CONNECTION_WRITE_CONNECT_FAILURES, |
| 1059 rtt, | 1058 rtt, |
| 1060 now) && | 1059 now) && |
| 1061 TooLongWithoutResponse(pings_since_last_response_, | 1060 TooLongWithoutResponse(pings_since_last_response_, |
| 1062 CONNECTION_WRITE_CONNECT_TIMEOUT, | 1061 CONNECTION_WRITE_CONNECT_TIMEOUT, |
| 1063 now)) { | 1062 now)) { |
| 1064 uint32 max_pings = CONNECTION_WRITE_CONNECT_FAILURES; | 1063 uint32_t max_pings = CONNECTION_WRITE_CONNECT_FAILURES; |
| 1065 LOG_J(LS_INFO, this) << "Unwritable after " << max_pings | 1064 LOG_J(LS_INFO, this) << "Unwritable after " << max_pings |
| 1066 << " ping failures and " | 1065 << " ping failures and " |
| 1067 << now - pings_since_last_response_[0].sent_time | 1066 << now - pings_since_last_response_[0].sent_time |
| 1068 << " ms without a response," | 1067 << " ms without a response," |
| 1069 << " ms since last received ping=" | 1068 << " ms since last received ping=" |
| 1070 << now - last_ping_received_ | 1069 << now - last_ping_received_ |
| 1071 << " ms since last received data=" | 1070 << " ms since last received data=" |
| 1072 << now - last_data_received_ | 1071 << now - last_data_received_ |
| 1073 << " rtt=" << rtt; | 1072 << " rtt=" << rtt; |
| 1074 set_write_state(STATE_WRITE_UNRELIABLE); | 1073 set_write_state(STATE_WRITE_UNRELIABLE); |
| 1075 } | 1074 } |
| 1076 if ((write_state_ == STATE_WRITE_UNRELIABLE || | 1075 if ((write_state_ == STATE_WRITE_UNRELIABLE || |
| 1077 write_state_ == STATE_WRITE_INIT) && | 1076 write_state_ == STATE_WRITE_INIT) && |
| 1078 TooLongWithoutResponse(pings_since_last_response_, | 1077 TooLongWithoutResponse(pings_since_last_response_, |
| 1079 CONNECTION_WRITE_TIMEOUT, | 1078 CONNECTION_WRITE_TIMEOUT, |
| 1080 now)) { | 1079 now)) { |
| 1081 LOG_J(LS_INFO, this) << "Timed out after " | 1080 LOG_J(LS_INFO, this) << "Timed out after " |
| 1082 << now - pings_since_last_response_[0].sent_time | 1081 << now - pings_since_last_response_[0].sent_time |
| 1083 << " ms without a response" | 1082 << " ms without a response" |
| 1084 << ", rtt=" << rtt; | 1083 << ", rtt=" << rtt; |
| 1085 set_write_state(STATE_WRITE_TIMEOUT); | 1084 set_write_state(STATE_WRITE_TIMEOUT); |
| 1086 } | 1085 } |
| 1087 | 1086 |
| 1088 // Check the receiving state. | 1087 // Check the receiving state. |
| 1089 uint32 last_recv_time = last_received(); | 1088 uint32_t last_recv_time = last_received(); |
| 1090 bool receiving = now <= last_recv_time + receiving_timeout_; | 1089 bool receiving = now <= last_recv_time + receiving_timeout_; |
| 1091 set_receiving(receiving); | 1090 set_receiving(receiving); |
| 1092 } | 1091 } |
| 1093 | 1092 |
| 1094 void Connection::Ping(uint32 now) { | 1093 void Connection::Ping(uint32_t now) { |
| 1095 last_ping_sent_ = now; | 1094 last_ping_sent_ = now; |
| 1096 ConnectionRequest *req = new ConnectionRequest(this); | 1095 ConnectionRequest *req = new ConnectionRequest(this); |
| 1097 pings_since_last_response_.push_back(SentPing(req->id(), now)); | 1096 pings_since_last_response_.push_back(SentPing(req->id(), now)); |
| 1098 LOG_J(LS_VERBOSE, this) << "Sending STUN ping " | 1097 LOG_J(LS_VERBOSE, this) << "Sending STUN ping " |
| 1099 << ", id=" << rtc::hex_encode(req->id()); | 1098 << ", id=" << rtc::hex_encode(req->id()); |
| 1100 requests_.Send(req); | 1099 requests_.Send(req); |
| 1101 state_ = STATE_INPROGRESS; | 1100 state_ = STATE_INPROGRESS; |
| 1102 } | 1101 } |
| 1103 | 1102 |
| 1104 void Connection::ReceivedPing() { | 1103 void Connection::ReceivedPing() { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1175 std::string Connection::ToSensitiveString() const { | 1174 std::string Connection::ToSensitiveString() const { |
| 1176 return ToString(); | 1175 return ToString(); |
| 1177 } | 1176 } |
| 1178 | 1177 |
| 1179 void Connection::OnConnectionRequestResponse(ConnectionRequest* request, | 1178 void Connection::OnConnectionRequestResponse(ConnectionRequest* request, |
| 1180 StunMessage* response) { | 1179 StunMessage* response) { |
| 1181 // Log at LS_INFO if we receive a ping response on an unwritable | 1180 // Log at LS_INFO if we receive a ping response on an unwritable |
| 1182 // connection. | 1181 // connection. |
| 1183 rtc::LoggingSeverity sev = !writable() ? rtc::LS_INFO : rtc::LS_VERBOSE; | 1182 rtc::LoggingSeverity sev = !writable() ? rtc::LS_INFO : rtc::LS_VERBOSE; |
| 1184 | 1183 |
| 1185 uint32 rtt = request->Elapsed(); | 1184 uint32_t rtt = request->Elapsed(); |
| 1186 | 1185 |
| 1187 ReceivedPingResponse(); | 1186 ReceivedPingResponse(); |
| 1188 | 1187 |
| 1189 if (LOG_CHECK_LEVEL_V(sev)) { | 1188 if (LOG_CHECK_LEVEL_V(sev)) { |
| 1190 bool use_candidate = ( | 1189 bool use_candidate = ( |
| 1191 response->GetByteString(STUN_ATTR_USE_CANDIDATE) != nullptr); | 1190 response->GetByteString(STUN_ATTR_USE_CANDIDATE) != nullptr); |
| 1192 std::string pings; | 1191 std::string pings; |
| 1193 PrintPingsSinceLastResponse(&pings, 5); | 1192 PrintPingsSinceLastResponse(&pings, 5); |
| 1194 LOG_JV(sev, this) << "Received STUN ping response" | 1193 LOG_JV(sev, this) << "Received STUN ping response" |
| 1195 << ", id=" << rtc::hex_encode(request->id()) | 1194 << ", id=" << rtc::hex_encode(request->id()) |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1283 } | 1282 } |
| 1284 } | 1283 } |
| 1285 | 1284 |
| 1286 void Connection::OnMessage(rtc::Message *pmsg) { | 1285 void Connection::OnMessage(rtc::Message *pmsg) { |
| 1287 ASSERT(pmsg->message_id == MSG_DELETE); | 1286 ASSERT(pmsg->message_id == MSG_DELETE); |
| 1288 LOG_J(LS_INFO, this) << "Connection deleted due to read or write timeout"; | 1287 LOG_J(LS_INFO, this) << "Connection deleted due to read or write timeout"; |
| 1289 SignalDestroyed(this); | 1288 SignalDestroyed(this); |
| 1290 delete this; | 1289 delete this; |
| 1291 } | 1290 } |
| 1292 | 1291 |
| 1293 uint32 Connection::last_received() { | 1292 uint32_t Connection::last_received() { |
| 1294 return std::max(last_data_received_, | 1293 return std::max(last_data_received_, |
| 1295 std::max(last_ping_received_, last_ping_response_received_)); | 1294 std::max(last_ping_received_, last_ping_response_received_)); |
| 1296 } | 1295 } |
| 1297 | 1296 |
| 1298 size_t Connection::recv_bytes_second() { | 1297 size_t Connection::recv_bytes_second() { |
| 1299 return recv_rate_tracker_.ComputeRate(); | 1298 return recv_rate_tracker_.ComputeRate(); |
| 1300 } | 1299 } |
| 1301 | 1300 |
| 1302 size_t Connection::recv_total_bytes() { | 1301 size_t Connection::recv_total_bytes() { |
| 1303 return recv_rate_tracker_.TotalSampleCount(); | 1302 return recv_rate_tracker_.TotalSampleCount(); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1350 // Its priority is set equal to the value of the PRIORITY attribute | 1349 // Its priority is set equal to the value of the PRIORITY attribute |
| 1351 // in the Binding request. | 1350 // in the Binding request. |
| 1352 const StunUInt32Attribute* priority_attr = | 1351 const StunUInt32Attribute* priority_attr = |
| 1353 request->msg()->GetUInt32(STUN_ATTR_PRIORITY); | 1352 request->msg()->GetUInt32(STUN_ATTR_PRIORITY); |
| 1354 if (!priority_attr) { | 1353 if (!priority_attr) { |
| 1355 LOG(LS_WARNING) << "Connection::OnConnectionRequestResponse - " | 1354 LOG(LS_WARNING) << "Connection::OnConnectionRequestResponse - " |
| 1356 << "No STUN_ATTR_PRIORITY found in the " | 1355 << "No STUN_ATTR_PRIORITY found in the " |
| 1357 << "stun response message"; | 1356 << "stun response message"; |
| 1358 return; | 1357 return; |
| 1359 } | 1358 } |
| 1360 const uint32 priority = priority_attr->value(); | 1359 const uint32_t priority = priority_attr->value(); |
| 1361 std::string id = rtc::CreateRandomString(8); | 1360 std::string id = rtc::CreateRandomString(8); |
| 1362 | 1361 |
| 1363 Candidate new_local_candidate; | 1362 Candidate new_local_candidate; |
| 1364 new_local_candidate.set_id(id); | 1363 new_local_candidate.set_id(id); |
| 1365 new_local_candidate.set_component(local_candidate().component()); | 1364 new_local_candidate.set_component(local_candidate().component()); |
| 1366 new_local_candidate.set_type(PRFLX_PORT_TYPE); | 1365 new_local_candidate.set_type(PRFLX_PORT_TYPE); |
| 1367 new_local_candidate.set_protocol(local_candidate().protocol()); | 1366 new_local_candidate.set_protocol(local_candidate().protocol()); |
| 1368 new_local_candidate.set_address(addr->GetAddress()); | 1367 new_local_candidate.set_address(addr->GetAddress()); |
| 1369 new_local_candidate.set_priority(priority); | 1368 new_local_candidate.set_priority(priority); |
| 1370 new_local_candidate.set_username(local_candidate().username()); | 1369 new_local_candidate.set_username(local_candidate().username()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1402 ASSERT(sent < 0); | 1401 ASSERT(sent < 0); |
| 1403 error_ = port_->GetError(); | 1402 error_ = port_->GetError(); |
| 1404 sent_packets_discarded_++; | 1403 sent_packets_discarded_++; |
| 1405 } else { | 1404 } else { |
| 1406 send_rate_tracker_.AddSamples(sent); | 1405 send_rate_tracker_.AddSamples(sent); |
| 1407 } | 1406 } |
| 1408 return sent; | 1407 return sent; |
| 1409 } | 1408 } |
| 1410 | 1409 |
| 1411 } // namespace cricket | 1410 } // namespace cricket |
| OLD | NEW |