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

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

Issue 1362503003: Use suffixed {uint,int}{8,16,32,64}_t types. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: google::int32 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
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 15 matching lines...) Expand all
26 MSG_SORT = 1, 26 MSG_SORT = 1,
27 MSG_PING, 27 MSG_PING,
28 MSG_CHECK_RECEIVING 28 MSG_CHECK_RECEIVING
29 }; 29 };
30 30
31 // When the socket is unwritable, we will use 10 Kbps (ignoring IP+UDP headers) 31 // When the socket is unwritable, we will use 10 Kbps (ignoring IP+UDP headers)
32 // for pinging. When the socket is writable, we will use only 1 Kbps because 32 // for pinging. When the socket is writable, we will use only 1 Kbps because
33 // we don't want to degrade the quality on a modem. These numbers should work 33 // we don't want to degrade the quality on a modem. These numbers should work
34 // well on a 28.8K modem, which is the slowest connection on which the voice 34 // well on a 28.8K modem, which is the slowest connection on which the voice
35 // quality is reasonable at all. 35 // quality is reasonable at all.
36 static const uint32 PING_PACKET_SIZE = 60 * 8; 36 static const uint32_t PING_PACKET_SIZE = 60 * 8;
37 static const uint32 WRITABLE_DELAY = 1000 * PING_PACKET_SIZE / 1000; // 480ms 37 static const uint32_t WRITABLE_DELAY = 1000 * PING_PACKET_SIZE / 1000; // 480ms
38 static const uint32 UNWRITABLE_DELAY = 1000 * PING_PACKET_SIZE / 10000; // 50ms 38 static const uint32_t UNWRITABLE_DELAY =
39 1000 * PING_PACKET_SIZE / 10000; // 50ms
39 40
40 // If there is a current writable connection, then we will also try hard to 41 // If there is a current writable connection, then we will also try hard to
41 // make sure it is pinged at this rate. 42 // make sure it is pinged at this rate.
42 static const uint32 MAX_CURRENT_WRITABLE_DELAY = 900; // 2*WRITABLE_DELAY - bit 43 static const uint32_t MAX_CURRENT_WRITABLE_DELAY =
44 900; // 2*WRITABLE_DELAY - bit
43 45
44 static const int MIN_CHECK_RECEIVING_DELAY = 50; // ms 46 static const int MIN_CHECK_RECEIVING_DELAY = 50; // ms
45 47
46 // The minimum improvement in RTT that justifies a switch. 48 // The minimum improvement in RTT that justifies a switch.
47 static const double kMinImprovement = 10; 49 static const double kMinImprovement = 10;
48 50
49 cricket::PortInterface::CandidateOrigin GetOrigin(cricket::PortInterface* port, 51 cricket::PortInterface::CandidateOrigin GetOrigin(cricket::PortInterface* port,
50 cricket::PortInterface* origin_port) { 52 cricket::PortInterface* origin_port) {
51 if (!origin_port) 53 if (!origin_port)
52 return cricket::PortInterface::ORIGIN_MESSAGE; 54 return cricket::PortInterface::ORIGIN_MESSAGE;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 ice_role_(ICEROLE_UNKNOWN), 190 ice_role_(ICEROLE_UNKNOWN),
189 tiebreaker_(0), 191 tiebreaker_(0),
190 remote_candidate_generation_(0), 192 remote_candidate_generation_(0),
191 check_receiving_delay_(MIN_CHECK_RECEIVING_DELAY * 5), 193 check_receiving_delay_(MIN_CHECK_RECEIVING_DELAY * 5),
192 receiving_timeout_(MIN_CHECK_RECEIVING_DELAY * 50) { 194 receiving_timeout_(MIN_CHECK_RECEIVING_DELAY * 50) {
193 } 195 }
194 196
195 P2PTransportChannel::~P2PTransportChannel() { 197 P2PTransportChannel::~P2PTransportChannel() {
196 ASSERT(worker_thread_ == rtc::Thread::Current()); 198 ASSERT(worker_thread_ == rtc::Thread::Current());
197 199
198 for (uint32 i = 0; i < allocator_sessions_.size(); ++i) 200 for (uint32_t i = 0; i < allocator_sessions_.size(); ++i)
199 delete allocator_sessions_[i]; 201 delete allocator_sessions_[i];
200 } 202 }
201 203
202 // Add the allocator session to our list so that we know which sessions 204 // Add the allocator session to our list so that we know which sessions
203 // are still active. 205 // are still active.
204 void P2PTransportChannel::AddAllocatorSession(PortAllocatorSession* session) { 206 void P2PTransportChannel::AddAllocatorSession(PortAllocatorSession* session) {
205 session->set_generation(static_cast<uint32>(allocator_sessions_.size())); 207 session->set_generation(static_cast<uint32_t>(allocator_sessions_.size()));
206 allocator_sessions_.push_back(session); 208 allocator_sessions_.push_back(session);
207 209
208 // We now only want to apply new candidates that we receive to the ports 210 // We now only want to apply new candidates that we receive to the ports
209 // created by this new session because these are replacing those of the 211 // created by this new session because these are replacing those of the
210 // previous sessions. 212 // previous sessions.
211 ports_.clear(); 213 ports_.clear();
212 214
213 session->SignalPortReady.connect(this, &P2PTransportChannel::OnPortReady); 215 session->SignalPortReady.connect(this, &P2PTransportChannel::OnPortReady);
214 session->SignalCandidatesReady.connect( 216 session->SignalCandidatesReady.connect(
215 this, &P2PTransportChannel::OnCandidatesReady); 217 this, &P2PTransportChannel::OnCandidatesReady);
(...skipping 21 matching lines...) Expand all
237 ASSERT(worker_thread_ == rtc::Thread::Current()); 239 ASSERT(worker_thread_ == rtc::Thread::Current());
238 if (ice_role_ != ice_role) { 240 if (ice_role_ != ice_role) {
239 ice_role_ = ice_role; 241 ice_role_ = ice_role;
240 for (std::vector<PortInterface *>::iterator it = ports_.begin(); 242 for (std::vector<PortInterface *>::iterator it = ports_.begin();
241 it != ports_.end(); ++it) { 243 it != ports_.end(); ++it) {
242 (*it)->SetIceRole(ice_role); 244 (*it)->SetIceRole(ice_role);
243 } 245 }
244 } 246 }
245 } 247 }
246 248
247 void P2PTransportChannel::SetIceTiebreaker(uint64 tiebreaker) { 249 void P2PTransportChannel::SetIceTiebreaker(uint64_t tiebreaker) {
248 ASSERT(worker_thread_ == rtc::Thread::Current()); 250 ASSERT(worker_thread_ == rtc::Thread::Current());
249 if (!ports_.empty()) { 251 if (!ports_.empty()) {
250 LOG(LS_ERROR) 252 LOG(LS_ERROR)
251 << "Attempt to change tiebreaker after Port has been allocated."; 253 << "Attempt to change tiebreaker after Port has been allocated.";
252 return; 254 return;
253 } 255 }
254 256
255 tiebreaker_ = tiebreaker; 257 tiebreaker_ = tiebreaker;
256 } 258 }
257 259
258 // Currently a channel is considered ICE completed once there is no 260 // Currently a channel is considered ICE completed once there is no
259 // more than one connection per Network. This works for a single NIC 261 // more than one connection per Network. This works for a single NIC
260 // with both IPv4 and IPv6 enabled. However, this condition won't 262 // with both IPv4 and IPv6 enabled. However, this condition won't
261 // happen when there are multiple NICs and all of them have 263 // happen when there are multiple NICs and all of them have
262 // connectivity. 264 // connectivity.
263 // TODO(guoweis): Change Completion to be driven by a channel level 265 // TODO(guoweis): Change Completion to be driven by a channel level
264 // timer. 266 // timer.
265 TransportChannelState P2PTransportChannel::GetState() const { 267 TransportChannelState P2PTransportChannel::GetState() const {
266 std::set<rtc::Network*> networks; 268 std::set<rtc::Network*> networks;
267 269
268 if (connections_.size() == 0) { 270 if (connections_.size() == 0) {
269 return TransportChannelState::STATE_FAILED; 271 return TransportChannelState::STATE_FAILED;
270 } 272 }
271 273
272 for (uint32 i = 0; i < connections_.size(); ++i) { 274 for (uint32_t i = 0; i < connections_.size(); ++i) {
273 rtc::Network* network = connections_[i]->port()->Network(); 275 rtc::Network* network = connections_[i]->port()->Network();
274 if (networks.find(network) == networks.end()) { 276 if (networks.find(network) == networks.end()) {
275 networks.insert(network); 277 networks.insert(network);
276 } else { 278 } else {
277 LOG_J(LS_VERBOSE, this) << "Ice not completed yet for this channel as " 279 LOG_J(LS_VERBOSE, this) << "Ice not completed yet for this channel as "
278 << network->ToString() 280 << network->ToString()
279 << " has more than 1 connection."; 281 << " has more than 1 connection.";
280 return TransportChannelState::STATE_CONNECTING; 282 return TransportChannelState::STATE_CONNECTING;
281 } 283 }
282 } 284 }
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 // existing remote candidates, it represents a new peer reflexive remote 508 // existing remote candidates, it represents a new peer reflexive remote
507 // candidate. 509 // candidate.
508 remote_candidate = 510 remote_candidate =
509 Candidate(component(), ProtoToString(proto), address, 0, 511 Candidate(component(), ProtoToString(proto), address, 0,
510 remote_username, remote_password, PRFLX_PORT_TYPE, 0U, ""); 512 remote_username, remote_password, PRFLX_PORT_TYPE, 0U, "");
511 513
512 // From RFC 5245, section-7.2.1.3: 514 // From RFC 5245, section-7.2.1.3:
513 // The foundation of the candidate is set to an arbitrary value, different 515 // The foundation of the candidate is set to an arbitrary value, different
514 // from the foundation for all other remote candidates. 516 // from the foundation for all other remote candidates.
515 remote_candidate.set_foundation( 517 remote_candidate.set_foundation(
516 rtc::ToString<uint32>(rtc::ComputeCrc32(remote_candidate.id()))); 518 rtc::ToString<uint32_t>(rtc::ComputeCrc32(remote_candidate.id())));
517 519
518 remote_candidate.set_priority(remote_candidate_priority); 520 remote_candidate.set_priority(remote_candidate_priority);
519 } 521 }
520 522
521 // RFC5245, the agent constructs a pair whose local candidate is equal to 523 // RFC5245, the agent constructs a pair whose local candidate is equal to
522 // the transport address on which the STUN request was received, and a 524 // the transport address on which the STUN request was received, and a
523 // remote candidate equal to the source transport address where the 525 // remote candidate equal to the source transport address where the
524 // request came from. 526 // request came from.
525 527
526 // There shouldn't be an existing connection with this remote address. 528 // There shouldn't be an existing connection with this remote address.
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 } else { 604 } else {
603 LOG(LS_INFO) << "Not switching the best connection on controlled side yet," 605 LOG(LS_INFO) << "Not switching the best connection on controlled side yet,"
604 << " because it's not writable: " << conn->ToString(); 606 << " because it's not writable: " << conn->ToString();
605 pending_best_connection_ = conn; 607 pending_best_connection_ = conn;
606 } 608 }
607 } 609 }
608 610
609 void P2PTransportChannel::OnCandidate(const Candidate& candidate) { 611 void P2PTransportChannel::OnCandidate(const Candidate& candidate) {
610 ASSERT(worker_thread_ == rtc::Thread::Current()); 612 ASSERT(worker_thread_ == rtc::Thread::Current());
611 613
612 uint32 generation = candidate.generation(); 614 uint32_t generation = candidate.generation();
613 // Network may not guarantee the order of the candidate delivery. If a 615 // Network may not guarantee the order of the candidate delivery. If a
614 // remote candidate with an older generation arrives, drop it. 616 // remote candidate with an older generation arrives, drop it.
615 if (generation != 0 && generation < remote_candidate_generation_) { 617 if (generation != 0 && generation < remote_candidate_generation_) {
616 LOG(LS_WARNING) << "Dropping a remote candidate because its generation " 618 LOG(LS_WARNING) << "Dropping a remote candidate because its generation "
617 << generation 619 << generation
618 << " is lower than the current remote generation " 620 << " is lower than the current remote generation "
619 << remote_candidate_generation_; 621 << remote_candidate_generation_;
620 return; 622 return;
621 } 623 }
622 624
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
729 return true; 731 return true;
730 } 732 }
731 733
732 bool P2PTransportChannel::FindConnection( 734 bool P2PTransportChannel::FindConnection(
733 cricket::Connection* connection) const { 735 cricket::Connection* connection) const {
734 std::vector<Connection*>::const_iterator citer = 736 std::vector<Connection*>::const_iterator citer =
735 std::find(connections_.begin(), connections_.end(), connection); 737 std::find(connections_.begin(), connections_.end(), connection);
736 return citer != connections_.end(); 738 return citer != connections_.end();
737 } 739 }
738 740
739 uint32 P2PTransportChannel::GetRemoteCandidateGeneration( 741 uint32_t P2PTransportChannel::GetRemoteCandidateGeneration(
740 const Candidate& candidate) { 742 const Candidate& candidate) {
741 // We need to keep track of the remote ice restart so newer 743 // We need to keep track of the remote ice restart so newer
742 // connections are prioritized over the older. 744 // connections are prioritized over the older.
743 ASSERT(candidate.generation() == 0 || 745 ASSERT(candidate.generation() == 0 ||
744 candidate.generation() == remote_candidate_generation_); 746 candidate.generation() == remote_candidate_generation_);
745 return remote_candidate_generation_; 747 return remote_candidate_generation_;
746 } 748 }
747 749
748 // Check if remote candidate is already cached. 750 // Check if remote candidate is already cached.
749 bool P2PTransportChannel::IsDuplicateRemoteCandidate( 751 bool P2PTransportChannel::IsDuplicateRemoteCandidate(
750 const Candidate& candidate) { 752 const Candidate& candidate) {
751 for (uint32 i = 0; i < remote_candidates_.size(); ++i) { 753 for (uint32_t i = 0; i < remote_candidates_.size(); ++i) {
752 if (remote_candidates_[i].IsEquivalent(candidate)) { 754 if (remote_candidates_[i].IsEquivalent(candidate)) {
753 return true; 755 return true;
754 } 756 }
755 } 757 }
756 return false; 758 return false;
757 } 759 }
758 760
759 // Maintain our remote candidate list, adding this new remote one. 761 // Maintain our remote candidate list, adding this new remote one.
760 void P2PTransportChannel::RememberRemoteCandidate( 762 void P2PTransportChannel::RememberRemoteCandidate(
761 const Candidate& remote_candidate, PortInterface* origin_port) { 763 const Candidate& remote_candidate, PortInterface* origin_port) {
762 // Remove any candidates whose generation is older than this one. The 764 // Remove any candidates whose generation is older than this one. The
763 // presence of a new generation indicates that the old ones are not useful. 765 // presence of a new generation indicates that the old ones are not useful.
764 uint32 i = 0; 766 uint32_t i = 0;
765 while (i < remote_candidates_.size()) { 767 while (i < remote_candidates_.size()) {
766 if (remote_candidates_[i].generation() < remote_candidate.generation()) { 768 if (remote_candidates_[i].generation() < remote_candidate.generation()) {
767 LOG(INFO) << "Pruning candidate from old generation: " 769 LOG(INFO) << "Pruning candidate from old generation: "
768 << remote_candidates_[i].address().ToSensitiveString(); 770 << remote_candidates_[i].address().ToSensitiveString();
769 remote_candidates_.erase(remote_candidates_.begin() + i); 771 remote_candidates_.erase(remote_candidates_.begin() + i);
770 } else { 772 } else {
771 i += 1; 773 i += 1;
772 } 774 }
773 } 775 }
774 776
(...skipping 13 matching lines...) Expand all
788 ASSERT(worker_thread_ == rtc::Thread::Current()); 790 ASSERT(worker_thread_ == rtc::Thread::Current());
789 OptionMap::iterator it = options_.find(opt); 791 OptionMap::iterator it = options_.find(opt);
790 if (it == options_.end()) { 792 if (it == options_.end()) {
791 options_.insert(std::make_pair(opt, value)); 793 options_.insert(std::make_pair(opt, value));
792 } else if (it->second == value) { 794 } else if (it->second == value) {
793 return 0; 795 return 0;
794 } else { 796 } else {
795 it->second = value; 797 it->second = value;
796 } 798 }
797 799
798 for (uint32 i = 0; i < ports_.size(); ++i) { 800 for (uint32_t i = 0; i < ports_.size(); ++i) {
799 int val = ports_[i]->SetOption(opt, value); 801 int val = ports_[i]->SetOption(opt, value);
800 if (val < 0) { 802 if (val < 0) {
801 // Because this also occurs deferred, probably no point in reporting an 803 // Because this also occurs deferred, probably no point in reporting an
802 // error 804 // error
803 LOG(WARNING) << "SetOption(" << opt << ", " << value << ") failed: " 805 LOG(WARNING) << "SetOption(" << opt << ", " << value << ") failed: "
804 << ports_[i]->GetError(); 806 << ports_[i]->GetError();
805 } 807 }
806 } 808 }
807 return 0; 809 return 0;
808 } 810 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 // Begin allocate (or immediately re-allocate, if MSG_ALLOCATE pending) 886 // Begin allocate (or immediately re-allocate, if MSG_ALLOCATE pending)
885 void P2PTransportChannel::Allocate() { 887 void P2PTransportChannel::Allocate() {
886 // Time for a new allocator, lets make sure we have a signalling channel 888 // Time for a new allocator, lets make sure we have a signalling channel
887 // to communicate candidates through first. 889 // to communicate candidates through first.
888 waiting_for_signaling_ = true; 890 waiting_for_signaling_ = true;
889 SignalRequestSignaling(this); 891 SignalRequestSignaling(this);
890 } 892 }
891 893
892 // Monitor connection states. 894 // Monitor connection states.
893 void P2PTransportChannel::UpdateConnectionStates() { 895 void P2PTransportChannel::UpdateConnectionStates() {
894 uint32 now = rtc::Time(); 896 uint32_t now = rtc::Time();
895 897
896 // We need to copy the list of connections since some may delete themselves 898 // We need to copy the list of connections since some may delete themselves
897 // when we call UpdateState. 899 // when we call UpdateState.
898 for (uint32 i = 0; i < connections_.size(); ++i) 900 for (uint32_t i = 0; i < connections_.size(); ++i)
899 connections_[i]->UpdateState(now); 901 connections_[i]->UpdateState(now);
900 } 902 }
901 903
902 // Prepare for best candidate sorting. 904 // Prepare for best candidate sorting.
903 void P2PTransportChannel::RequestSort() { 905 void P2PTransportChannel::RequestSort() {
904 if (!sort_dirty_) { 906 if (!sort_dirty_) {
905 worker_thread_->Post(this, MSG_SORT); 907 worker_thread_->Post(this, MSG_SORT);
906 sort_dirty_ = true; 908 sort_dirty_ = true;
907 } 909 }
908 } 910 }
(...skipping 10 matching lines...) Expand all
919 // Any changes after this point will require a re-sort. 921 // Any changes after this point will require a re-sort.
920 sort_dirty_ = false; 922 sort_dirty_ = false;
921 923
922 // Find the best alternative connection by sorting. It is important to note 924 // Find the best alternative connection by sorting. It is important to note
923 // that amongst equal preference, writable connections, this will choose the 925 // that amongst equal preference, writable connections, this will choose the
924 // one whose estimated latency is lowest. So it is the only one that we 926 // one whose estimated latency is lowest. So it is the only one that we
925 // need to consider switching to. 927 // need to consider switching to.
926 ConnectionCompare cmp; 928 ConnectionCompare cmp;
927 std::stable_sort(connections_.begin(), connections_.end(), cmp); 929 std::stable_sort(connections_.begin(), connections_.end(), cmp);
928 LOG(LS_VERBOSE) << "Sorting available connections:"; 930 LOG(LS_VERBOSE) << "Sorting available connections:";
929 for (uint32 i = 0; i < connections_.size(); ++i) { 931 for (uint32_t i = 0; i < connections_.size(); ++i) {
930 LOG(LS_VERBOSE) << connections_[i]->ToString(); 932 LOG(LS_VERBOSE) << connections_[i]->ToString();
931 } 933 }
932 934
933 Connection* top_connection = 935 Connection* top_connection =
934 (connections_.size() > 0) ? connections_[0] : nullptr; 936 (connections_.size() > 0) ? connections_[0] : nullptr;
935 937
936 // If necessary, switch to the new choice. 938 // If necessary, switch to the new choice.
937 // Note that |top_connection| doesn't have to be writable to become the best 939 // Note that |top_connection| doesn't have to be writable to become the best
938 // connection although it will have higher priority if it is writable. 940 // connection although it will have higher priority if it is writable.
939 // The controlled side can switch the best connection only if the current 941 // The controlled side can switch the best connection only if the current
940 // |best connection_| has not been nominated by the controlling side yet. 942 // |best connection_| has not been nominated by the controlling side yet.
941 if ((ice_role_ == ICEROLE_CONTROLLING || !best_nominated_connection()) && 943 if ((ice_role_ == ICEROLE_CONTROLLING || !best_nominated_connection()) &&
942 ShouldSwitch(best_connection_, top_connection)) { 944 ShouldSwitch(best_connection_, top_connection)) {
943 LOG(LS_INFO) << "Switching best connection: " << top_connection->ToString(); 945 LOG(LS_INFO) << "Switching best connection: " << top_connection->ToString();
944 SwitchBestConnectionTo(top_connection); 946 SwitchBestConnectionTo(top_connection);
945 } 947 }
946 948
947 // Controlled side can prune only if the best connection has been nominated. 949 // Controlled side can prune only if the best connection has been nominated.
948 // because otherwise it may delete the connection that will be selected by 950 // because otherwise it may delete the connection that will be selected by
949 // the controlling side. 951 // the controlling side.
950 if (ice_role_ == ICEROLE_CONTROLLING || best_nominated_connection()) { 952 if (ice_role_ == ICEROLE_CONTROLLING || best_nominated_connection()) {
951 PruneConnections(); 953 PruneConnections();
952 } 954 }
953 955
954 // Check if all connections are timedout. 956 // Check if all connections are timedout.
955 bool all_connections_timedout = true; 957 bool all_connections_timedout = true;
956 for (uint32 i = 0; i < connections_.size(); ++i) { 958 for (uint32_t i = 0; i < connections_.size(); ++i) {
957 if (connections_[i]->write_state() != Connection::STATE_WRITE_TIMEOUT) { 959 if (connections_[i]->write_state() != Connection::STATE_WRITE_TIMEOUT) {
958 all_connections_timedout = false; 960 all_connections_timedout = false;
959 break; 961 break;
960 } 962 }
961 } 963 }
962 964
963 // Now update the writable state of the channel with the information we have 965 // Now update the writable state of the channel with the information we have
964 // so far. 966 // so far.
965 if (best_connection_ && best_connection_->writable()) { 967 if (best_connection_ && best_connection_->writable()) {
966 HandleWritable(); 968 HandleWritable();
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1043 1045
1044 // TODO(honghaiz): The channel receiving state is set in OnCheckReceiving. 1046 // TODO(honghaiz): The channel receiving state is set in OnCheckReceiving.
1045 // Will revisit in a subsequent code change. 1047 // Will revisit in a subsequent code change.
1046 } 1048 }
1047 1049
1048 // We checked the status of our connections and we had at least one that 1050 // We checked the status of our connections and we had at least one that
1049 // was writable, go into the writable state. 1051 // was writable, go into the writable state.
1050 void P2PTransportChannel::HandleWritable() { 1052 void P2PTransportChannel::HandleWritable() {
1051 ASSERT(worker_thread_ == rtc::Thread::Current()); 1053 ASSERT(worker_thread_ == rtc::Thread::Current());
1052 if (!writable()) { 1054 if (!writable()) {
1053 for (uint32 i = 0; i < allocator_sessions_.size(); ++i) { 1055 for (uint32_t i = 0; i < allocator_sessions_.size(); ++i) {
1054 if (allocator_sessions_[i]->IsGettingPorts()) { 1056 if (allocator_sessions_[i]->IsGettingPorts()) {
1055 allocator_sessions_[i]->StopGettingPorts(); 1057 allocator_sessions_[i]->StopGettingPorts();
1056 } 1058 }
1057 } 1059 }
1058 } 1060 }
1059 1061
1060 was_writable_ = true; 1062 was_writable_ = true;
1061 set_writable(true); 1063 set_writable(true);
1062 } 1064 }
1063 1065
(...skipping 13 matching lines...) Expand all
1077 1079
1078 // If we have a best connection, return it, otherwise return top one in the 1080 // If we have a best connection, return it, otherwise return top one in the
1079 // list (later we will mark it best). 1081 // list (later we will mark it best).
1080 Connection* P2PTransportChannel::GetBestConnectionOnNetwork( 1082 Connection* P2PTransportChannel::GetBestConnectionOnNetwork(
1081 rtc::Network* network) const { 1083 rtc::Network* network) const {
1082 // If the best connection is on this network, then it wins. 1084 // If the best connection is on this network, then it wins.
1083 if (best_connection_ && (best_connection_->port()->Network() == network)) 1085 if (best_connection_ && (best_connection_->port()->Network() == network))
1084 return best_connection_; 1086 return best_connection_;
1085 1087
1086 // Otherwise, we return the top-most in sorted order. 1088 // Otherwise, we return the top-most in sorted order.
1087 for (uint32 i = 0; i < connections_.size(); ++i) { 1089 for (uint32_t i = 0; i < connections_.size(); ++i) {
1088 if (connections_[i]->port()->Network() == network) 1090 if (connections_[i]->port()->Network() == network)
1089 return connections_[i]; 1091 return connections_[i];
1090 } 1092 }
1091 1093
1092 return NULL; 1094 return NULL;
1093 } 1095 }
1094 1096
1095 // Handle any queued up requests 1097 // Handle any queued up requests
1096 void P2PTransportChannel::OnMessage(rtc::Message *pmsg) { 1098 void P2PTransportChannel::OnMessage(rtc::Message *pmsg) {
1097 switch (pmsg->message_id) { 1099 switch (pmsg->message_id) {
(...skipping 23 matching lines...) Expand all
1121 // Make sure the states of the connections are up-to-date (since this affects 1123 // Make sure the states of the connections are up-to-date (since this affects
1122 // which ones are pingable). 1124 // which ones are pingable).
1123 UpdateConnectionStates(); 1125 UpdateConnectionStates();
1124 1126
1125 // Find the oldest pingable connection and have it do a ping. 1127 // Find the oldest pingable connection and have it do a ping.
1126 Connection* conn = FindNextPingableConnection(); 1128 Connection* conn = FindNextPingableConnection();
1127 if (conn) 1129 if (conn)
1128 PingConnection(conn); 1130 PingConnection(conn);
1129 1131
1130 // Post ourselves a message to perform the next ping. 1132 // Post ourselves a message to perform the next ping.
1131 uint32 delay = writable() ? WRITABLE_DELAY : UNWRITABLE_DELAY; 1133 uint32_t delay = writable() ? WRITABLE_DELAY : UNWRITABLE_DELAY;
1132 thread()->PostDelayed(delay, this, MSG_PING); 1134 thread()->PostDelayed(delay, this, MSG_PING);
1133 } 1135 }
1134 1136
1135 void P2PTransportChannel::OnCheckReceiving() { 1137 void P2PTransportChannel::OnCheckReceiving() {
1136 if (best_connection_) { 1138 if (best_connection_) {
1137 bool receiving = rtc::Time() <= 1139 bool receiving = rtc::Time() <=
1138 best_connection_->last_received() + receiving_timeout_; 1140 best_connection_->last_received() + receiving_timeout_;
1139 set_receiving(receiving); 1141 set_receiving(receiving);
1140 } 1142 }
1141 1143
(...skipping 24 matching lines...) Expand all
1166 return !writable() || conn->write_state() != Connection::STATE_WRITE_TIMEOUT; 1168 return !writable() || conn->write_state() != Connection::STATE_WRITE_TIMEOUT;
1167 } 1169 }
1168 1170
1169 // Returns the next pingable connection to ping. This will be the oldest 1171 // Returns the next pingable connection to ping. This will be the oldest
1170 // pingable connection unless we have a connected, writable connection that is 1172 // pingable connection unless we have a connected, writable connection that is
1171 // past the maximum acceptable ping delay. When reconnecting a TCP connection, 1173 // past the maximum acceptable ping delay. When reconnecting a TCP connection,
1172 // the best connection is disconnected, although still WRITABLE while 1174 // the best connection is disconnected, although still WRITABLE while
1173 // reconnecting. The newly created connection should be selected as the ping 1175 // reconnecting. The newly created connection should be selected as the ping
1174 // target to become writable instead. See the big comment in CompareConnections. 1176 // target to become writable instead. See the big comment in CompareConnections.
1175 Connection* P2PTransportChannel::FindNextPingableConnection() { 1177 Connection* P2PTransportChannel::FindNextPingableConnection() {
1176 uint32 now = rtc::Time(); 1178 uint32_t now = rtc::Time();
1177 if (best_connection_ && best_connection_->connected() && 1179 if (best_connection_ && best_connection_->connected() &&
1178 (best_connection_->write_state() == Connection::STATE_WRITABLE) && 1180 (best_connection_->write_state() == Connection::STATE_WRITABLE) &&
1179 (best_connection_->last_ping_sent() + MAX_CURRENT_WRITABLE_DELAY <= 1181 (best_connection_->last_ping_sent() + MAX_CURRENT_WRITABLE_DELAY <=
1180 now)) { 1182 now)) {
1181 return best_connection_; 1183 return best_connection_;
1182 } 1184 }
1183 1185
1184 // First, find "triggered checks". We ping first those connections 1186 // First, find "triggered checks". We ping first those connections
1185 // that have received a ping but have not sent a ping since receiving 1187 // that have received a ping but have not sent a ping since receiving
1186 // it (last_received_ping > last_sent_ping). But we shouldn't do 1188 // it (last_received_ping > last_sent_ping). But we shouldn't do
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 } 1333 }
1332 } 1334 }
1333 1335
1334 void P2PTransportChannel::OnReadyToSend(Connection* connection) { 1336 void P2PTransportChannel::OnReadyToSend(Connection* connection) {
1335 if (connection == best_connection_ && writable()) { 1337 if (connection == best_connection_ && writable()) {
1336 SignalReadyToSend(this); 1338 SignalReadyToSend(this);
1337 } 1339 }
1338 } 1340 }
1339 1341
1340 } // namespace cricket 1342 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698