Index: webrtc/p2p/base/port.cc |
diff --git a/webrtc/p2p/base/port.cc b/webrtc/p2p/base/port.cc |
index b08cc4c91039f8149fac115a17e70f70236698ff..0ce946582aed64e2e44b060331e0aab20a429c0d 100644 |
--- a/webrtc/p2p/base/port.cc |
+++ b/webrtc/p2p/base/port.cc |
@@ -270,8 +270,19 @@ void Port::AddAddress(const rtc::SocketAddress& address, |
} |
} |
-void Port::AddConnection(Connection* conn) { |
- connections_[conn->remote_candidate().address()] = conn; |
+void Port::AddOrReplaceConnection(Connection* conn) { |
+ auto ret = connections_.insert( |
+ std::make_pair(conn->remote_candidate().address(), conn)); |
+ // If there is a different connection on the same remote address, replace |
+ // it with the new one and destroy the old one. |
+ if (ret.second == false && ret.first->second != conn) { |
+ LOG_J(LS_WARNING, this) |
+ << "A new connection was created on an existing remote address. " |
+ << "New remote candidate: " << conn->remote_candidate().ToString(); |
+ ret.first->second->SignalDestroyed.disconnect(this); |
+ ret.first->second->Destroy(); |
+ ret.first->second = conn; |
+ } |
conn->SignalDestroyed.connect(this, &Port::OnConnectionDestroyed); |
SignalConnectionCreated(this, conn); |
} |
@@ -688,6 +699,7 @@ void Port::OnConnectionDestroyed(Connection* conn) { |
connections_.find(conn->remote_candidate().address()); |
ASSERT(iter != connections_.end()); |
connections_.erase(iter); |
+ HandleConnectionDestroyed(conn); |
// On the controlled side, ports time out after all connections fail. |
// Note: If a new connection is added after this message is posted, but it |