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->SignalDestroyed.disconnect(this); |
| 283 ret.first->second->Destroy(); |
| 284 ret.first->second = conn; |
| 285 } |
275 conn->SignalDestroyed.connect(this, &Port::OnConnectionDestroyed); | 286 conn->SignalDestroyed.connect(this, &Port::OnConnectionDestroyed); |
276 SignalConnectionCreated(this, conn); | 287 SignalConnectionCreated(this, conn); |
277 } | 288 } |
278 | 289 |
279 void Port::OnReadPacket( | 290 void Port::OnReadPacket( |
280 const char* data, size_t size, const rtc::SocketAddress& addr, | 291 const char* data, size_t size, const rtc::SocketAddress& addr, |
281 ProtocolType proto) { | 292 ProtocolType proto) { |
282 // If the user has enabled port packets, just hand this over. | 293 // If the user has enabled port packets, just hand this over. |
283 if (enable_port_packets_) { | 294 if (enable_port_packets_) { |
284 SignalReadPacket(this, data, size, addr); | 295 SignalReadPacket(this, data, size, addr); |
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 | 692 |
682 void Port::EnablePortPackets() { | 693 void Port::EnablePortPackets() { |
683 enable_port_packets_ = true; | 694 enable_port_packets_ = true; |
684 } | 695 } |
685 | 696 |
686 void Port::OnConnectionDestroyed(Connection* conn) { | 697 void Port::OnConnectionDestroyed(Connection* conn) { |
687 AddressMap::iterator iter = | 698 AddressMap::iterator iter = |
688 connections_.find(conn->remote_candidate().address()); | 699 connections_.find(conn->remote_candidate().address()); |
689 ASSERT(iter != connections_.end()); | 700 ASSERT(iter != connections_.end()); |
690 connections_.erase(iter); | 701 connections_.erase(iter); |
| 702 HandleConnectionDestroyed(conn); |
691 | 703 |
692 // On the controlled side, ports time out after all connections fail. | 704 // 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 | 705 // 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 | 706 // fails and is removed before kPortTimeoutDelay, then this message will |
695 // still cause the Port to be destroyed. | 707 // still cause the Port to be destroyed. |
696 if (dead()) { | 708 if (dead()) { |
697 thread_->PostDelayed(timeout_delay_, this, MSG_DEAD); | 709 thread_->PostDelayed(timeout_delay_, this, MSG_DEAD); |
698 } | 710 } |
699 } | 711 } |
700 | 712 |
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1505 ASSERT(sent < 0); | 1517 ASSERT(sent < 0); |
1506 error_ = port_->GetError(); | 1518 error_ = port_->GetError(); |
1507 sent_packets_discarded_++; | 1519 sent_packets_discarded_++; |
1508 } else { | 1520 } else { |
1509 send_rate_tracker_.AddSamples(sent); | 1521 send_rate_tracker_.AddSamples(sent); |
1510 } | 1522 } |
1511 return sent; | 1523 return sent; |
1512 } | 1524 } |
1513 | 1525 |
1514 } // namespace cricket | 1526 } // namespace cricket |
OLD | NEW |