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

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

Issue 1345913004: Replace readable with receiving where receiving means receiving anything (stun ping, response or da… (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Address comments Created 5 years, 3 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/p2ptransportchannel.h ('k') | webrtc/p2p/base/p2ptransportchannel_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 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 session->SignalCandidatesReady.connect( 214 session->SignalCandidatesReady.connect(
215 this, &P2PTransportChannel::OnCandidatesReady); 215 this, &P2PTransportChannel::OnCandidatesReady);
216 session->SignalCandidatesAllocationDone.connect( 216 session->SignalCandidatesAllocationDone.connect(
217 this, &P2PTransportChannel::OnCandidatesAllocationDone); 217 this, &P2PTransportChannel::OnCandidatesAllocationDone);
218 session->StartGettingPorts(); 218 session->StartGettingPorts();
219 } 219 }
220 220
221 void P2PTransportChannel::AddConnection(Connection* connection) { 221 void P2PTransportChannel::AddConnection(Connection* connection) {
222 connections_.push_back(connection); 222 connections_.push_back(connection);
223 connection->set_remote_ice_mode(remote_ice_mode_); 223 connection->set_remote_ice_mode(remote_ice_mode_);
224 connection->set_receiving_timeout(receiving_timeout_);
224 connection->SignalReadPacket.connect( 225 connection->SignalReadPacket.connect(
225 this, &P2PTransportChannel::OnReadPacket); 226 this, &P2PTransportChannel::OnReadPacket);
226 connection->SignalReadyToSend.connect( 227 connection->SignalReadyToSend.connect(
227 this, &P2PTransportChannel::OnReadyToSend); 228 this, &P2PTransportChannel::OnReadyToSend);
228 connection->SignalStateChange.connect( 229 connection->SignalStateChange.connect(
229 this, &P2PTransportChannel::OnConnectionStateChange); 230 this, &P2PTransportChannel::OnConnectionStateChange);
230 connection->SignalDestroyed.connect( 231 connection->SignalDestroyed.connect(
231 this, &P2PTransportChannel::OnConnectionDestroyed); 232 this, &P2PTransportChannel::OnConnectionDestroyed);
232 connection->SignalNominated.connect(this, &P2PTransportChannel::OnNominated); 233 connection->SignalNominated.connect(this, &P2PTransportChannel::OnNominated);
233 } 234 }
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 remote_ice_mode_ = mode; 334 remote_ice_mode_ = mode;
334 } 335 }
335 336
336 void P2PTransportChannel::SetReceivingTimeout(int receiving_timeout_ms) { 337 void P2PTransportChannel::SetReceivingTimeout(int receiving_timeout_ms) {
337 if (receiving_timeout_ms < 0) { 338 if (receiving_timeout_ms < 0) {
338 return; 339 return;
339 } 340 }
340 receiving_timeout_ = receiving_timeout_ms; 341 receiving_timeout_ = receiving_timeout_ms;
341 check_receiving_delay_ = 342 check_receiving_delay_ =
342 std::max(MIN_CHECK_RECEIVING_DELAY, receiving_timeout_ / 10); 343 std::max(MIN_CHECK_RECEIVING_DELAY, receiving_timeout_ / 10);
344
345 for (Connection* connection : connections_) {
346 connection->set_receiving_timeout(receiving_timeout_);
347 }
343 LOG(LS_VERBOSE) << "Set ICE receiving timeout to " << receiving_timeout_ 348 LOG(LS_VERBOSE) << "Set ICE receiving timeout to " << receiving_timeout_
344 << " milliseconds"; 349 << " milliseconds";
345 } 350 }
346 351
347 // Go into the state of processing candidates, and running in general 352 // Go into the state of processing candidates, and running in general
348 void P2PTransportChannel::Connect() { 353 void P2PTransportChannel::Connect() {
349 ASSERT(worker_thread_ == rtc::Thread::Current()); 354 ASSERT(worker_thread_ == rtc::Thread::Current());
350 if (ice_ufrag_.empty() || ice_pwd_.empty()) { 355 if (ice_ufrag_.empty() || ice_pwd_.empty()) {
351 ASSERT(false); 356 ASSERT(false);
352 LOG(LS_ERROR) << "P2PTransportChannel::Connect: The ice_ufrag_ and the " 357 LOG(LS_ERROR) << "P2PTransportChannel::Connect: The ice_ufrag_ and the "
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 port->SignalDestroyed.connect(this, &P2PTransportChannel::OnPortDestroyed); 398 port->SignalDestroyed.connect(this, &P2PTransportChannel::OnPortDestroyed);
394 port->SignalRoleConflict.connect( 399 port->SignalRoleConflict.connect(
395 this, &P2PTransportChannel::OnRoleConflict); 400 this, &P2PTransportChannel::OnRoleConflict);
396 401
397 // Attempt to create a connection from this new port to all of the remote 402 // Attempt to create a connection from this new port to all of the remote
398 // candidates that we were given so far. 403 // candidates that we were given so far.
399 404
400 std::vector<RemoteCandidate>::iterator iter; 405 std::vector<RemoteCandidate>::iterator iter;
401 for (iter = remote_candidates_.begin(); iter != remote_candidates_.end(); 406 for (iter = remote_candidates_.begin(); iter != remote_candidates_.end();
402 ++iter) { 407 ++iter) {
403 CreateConnection(port, *iter, iter->origin_port(), false); 408 CreateConnection(port, *iter, iter->origin_port());
404 } 409 }
405 410
406 SortConnections(); 411 SortConnections();
407 } 412 }
408 413
409 // A new candidate is available, let listeners know 414 // A new candidate is available, let listeners know
410 void P2PTransportChannel::OnCandidatesReady( 415 void P2PTransportChannel::OnCandidatesReady(
411 PortAllocatorSession *session, const std::vector<Candidate>& candidates) { 416 PortAllocatorSession *session, const std::vector<Candidate>& candidates) {
412 ASSERT(worker_thread_ == rtc::Thread::Current()); 417 ASSERT(worker_thread_ == rtc::Thread::Current());
413 for (size_t i = 0; i < candidates.size(); ++i) { 418 for (size_t i = 0; i < candidates.size(); ++i) {
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 // remote candidate with an older generation arrives, drop it. 614 // remote candidate with an older generation arrives, drop it.
610 if (generation != 0 && generation < remote_candidate_generation_) { 615 if (generation != 0 && generation < remote_candidate_generation_) {
611 LOG(LS_WARNING) << "Dropping a remote candidate because its generation " 616 LOG(LS_WARNING) << "Dropping a remote candidate because its generation "
612 << generation 617 << generation
613 << " is lower than the current remote generation " 618 << " is lower than the current remote generation "
614 << remote_candidate_generation_; 619 << remote_candidate_generation_;
615 return; 620 return;
616 } 621 }
617 622
618 // Create connections to this remote candidate. 623 // Create connections to this remote candidate.
619 CreateConnections(candidate, NULL, false); 624 CreateConnections(candidate, NULL);
620 625
621 // Resort the connections list, which may have new elements. 626 // Resort the connections list, which may have new elements.
622 SortConnections(); 627 SortConnections();
623 } 628 }
624 629
625 // Creates connections from all of the ports that we care about to the given 630 // Creates connections from all of the ports that we care about to the given
626 // remote candidate. The return value is true if we created a connection from 631 // remote candidate. The return value is true if we created a connection from
627 // the origin port. 632 // the origin port.
628 bool P2PTransportChannel::CreateConnections(const Candidate& remote_candidate, 633 bool P2PTransportChannel::CreateConnections(const Candidate& remote_candidate,
629 PortInterface* origin_port, 634 PortInterface* origin_port) {
630 bool readable) {
631 ASSERT(worker_thread_ == rtc::Thread::Current()); 635 ASSERT(worker_thread_ == rtc::Thread::Current());
632 636
633 Candidate new_remote_candidate(remote_candidate); 637 Candidate new_remote_candidate(remote_candidate);
634 new_remote_candidate.set_generation( 638 new_remote_candidate.set_generation(
635 GetRemoteCandidateGeneration(remote_candidate)); 639 GetRemoteCandidateGeneration(remote_candidate));
636 // ICE candidates don't need to have username and password set, but 640 // ICE candidates don't need to have username and password set, but
637 // the code below this (specifically, ConnectionRequest::Prepare in 641 // the code below this (specifically, ConnectionRequest::Prepare in
638 // port.cc) uses the remote candidates's username. So, we set it 642 // port.cc) uses the remote candidates's username. So, we set it
639 // here. 643 // here.
640 if (remote_candidate.username().empty()) { 644 if (remote_candidate.username().empty()) {
(...skipping 17 matching lines...) Expand all
658 } 662 }
659 663
660 // Add a new connection for this candidate to every port that allows such a 664 // Add a new connection for this candidate to every port that allows such a
661 // connection (i.e., if they have compatible protocols) and that does not 665 // connection (i.e., if they have compatible protocols) and that does not
662 // already have a connection to an equivalent candidate. We must be careful 666 // already have a connection to an equivalent candidate. We must be careful
663 // to make sure that the origin port is included, even if it was pruned, 667 // to make sure that the origin port is included, even if it was pruned,
664 // since that may be the only port that can create this connection. 668 // since that may be the only port that can create this connection.
665 bool created = false; 669 bool created = false;
666 std::vector<PortInterface *>::reverse_iterator it; 670 std::vector<PortInterface *>::reverse_iterator it;
667 for (it = ports_.rbegin(); it != ports_.rend(); ++it) { 671 for (it = ports_.rbegin(); it != ports_.rend(); ++it) {
668 if (CreateConnection(*it, new_remote_candidate, origin_port, readable)) { 672 if (CreateConnection(*it, new_remote_candidate, origin_port)) {
669 if (*it == origin_port) 673 if (*it == origin_port)
670 created = true; 674 created = true;
671 } 675 }
672 } 676 }
673 677
674 if ((origin_port != NULL) && 678 if ((origin_port != NULL) &&
675 std::find(ports_.begin(), ports_.end(), origin_port) == ports_.end()) { 679 std::find(ports_.begin(), ports_.end(), origin_port) == ports_.end()) {
676 if (CreateConnection( 680 if (CreateConnection(origin_port, new_remote_candidate, origin_port))
677 origin_port, new_remote_candidate, origin_port, readable))
678 created = true; 681 created = true;
679 } 682 }
680 683
681 // Remember this remote candidate so that we can add it to future ports. 684 // Remember this remote candidate so that we can add it to future ports.
682 RememberRemoteCandidate(new_remote_candidate, origin_port); 685 RememberRemoteCandidate(new_remote_candidate, origin_port);
683 686
684 return created; 687 return created;
685 } 688 }
686 689
687 // Setup a connection object for the local and remote candidate combination. 690 // Setup a connection object for the local and remote candidate combination.
688 // And then listen to connection object for changes. 691 // And then listen to connection object for changes.
689 bool P2PTransportChannel::CreateConnection(PortInterface* port, 692 bool P2PTransportChannel::CreateConnection(PortInterface* port,
690 const Candidate& remote_candidate, 693 const Candidate& remote_candidate,
691 PortInterface* origin_port, 694 PortInterface* origin_port) {
692 bool readable) {
693 // Look for an existing connection with this remote address. If one is not 695 // Look for an existing connection with this remote address. If one is not
694 // found, then we can create a new connection for this address. 696 // found, then we can create a new connection for this address.
695 Connection* connection = port->GetConnection(remote_candidate.address()); 697 Connection* connection = port->GetConnection(remote_candidate.address());
696 if (connection != NULL) { 698 if (connection != NULL) {
697 connection->MaybeUpdatePeerReflexiveCandidate(remote_candidate); 699 connection->MaybeUpdatePeerReflexiveCandidate(remote_candidate);
698 700
699 // It is not legal to try to change any of the parameters of an existing 701 // It is not legal to try to change any of the parameters of an existing
700 // connection; however, the other side can send a duplicate candidate. 702 // connection; however, the other side can send a duplicate candidate.
701 if (!remote_candidate.IsEquivalent(connection->remote_candidate())) { 703 if (!remote_candidate.IsEquivalent(connection->remote_candidate())) {
702 LOG(INFO) << "Attempt to change a remote candidate." 704 LOG(INFO) << "Attempt to change a remote candidate."
(...skipping 14 matching lines...) Expand all
717 connection = port->CreateConnection(remote_candidate, origin); 719 connection = port->CreateConnection(remote_candidate, origin);
718 if (!connection) 720 if (!connection)
719 return false; 721 return false;
720 722
721 AddConnection(connection); 723 AddConnection(connection);
722 724
723 LOG_J(LS_INFO, this) << "Created connection with origin=" << origin << ", (" 725 LOG_J(LS_INFO, this) << "Created connection with origin=" << origin << ", ("
724 << connections_.size() << " total)"; 726 << connections_.size() << " total)";
725 } 727 }
726 728
727 // If we are readable, it is because we are creating this in response to a
728 // ping from the other side. This will cause the state to become readable.
729 if (readable)
730 connection->ReceivedPing();
731
732 return true; 729 return true;
733 } 730 }
734 731
735 bool P2PTransportChannel::FindConnection( 732 bool P2PTransportChannel::FindConnection(
736 cricket::Connection* connection) const { 733 cricket::Connection* connection) const {
737 std::vector<Connection*>::const_iterator citer = 734 std::vector<Connection*>::const_iterator citer =
738 std::find(connections_.begin(), connections_.end(), connection); 735 std::find(connections_.begin(), connections_.end(), connection);
739 return citer != connections_.end(); 736 return citer != connections_.end();
740 } 737 }
741 738
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 bool P2PTransportChannel::GetStats(ConnectionInfos *infos) { 843 bool P2PTransportChannel::GetStats(ConnectionInfos *infos) {
847 ASSERT(worker_thread_ == rtc::Thread::Current()); 844 ASSERT(worker_thread_ == rtc::Thread::Current());
848 // Gather connection infos. 845 // Gather connection infos.
849 infos->clear(); 846 infos->clear();
850 847
851 std::vector<Connection *>::const_iterator it; 848 std::vector<Connection *>::const_iterator it;
852 for (it = connections_.begin(); it != connections_.end(); ++it) { 849 for (it = connections_.begin(); it != connections_.end(); ++it) {
853 Connection *connection = *it; 850 Connection *connection = *it;
854 ConnectionInfo info; 851 ConnectionInfo info;
855 info.best_connection = (best_connection_ == connection); 852 info.best_connection = (best_connection_ == connection);
856 info.readable = 853 info.receiving = connection->receiving();
857 (connection->read_state() == Connection::STATE_READABLE);
858 info.writable = 854 info.writable =
859 (connection->write_state() == Connection::STATE_WRITABLE); 855 (connection->write_state() == Connection::STATE_WRITABLE);
860 info.timeout = 856 info.timeout =
861 (connection->write_state() == Connection::STATE_WRITE_TIMEOUT); 857 (connection->write_state() == Connection::STATE_WRITE_TIMEOUT);
862 info.new_connection = !connection->reported(); 858 info.new_connection = !connection->reported();
863 connection->set_reported(true); 859 connection->set_reported(true);
864 info.rtt = connection->rtt(); 860 info.rtt = connection->rtt();
865 info.sent_total_bytes = connection->sent_total_bytes(); 861 info.sent_total_bytes = connection->sent_total_bytes();
866 info.sent_bytes_second = connection->sent_bytes_second(); 862 info.sent_bytes_second = connection->sent_bytes_second();
867 info.sent_discarded_packets = connection->sent_discarded_packets(); 863 info.sent_discarded_packets = connection->sent_discarded_packets();
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1022 Connection* old_best_connection = best_connection_; 1018 Connection* old_best_connection = best_connection_;
1023 best_connection_ = conn; 1019 best_connection_ = conn;
1024 if (best_connection_) { 1020 if (best_connection_) {
1025 if (old_best_connection) { 1021 if (old_best_connection) {
1026 LOG_J(LS_INFO, this) << "Previous best connection: " 1022 LOG_J(LS_INFO, this) << "Previous best connection: "
1027 << old_best_connection->ToString(); 1023 << old_best_connection->ToString();
1028 } 1024 }
1029 LOG_J(LS_INFO, this) << "New best connection: " 1025 LOG_J(LS_INFO, this) << "New best connection: "
1030 << best_connection_->ToString(); 1026 << best_connection_->ToString();
1031 SignalRouteChange(this, best_connection_->remote_candidate()); 1027 SignalRouteChange(this, best_connection_->remote_candidate());
1032 // When it just switched to a best connection, set receiving to true. 1028 set_receiving(best_connection_->receiving());
1033 set_receiving(true);
1034 } else { 1029 } else {
1035 LOG_J(LS_INFO, this) << "No best connection"; 1030 LOG_J(LS_INFO, this) << "No best connection";
1036 } 1031 }
1037 } 1032 }
1038 1033
1039 void P2PTransportChannel::UpdateChannelState() { 1034 void P2PTransportChannel::UpdateChannelState() {
1040 // The Handle* functions already set the writable state. We'll just double- 1035 // The Handle* functions already set the writable state. We'll just double-
1041 // check it here. 1036 // check it here.
1042 bool writable = ((best_connection_ != NULL) && 1037 bool writable = ((best_connection_ != NULL) &&
1043 (best_connection_->write_state() == 1038 (best_connection_->write_state() ==
1044 Connection::STATE_WRITABLE)); 1039 Connection::STATE_WRITABLE));
1045 ASSERT(writable == this->writable()); 1040 ASSERT(writable == this->writable());
1046 if (writable != this->writable()) 1041 if (writable != this->writable())
1047 LOG(LS_ERROR) << "UpdateChannelState: writable state mismatch"; 1042 LOG(LS_ERROR) << "UpdateChannelState: writable state mismatch";
1048 1043
1049 bool readable = false; 1044 // TODO(honghaiz): The channel receiving state is set in OnCheckReceiving.
1050 for (uint32 i = 0; i < connections_.size(); ++i) { 1045 // Will revisit in a subsequent code change.
1051 if (connections_[i]->read_state() == Connection::STATE_READABLE) {
1052 readable = true;
1053 break;
1054 }
1055 }
1056 set_readable(readable);
1057 } 1046 }
1058 1047
1059 // We checked the status of our connections and we had at least one that 1048 // We checked the status of our connections and we had at least one that
1060 // was writable, go into the writable state. 1049 // was writable, go into the writable state.
1061 void P2PTransportChannel::HandleWritable() { 1050 void P2PTransportChannel::HandleWritable() {
1062 ASSERT(worker_thread_ == rtc::Thread::Current()); 1051 ASSERT(worker_thread_ == rtc::Thread::Current());
1063 if (!writable()) { 1052 if (!writable()) {
1064 for (uint32 i = 0; i < allocator_sessions_.size(); ++i) { 1053 for (uint32 i = 0; i < allocator_sessions_.size(); ++i) {
1065 if (allocator_sessions_[i]->IsGettingPorts()) { 1054 if (allocator_sessions_[i]->IsGettingPorts()) {
1066 allocator_sessions_[i]->StopGettingPorts(); 1055 allocator_sessions_[i]->StopGettingPorts();
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1137 Connection* conn = FindNextPingableConnection(); 1126 Connection* conn = FindNextPingableConnection();
1138 if (conn) 1127 if (conn)
1139 PingConnection(conn); 1128 PingConnection(conn);
1140 1129
1141 // Post ourselves a message to perform the next ping. 1130 // Post ourselves a message to perform the next ping.
1142 uint32 delay = writable() ? WRITABLE_DELAY : UNWRITABLE_DELAY; 1131 uint32 delay = writable() ? WRITABLE_DELAY : UNWRITABLE_DELAY;
1143 thread()->PostDelayed(delay, this, MSG_PING); 1132 thread()->PostDelayed(delay, this, MSG_PING);
1144 } 1133 }
1145 1134
1146 void P2PTransportChannel::OnCheckReceiving() { 1135 void P2PTransportChannel::OnCheckReceiving() {
1147 // Check receiving only if the best connection has received data packets 1136 if (best_connection_) {
1148 // because we want to detect not receiving any packets only after the media
1149 // have started flowing.
1150 if (best_connection_ && best_connection_->recv_total_bytes() > 0) {
1151 bool receiving = rtc::Time() <= 1137 bool receiving = rtc::Time() <=
1152 best_connection_->last_received() + receiving_timeout_; 1138 best_connection_->last_received() + receiving_timeout_;
1153 set_receiving(receiving); 1139 set_receiving(receiving);
1154 } 1140 }
1155 1141
1156 thread()->PostDelayed(check_receiving_delay_, this, MSG_CHECK_RECEIVING); 1142 thread()->PostDelayed(check_receiving_delay_, this, MSG_CHECK_RECEIVING);
1157 } 1143 }
1158 1144
1159 // Is the connection in a state for us to even consider pinging the other side? 1145 // Is the connection in a state for us to even consider pinging the other side?
1160 // We consider a connection pingable even if it's not connected because that's 1146 // We consider a connection pingable even if it's not connected because that's
1161 // how a TCP connection is kicked into reconnecting on the active side. 1147 // how a TCP connection is kicked into reconnecting on the active side.
1162 bool P2PTransportChannel::IsPingable(Connection* conn) { 1148 bool P2PTransportChannel::IsPingable(Connection* conn) {
1163 const Candidate& remote = conn->remote_candidate(); 1149 const Candidate& remote = conn->remote_candidate();
1164 // We should never get this far with an empty remote ufrag. 1150 // We should never get this far with an empty remote ufrag.
1165 ASSERT(!remote.username().empty()); 1151 ASSERT(!remote.username().empty());
1166 if (remote.username().empty() || remote.password().empty()) { 1152 if (remote.username().empty() || remote.password().empty()) {
1167 // If we don't have an ICE ufrag and pwd, there's no way we can ping. 1153 // If we don't have an ICE ufrag and pwd, there's no way we can ping.
1168 return false; 1154 return false;
1169 } 1155 }
1170 1156
1171 // An never connected connection cannot be written to at all, so pinging is 1157 // An never connected connection cannot be written to at all, so pinging is
1172 // out of the question. However, if it has become WRITABLE, it is in the 1158 // out of the question. However, if it has become WRITABLE, it is in the
1173 // reconnecting state so ping is needed. 1159 // reconnecting state so ping is needed.
1174 if (!conn->connected() && conn->write_state() != Connection::STATE_WRITABLE) { 1160 if (!conn->connected() && !conn->writable()) {
1175 return false; 1161 return false;
1176 } 1162 }
1177 1163
1178 if (writable()) { 1164 // If the channel is not writable, ping all candidates. Otherwise, we only
1179 // If we are writable, then we only want to ping connections that could be 1165 // want to ping connections that have not timed out on writing.
1180 // better than this one, i.e., the ones that were not pruned. 1166 return !writable() || conn->write_state() != Connection::STATE_WRITE_TIMEOUT;
1181 return (conn->write_state() != Connection::STATE_WRITE_TIMEOUT);
1182 } else {
1183 // If we are not writable, then we need to try everything that might work.
1184 // This includes both connections that do not have write timeout as well as
1185 // ones that do not have read timeout. A connection could be readable but
1186 // be in write-timeout if we pruned it before. Since the other side is
1187 // still pinging it, it very well might still work.
1188 return (conn->write_state() != Connection::STATE_WRITE_TIMEOUT) ||
1189 (conn->read_state() != Connection::STATE_READ_TIMEOUT);
1190 }
1191 } 1167 }
1192 1168
1193 // Returns the next pingable connection to ping. This will be the oldest 1169 // Returns the next pingable connection to ping. This will be the oldest
1194 // pingable connection unless we have a connected, writable connection that is 1170 // pingable connection unless we have a connected, writable connection that is
1195 // past the maximum acceptable ping delay. When reconnecting a TCP connection, 1171 // past the maximum acceptable ping delay. When reconnecting a TCP connection,
1196 // the best connection is disconnected, although still WRITABLE while 1172 // the best connection is disconnected, although still WRITABLE while
1197 // reconnecting. The newly created connection should be selected as the ping 1173 // reconnecting. The newly created connection should be selected as the ping
1198 // target to become writable instead. See the big comment in CompareConnections. 1174 // target to become writable instead. See the big comment in CompareConnections.
1199 Connection* P2PTransportChannel::FindNextPingableConnection() { 1175 Connection* P2PTransportChannel::FindNextPingableConnection() {
1200 uint32 now = rtc::Time(); 1176 uint32 now = rtc::Time();
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1355 } 1331 }
1356 } 1332 }
1357 1333
1358 void P2PTransportChannel::OnReadyToSend(Connection* connection) { 1334 void P2PTransportChannel::OnReadyToSend(Connection* connection) {
1359 if (connection == best_connection_ && writable()) { 1335 if (connection == best_connection_ && writable()) {
1360 SignalReadyToSend(this); 1336 SignalReadyToSend(this);
1361 } 1337 }
1362 } 1338 }
1363 1339
1364 } // namespace cricket 1340 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/p2p/base/p2ptransportchannel.h ('k') | webrtc/p2p/base/p2ptransportchannel_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698