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

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

Issue 2025573002: Use continual gathering to restore backup connections (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: . Created 4 years, 6 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
11 #include "webrtc/p2p/base/p2ptransportchannel.h" 11 #include "webrtc/p2p/base/p2ptransportchannel.h"
12 12
13 #include <algorithm> 13 #include <algorithm>
14 #include <set> 14 #include <set>
15 15
16 #include "webrtc/base/common.h" 16 #include "webrtc/base/common.h"
17 #include "webrtc/base/crc32.h" 17 #include "webrtc/base/crc32.h"
18 #include "webrtc/base/logging.h" 18 #include "webrtc/base/logging.h"
19 #include "webrtc/base/stringencode.h" 19 #include "webrtc/base/stringencode.h"
20 #include "webrtc/p2p/base/candidate.h" 20 #include "webrtc/p2p/base/candidate.h"
21 #include "webrtc/p2p/base/candidatepairinterface.h" 21 #include "webrtc/p2p/base/candidatepairinterface.h"
22 #include "webrtc/p2p/base/common.h" 22 #include "webrtc/p2p/base/common.h"
23 #include "webrtc/p2p/base/relayport.h" // For RELAY_PORT_TYPE. 23 #include "webrtc/p2p/base/relayport.h" // For RELAY_PORT_TYPE.
24 #include "webrtc/p2p/base/stunport.h" // For STUN_PORT_TYPE. 24 #include "webrtc/p2p/base/stunport.h" // For STUN_PORT_TYPE.
25 #include "webrtc/system_wrappers/include/field_trial.h" 25 #include "webrtc/system_wrappers/include/field_trial.h"
26 26
27 namespace { 27 namespace {
28 28
29 // messages for queuing up work for ourselves 29 // messages for queuing up work for ourselves
30 enum { MSG_SORT = 1, MSG_CHECK_AND_PING }; 30 enum {
31 MSG_SORT = 1,
32 MSG_CHECK_AND_PING,
33 MSG_REGATHER_ON_FAILED_NETWORKS,
34 MSG_SIGNAL_CANDIDATES_REMOVED
35 };
31 36
32 // The minimum improvement in RTT that justifies a switch. 37 // The minimum improvement in RTT that justifies a switch.
33 static const double kMinImprovement = 10; 38 const double kMinImprovement = 10;
34 39
35 bool IsRelayRelay(cricket::Connection* conn) { 40 bool IsRelayRelay(cricket::Connection* conn) {
36 return conn->local_candidate().type() == cricket::RELAY_PORT_TYPE && 41 return conn->local_candidate().type() == cricket::RELAY_PORT_TYPE &&
37 conn->remote_candidate().type() == cricket::RELAY_PORT_TYPE; 42 conn->remote_candidate().type() == cricket::RELAY_PORT_TYPE;
38 } 43 }
39 44
40 bool IsUdp(cricket::Connection* conn) { 45 bool IsUdp(cricket::Connection* conn) {
41 return conn->local_candidate().relay_protocol() == cricket::UDP_PROTOCOL_NAME; 46 return conn->local_candidate().relay_protocol() == cricket::UDP_PROTOCOL_NAME;
42 } 47 }
43 48
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 // writable or not receiving. 222 // writable or not receiving.
218 const int WEAK_PING_INTERVAL = 1000 * PING_PACKET_SIZE / 10000; 223 const int WEAK_PING_INTERVAL = 1000 * PING_PACKET_SIZE / 10000;
219 224
220 // If the current best connection is both writable and receiving, then we will 225 // If the current best connection is both writable and receiving, then we will
221 // also try hard to make sure it is pinged at this rate (a little less than 226 // also try hard to make sure it is pinged at this rate (a little less than
222 // 2 * STRONG_PING_INTERVAL). 227 // 2 * STRONG_PING_INTERVAL).
223 static const int MAX_CURRENT_STRONG_INTERVAL = 900; // ms 228 static const int MAX_CURRENT_STRONG_INTERVAL = 900; // ms
224 229
225 static const int MIN_CHECK_RECEIVING_INTERVAL = 50; // ms 230 static const int MIN_CHECK_RECEIVING_INTERVAL = 50; // ms
226 231
232 // We periodically check if any existing networks do not have any connection
233 // and regather on those failed networks.
234 static const int DEFAULT_REGATHER_ON_FAILED_NETWORKS_INTERVAL = 5 * 60 * 1000;
235
227 P2PTransportChannel::P2PTransportChannel(const std::string& transport_name, 236 P2PTransportChannel::P2PTransportChannel(const std::string& transport_name,
228 int component, 237 int component,
229 P2PTransport* transport, 238 P2PTransport* transport,
230 PortAllocator* allocator) 239 PortAllocator* allocator)
231 : P2PTransportChannel(transport_name, component, allocator) {} 240 : P2PTransportChannel(transport_name, component, allocator) {}
232 241
233 P2PTransportChannel::P2PTransportChannel(const std::string& transport_name, 242 P2PTransportChannel::P2PTransportChannel(const std::string& transport_name,
234 int component, 243 int component,
235 PortAllocator* allocator) 244 PortAllocator* allocator)
236 : TransportChannelImpl(transport_name, component), 245 : TransportChannelImpl(transport_name, component),
237 allocator_(allocator), 246 allocator_(allocator),
238 worker_thread_(rtc::Thread::Current()), 247 worker_thread_(rtc::Thread::Current()),
239 incoming_only_(false), 248 incoming_only_(false),
240 error_(0), 249 error_(0),
241 best_connection_(NULL), 250 best_connection_(NULL),
242 pending_best_connection_(NULL), 251 pending_best_connection_(NULL),
243 sort_dirty_(false), 252 sort_dirty_(false),
244 remote_ice_mode_(ICEMODE_FULL), 253 remote_ice_mode_(ICEMODE_FULL),
245 ice_role_(ICEROLE_UNKNOWN), 254 ice_role_(ICEROLE_UNKNOWN),
246 tiebreaker_(0), 255 tiebreaker_(0),
247 gathering_state_(kIceGatheringNew), 256 gathering_state_(kIceGatheringNew),
248 check_receiving_interval_(MIN_CHECK_RECEIVING_INTERVAL * 5), 257 check_receiving_interval_(MIN_CHECK_RECEIVING_INTERVAL * 5),
249 config_(MIN_CHECK_RECEIVING_INTERVAL * 50 /* receiving_timeout */, 258 config_(
250 0 /* backup_connection_ping_interval */, 259 MIN_CHECK_RECEIVING_INTERVAL * 50 /* receiving_timeout */,
251 false /* gather_continually */, 260 0 /* backup_connection_ping_interval */,
252 false /* prioritize_most_likely_candidate_pairs */, 261 GATHER_ONCE,
253 MAX_CURRENT_STRONG_INTERVAL /* max_strong_interval */) { 262 false /* prioritize_most_likely_candidate_pairs */,
263 MAX_CURRENT_STRONG_INTERVAL /* max_strong_interval */,
264 DEFAULT_REGATHER_ON_FAILED_NETWORKS_INTERVAL) {
254 uint32_t weak_ping_interval = ::strtoul( 265 uint32_t weak_ping_interval = ::strtoul(
255 webrtc::field_trial::FindFullName("WebRTC-StunInterPacketDelay").c_str(), 266 webrtc::field_trial::FindFullName("WebRTC-StunInterPacketDelay").c_str(),
256 nullptr, 10); 267 nullptr, 10);
257 if (weak_ping_interval) { 268 if (weak_ping_interval) {
258 weak_ping_interval_ = static_cast<int>(weak_ping_interval); 269 weak_ping_interval_ = static_cast<int>(weak_ping_interval);
259 } 270 }
260 } 271 }
261 272
262 P2PTransportChannel::~P2PTransportChannel() { 273 P2PTransportChannel::~P2PTransportChannel() {
263 ASSERT(worker_thread_ == rtc::Thread::Current()); 274 ASSERT(worker_thread_ == rtc::Thread::Current());
264 } 275 }
265 276
266 // Add the allocator session to our list so that we know which sessions 277 // Add the allocator session to our list so that we know which sessions
267 // are still active. 278 // are still active.
268 void P2PTransportChannel::AddAllocatorSession( 279 void P2PTransportChannel::AddAllocatorSession(
269 std::unique_ptr<PortAllocatorSession> session) { 280 std::unique_ptr<PortAllocatorSession> session) {
270 ASSERT(worker_thread_ == rtc::Thread::Current()); 281 ASSERT(worker_thread_ == rtc::Thread::Current());
271 282
272 session->set_generation(static_cast<uint32_t>(allocator_sessions_.size())); 283 session->set_generation(static_cast<uint32_t>(allocator_sessions_.size()));
273 session->SignalPortReady.connect(this, &P2PTransportChannel::OnPortReady); 284 session->SignalPortReady.connect(this, &P2PTransportChannel::OnPortReady);
274 session->SignalCandidatesReady.connect( 285 session->SignalCandidatesReady.connect(
275 this, &P2PTransportChannel::OnCandidatesReady); 286 this, &P2PTransportChannel::OnCandidatesReady);
287 session->SignalCandidatesRemoved.connect(
288 this, &P2PTransportChannel::OnCandidatesRemoved);
276 session->SignalCandidatesAllocationDone.connect( 289 session->SignalCandidatesAllocationDone.connect(
277 this, &P2PTransportChannel::OnCandidatesAllocationDone); 290 this, &P2PTransportChannel::OnCandidatesAllocationDone);
278 291
279 // We now only want to apply new candidates that we receive to the ports 292 // We now only want to apply new candidates that we receive to the ports
280 // created by this new session because these are replacing those of the 293 // created by this new session because these are replacing those of the
281 // previous sessions. 294 // previous sessions.
282 ports_.clear(); 295 ports_.clear();
283 296
284 allocator_sessions_.push_back(std::move(session)); 297 allocator_sessions_.push_back(std::move(session));
285 } 298 }
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 } 408 }
396 // Updating the remote ICE candidate generation could change the sort order. 409 // Updating the remote ICE candidate generation could change the sort order.
397 RequestSort(); 410 RequestSort();
398 } 411 }
399 412
400 void P2PTransportChannel::SetRemoteIceMode(IceMode mode) { 413 void P2PTransportChannel::SetRemoteIceMode(IceMode mode) {
401 remote_ice_mode_ = mode; 414 remote_ice_mode_ = mode;
402 } 415 }
403 416
404 void P2PTransportChannel::SetIceConfig(const IceConfig& config) { 417 void P2PTransportChannel::SetIceConfig(const IceConfig& config) {
405 config_.gather_continually = config.gather_continually; 418 config_.gathering_policy = config.gathering_policy;
406 LOG(LS_INFO) << "Set gather_continually to " << config_.gather_continually; 419 LOG(LS_INFO) << "Set gathering_policy to " << config_.gathering_policy;
407 420
408 if (config.backup_connection_ping_interval >= 0 && 421 if (config.backup_connection_ping_interval >= 0 &&
409 config_.backup_connection_ping_interval != 422 config_.backup_connection_ping_interval !=
410 config.backup_connection_ping_interval) { 423 config.backup_connection_ping_interval) {
411 config_.backup_connection_ping_interval = 424 config_.backup_connection_ping_interval =
412 config.backup_connection_ping_interval; 425 config.backup_connection_ping_interval;
413 LOG(LS_INFO) << "Set backup connection ping interval to " 426 LOG(LS_INFO) << "Set backup connection ping interval to "
414 << config_.backup_connection_ping_interval << " milliseconds."; 427 << config_.backup_connection_ping_interval << " milliseconds.";
415 } 428 }
416 429
(...skipping 14 matching lines...) Expand all
431 config.prioritize_most_likely_candidate_pairs; 444 config.prioritize_most_likely_candidate_pairs;
432 LOG(LS_INFO) << "Set ping most likely connection to " 445 LOG(LS_INFO) << "Set ping most likely connection to "
433 << config_.prioritize_most_likely_candidate_pairs; 446 << config_.prioritize_most_likely_candidate_pairs;
434 447
435 if (config.max_strong_interval >= 0 && 448 if (config.max_strong_interval >= 0 &&
436 config_.max_strong_interval != config.max_strong_interval) { 449 config_.max_strong_interval != config.max_strong_interval) {
437 config_.max_strong_interval = config.max_strong_interval; 450 config_.max_strong_interval = config.max_strong_interval;
438 LOG(LS_INFO) << "Set max strong interval to " 451 LOG(LS_INFO) << "Set max strong interval to "
439 << config_.max_strong_interval; 452 << config_.max_strong_interval;
440 } 453 }
454
455 if (config.regather_on_failed_networks_interval >= 0 &&
456 config.regather_on_failed_networks_interval !=
457 config_.regather_on_failed_networks_interval) {
458 config_.regather_on_failed_networks_interval =
459 config.regather_on_failed_networks_interval;
460 LOG(LS_INFO) << "Set regather_on_failed_networks_interval to "
461 << config_.regather_on_failed_networks_interval;
462 }
441 } 463 }
442 464
443 const IceConfig& P2PTransportChannel::config() const { 465 const IceConfig& P2PTransportChannel::config() const {
444 return config_; 466 return config_;
445 } 467 }
446 468
447 // Go into the state of processing candidates, and running in general 469 // Go into the state of processing candidates, and running in general
448 void P2PTransportChannel::Connect() { 470 void P2PTransportChannel::Connect() {
449 ASSERT(worker_thread_ == rtc::Thread::Current()); 471 ASSERT(worker_thread_ == rtc::Thread::Current());
450 if (ice_ufrag_.empty() || ice_pwd_.empty()) { 472 if (ice_ufrag_.empty() || ice_pwd_.empty()) {
451 ASSERT(false); 473 ASSERT(false);
452 LOG(LS_ERROR) << "P2PTransportChannel::Connect: The ice_ufrag_ and the " 474 LOG(LS_ERROR) << "P2PTransportChannel::Connect: The ice_ufrag_ and the "
453 << "ice_pwd_ are not set."; 475 << "ice_pwd_ are not set.";
454 return; 476 return;
455 } 477 }
456 478
457 // Start checking and pinging as the ports come in. 479 // Start checking and pinging as the ports come in.
458 thread()->Post(RTC_FROM_HERE, this, MSG_CHECK_AND_PING); 480 thread()->Post(RTC_FROM_HERE, this, MSG_CHECK_AND_PING);
481 thread()->PostDelayed(RTC_FROM_HERE,
482 config_.regather_on_failed_networks_interval, this,
483 MSG_REGATHER_ON_FAILED_NETWORKS);
459 } 484 }
460 485
461 void P2PTransportChannel::MaybeStartGathering() { 486 void P2PTransportChannel::MaybeStartGathering() {
462 // Start gathering if we never started before, or if an ICE restart occurred. 487 // Start gathering if we never started before, or if an ICE restart occurred.
463 if (allocator_sessions_.empty() || 488 if (allocator_sessions_.empty() ||
464 IceCredentialsChanged(allocator_sessions_.back()->ice_ufrag(), 489 IceCredentialsChanged(allocator_sessions_.back()->ice_ufrag(),
465 allocator_sessions_.back()->ice_pwd(), ice_ufrag_, 490 allocator_sessions_.back()->ice_pwd(), ice_ufrag_,
466 ice_pwd_)) { 491 ice_pwd_)) {
467 if (gathering_state_ != kIceGatheringGathering) { 492 if (gathering_state_ != kIceGatheringGathering) {
468 gathering_state_ = kIceGatheringGathering; 493 gathering_state_ = kIceGatheringGathering;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 // Remember the ports and candidates, and signal that candidates are ready. 538 // Remember the ports and candidates, and signal that candidates are ready.
514 // The session will handle this, and send an initiate/accept/modify message 539 // The session will handle this, and send an initiate/accept/modify message
515 // if one is pending. 540 // if one is pending.
516 541
517 port->SetIceRole(ice_role_); 542 port->SetIceRole(ice_role_);
518 port->SetIceTiebreaker(tiebreaker_); 543 port->SetIceTiebreaker(tiebreaker_);
519 ports_.push_back(port); 544 ports_.push_back(port);
520 port->SignalUnknownAddress.connect( 545 port->SignalUnknownAddress.connect(
521 this, &P2PTransportChannel::OnUnknownAddress); 546 this, &P2PTransportChannel::OnUnknownAddress);
522 port->SignalDestroyed.connect(this, &P2PTransportChannel::OnPortDestroyed); 547 port->SignalDestroyed.connect(this, &P2PTransportChannel::OnPortDestroyed);
523 port->SignalNetworkInactive.connect( 548 port->SignalClosed.connect(this, &P2PTransportChannel::OnPortClosed);
524 this, &P2PTransportChannel::OnPortNetworkInactive); 549
525 port->SignalRoleConflict.connect( 550 port->SignalRoleConflict.connect(
526 this, &P2PTransportChannel::OnRoleConflict); 551 this, &P2PTransportChannel::OnRoleConflict);
527 port->SignalSentPacket.connect(this, &P2PTransportChannel::OnSentPacket); 552 port->SignalSentPacket.connect(this, &P2PTransportChannel::OnSentPacket);
528 553
529 // Attempt to create a connection from this new port to all of the remote 554 // Attempt to create a connection from this new port to all of the remote
530 // candidates that we were given so far. 555 // candidates that we were given so far.
531 556
532 std::vector<RemoteCandidate>::iterator iter; 557 std::vector<RemoteCandidate>::iterator iter;
533 for (iter = remote_candidates_.begin(); iter != remote_candidates_.end(); 558 for (iter = remote_candidates_.begin(); iter != remote_candidates_.end();
534 ++iter) { 559 ++iter) {
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after
1249 } 1274 }
1250 set_receiving(receiving); 1275 set_receiving(receiving);
1251 } 1276 }
1252 1277
1253 void P2PTransportChannel::MaybeStopPortAllocatorSessions() { 1278 void P2PTransportChannel::MaybeStopPortAllocatorSessions() {
1254 if (!IsGettingPorts()) { 1279 if (!IsGettingPorts()) {
1255 return; 1280 return;
1256 } 1281 }
1257 1282
1258 for (const auto& session : allocator_sessions_) { 1283 for (const auto& session : allocator_sessions_) {
1259 if (!session->IsGettingPorts()) { 1284 if (!session->CanGetPorts()) {
1285 // The session has completely stopped.
1260 continue; 1286 continue;
1261 } 1287 }
1262 // If gathering continually, keep the last session running so that it 1288 // If gathering continually, keep the last session at STATE_CLEARED so that
1263 // will gather candidates if the networks change. 1289 // it can gather candidates if the networks change.
1264 if (config_.gather_continually && session == allocator_sessions_.back()) { 1290 if (config_.gather_continually() && session == allocator_sessions_.back()) {
1265 session->ClearGettingPorts(); 1291 session->ClearGettingPorts();
1266 break; 1292 } else {
1293 session->StopGettingPorts();
1267 } 1294 }
1268 session->StopGettingPorts();
1269 } 1295 }
1270 } 1296 }
1271 1297
1272 // If all connections timed out, delete them all. 1298 // If all connections timed out, delete them all.
1273 void P2PTransportChannel::HandleAllTimedOut() { 1299 void P2PTransportChannel::HandleAllTimedOut() {
1274 for (Connection* connection : connections_) { 1300 for (Connection* connection : connections_) {
1275 connection->Destroy(); 1301 connection->Destroy();
1276 } 1302 }
1277 } 1303 }
1278 1304
(...skipping 20 matching lines...) Expand all
1299 1325
1300 // Handle any queued up requests 1326 // Handle any queued up requests
1301 void P2PTransportChannel::OnMessage(rtc::Message *pmsg) { 1327 void P2PTransportChannel::OnMessage(rtc::Message *pmsg) {
1302 switch (pmsg->message_id) { 1328 switch (pmsg->message_id) {
1303 case MSG_SORT: 1329 case MSG_SORT:
1304 OnSort(); 1330 OnSort();
1305 break; 1331 break;
1306 case MSG_CHECK_AND_PING: 1332 case MSG_CHECK_AND_PING:
1307 OnCheckAndPing(); 1333 OnCheckAndPing();
1308 break; 1334 break;
1335 case MSG_REGATHER_ON_FAILED_NETWORKS:
1336 RegatherOnFailedNetworks();
1337 break;
1338 case MSG_SIGNAL_CANDIDATES_REMOVED:
1339 if (!candidates_to_remove_.empty()) {
1340 LOG(LS_INFO) << "Signal removing " << candidates_to_remove_.size()
1341 << " candidates";
1342 SignalCandidatesRemoved(this, candidates_to_remove_);
1343 candidates_to_remove_.clear();
1344 }
1345 break;
1309 default: 1346 default:
1310 ASSERT(false); 1347 ASSERT(false);
1311 break; 1348 break;
1312 } 1349 }
1313 } 1350 }
1314 1351
1315 // Handle queued up sort request 1352 // Handle queued up sort request
1316 void P2PTransportChannel::OnSort() { 1353 void P2PTransportChannel::OnSort() {
1317 // Resort the connections based on the new statistics. 1354 // Resort the connections based on the new statistics.
1318 SortConnections(); 1355 SortConnections();
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1500 // and re-choose a best assuming that there was no best connection. 1537 // and re-choose a best assuming that there was no best connection.
1501 if (best_connection_ == connection) { 1538 if (best_connection_ == connection) {
1502 LOG(LS_INFO) << "Best connection destroyed. Will choose a new one."; 1539 LOG(LS_INFO) << "Best connection destroyed. Will choose a new one.";
1503 SwitchBestConnectionTo(NULL); 1540 SwitchBestConnectionTo(NULL);
1504 RequestSort(); 1541 RequestSort();
1505 } 1542 }
1506 1543
1507 UpdateState(); 1544 UpdateState();
1508 } 1545 }
1509 1546
1510 // When a port is destroyed remove it from our list of ports to use for
1511 // connection attempts.
1512 void P2PTransportChannel::OnPortDestroyed(PortInterface* port) { 1547 void P2PTransportChannel::OnPortDestroyed(PortInterface* port) {
1513 ASSERT(worker_thread_ == rtc::Thread::Current()); 1548 ASSERT(worker_thread_ == rtc::Thread::Current());
1514 1549
1515 // Remove this port from the list (if we didn't drop it already). 1550 if (RemovePort(port)) {
1516 std::vector<PortInterface*>::iterator iter = 1551 LOG(INFO) << "Removed port because it is destroyed: " << ports_.size()
1517 std::find(ports_.begin(), ports_.end(), port); 1552 << " remaining";
1518 if (iter != ports_.end()) 1553 }
1519 ports_.erase(iter);
1520
1521 LOG(INFO) << "Removed port from p2p socket: "
1522 << static_cast<int>(ports_.size()) << " remaining";
1523 } 1554 }
1524 1555
1525 void P2PTransportChannel::OnPortNetworkInactive(PortInterface* port) { 1556 void P2PTransportChannel::OnPortClosed(PortInterface* port) {
1526 // If it does not gather continually, the port will be removed from the list 1557 ASSERT(worker_thread_ == rtc::Thread::Current());
1527 // when ICE restarts. 1558
1528 if (!config_.gather_continually) { 1559 if (RemovePort(port)) {
1560 LOG(INFO) << "Removed port because it is closed: " << ports_.size()
1561 << " remaining";
1562 }
1563 }
1564
1565 bool P2PTransportChannel::RemovePort(PortInterface* port) {
1566 auto new_end = std::remove(ports_.begin(), ports_.end(), port);
1567 if (new_end != ports_.end()) {
1568 ports_.erase(new_end, ports_.end());
1569 return true;
1570 }
1571 return false;
1572 }
1573
1574 void P2PTransportChannel::OnCandidatesRemoved(
1575 PortAllocatorSession* session,
1576 const std::vector<Candidate>& candidates) {
1577 ASSERT(worker_thread_ == rtc::Thread::Current());
1578 // Do not signal candidate removals if continual gathering is not enabled.
1579 // Do not signal candidate removals if this is not the last session because
1580 // an ICE restart would have signaled the remote side about all candidate
1581 // removals in previous sessions.
1582 if (!config_.gather_continually() || session != allocator_session()) {
1529 return; 1583 return;
1530 } 1584 }
1531 auto it = std::find(ports_.begin(), ports_.end(), port); 1585
1532 // Don't need to do anything if the port has been deleted from the port list. 1586 // If |candidates_to_remove_| is not empty, a msg
1533 if (it == ports_.end()) { 1587 // MSG_SIGNAL_CANDIDATES_REMOVED should have been posted.
1588 if (candidates_to_remove_.empty()) {
1589 thread()->Post(this, MSG_SIGNAL_CANDIDATES_REMOVED);
1590 }
1591
1592 for (Candidate candidate : candidates) {
1593 candidate.set_transport_name(transport_name());
1594 candidates_to_remove_.push_back(candidate);
1595 }
1596 }
1597
1598 void P2PTransportChannel::OnRegatherOnFailedNetworks() {
1599 if (!config_.gather_continually() || allocator_sessions_.empty()) {
1534 return; 1600 return;
1535 } 1601 }
1536 ports_.erase(it); 1602 allocator_session()->RegatherOnFailedNetworks();
1537 LOG(INFO) << "Removed port due to inactive networks: " << ports_.size() 1603
1538 << " remaining"; 1604 thread()->PostDelayed(config_.regather_on_failed_network_interval_, this,
1539 std::vector<Candidate> candidates = port->Candidates(); 1605 MSG_REGATHER_ON_FAILED_NETWORKS);
1540 for (Candidate& candidate : candidates) {
1541 candidate.set_transport_name(transport_name());
1542 }
1543 SignalCandidatesRemoved(this, candidates);
1544 } 1606 }
1545 1607
1546 // We data is available, let listeners know 1608 // We data is available, let listeners know
1547 void P2PTransportChannel::OnReadPacket(Connection* connection, 1609 void P2PTransportChannel::OnReadPacket(Connection* connection,
1548 const char* data, 1610 const char* data,
1549 size_t len, 1611 size_t len,
1550 const rtc::PacketTime& packet_time) { 1612 const rtc::PacketTime& packet_time) {
1551 ASSERT(worker_thread_ == rtc::Thread::Current()); 1613 ASSERT(worker_thread_ == rtc::Thread::Current());
1552 1614
1553 // Do not deliver, if packet doesn't belong to the correct transport channel. 1615 // Do not deliver, if packet doesn't belong to the correct transport channel.
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1688 1750
1689 // During the initial state when nothing has been pinged yet, return the first 1751 // During the initial state when nothing has been pinged yet, return the first
1690 // one in the ordered |connections_|. 1752 // one in the ordered |connections_|.
1691 return *(std::find_if(connections_.begin(), connections_.end(), 1753 return *(std::find_if(connections_.begin(), connections_.end(),
1692 [conn1, conn2](Connection* conn) { 1754 [conn1, conn2](Connection* conn) {
1693 return conn == conn1 || conn == conn2; 1755 return conn == conn1 || conn == conn2;
1694 })); 1756 }));
1695 } 1757 }
1696 1758
1697 } // namespace cricket 1759 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698