OLD | NEW |
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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 c.set_network_type(network_->type()); | 263 c.set_network_type(network_->type()); |
264 c.set_related_address(related_address); | 264 c.set_related_address(related_address); |
265 candidates_.push_back(c); | 265 candidates_.push_back(c); |
266 SignalCandidateReady(this, c); | 266 SignalCandidateReady(this, c); |
267 | 267 |
268 if (final) { | 268 if (final) { |
269 SignalPortComplete(this); | 269 SignalPortComplete(this); |
270 } | 270 } |
271 } | 271 } |
272 | 272 |
273 void Port::AddConnection(Connection* conn) { | 273 void Port::AddOrReplaceConnection(Connection* conn) { |
274 connections_[conn->remote_candidate().address()] = conn; | 274 auto ret = connections_.insert( |
| 275 std::make_pair(conn->remote_candidate().address(), conn)); |
| 276 // If there is a different connection on the same remote address, replace |
| 277 // it with the new one and destroy the old one. |
| 278 if (ret.second == false && ret.first->second != conn) { |
| 279 LOG_J(LS_WARNING, this) |
| 280 << "A new connection was created on an existing remote address. " |
| 281 << "New remote candidate: " << conn->remote_candidate().ToString(); |
| 282 ret.first->second->Destroy(); |
| 283 ret.first->second = conn; |
| 284 } |
275 conn->SignalDestroyed.connect(this, &Port::OnConnectionDestroyed); | 285 conn->SignalDestroyed.connect(this, &Port::OnConnectionDestroyed); |
276 SignalConnectionCreated(this, conn); | 286 SignalConnectionCreated(this, conn); |
277 } | 287 } |
278 | 288 |
279 void Port::OnReadPacket( | 289 void Port::OnReadPacket( |
280 const char* data, size_t size, const rtc::SocketAddress& addr, | 290 const char* data, size_t size, const rtc::SocketAddress& addr, |
281 ProtocolType proto) { | 291 ProtocolType proto) { |
282 // If the user has enabled port packets, just hand this over. | 292 // If the user has enabled port packets, just hand this over. |
283 if (enable_port_packets_) { | 293 if (enable_port_packets_) { |
284 SignalReadPacket(this, data, size, addr); | 294 SignalReadPacket(this, data, size, addr); |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 } | 690 } |
681 | 691 |
682 void Port::EnablePortPackets() { | 692 void Port::EnablePortPackets() { |
683 enable_port_packets_ = true; | 693 enable_port_packets_ = true; |
684 } | 694 } |
685 | 695 |
686 void Port::OnConnectionDestroyed(Connection* conn) { | 696 void Port::OnConnectionDestroyed(Connection* conn) { |
687 AddressMap::iterator iter = | 697 AddressMap::iterator iter = |
688 connections_.find(conn->remote_candidate().address()); | 698 connections_.find(conn->remote_candidate().address()); |
689 ASSERT(iter != connections_.end()); | 699 ASSERT(iter != connections_.end()); |
| 700 if (iter->second != conn) { |
| 701 // If the deleted connection is different than what we have now, ignore it. |
| 702 return; |
| 703 } |
690 connections_.erase(iter); | 704 connections_.erase(iter); |
| 705 HandleConnectionDestroyed(conn); |
691 | 706 |
692 // On the controlled side, ports time out after all connections fail. | 707 // On the controlled side, ports time out after all connections fail. |
693 // Note: If a new connection is added after this message is posted, but it | 708 // Note: If a new connection is added after this message is posted, but it |
694 // fails and is removed before kPortTimeoutDelay, then this message will | 709 // fails and is removed before kPortTimeoutDelay, then this message will |
695 // still cause the Port to be destroyed. | 710 // still cause the Port to be destroyed. |
696 if (dead()) { | 711 if (dead()) { |
697 thread_->PostDelayed(timeout_delay_, this, MSG_DEAD); | 712 thread_->PostDelayed(timeout_delay_, this, MSG_DEAD); |
698 } | 713 } |
699 } | 714 } |
700 | 715 |
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1505 ASSERT(sent < 0); | 1520 ASSERT(sent < 0); |
1506 error_ = port_->GetError(); | 1521 error_ = port_->GetError(); |
1507 sent_packets_discarded_++; | 1522 sent_packets_discarded_++; |
1508 } else { | 1523 } else { |
1509 send_rate_tracker_.AddSamples(sent); | 1524 send_rate_tracker_.AddSamples(sent); |
1510 } | 1525 } |
1511 return sent; | 1526 return sent; |
1512 } | 1527 } |
1513 | 1528 |
1514 } // namespace cricket | 1529 } // namespace cricket |
OLD | NEW |