OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2012 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 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 : Port(thread, | 192 : Port(thread, |
193 RELAY_PORT_TYPE, | 193 RELAY_PORT_TYPE, |
194 factory, | 194 factory, |
195 network, | 195 network, |
196 socket->GetLocalAddress().ipaddr(), | 196 socket->GetLocalAddress().ipaddr(), |
197 username, | 197 username, |
198 password), | 198 password), |
199 server_address_(server_address), | 199 server_address_(server_address), |
200 credentials_(credentials), | 200 credentials_(credentials), |
201 socket_(socket), | 201 socket_(socket), |
202 resolver_(NULL), | 202 resolver_(nullptr), |
203 error_(0), | 203 error_(0), |
204 request_manager_(thread), | 204 request_manager_(thread), |
205 next_channel_number_(TURN_CHANNEL_NUMBER_START), | 205 next_channel_number_(TURN_CHANNEL_NUMBER_START), |
206 state_(STATE_CONNECTING), | 206 state_(STATE_CONNECTING), |
207 server_priority_(server_priority), | 207 server_priority_(server_priority), |
208 allocate_mismatch_retries_(0) { | 208 allocate_mismatch_retries_(0) { |
209 request_manager_.SignalSendPacket.connect(this, &TurnPort::OnSendStunPacket); | 209 request_manager_.SignalSendPacket.connect(this, &TurnPort::OnSendStunPacket); |
210 request_manager_.set_origin(origin); | 210 request_manager_.set_origin(origin); |
211 } | 211 } |
212 | 212 |
(...skipping 13 matching lines...) Expand all Loading... |
226 RELAY_PORT_TYPE, | 226 RELAY_PORT_TYPE, |
227 factory, | 227 factory, |
228 network, | 228 network, |
229 ip, | 229 ip, |
230 min_port, | 230 min_port, |
231 max_port, | 231 max_port, |
232 username, | 232 username, |
233 password), | 233 password), |
234 server_address_(server_address), | 234 server_address_(server_address), |
235 credentials_(credentials), | 235 credentials_(credentials), |
236 socket_(NULL), | 236 socket_(nullptr), |
237 resolver_(NULL), | 237 resolver_(nullptr), |
238 error_(0), | 238 error_(0), |
239 request_manager_(thread), | 239 request_manager_(thread), |
240 next_channel_number_(TURN_CHANNEL_NUMBER_START), | 240 next_channel_number_(TURN_CHANNEL_NUMBER_START), |
241 state_(STATE_CONNECTING), | 241 state_(STATE_CONNECTING), |
242 server_priority_(server_priority), | 242 server_priority_(server_priority), |
243 allocate_mismatch_retries_(0) { | 243 allocate_mismatch_retries_(0) { |
244 request_manager_.SignalSendPacket.connect(this, &TurnPort::OnSendStunPacket); | 244 request_manager_.SignalSendPacket.connect(this, &TurnPort::OnSendStunPacket); |
245 request_manager_.set_origin(origin); | 245 request_manager_.set_origin(origin); |
246 } | 246 } |
247 | 247 |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 } | 434 } |
435 | 435 |
436 LOG_J(LS_INFO, this) << "Allocating a new socket after " | 436 LOG_J(LS_INFO, this) << "Allocating a new socket after " |
437 << "STUN_ERROR_ALLOCATION_MISMATCH, retry = " | 437 << "STUN_ERROR_ALLOCATION_MISMATCH, retry = " |
438 << allocate_mismatch_retries_ + 1; | 438 << allocate_mismatch_retries_ + 1; |
439 if (SharedSocket()) { | 439 if (SharedSocket()) { |
440 ResetSharedSocket(); | 440 ResetSharedSocket(); |
441 } else { | 441 } else { |
442 delete socket_; | 442 delete socket_; |
443 } | 443 } |
444 socket_ = NULL; | 444 socket_ = nullptr; |
445 | 445 |
446 ResetNonce(); | 446 ResetNonce(); |
447 PrepareAddress(); | 447 PrepareAddress(); |
448 ++allocate_mismatch_retries_; | 448 ++allocate_mismatch_retries_; |
449 } | 449 } |
450 | 450 |
451 Connection* TurnPort::CreateConnection(const Candidate& remote_candidate, | 451 Connection* TurnPort::CreateConnection(const Candidate& remote_candidate, |
452 CandidateOrigin origin) { | 452 CandidateOrigin origin) { |
453 // TURN-UDP can only connect to UDP candidates. | 453 // TURN-UDP can only connect to UDP candidates. |
454 if (!SupportsProtocol(remote_candidate.protocol())) { | 454 if (!SupportsProtocol(remote_candidate.protocol())) { |
455 return NULL; | 455 return nullptr; |
456 } | 456 } |
457 | 457 |
458 if (state_ == STATE_DISCONNECTED || state_ == STATE_RECEIVEONLY) { | 458 if (state_ == STATE_DISCONNECTED || state_ == STATE_RECEIVEONLY) { |
459 return NULL; | 459 return nullptr; |
460 } | 460 } |
461 | 461 |
462 // A TURN port will have two candiates, STUN and TURN. STUN may not | 462 // A TURN port will have two candiates, STUN and TURN. STUN may not |
463 // present in all cases. If present stun candidate will be added first | 463 // present in all cases. If present stun candidate will be added first |
464 // and TURN candidate later. | 464 // and TURN candidate later. |
465 for (size_t index = 0; index < Candidates().size(); ++index) { | 465 for (size_t index = 0; index < Candidates().size(); ++index) { |
466 const Candidate& local_candidate = Candidates()[index]; | 466 const Candidate& local_candidate = Candidates()[index]; |
467 if (local_candidate.type() == RELAY_PORT_TYPE && | 467 if (local_candidate.type() == RELAY_PORT_TYPE && |
468 local_candidate.address().family() == | 468 local_candidate.address().family() == |
469 remote_candidate.address().family()) { | 469 remote_candidate.address().family()) { |
470 // Create an entry, if needed, so we can get our permissions set up | 470 // Create an entry, if needed, so we can get our permissions set up |
471 // correctly. | 471 // correctly. |
472 CreateOrRefreshEntry(remote_candidate.address()); | 472 CreateOrRefreshEntry(remote_candidate.address()); |
473 ProxyConnection* conn = | 473 ProxyConnection* conn = |
474 new ProxyConnection(this, index, remote_candidate); | 474 new ProxyConnection(this, index, remote_candidate); |
475 AddOrReplaceConnection(conn); | 475 AddOrReplaceConnection(conn); |
476 return conn; | 476 return conn; |
477 } | 477 } |
478 } | 478 } |
479 return NULL; | 479 return nullptr; |
480 } | 480 } |
481 | 481 |
482 bool TurnPort::FailAndPruneConnection(const rtc::SocketAddress& address) { | 482 bool TurnPort::FailAndPruneConnection(const rtc::SocketAddress& address) { |
483 Connection* conn = GetConnection(address); | 483 Connection* conn = GetConnection(address); |
484 if (conn != nullptr) { | 484 if (conn != nullptr) { |
485 conn->FailAndPrune(); | 485 conn->FailAndPrune(); |
486 return true; | 486 return true; |
487 } | 487 } |
488 return false; | 488 return false; |
489 } | 489 } |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
800 // Send another allocate request to alternate server, with the received | 800 // Send another allocate request to alternate server, with the received |
801 // realm and nonce values. | 801 // realm and nonce values. |
802 SendRequest(new TurnAllocateRequest(this), 0); | 802 SendRequest(new TurnAllocateRequest(this), 0); |
803 } else { | 803 } else { |
804 // Since it's TCP, we have to delete the connected socket and reconnect | 804 // Since it's TCP, we have to delete the connected socket and reconnect |
805 // with the alternate server. PrepareAddress will send stun binding once | 805 // with the alternate server. PrepareAddress will send stun binding once |
806 // the new socket is connected. | 806 // the new socket is connected. |
807 RTC_DCHECK(server_address().proto == PROTO_TCP); | 807 RTC_DCHECK(server_address().proto == PROTO_TCP); |
808 RTC_DCHECK(!SharedSocket()); | 808 RTC_DCHECK(!SharedSocket()); |
809 delete socket_; | 809 delete socket_; |
810 socket_ = NULL; | 810 socket_ = nullptr; |
811 PrepareAddress(); | 811 PrepareAddress(); |
812 } | 812 } |
813 break; | 813 break; |
814 default: | 814 default: |
815 Port::OnMessage(message); | 815 Port::OnMessage(message); |
816 } | 816 } |
817 } | 817 } |
818 | 818 |
819 void TurnPort::OnAllocateRequestTimeout() { | 819 void TurnPort::OnAllocateRequestTimeout() { |
820 OnAllocateError(); | 820 OnAllocateError(); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
986 return (std::find_if(entries_.begin(), entries_.end(), | 986 return (std::find_if(entries_.begin(), entries_.end(), |
987 std::bind2nd(std::ptr_fun(MatchesIP), ipaddr)) != entries_.end()); | 987 std::bind2nd(std::ptr_fun(MatchesIP), ipaddr)) != entries_.end()); |
988 } | 988 } |
989 | 989 |
990 static bool MatchesAddress(TurnEntry* e, rtc::SocketAddress addr) { | 990 static bool MatchesAddress(TurnEntry* e, rtc::SocketAddress addr) { |
991 return e->address() == addr; | 991 return e->address() == addr; |
992 } | 992 } |
993 TurnEntry* TurnPort::FindEntry(const rtc::SocketAddress& addr) const { | 993 TurnEntry* TurnPort::FindEntry(const rtc::SocketAddress& addr) const { |
994 EntryList::const_iterator it = std::find_if(entries_.begin(), entries_.end(), | 994 EntryList::const_iterator it = std::find_if(entries_.begin(), entries_.end(), |
995 std::bind2nd(std::ptr_fun(MatchesAddress), addr)); | 995 std::bind2nd(std::ptr_fun(MatchesAddress), addr)); |
996 return (it != entries_.end()) ? *it : NULL; | 996 return (it != entries_.end()) ? *it : nullptr; |
997 } | 997 } |
998 | 998 |
999 static bool MatchesChannelId(TurnEntry* e, int id) { | 999 static bool MatchesChannelId(TurnEntry* e, int id) { |
1000 return e->channel_id() == id; | 1000 return e->channel_id() == id; |
1001 } | 1001 } |
1002 TurnEntry* TurnPort::FindEntry(int channel_id) const { | 1002 TurnEntry* TurnPort::FindEntry(int channel_id) const { |
1003 EntryList::const_iterator it = std::find_if(entries_.begin(), entries_.end(), | 1003 EntryList::const_iterator it = std::find_if(entries_.begin(), entries_.end(), |
1004 std::bind2nd(std::ptr_fun(MatchesChannelId), channel_id)); | 1004 std::bind2nd(std::ptr_fun(MatchesChannelId), channel_id)); |
1005 return (it != entries_.end()) ? *it : NULL; | 1005 return (it != entries_.end()) ? *it : nullptr; |
1006 } | 1006 } |
1007 | 1007 |
1008 bool TurnPort::EntryExists(TurnEntry* e) { | 1008 bool TurnPort::EntryExists(TurnEntry* e) { |
1009 auto it = std::find(entries_.begin(), entries_.end(), e); | 1009 auto it = std::find(entries_.begin(), entries_.end(), e); |
1010 return it != entries_.end(); | 1010 return it != entries_.end(); |
1011 } | 1011 } |
1012 | 1012 |
1013 void TurnPort::CreateOrRefreshEntry(const rtc::SocketAddress& addr) { | 1013 void TurnPort::CreateOrRefreshEntry(const rtc::SocketAddress& addr) { |
1014 TurnEntry* entry = FindEntry(addr); | 1014 TurnEntry* entry = FindEntry(addr); |
1015 if (entry == nullptr) { | 1015 if (entry == nullptr) { |
1016 entry = new TurnEntry(this, next_channel_number_++, addr); | 1016 entry = new TurnEntry(this, next_channel_number_++, addr); |
1017 entries_.push_back(entry); | 1017 entries_.push_back(entry); |
1018 } else { | 1018 } else { |
1019 // The channel binding request for the entry will be refreshed automatically | 1019 // The channel binding request for the entry will be refreshed automatically |
1020 // until the entry is destroyed. | 1020 // until the entry is destroyed. |
1021 CancelEntryDestruction(entry); | 1021 CancelEntryDestruction(entry); |
1022 } | 1022 } |
1023 } | 1023 } |
1024 | 1024 |
1025 void TurnPort::DestroyEntry(TurnEntry* entry) { | 1025 void TurnPort::DestroyEntry(TurnEntry* entry) { |
1026 RTC_DCHECK(entry != NULL); | 1026 RTC_DCHECK(entry != nullptr); |
1027 entry->SignalDestroyed(entry); | 1027 entry->SignalDestroyed(entry); |
1028 entries_.remove(entry); | 1028 entries_.remove(entry); |
1029 delete entry; | 1029 delete entry; |
1030 } | 1030 } |
1031 | 1031 |
1032 void TurnPort::DestroyEntryIfNotCancelled(TurnEntry* entry, int64_t timestamp) { | 1032 void TurnPort::DestroyEntryIfNotCancelled(TurnEntry* entry, int64_t timestamp) { |
1033 if (!EntryExists(entry)) { | 1033 if (!EntryExists(entry)) { |
1034 return; | 1034 return; |
1035 } | 1035 } |
1036 bool cancelled = timestamp != entry->destruction_timestamp(); | 1036 bool cancelled = timestamp != entry->destruction_timestamp(); |
1037 if (!cancelled) { | 1037 if (!cancelled) { |
1038 DestroyEntry(entry); | 1038 DestroyEntry(entry); |
1039 } | 1039 } |
1040 } | 1040 } |
1041 | 1041 |
1042 void TurnPort::HandleConnectionDestroyed(Connection* conn) { | 1042 void TurnPort::HandleConnectionDestroyed(Connection* conn) { |
1043 // Schedule an event to destroy TurnEntry for the connection, which is | 1043 // Schedule an event to destroy TurnEntry for the connection, which is |
1044 // already destroyed. | 1044 // already destroyed. |
1045 const rtc::SocketAddress& remote_address = conn->remote_candidate().address(); | 1045 const rtc::SocketAddress& remote_address = conn->remote_candidate().address(); |
1046 TurnEntry* entry = FindEntry(remote_address); | 1046 TurnEntry* entry = FindEntry(remote_address); |
1047 RTC_DCHECK(entry != NULL); | 1047 RTC_DCHECK(entry != nullptr); |
1048 ScheduleEntryDestruction(entry); | 1048 ScheduleEntryDestruction(entry); |
1049 } | 1049 } |
1050 | 1050 |
1051 void TurnPort::ScheduleEntryDestruction(TurnEntry* entry) { | 1051 void TurnPort::ScheduleEntryDestruction(TurnEntry* entry) { |
1052 RTC_DCHECK(entry->destruction_timestamp() == 0); | 1052 RTC_DCHECK(entry->destruction_timestamp() == 0); |
1053 int64_t timestamp = rtc::TimeMillis(); | 1053 int64_t timestamp = rtc::TimeMillis(); |
1054 entry->set_destruction_timestamp(timestamp); | 1054 entry->set_destruction_timestamp(timestamp); |
1055 invoker_.AsyncInvokeDelayed<void>( | 1055 invoker_.AsyncInvokeDelayed<void>( |
1056 RTC_FROM_HERE, thread(), | 1056 RTC_FROM_HERE, thread(), |
1057 rtc::Bind(&TurnPort::DestroyEntryIfNotCancelled, this, entry, timestamp), | 1057 rtc::Bind(&TurnPort::DestroyEntryIfNotCancelled, this, entry, timestamp), |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1364 void TurnCreatePermissionRequest::OnTimeout() { | 1364 void TurnCreatePermissionRequest::OnTimeout() { |
1365 LOG_J(LS_WARNING, port_) << "TURN create permission timeout " | 1365 LOG_J(LS_WARNING, port_) << "TURN create permission timeout " |
1366 << rtc::hex_encode(id()); | 1366 << rtc::hex_encode(id()); |
1367 if (entry_) { | 1367 if (entry_) { |
1368 entry_->OnCreatePermissionTimeout(); | 1368 entry_->OnCreatePermissionTimeout(); |
1369 } | 1369 } |
1370 } | 1370 } |
1371 | 1371 |
1372 void TurnCreatePermissionRequest::OnEntryDestroyed(TurnEntry* entry) { | 1372 void TurnCreatePermissionRequest::OnEntryDestroyed(TurnEntry* entry) { |
1373 RTC_DCHECK(entry_ == entry); | 1373 RTC_DCHECK(entry_ == entry); |
1374 entry_ = NULL; | 1374 entry_ = nullptr; |
1375 } | 1375 } |
1376 | 1376 |
1377 TurnChannelBindRequest::TurnChannelBindRequest( | 1377 TurnChannelBindRequest::TurnChannelBindRequest( |
1378 TurnPort* port, TurnEntry* entry, | 1378 TurnPort* port, TurnEntry* entry, |
1379 int channel_id, const rtc::SocketAddress& ext_addr) | 1379 int channel_id, const rtc::SocketAddress& ext_addr) |
1380 : StunRequest(new TurnMessage()), | 1380 : StunRequest(new TurnMessage()), |
1381 port_(port), | 1381 port_(port), |
1382 entry_(entry), | 1382 entry_(entry), |
1383 channel_id_(channel_id), | 1383 channel_id_(channel_id), |
1384 ext_addr_(ext_addr) { | 1384 ext_addr_(ext_addr) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1434 void TurnChannelBindRequest::OnTimeout() { | 1434 void TurnChannelBindRequest::OnTimeout() { |
1435 LOG_J(LS_WARNING, port_) << "TURN channel bind timeout " | 1435 LOG_J(LS_WARNING, port_) << "TURN channel bind timeout " |
1436 << rtc::hex_encode(id()); | 1436 << rtc::hex_encode(id()); |
1437 if (entry_) { | 1437 if (entry_) { |
1438 entry_->OnChannelBindTimeout(); | 1438 entry_->OnChannelBindTimeout(); |
1439 } | 1439 } |
1440 } | 1440 } |
1441 | 1441 |
1442 void TurnChannelBindRequest::OnEntryDestroyed(TurnEntry* entry) { | 1442 void TurnChannelBindRequest::OnEntryDestroyed(TurnEntry* entry) { |
1443 RTC_DCHECK(entry_ == entry); | 1443 RTC_DCHECK(entry_ == entry); |
1444 entry_ = NULL; | 1444 entry_ = nullptr; |
1445 } | 1445 } |
1446 | 1446 |
1447 TurnEntry::TurnEntry(TurnPort* port, int channel_id, | 1447 TurnEntry::TurnEntry(TurnPort* port, int channel_id, |
1448 const rtc::SocketAddress& ext_addr) | 1448 const rtc::SocketAddress& ext_addr) |
1449 : port_(port), | 1449 : port_(port), |
1450 channel_id_(channel_id), | 1450 channel_id_(channel_id), |
1451 ext_addr_(ext_addr), | 1451 ext_addr_(ext_addr), |
1452 state_(STATE_UNBOUND) { | 1452 state_(STATE_UNBOUND) { |
1453 // Creating permission for |ext_addr_|. | 1453 // Creating permission for |ext_addr_|. |
1454 SendCreatePermissionRequest(0); | 1454 SendCreatePermissionRequest(0); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1552 } else { | 1552 } else { |
1553 state_ = STATE_UNBOUND; | 1553 state_ = STATE_UNBOUND; |
1554 port_->FailAndPruneConnection(ext_addr_); | 1554 port_->FailAndPruneConnection(ext_addr_); |
1555 } | 1555 } |
1556 } | 1556 } |
1557 void TurnEntry::OnChannelBindTimeout() { | 1557 void TurnEntry::OnChannelBindTimeout() { |
1558 state_ = STATE_UNBOUND; | 1558 state_ = STATE_UNBOUND; |
1559 port_->FailAndPruneConnection(ext_addr_); | 1559 port_->FailAndPruneConnection(ext_addr_); |
1560 } | 1560 } |
1561 } // namespace cricket | 1561 } // namespace cricket |
OLD | NEW |