| Index: webrtc/p2p/base/p2ptransportchannel.cc
|
| diff --git a/webrtc/p2p/base/p2ptransportchannel.cc b/webrtc/p2p/base/p2ptransportchannel.cc
|
| index b1de3e91d3d4a3ee5bca7221e515a10c4aae090c..a2fb774456d3b71d6478677657fa3a12bde994ad 100644
|
| --- a/webrtc/p2p/base/p2ptransportchannel.cc
|
| +++ b/webrtc/p2p/base/p2ptransportchannel.cc
|
| @@ -855,40 +855,41 @@ bool P2PTransportChannel::CreateConnection(PortInterface* port,
|
| 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);
|
| -
|
| - // Don't create connection if this is a candidate we received in a
|
| + if (connection == nullptr ||
|
| + connection->remote_candidate().generation() <
|
| + remote_candidate.generation()) {
|
| + // Don't create a 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_)
|
| + PortInterface::CandidateOrigin origin = GetOrigin(port, origin_port);
|
| + if (origin == PortInterface::ORIGIN_MESSAGE && incoming_only_) {
|
| return false;
|
| -
|
| - connection = port->CreateConnection(remote_candidate, origin);
|
| - if (!connection)
|
| + }
|
| + 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;
|
| }
|
|
|
| - return true;
|
| + // No new connection was created.
|
| + // Check if this is a peer reflexive candidate.
|
| + 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;
|
| }
|
|
|
| bool P2PTransportChannel::FindConnection(Connection* connection) const {
|
|
|