Chromium Code Reviews| Index: webrtc/p2p/base/p2ptransportchannel.cc |
| diff --git a/webrtc/p2p/base/p2ptransportchannel.cc b/webrtc/p2p/base/p2ptransportchannel.cc |
| index b1de3e91d3d4a3ee5bca7221e515a10c4aae090c..17a3643bc5e7aa863f25d3dfeb582edde9414342 100644 |
| --- a/webrtc/p2p/base/p2ptransportchannel.cc |
| +++ b/webrtc/p2p/base/p2ptransportchannel.cc |
| @@ -532,7 +532,7 @@ void P2PTransportChannel::OnPortReady(PortAllocatorSession *session, |
| std::vector<RemoteCandidate>::iterator iter; |
| for (iter = remote_candidates_.begin(); iter != remote_candidates_.end(); |
| ++iter) { |
| - CreateConnection(port, *iter, iter->origin_port()); |
| + MaybeCreateConnection(port, *iter, iter->origin_port()); |
| } |
| SortConnections(); |
| @@ -828,7 +828,7 @@ bool P2PTransportChannel::CreateConnections(const Candidate& remote_candidate, |
| bool created = false; |
| std::vector<PortInterface *>::reverse_iterator it; |
| for (it = ports_.rbegin(); it != ports_.rend(); ++it) { |
| - if (CreateConnection(*it, remote_candidate, origin_port)) { |
| + if (MaybeCreateConnection(*it, remote_candidate, origin_port)) { |
| if (*it == origin_port) |
| created = true; |
| } |
| @@ -836,7 +836,7 @@ bool P2PTransportChannel::CreateConnections(const Candidate& remote_candidate, |
| if ((origin_port != NULL) && |
| std::find(ports_.begin(), ports_.end(), origin_port) == ports_.end()) { |
| - if (CreateConnection(origin_port, remote_candidate, origin_port)) |
| + if (MaybeCreateConnection(origin_port, remote_candidate, origin_port)) |
| created = true; |
| } |
| @@ -848,46 +848,56 @@ bool P2PTransportChannel::CreateConnections(const Candidate& remote_candidate, |
| // Setup a connection object for the local and remote candidate combination. |
| // And then listen to connection object for changes. |
| -bool P2PTransportChannel::CreateConnection(PortInterface* port, |
| - const Candidate& remote_candidate, |
| - PortInterface* origin_port) { |
| +bool P2PTransportChannel::MaybeCreateConnection( |
| + PortInterface* port, |
| + const Candidate& remote_candidate, |
| + PortInterface* origin_port) { |
| if (!port->SupportsProtocol(remote_candidate.protocol())) { |
| return false; |
| } |
| // Look for an existing connection with this remote address. If one is not |
| - // found, then we can create a new connection for this address. |
| + // found or it is found but the existing remote candidate has an older |
| + // generation, then we can create a new connection for this address. |
| Connection* connection = port->GetConnection(remote_candidate.address()); |
| - if (connection != NULL) { |
| - connection->MaybeUpdatePeerReflexiveCandidate(remote_candidate); |
| - |
| - // It is not legal to try to change any of the parameters of an existing |
| - // connection; however, the other side can send a duplicate candidate. |
| - if (!remote_candidate.IsEquivalent(connection->remote_candidate())) { |
| - LOG(INFO) << "Attempt to change a remote candidate." |
| - << " Existing remote candidate: " |
| - << connection->remote_candidate().ToString() |
| - << "New remote candidate: " |
| - << remote_candidate.ToString(); |
| - return false; |
| - } |
| - } else { |
| - PortInterface::CandidateOrigin origin = GetOrigin(port, origin_port); |
| + if (connection == nullptr || |
| + connection->remote_candidate().generation() < |
| + remote_candidate.generation()) { |
| + return CreateConnection(port, remote_candidate, origin_port); |
| + } |
| - // Don't create connection if this is a candidate we received in a |
| - // message and we are not allowed to make outgoing connections. |
| - if (origin == PortInterface::ORIGIN_MESSAGE && incoming_only_) |
| - return false; |
| + // Check if this is a peer reflexive candidate. |
| + connection->MaybeUpdatePeerReflexiveCandidate(remote_candidate); |
| - connection = port->CreateConnection(remote_candidate, origin); |
| - if (!connection) |
| - return false; |
| + // It is not legal to try to change any of the parameters of an existing |
| + // connection; however, the other side can send a duplicate candidate. |
| + if (!remote_candidate.IsEquivalent(connection->remote_candidate())) { |
| + LOG(INFO) << "Attempt to change a remote candidate." |
| + << " Existing remote candidate: " |
| + << connection->remote_candidate().ToString() |
| + << "New remote candidate: " << remote_candidate.ToString(); |
| + } |
| + // No new connection was created at this point. |
| + return false; |
| +} |
| + |
| +bool P2PTransportChannel::CreateConnection(PortInterface* port, |
| + const Candidate& remote_candidate, |
| + PortInterface* origin_port) { |
|
pthatcher1
2016/05/27 18:42:54
I don't quite understand why you split these metho
honghaiz3
2016/05/31 18:57:31
I thought it may improve readability.
Since it cau
|
| + PortInterface::CandidateOrigin origin = GetOrigin(port, origin_port); |
| - AddConnection(connection); |
| + // Don't create connection if this is a candidate we received in a |
|
pthatcher1
2016/05/27 18:42:54
create connection => create a caonnection
honghaiz3
2016/05/31 18:57:31
Done.
|
| + // message and we are not allowed to make outgoing connections. |
| + if (origin == PortInterface::ORIGIN_MESSAGE && incoming_only_) |
|
pthatcher1
2016/05/27 18:42:54
{}s please
honghaiz3
2016/05/31 18:57:31
Done.
|
| + return false; |
| - LOG_J(LS_INFO, this) << "Created connection with origin=" << origin << ", (" |
| - << connections_.size() << " total)"; |
| + Connection* connection = port->CreateConnection(remote_candidate, origin); |
| + if (!connection) { |
| + return false; |
| } |
| + AddConnection(connection); |
| + LOG_J(LS_INFO, this) << "Created connection with origin=" << origin << ", (" |
| + << connections_.size() << " total)"; |
| return true; |
| } |