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

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

Issue 2093623004: Add config to prune TURN ports (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Add all tests and fix a bug to set port type Created 4 years, 5 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 29 matching lines...) Expand all
40 MSG_CONFIG_STOP, 40 MSG_CONFIG_STOP,
41 }; 41 };
42 42
43 const int PHASE_UDP = 0; 43 const int PHASE_UDP = 0;
44 const int PHASE_RELAY = 1; 44 const int PHASE_RELAY = 1;
45 const int PHASE_TCP = 2; 45 const int PHASE_TCP = 2;
46 const int PHASE_SSLTCP = 3; 46 const int PHASE_SSLTCP = 3;
47 47
48 const int kNumPhases = 4; 48 const int kNumPhases = 4;
49 49
50 enum class AddressFamily { UNSPEC, IPV4, IPV6 };
51
52 AddressFamily ToAddressFamily(int ip_family) {
53 switch (ip_family) {
54 case AF_UNSPEC:
55 return AddressFamily::UNSPEC;
56 case AF_INET:
57 return AddressFamily::IPV4;
58 case AF_INET6:
59 return AddressFamily::IPV6;
60 default:
61 RTC_DCHECK(false);
62 return AddressFamily::UNSPEC;
63 }
64 }
pthatcher1 2016/06/27 20:35:55 Is this just for sorting? If so, instead of makin
honghaiz3 2016/06/28 01:49:25 You are right. Make it return an integer.
65
66 // Returns positive if a is better, negative if b is better, and 0 otherwise.
67 int ComparePort(const cricket::Port* a, const cricket::Port* b) {
68 static constexpr int a_is_better = 1;
69 static constexpr int b_is_better = -1;
70 // Protocol type is defined as UDP = 0, TCP = 1, SSLTCP = 2.
71 if (a->GetProtocol() < b->GetProtocol()) {
72 return a_is_better;
73 }
74 if (a->GetProtocol() > b->GetProtocol()) {
75 return b_is_better;
76 }
77
78 AddressFamily a_family = ToAddressFamily(a->Network()->GetBestIP().family());
79 AddressFamily b_family = ToAddressFamily(b->Network()->GetBestIP().family());
80 if (a_family > b_family) {
81 return a_is_better;
82 }
83 if (a_family < b_family) {
84 return b_is_better;
85 }
86 return 0;
87 }
88
50 } // namespace 89 } // namespace
51 90
52 namespace cricket { 91 namespace cricket {
53 const uint32_t DISABLE_ALL_PHASES = 92 const uint32_t DISABLE_ALL_PHASES =
54 PORTALLOCATOR_DISABLE_UDP | PORTALLOCATOR_DISABLE_TCP | 93 PORTALLOCATOR_DISABLE_UDP | PORTALLOCATOR_DISABLE_TCP |
55 PORTALLOCATOR_DISABLE_STUN | PORTALLOCATOR_DISABLE_RELAY; 94 PORTALLOCATOR_DISABLE_STUN | PORTALLOCATOR_DISABLE_RELAY;
56 95
57 // BasicPortAllocator 96 // BasicPortAllocator
58 BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager, 97 BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager,
59 rtc::PacketSocketFactory* socket_factory) 98 rtc::PacketSocketFactory* socket_factory)
60 : network_manager_(network_manager), socket_factory_(socket_factory) { 99 : network_manager_(network_manager), socket_factory_(socket_factory) {
61 ASSERT(network_manager_ != nullptr); 100 ASSERT(network_manager_ != nullptr);
62 ASSERT(socket_factory_ != nullptr); 101 ASSERT(socket_factory_ != nullptr);
63 Construct(); 102 Construct();
64 } 103 }
65 104
66 BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager) 105 BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager)
67 : network_manager_(network_manager), socket_factory_(nullptr) { 106 : network_manager_(network_manager), socket_factory_(nullptr) {
68 ASSERT(network_manager_ != nullptr); 107 ASSERT(network_manager_ != nullptr);
69 Construct(); 108 Construct();
70 } 109 }
71 110
72 BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager, 111 BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager,
73 rtc::PacketSocketFactory* socket_factory, 112 rtc::PacketSocketFactory* socket_factory,
74 const ServerAddresses& stun_servers) 113 const ServerAddresses& stun_servers)
75 : network_manager_(network_manager), socket_factory_(socket_factory) { 114 : network_manager_(network_manager), socket_factory_(socket_factory) {
76 ASSERT(socket_factory_ != NULL); 115 ASSERT(socket_factory_ != NULL);
77 SetConfiguration(stun_servers, std::vector<RelayServerConfig>(), 0); 116 SetConfiguration(stun_servers, std::vector<RelayServerConfig>(), 0, false);
78 Construct(); 117 Construct();
79 } 118 }
80 119
81 BasicPortAllocator::BasicPortAllocator( 120 BasicPortAllocator::BasicPortAllocator(
82 rtc::NetworkManager* network_manager, 121 rtc::NetworkManager* network_manager,
83 const ServerAddresses& stun_servers, 122 const ServerAddresses& stun_servers,
84 const rtc::SocketAddress& relay_address_udp, 123 const rtc::SocketAddress& relay_address_udp,
85 const rtc::SocketAddress& relay_address_tcp, 124 const rtc::SocketAddress& relay_address_tcp,
86 const rtc::SocketAddress& relay_address_ssl) 125 const rtc::SocketAddress& relay_address_ssl)
87 : network_manager_(network_manager), socket_factory_(NULL) { 126 : network_manager_(network_manager), socket_factory_(NULL) {
88 std::vector<RelayServerConfig> turn_servers; 127 std::vector<RelayServerConfig> turn_servers;
89 RelayServerConfig config(RELAY_GTURN); 128 RelayServerConfig config(RELAY_GTURN);
90 if (!relay_address_udp.IsNil()) { 129 if (!relay_address_udp.IsNil()) {
91 config.ports.push_back(ProtocolAddress(relay_address_udp, PROTO_UDP)); 130 config.ports.push_back(ProtocolAddress(relay_address_udp, PROTO_UDP));
92 } 131 }
93 if (!relay_address_tcp.IsNil()) { 132 if (!relay_address_tcp.IsNil()) {
94 config.ports.push_back(ProtocolAddress(relay_address_tcp, PROTO_TCP)); 133 config.ports.push_back(ProtocolAddress(relay_address_tcp, PROTO_TCP));
95 } 134 }
96 if (!relay_address_ssl.IsNil()) { 135 if (!relay_address_ssl.IsNil()) {
97 config.ports.push_back(ProtocolAddress(relay_address_ssl, PROTO_SSLTCP)); 136 config.ports.push_back(ProtocolAddress(relay_address_ssl, PROTO_SSLTCP));
98 } 137 }
99 138
100 if (!config.ports.empty()) { 139 if (!config.ports.empty()) {
101 turn_servers.push_back(config); 140 turn_servers.push_back(config);
102 } 141 }
103 142
104 SetConfiguration(stun_servers, turn_servers, 0); 143 SetConfiguration(stun_servers, turn_servers, 0, false);
105 Construct(); 144 Construct();
106 } 145 }
107 146
108 void BasicPortAllocator::Construct() { 147 void BasicPortAllocator::Construct() {
109 allow_tcp_listen_ = true; 148 allow_tcp_listen_ = true;
110 } 149 }
111 150
112 BasicPortAllocator::~BasicPortAllocator() { 151 BasicPortAllocator::~BasicPortAllocator() {
113 } 152 }
114 153
115 PortAllocatorSession* BasicPortAllocator::CreateSessionInternal( 154 PortAllocatorSession* BasicPortAllocator::CreateSessionInternal(
116 const std::string& content_name, int component, 155 const std::string& content_name, int component,
117 const std::string& ice_ufrag, const std::string& ice_pwd) { 156 const std::string& ice_ufrag, const std::string& ice_pwd) {
118 return new BasicPortAllocatorSession( 157 return new BasicPortAllocatorSession(
119 this, content_name, component, ice_ufrag, ice_pwd); 158 this, content_name, component, ice_ufrag, ice_pwd);
120 } 159 }
121 160
122 void BasicPortAllocator::AddTurnServer(const RelayServerConfig& turn_server) { 161 void BasicPortAllocator::AddTurnServer(const RelayServerConfig& turn_server) {
123 std::vector<RelayServerConfig> new_turn_servers = turn_servers(); 162 std::vector<RelayServerConfig> new_turn_servers = turn_servers();
124 new_turn_servers.push_back(turn_server); 163 new_turn_servers.push_back(turn_server);
125 SetConfiguration(stun_servers(), new_turn_servers, candidate_pool_size()); 164 SetConfiguration(stun_servers(), new_turn_servers, candidate_pool_size(),
165 disable_low_priority_turn_ports());
126 } 166 }
127 167
128 // BasicPortAllocatorSession 168 // BasicPortAllocatorSession
129 BasicPortAllocatorSession::BasicPortAllocatorSession( 169 BasicPortAllocatorSession::BasicPortAllocatorSession(
130 BasicPortAllocator *allocator, 170 BasicPortAllocator *allocator,
131 const std::string& content_name, 171 const std::string& content_name,
132 int component, 172 int component,
133 const std::string& ice_ufrag, 173 const std::string& ice_ufrag,
134 const std::string& ice_pwd) 174 const std::string& ice_pwd)
135 : PortAllocatorSession(content_name, component, 175 : PortAllocatorSession(content_name, component,
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 } 250 }
211 251
212 void BasicPortAllocatorSession::ClearGettingPorts() { 252 void BasicPortAllocatorSession::ClearGettingPorts() {
213 network_thread_->Clear(this, MSG_ALLOCATE); 253 network_thread_->Clear(this, MSG_ALLOCATE);
214 for (uint32_t i = 0; i < sequences_.size(); ++i) 254 for (uint32_t i = 0; i < sequences_.size(); ++i)
215 sequences_[i]->Stop(); 255 sequences_[i]->Stop();
216 } 256 }
217 257
218 std::vector<PortInterface*> BasicPortAllocatorSession::ReadyPorts() const { 258 std::vector<PortInterface*> BasicPortAllocatorSession::ReadyPorts() const {
219 std::vector<PortInterface*> ret; 259 std::vector<PortInterface*> ret;
260 // Add all non-TURN ports.
220 for (const PortData& port : ports_) { 261 for (const PortData& port : ports_) {
221 if (port.has_pairable_candidate() && !port.error()) { 262 if (IsPortInUse(port.port()) && port.has_pairable_candidate() &&
263 !port.error()) {
222 ret.push_back(port.port()); 264 ret.push_back(port.port());
223 } 265 }
224 } 266 }
225 return ret; 267 return ret;
226 } 268 }
227 269
228 std::vector<Candidate> BasicPortAllocatorSession::ReadyCandidates() const { 270 std::vector<Candidate> BasicPortAllocatorSession::ReadyCandidates() const {
229 std::vector<Candidate> candidates; 271 std::vector<Candidate> candidates;
230 for (const PortData& data : ports_) { 272 for (const PortData& data : ports_) {
273 if (!IsPortInUse(data.port())) {
274 continue;
275 }
276
231 for (const Candidate& candidate : data.port()->Candidates()) { 277 for (const Candidate& candidate : data.port()->Candidates()) {
232 if (!CheckCandidateFilter(candidate)) { 278 if (!CheckCandidateFilter(candidate)) {
233 continue; 279 continue;
234 } 280 }
235 ProtocolType pvalue; 281 ProtocolType pvalue;
236 if (!StringToProto(candidate.protocol().c_str(), &pvalue) || 282 if (!StringToProto(candidate.protocol().c_str(), &pvalue) ||
237 !data.sequence()->ProtocolEnabled(pvalue)) { 283 !data.sequence()->ProtocolEnabled(pvalue)) {
238 continue; 284 continue;
239 } 285 }
240 candidates.push_back(SanitizeRelatedAddress(candidate)); 286 candidates.push_back(SanitizeRelatedAddress(candidate));
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 networks->end()); 477 networks->end());
432 } 478 }
433 } 479 }
434 480
435 // For each network, see if we have a sequence that covers it already. If not, 481 // For each network, see if we have a sequence that covers it already. If not,
436 // create a new sequence to create the appropriate ports. 482 // create a new sequence to create the appropriate ports.
437 void BasicPortAllocatorSession::DoAllocate() { 483 void BasicPortAllocatorSession::DoAllocate() {
438 bool done_signal_needed = false; 484 bool done_signal_needed = false;
439 std::vector<rtc::Network*> networks; 485 std::vector<rtc::Network*> networks;
440 GetNetworks(&networks); 486 GetNetworks(&networks);
487 turn_ports_in_use_by_network_names_.clear();
441 488
442 if (networks.empty()) { 489 if (networks.empty()) {
443 LOG(LS_WARNING) << "Machine has no networks; no ports will be allocated"; 490 LOG(LS_WARNING) << "Machine has no networks; no ports will be allocated";
444 done_signal_needed = true; 491 done_signal_needed = true;
445 } else { 492 } else {
493 PortConfiguration* config = configs_.empty() ? nullptr : configs_.back();
446 for (uint32_t i = 0; i < networks.size(); ++i) { 494 for (uint32_t i = 0; i < networks.size(); ++i) {
447 PortConfiguration* config = NULL;
448 if (configs_.size() > 0)
449 config = configs_.back();
450
451 uint32_t sequence_flags = flags(); 495 uint32_t sequence_flags = flags();
452 if ((sequence_flags & DISABLE_ALL_PHASES) == DISABLE_ALL_PHASES) { 496 if ((sequence_flags & DISABLE_ALL_PHASES) == DISABLE_ALL_PHASES) {
453 // If all the ports are disabled we should just fire the allocation 497 // If all the ports are disabled we should just fire the allocation
454 // done event and return. 498 // done event and return.
455 done_signal_needed = true; 499 done_signal_needed = true;
456 break; 500 break;
457 } 501 }
458 502
459 if (!config || config->relays.empty()) { 503 if (!config || config->relays.empty()) {
460 // No relay ports specified in this config. 504 // No relay ports specified in this config.
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 Port* port, const Candidate& c) { 610 Port* port, const Candidate& c) {
567 ASSERT(rtc::Thread::Current() == network_thread_); 611 ASSERT(rtc::Thread::Current() == network_thread_);
568 PortData* data = FindPort(port); 612 PortData* data = FindPort(port);
569 ASSERT(data != NULL); 613 ASSERT(data != NULL);
570 // Discarding any candidate signal if port allocation status is 614 // Discarding any candidate signal if port allocation status is
571 // already in completed state. 615 // already in completed state.
572 if (data->complete() || data->error()) { 616 if (data->complete() || data->error()) {
573 return; 617 return;
574 } 618 }
575 619
620 // Mark that the port has a pairable candidate, either because we have a
621 // usable candidate from the port, or simply because the port is bound to the
622 // any address and therefore has no host candidate. This will trigger the port
623 // to start creating candidate pairs (connections) and issue connectivity
624 // checks. If port has already been marked as having a pairable candidate,
625 // do nothing here.
626 // Note: Need to do MaybeSignalCandidateReady after this because we will
627 // check whether the candidate is generated by the port in use.
628 if (!data->has_pairable_candidate() && CandidatePairable(c, port)) {
629 data->set_has_pairable_candidate(true);
630 MaybeSignalPortReady(port);
pthatcher1 2016/06/27 20:35:55 If this is only called once, can we just inline it
honghaiz3 2016/06/28 01:49:25 A separate method will make it more readable here.
631 }
632
576 ProtocolType pvalue; 633 ProtocolType pvalue;
577 bool candidate_protocol_enabled = 634 bool candidate_protocol_enabled =
578 StringToProto(c.protocol().c_str(), &pvalue) && 635 StringToProto(c.protocol().c_str(), &pvalue) &&
579 data->sequence()->ProtocolEnabled(pvalue); 636 data->sequence()->ProtocolEnabled(pvalue);
580 637
581 if (CheckCandidateFilter(c) && candidate_protocol_enabled) { 638 if (CheckCandidateFilter(c) && candidate_protocol_enabled) {
582 std::vector<Candidate> candidates; 639 std::vector<Candidate> candidates;
583 candidates.push_back(SanitizeRelatedAddress(c)); 640 candidates.push_back(SanitizeRelatedAddress(c));
641 MaybeSignalCandidatesReady(port, candidates);
pthatcher1 2016/06/27 20:35:54 Since this is only called once, can you inline it?
honghaiz3 2016/06/28 01:49:25 Done.
642 }
643 }
644
645 void BasicPortAllocatorSession::MaybeSignalPortReady(Port* port) {
646 if (!allocator_->disable_low_priority_turn_ports() ||
647 port->Type() != RELAY_PORT_TYPE) {
648 SignalPortReady(this, port);
649 return;
650 }
651 std::vector<Port*>& turn_ports =
652 turn_ports_in_use_by_network_names_[port->Network()->name()];
pthatcher1 2016/06/27 20:35:55 Shouldn't we do a find() just in case it's not in
honghaiz3 2016/06/28 01:49:25 If it is not in the map, we create a new vector an
653
654 bool use_port = true;
655 auto iter = turn_ports.begin();
656 while (iter != turn_ports.end()) {
657 int cmp = ComparePort(port, *iter);
658 if (cmp > 0) {
659 // The new port has higher precedence. Deprecate the existing port.
660 SignalPortDeprecated(this, *iter);
661 iter = turn_ports.erase(iter);
662 // TODO(honghaiz): Maybe also remove the candidates in the port.
663 } else {
664 ++iter;
665 if (cmp < 0) {
666 // If this new port has a lower precedence than any existing port, do
667 // not use it.
668 use_port = false;
669 }
670 }
671 }
pthatcher1 2016/06/27 20:35:54 Correct me if I'm wrong, but it looks like turn_po
honghaiz3 2016/06/28 01:49:25 You are right, although we have removed the map no
672 if (use_port) {
pthatcher1 2016/06/27 20:35:55 Actually, if we just store all ports in ports_ and
honghaiz3 2016/06/28 01:49:25 Done. Did not use std::max as it is not really muc
673 turn_ports.push_back(port);
674 SignalPortReady(this, port);
pthatcher1 2016/06/27 20:35:54 I think we need a better pair of names than Signal
honghaiz3 2016/06/28 01:49:25 SignalPortReady is used elsewhere by downstream co
675 }
676 }
677
678 void BasicPortAllocatorSession::MaybeSignalCandidatesReady(
679 Port* port,
680 const std::vector<Candidate>& candidates) {
681 if (IsPortInUse(port)) {
584 SignalCandidatesReady(this, candidates); 682 SignalCandidatesReady(this, candidates);
585 } 683 }
684 }
586 685
587 // Port has already been marked as having a pairable candidate. 686 bool BasicPortAllocatorSession::IsPortInUse(Port* port) const {
588 // Nothing to do here. 687 // If the port is not disabling low priority ports, every port is in use.
589 if (data->has_pairable_candidate()) { 688 if (!allocator_->disable_low_priority_turn_ports()) {
590 return; 689 return true;
591 } 690 }
592 691 // If it is not a turn port, it is in use.
593 // Mark that the port has a pairable candidate, either because we have a 692 if (port->Type() != RELAY_PORT_TYPE) {
594 // usable candidate from the port, or simply because the port is bound to the 693 return true;
595 // any address and therefore has no host candidate. This will trigger the port
596 // to start creating candidate pairs (connections) and issue connectivity
597 // checks.
598 if (CandidatePairable(c, port)) {
599 data->set_has_pairable_candidate(true);
600 SignalPortReady(this, port);
601 } 694 }
695 // For TURN port, if it can be found in |turn_ports_in_use_by_network_name_|,
696 // it is in use.
697 const auto iter =
698 turn_ports_in_use_by_network_names_.find(port->Network()->name());
699 if (iter == turn_ports_in_use_by_network_names_.end()) {
700 return false;
701 }
702 const std::vector<Port*>& turn_ports = iter->second;
703 return std::find(turn_ports.begin(), turn_ports.end(), port) !=
704 turn_ports.end();
pthatcher1 2016/06/27 20:35:54 If we store all port in ports_ and just mark them
honghaiz3 2016/06/28 01:49:26 Done.
602 } 705 }
603 706
604 void BasicPortAllocatorSession::OnPortComplete(Port* port) { 707 void BasicPortAllocatorSession::OnPortComplete(Port* port) {
605 ASSERT(rtc::Thread::Current() == network_thread_); 708 ASSERT(rtc::Thread::Current() == network_thread_);
606 PortData* data = FindPort(port); 709 PortData* data = FindPort(port);
607 ASSERT(data != NULL); 710 ASSERT(data != NULL);
608 711
609 // Ignore any late signals. 712 // Ignore any late signals.
610 if (data->complete() || data->error()) { 713 if (data->complete() || data->error()) {
611 return; 714 return;
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
1021 1124
1022 // If BasicPortAllocatorSession::OnAllocate left relay ports enabled then we 1125 // If BasicPortAllocatorSession::OnAllocate left relay ports enabled then we
1023 // ought to have a relay list for them here. 1126 // ought to have a relay list for them here.
1024 ASSERT(config_ && !config_->relays.empty()); 1127 ASSERT(config_ && !config_->relays.empty());
1025 if (!(config_ && !config_->relays.empty())) { 1128 if (!(config_ && !config_->relays.empty())) {
1026 LOG(LS_WARNING) 1129 LOG(LS_WARNING)
1027 << "AllocationSequence: No relay server configured, skipping."; 1130 << "AllocationSequence: No relay server configured, skipping.";
1028 return; 1131 return;
1029 } 1132 }
1030 1133
1031 PortConfiguration::RelayList::const_iterator relay; 1134 for (RelayServerConfig& relay : config_->relays) {
1032 for (relay = config_->relays.begin(); 1135 if (relay.type == RELAY_GTURN) {
1033 relay != config_->relays.end(); ++relay) { 1136 CreateGturnPort(relay);
1034 if (relay->type == RELAY_GTURN) { 1137 } else if (relay.type == RELAY_TURN) {
1035 CreateGturnPort(*relay); 1138 CreateTurnPort(relay);
1036 } else if (relay->type == RELAY_TURN) {
1037 CreateTurnPort(*relay);
1038 } else { 1139 } else {
1039 ASSERT(false); 1140 ASSERT(false);
1040 } 1141 }
1041 } 1142 }
1042 } 1143 }
1043 1144
1044 void AllocationSequence::CreateGturnPort(const RelayServerConfig& config) { 1145 void AllocationSequence::CreateGturnPort(const RelayServerConfig& config) {
1045 // TODO(mallinath) - Rename RelayPort to GTurnPort. 1146 // TODO(mallinath) - Rename RelayPort to GTurnPort.
1046 RelayPort* port = RelayPort::Create(session_->network_thread(), 1147 RelayPort* port = RelayPort::Create(session_->network_thread(),
1047 session_->socket_factory(), 1148 session_->socket_factory(),
(...skipping 29 matching lines...) Expand all
1077 for (relay_port = config.ports.begin(); 1178 for (relay_port = config.ports.begin();
1078 relay_port != config.ports.end(); ++relay_port) { 1179 relay_port != config.ports.end(); ++relay_port) {
1079 TurnPort* port = NULL; 1180 TurnPort* port = NULL;
1080 1181
1081 // Skip UDP connections to relay servers if it's disallowed. 1182 // Skip UDP connections to relay servers if it's disallowed.
1082 if (IsFlagSet(PORTALLOCATOR_DISABLE_UDP_RELAY) && 1183 if (IsFlagSet(PORTALLOCATOR_DISABLE_UDP_RELAY) &&
1083 relay_port->proto == PROTO_UDP) { 1184 relay_port->proto == PROTO_UDP) {
1084 continue; 1185 continue;
1085 } 1186 }
1086 1187
1188 // Do not create the port if the server address family is known and does
1189 // not match the local ip address family.
1190 int server_ip_family = relay_port->address.ipaddr().family();
1191 int local_ip_family = network_->GetBestIP().family();
1192 if (server_ip_family != AF_UNSPEC && server_ip_family != local_ip_family) {
1193 LOG(LS_INFO) << "Server and local address families are not compatible. "
1194 << "Server address: "
1195 << relay_port->address.ipaddr().ToString()
1196 << " Local address: " << network_->GetBestIP().ToString();
1197 continue;
1198 }
pthatcher1 2016/06/27 20:35:54 Should this be a separate CL? It seems like a bug
honghaiz3 2016/06/28 01:49:26 Done.
1199
1087 // Shared socket mode must be enabled only for UDP based ports. Hence 1200 // Shared socket mode must be enabled only for UDP based ports. Hence
1088 // don't pass shared socket for ports which will create TCP sockets. 1201 // don't pass shared socket for ports which will create TCP sockets.
1089 // TODO(mallinath) - Enable shared socket mode for TURN ports. Disabled 1202 // TODO(mallinath) - Enable shared socket mode for TURN ports. Disabled
1090 // due to webrtc bug https://code.google.com/p/webrtc/issues/detail?id=3537 1203 // due to webrtc bug https://code.google.com/p/webrtc/issues/detail?id=3537
1091 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) && 1204 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) &&
1092 relay_port->proto == PROTO_UDP && udp_socket_) { 1205 relay_port->proto == PROTO_UDP && udp_socket_) {
1093 port = TurnPort::Create(session_->network_thread(), 1206 port = TurnPort::Create(session_->network_thread(),
1094 session_->socket_factory(), 1207 session_->socket_factory(),
1095 network_, udp_socket_.get(), 1208 network_, udp_socket_.get(),
1096 session_->username(), session_->password(), 1209 session_->username(), session_->password(),
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1235 ServerAddresses servers; 1348 ServerAddresses servers;
1236 for (size_t i = 0; i < relays.size(); ++i) { 1349 for (size_t i = 0; i < relays.size(); ++i) {
1237 if (relays[i].type == turn_type && SupportsProtocol(relays[i], type)) { 1350 if (relays[i].type == turn_type && SupportsProtocol(relays[i], type)) {
1238 servers.insert(relays[i].ports.front().address); 1351 servers.insert(relays[i].ports.front().address);
1239 } 1352 }
1240 } 1353 }
1241 return servers; 1354 return servers;
1242 } 1355 }
1243 1356
1244 } // namespace cricket 1357 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698