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

Side by Side Diff: webrtc/p2p/client/basicportallocator.cc

Issue 2261523004: Signal to remove remote candidates if ports are pruned. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Merge to head and fix a comment Created 4 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 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 // regathers ports and candidates. 307 // regathers ports and candidates.
308 for (AllocationSequence* sequence : sequences_) { 308 for (AllocationSequence* sequence : sequences_) {
309 if (!sequence->network_failed() && 309 if (!sequence->network_failed() &&
310 std::find(failed_networks.begin(), failed_networks.end(), 310 std::find(failed_networks.begin(), failed_networks.end(),
311 sequence->network()) != failed_networks.end()) { 311 sequence->network()) != failed_networks.end()) {
312 sequence->set_network_failed(); 312 sequence->set_network_failed();
313 } 313 }
314 } 314 }
315 // Remove ports from being used locally and send signaling to remove 315 // Remove ports from being used locally and send signaling to remove
316 // the candidates on the remote side. 316 // the candidates on the remote side.
317 RemovePortsAndCandidates(failed_networks); 317 std::vector<PortData*> ports_to_prune = GetUnprunedPorts(failed_networks);
318 if (!ports_to_prune.empty()) {
319 LOG(LS_INFO) << "Prune " << ports_to_prune.size()
320 << " ports because their networks failed";
321 PrunePortsAndRemoveCandidates(ports_to_prune);
322 }
318 323
319 if (allocation_started_ && network_manager_started_) { 324 if (allocation_started_ && network_manager_started_) {
320 DoAllocate(); 325 DoAllocate();
321 } 326 }
322 } 327 }
323 328
324 std::vector<PortInterface*> BasicPortAllocatorSession::ReadyPorts() const { 329 std::vector<PortInterface*> BasicPortAllocatorSession::ReadyPorts() const {
325 std::vector<PortInterface*> ret; 330 std::vector<PortInterface*> ret;
326 for (const PortData& data : ports_) { 331 for (const PortData& data : ports_) {
327 if (data.ready()) { 332 if (data.ready()) {
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 for (AllocationSequence* sequence : sequences_) { 613 for (AllocationSequence* sequence : sequences_) {
609 // Mark the sequence as "network failed" if its network is not in 614 // Mark the sequence as "network failed" if its network is not in
610 // |networks|. 615 // |networks|.
611 if (!sequence->network_failed() && 616 if (!sequence->network_failed() &&
612 std::find(networks.begin(), networks.end(), sequence->network()) == 617 std::find(networks.begin(), networks.end(), sequence->network()) ==
613 networks.end()) { 618 networks.end()) {
614 sequence->OnNetworkFailed(); 619 sequence->OnNetworkFailed();
615 failed_networks.push_back(sequence->network()); 620 failed_networks.push_back(sequence->network());
616 } 621 }
617 } 622 }
618 RemovePortsAndCandidates(failed_networks); 623 std::vector<PortData*> ports_to_prune = GetUnprunedPorts(failed_networks);
624 if (!ports_to_prune.empty()) {
625 LOG(LS_INFO) << "Prune " << ports_to_prune.size()
626 << " ports because their networks were gone";
627 PrunePortsAndRemoveCandidates(ports_to_prune);
628 }
619 629
620 if (!network_manager_started_) { 630 if (!network_manager_started_) {
621 LOG(LS_INFO) << "Network manager is started"; 631 LOG(LS_INFO) << "Network manager is started";
622 network_manager_started_ = true; 632 network_manager_started_ = true;
623 } 633 }
624 if (allocation_started_) 634 if (allocation_started_)
625 DoAllocate(); 635 DoAllocate();
626 } 636 }
627 637
628 void BasicPortAllocatorSession::DisableEquivalentPhases( 638 void BasicPortAllocatorSession::DisableEquivalentPhases(
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
750 bool BasicPortAllocatorSession::PruneTurnPorts(Port* newly_pairable_turn_port) { 760 bool BasicPortAllocatorSession::PruneTurnPorts(Port* newly_pairable_turn_port) {
751 // Note: We determine the same network based only on their network names. So 761 // Note: We determine the same network based only on their network names. So
752 // if an IPv4 address and an IPv6 address have the same network name, they 762 // if an IPv4 address and an IPv6 address have the same network name, they
753 // are considered the same network here. 763 // are considered the same network here.
754 const std::string& network_name = newly_pairable_turn_port->Network()->name(); 764 const std::string& network_name = newly_pairable_turn_port->Network()->name();
755 Port* best_turn_port = GetBestTurnPortForNetwork(network_name); 765 Port* best_turn_port = GetBestTurnPortForNetwork(network_name);
756 // |port| is already in the list of ports, so the best port cannot be nullptr. 766 // |port| is already in the list of ports, so the best port cannot be nullptr.
757 RTC_CHECK(best_turn_port != nullptr); 767 RTC_CHECK(best_turn_port != nullptr);
758 768
759 bool pruned = false; 769 bool pruned = false;
760 std::vector<PortInterface*> pruned_ports; 770 std::vector<PortData*> ports_to_prune;
761 for (PortData& data : ports_) { 771 for (PortData& data : ports_) {
762 if (data.port()->Network()->name() == network_name && 772 if (data.port()->Network()->name() == network_name &&
763 data.port()->Type() == RELAY_PORT_TYPE && !data.pruned() && 773 data.port()->Type() == RELAY_PORT_TYPE && !data.pruned() &&
764 ComparePort(data.port(), best_turn_port) < 0) { 774 ComparePort(data.port(), best_turn_port) < 0) {
765 data.set_pruned();
766 pruned = true; 775 pruned = true;
767 data.port()->Prune();
768 if (data.port() != newly_pairable_turn_port) { 776 if (data.port() != newly_pairable_turn_port) {
769 pruned_ports.push_back(data.port()); 777 // These ports will be pruned in PrunePortsAndRemoveCandidates.
778 ports_to_prune.push_back(&data);
779 } else {
780 data.Prune();
770 } 781 }
771 } 782 }
772 } 783 }
773 if (!pruned_ports.empty()) { 784
774 LOG(LS_INFO) << "Pruned " << pruned_ports.size() << " ports"; 785 if (!ports_to_prune.empty()) {
775 SignalPortsPruned(this, pruned_ports); 786 LOG(LS_INFO) << "Prune " << ports_to_prune.size()
787 << " low-priority TURN ports";
788 PrunePortsAndRemoveCandidates(ports_to_prune);
776 } 789 }
777 return pruned; 790 return pruned;
778 } 791 }
779 792
780 void BasicPortAllocatorSession::PruneAllPorts() { 793 void BasicPortAllocatorSession::PruneAllPorts() {
781 for (PortData& data : ports_) { 794 for (PortData& data : ports_) {
782 data.port()->Prune(); 795 data.Prune();
783 } 796 }
784 } 797 }
785 798
786 void BasicPortAllocatorSession::OnPortComplete(Port* port) { 799 void BasicPortAllocatorSession::OnPortComplete(Port* port) {
787 ASSERT(rtc::Thread::Current() == network_thread_); 800 ASSERT(rtc::Thread::Current() == network_thread_);
788 LOG_J(LS_INFO, port) << "Port completed gathering candidates."; 801 LOG_J(LS_INFO, port) << "Port completed gathering candidates.";
789 PortData* data = FindPort(port); 802 PortData* data = FindPort(port);
790 ASSERT(data != NULL); 803 ASSERT(data != NULL);
791 804
792 // Ignore any late signals. 805 // Ignore any late signals.
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 Port* port) { 948 Port* port) {
936 for (std::vector<PortData>::iterator it = ports_.begin(); 949 for (std::vector<PortData>::iterator it = ports_.begin();
937 it != ports_.end(); ++it) { 950 it != ports_.end(); ++it) {
938 if (it->port() == port) { 951 if (it->port() == port) {
939 return &*it; 952 return &*it;
940 } 953 }
941 } 954 }
942 return NULL; 955 return NULL;
943 } 956 }
944 957
945 // Removes ports and candidates created on a given list of networks. 958 std::vector<BasicPortAllocatorSession::PortData*>
946 void BasicPortAllocatorSession::RemovePortsAndCandidates( 959 BasicPortAllocatorSession::GetUnprunedPorts(
947 const std::vector<rtc::Network*>& networks) { 960 const std::vector<rtc::Network*>& networks) {
948 std::vector<PortInterface*> ports_to_remove; 961 std::vector<PortData*> unpruned_ports;
949 std::vector<Candidate> candidates_to_remove; 962 for (PortData& port : ports_) {
950 for (PortData& data : ports_) { 963 if (!port.pruned() &&
951 if (std::find(networks.begin(), networks.end(), 964 std::find(networks.begin(), networks.end(),
952 data.sequence()->network()) == networks.end()) { 965 port.sequence()->network()) != networks.end()) {
953 continue; 966 unpruned_ports.push_back(&port);
954 } 967 }
968 }
969 return unpruned_ports;
970 }
971
972 void BasicPortAllocatorSession::PrunePortsAndRemoveCandidates(
973 const std::vector<PortData*>& port_data_list) {
974 std::vector<PortInterface*> pruned_ports;
975 std::vector<Candidate> removed_candidates;
976 for (PortData* data : port_data_list) {
955 // Prune the port so that it may be destroyed. 977 // Prune the port so that it may be destroyed.
956 data.port()->Prune(); 978 data->Prune();
957 ports_to_remove.push_back(data.port()); 979 pruned_ports.push_back(data->port());
958 if (data.has_pairable_candidate()) { 980 if (data->has_pairable_candidate()) {
959 GetCandidatesFromPort(data, &candidates_to_remove); 981 GetCandidatesFromPort(*data, &removed_candidates);
960 // Mark the port as having no pairable candidates so that its candidates 982 // Mark the port as having no pairable candidates so that its candidates
961 // won't be removed multiple times. 983 // won't be removed multiple times.
962 data.set_has_pairable_candidate(false); 984 data->set_has_pairable_candidate(false);
963 } 985 }
964 } 986 }
965 if (!ports_to_remove.empty()) { 987 if (!pruned_ports.empty()) {
966 LOG(LS_INFO) << "Removed " << ports_to_remove.size() << " ports"; 988 SignalPortsPruned(this, pruned_ports);
967 SignalPortsPruned(this, ports_to_remove);
968 } 989 }
969 if (!candidates_to_remove.empty()) { 990 if (!removed_candidates.empty()) {
970 SignalCandidatesRemoved(this, candidates_to_remove); 991 LOG(LS_INFO) << "Removed " << removed_candidates.size() << " candidates";
992 SignalCandidatesRemoved(this, removed_candidates);
971 } 993 }
972 } 994 }
973 995
974 // AllocationSequence 996 // AllocationSequence
975 997
976 AllocationSequence::AllocationSequence(BasicPortAllocatorSession* session, 998 AllocationSequence::AllocationSequence(BasicPortAllocatorSession* session,
977 rtc::Network* network, 999 rtc::Network* network,
978 PortConfiguration* config, 1000 PortConfiguration* config,
979 uint32_t flags) 1001 uint32_t flags)
980 : session_(session), 1002 : session_(session),
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
1461 ServerAddresses servers; 1483 ServerAddresses servers;
1462 for (size_t i = 0; i < relays.size(); ++i) { 1484 for (size_t i = 0; i < relays.size(); ++i) {
1463 if (relays[i].type == turn_type && SupportsProtocol(relays[i], type)) { 1485 if (relays[i].type == turn_type && SupportsProtocol(relays[i], type)) {
1464 servers.insert(relays[i].ports.front().address); 1486 servers.insert(relays[i].ports.front().address);
1465 } 1487 }
1466 } 1488 }
1467 return servers; 1489 return servers;
1468 } 1490 }
1469 1491
1470 } // namespace cricket 1492 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/p2p/client/basicportallocator.h ('k') | webrtc/p2p/client/basicportallocator_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698