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 |
11 #include "webrtc/p2p/base/turnport.h" | 11 #include "webrtc/p2p/base/turnport.h" |
12 | 12 |
13 #include <functional> | 13 #include <functional> |
14 | 14 |
15 #include "webrtc/p2p/base/common.h" | 15 #include "webrtc/p2p/base/common.h" |
16 #include "webrtc/p2p/base/stun.h" | 16 #include "webrtc/p2p/base/stun.h" |
17 #include "webrtc/base/asyncpacketsocket.h" | 17 #include "webrtc/base/asyncpacketsocket.h" |
18 #include "webrtc/base/byteorder.h" | 18 #include "webrtc/base/byteorder.h" |
| 19 #include "webrtc/base/checks.h" |
19 #include "webrtc/base/common.h" | 20 #include "webrtc/base/common.h" |
20 #include "webrtc/base/logging.h" | 21 #include "webrtc/base/logging.h" |
21 #include "webrtc/base/nethelpers.h" | 22 #include "webrtc/base/nethelpers.h" |
22 #include "webrtc/base/socketaddress.h" | 23 #include "webrtc/base/socketaddress.h" |
23 #include "webrtc/base/stringencode.h" | 24 #include "webrtc/base/stringencode.h" |
24 | 25 |
25 namespace cricket { | 26 namespace cricket { |
26 | 27 |
27 // TODO(juberti): Move to stun.h when relay messages have been renamed. | 28 // TODO(juberti): Move to stun.h when relay messages have been renamed. |
28 static const int TURN_ALLOCATE_REQUEST = STUN_ALLOCATE_REQUEST; | 29 static const int TURN_ALLOCATE_REQUEST = STUN_ALLOCATE_REQUEST; |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 } | 311 } |
311 if (server_address_.proto == PROTO_UDP) { | 312 if (server_address_.proto == PROTO_UDP) { |
312 // If its UDP, send AllocateRequest now. | 313 // If its UDP, send AllocateRequest now. |
313 // For TCP and TLS AllcateRequest will be sent by OnSocketConnect. | 314 // For TCP and TLS AllcateRequest will be sent by OnSocketConnect. |
314 SendRequest(new TurnAllocateRequest(this), 0); | 315 SendRequest(new TurnAllocateRequest(this), 0); |
315 } | 316 } |
316 } | 317 } |
317 } | 318 } |
318 | 319 |
319 bool TurnPort::CreateTurnClientSocket() { | 320 bool TurnPort::CreateTurnClientSocket() { |
320 ASSERT(!socket_ || SharedSocket()); | 321 RTC_DCHECK(!socket_ || SharedSocket()); |
321 | 322 |
322 if (server_address_.proto == PROTO_UDP && !SharedSocket()) { | 323 if (server_address_.proto == PROTO_UDP && !SharedSocket()) { |
323 socket_ = socket_factory()->CreateUdpSocket( | 324 socket_ = socket_factory()->CreateUdpSocket( |
324 rtc::SocketAddress(ip(), 0), min_port(), max_port()); | 325 rtc::SocketAddress(ip(), 0), min_port(), max_port()); |
325 } else if (server_address_.proto == PROTO_TCP || | 326 } else if (server_address_.proto == PROTO_TCP || |
326 server_address_.proto == PROTO_TLS) { | 327 server_address_.proto == PROTO_TLS) { |
327 ASSERT(!SharedSocket()); | 328 RTC_DCHECK(!SharedSocket()); |
328 int opts = rtc::PacketSocketFactory::OPT_STUN; | 329 int opts = rtc::PacketSocketFactory::OPT_STUN; |
329 | 330 |
330 // Apply server address TLS and insecure bits to options. | 331 // Apply server address TLS and insecure bits to options. |
331 if (server_address_.proto == PROTO_TLS) { | 332 if (server_address_.proto == PROTO_TLS) { |
332 if (tls_cert_policy_ == | 333 if (tls_cert_policy_ == |
333 TlsCertPolicy::TLS_CERT_POLICY_INSECURE_NO_CHECK) { | 334 TlsCertPolicy::TLS_CERT_POLICY_INSECURE_NO_CHECK) { |
334 opts |= rtc::PacketSocketFactory::OPT_TLS_INSECURE; | 335 opts |= rtc::PacketSocketFactory::OPT_TLS_INSECURE; |
335 } else { | 336 } else { |
336 opts |= rtc::PacketSocketFactory::OPT_TLS; | 337 opts |= rtc::PacketSocketFactory::OPT_TLS; |
337 } | 338 } |
(...skipping 30 matching lines...) Expand all Loading... |
368 server_address_.proto == PROTO_TLS) { | 369 server_address_.proto == PROTO_TLS) { |
369 socket_->SignalConnect.connect(this, &TurnPort::OnSocketConnect); | 370 socket_->SignalConnect.connect(this, &TurnPort::OnSocketConnect); |
370 socket_->SignalClose.connect(this, &TurnPort::OnSocketClose); | 371 socket_->SignalClose.connect(this, &TurnPort::OnSocketClose); |
371 } else { | 372 } else { |
372 state_ = STATE_CONNECTED; | 373 state_ = STATE_CONNECTED; |
373 } | 374 } |
374 return true; | 375 return true; |
375 } | 376 } |
376 | 377 |
377 void TurnPort::OnSocketConnect(rtc::AsyncPacketSocket* socket) { | 378 void TurnPort::OnSocketConnect(rtc::AsyncPacketSocket* socket) { |
378 ASSERT(server_address_.proto == PROTO_TCP); | 379 RTC_DCHECK(server_address_.proto == PROTO_TCP); |
379 // Do not use this port if the socket bound to a different address than | 380 // Do not use this port if the socket bound to a different address than |
380 // the one we asked for. This is seen in Chrome, where TCP sockets cannot be | 381 // the one we asked for. This is seen in Chrome, where TCP sockets cannot be |
381 // given a binding address, and the platform is expected to pick the | 382 // given a binding address, and the platform is expected to pick the |
382 // correct local address. | 383 // correct local address. |
383 | 384 |
384 // However, there are two situations in which we allow the bound address to | 385 // However, there are two situations in which we allow the bound address to |
385 // differ from the requested address: 1. The bound address is the loopback | 386 // differ from the requested address: 1. The bound address is the loopback |
386 // address. This happens when a proxy forces TCP to bind to only the | 387 // address. This happens when a proxy forces TCP to bind to only the |
387 // localhost address (see issue 3927). 2. The bound address is the "any | 388 // localhost address (see issue 3927). 2. The bound address is the "any |
388 // address". This happens when multiple_routes is disabled (see issue 4780). | 389 // address". This happens when multiple_routes is disabled (see issue 4780). |
(...skipping 24 matching lines...) Expand all Loading... |
413 server_address_.address = socket_->GetRemoteAddress(); | 414 server_address_.address = socket_->GetRemoteAddress(); |
414 } | 415 } |
415 | 416 |
416 LOG(LS_INFO) << "TurnPort connected to " << socket->GetRemoteAddress() | 417 LOG(LS_INFO) << "TurnPort connected to " << socket->GetRemoteAddress() |
417 << " using tcp."; | 418 << " using tcp."; |
418 SendRequest(new TurnAllocateRequest(this), 0); | 419 SendRequest(new TurnAllocateRequest(this), 0); |
419 } | 420 } |
420 | 421 |
421 void TurnPort::OnSocketClose(rtc::AsyncPacketSocket* socket, int error) { | 422 void TurnPort::OnSocketClose(rtc::AsyncPacketSocket* socket, int error) { |
422 LOG_J(LS_WARNING, this) << "Connection with server failed, error=" << error; | 423 LOG_J(LS_WARNING, this) << "Connection with server failed, error=" << error; |
423 ASSERT(socket == socket_); | 424 RTC_DCHECK(socket == socket_); |
424 Close(); | 425 Close(); |
425 } | 426 } |
426 | 427 |
427 void TurnPort::OnAllocateMismatch() { | 428 void TurnPort::OnAllocateMismatch() { |
428 if (allocate_mismatch_retries_ >= MAX_ALLOCATE_MISMATCH_RETRIES) { | 429 if (allocate_mismatch_retries_ >= MAX_ALLOCATE_MISMATCH_RETRIES) { |
429 LOG_J(LS_WARNING, this) << "Giving up on the port after " | 430 LOG_J(LS_WARNING, this) << "Giving up on the port after " |
430 << allocate_mismatch_retries_ | 431 << allocate_mismatch_retries_ |
431 << " retries for STUN_ERROR_ALLOCATION_MISMATCH"; | 432 << " retries for STUN_ERROR_ALLOCATION_MISMATCH"; |
432 OnAllocateError(); | 433 OnAllocateError(); |
433 return; | 434 return; |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 return; | 674 return; |
674 | 675 |
675 LOG_J(LS_INFO, this) << "Starting TURN host lookup for " | 676 LOG_J(LS_INFO, this) << "Starting TURN host lookup for " |
676 << address.ToSensitiveString(); | 677 << address.ToSensitiveString(); |
677 resolver_ = socket_factory()->CreateAsyncResolver(); | 678 resolver_ = socket_factory()->CreateAsyncResolver(); |
678 resolver_->SignalDone.connect(this, &TurnPort::OnResolveResult); | 679 resolver_->SignalDone.connect(this, &TurnPort::OnResolveResult); |
679 resolver_->Start(address); | 680 resolver_->Start(address); |
680 } | 681 } |
681 | 682 |
682 void TurnPort::OnResolveResult(rtc::AsyncResolverInterface* resolver) { | 683 void TurnPort::OnResolveResult(rtc::AsyncResolverInterface* resolver) { |
683 ASSERT(resolver == resolver_); | 684 RTC_DCHECK(resolver == resolver_); |
684 // If DNS resolve is failed when trying to connect to the server using TCP, | 685 // If DNS resolve is failed when trying to connect to the server using TCP, |
685 // one of the reason could be due to DNS queries blocked by firewall. | 686 // one of the reason could be due to DNS queries blocked by firewall. |
686 // In such cases we will try to connect to the server with hostname, assuming | 687 // In such cases we will try to connect to the server with hostname, assuming |
687 // socket layer will resolve the hostname through a HTTP proxy (if any). | 688 // socket layer will resolve the hostname through a HTTP proxy (if any). |
688 if (resolver_->GetError() != 0 && server_address_.proto == PROTO_TCP) { | 689 if (resolver_->GetError() != 0 && server_address_.proto == PROTO_TCP) { |
689 if (!CreateTurnClientSocket()) { | 690 if (!CreateTurnClientSocket()) { |
690 OnAllocateError(); | 691 OnAllocateError(); |
691 } | 692 } |
692 return; | 693 return; |
693 } | 694 } |
(...skipping 12 matching lines...) Expand all Loading... |
706 // Signal needs both resolved and unresolved address. After signal is sent | 707 // Signal needs both resolved and unresolved address. After signal is sent |
707 // we can copy resolved address back into |server_address_|. | 708 // we can copy resolved address back into |server_address_|. |
708 SignalResolvedServerAddress(this, server_address_.address, | 709 SignalResolvedServerAddress(this, server_address_.address, |
709 resolved_address); | 710 resolved_address); |
710 server_address_.address = resolved_address; | 711 server_address_.address = resolved_address; |
711 PrepareAddress(); | 712 PrepareAddress(); |
712 } | 713 } |
713 | 714 |
714 void TurnPort::OnSendStunPacket(const void* data, size_t size, | 715 void TurnPort::OnSendStunPacket(const void* data, size_t size, |
715 StunRequest* request) { | 716 StunRequest* request) { |
716 ASSERT(connected()); | 717 RTC_DCHECK(connected()); |
717 rtc::PacketOptions options(DefaultDscpValue()); | 718 rtc::PacketOptions options(DefaultDscpValue()); |
718 if (Send(data, size, options) < 0) { | 719 if (Send(data, size, options) < 0) { |
719 LOG_J(LS_ERROR, this) << "Failed to send TURN message, err=" | 720 LOG_J(LS_ERROR, this) << "Failed to send TURN message, err=" |
720 << socket_->GetError(); | 721 << socket_->GetError(); |
721 } | 722 } |
722 } | 723 } |
723 | 724 |
724 void TurnPort::OnStunAddress(const rtc::SocketAddress& address) { | 725 void TurnPort::OnStunAddress(const rtc::SocketAddress& address) { |
725 // STUN Port will discover STUN candidate, as it's supplied with first TURN | 726 // STUN Port will discover STUN candidate, as it's supplied with first TURN |
726 // server address. | 727 // server address. |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 break; | 798 break; |
798 case MSG_TRY_ALTERNATE_SERVER: | 799 case MSG_TRY_ALTERNATE_SERVER: |
799 if (server_address().proto == PROTO_UDP) { | 800 if (server_address().proto == PROTO_UDP) { |
800 // Send another allocate request to alternate server, with the received | 801 // Send another allocate request to alternate server, with the received |
801 // realm and nonce values. | 802 // realm and nonce values. |
802 SendRequest(new TurnAllocateRequest(this), 0); | 803 SendRequest(new TurnAllocateRequest(this), 0); |
803 } else { | 804 } else { |
804 // Since it's TCP, we have to delete the connected socket and reconnect | 805 // Since it's TCP, we have to delete the connected socket and reconnect |
805 // with the alternate server. PrepareAddress will send stun binding once | 806 // with the alternate server. PrepareAddress will send stun binding once |
806 // the new socket is connected. | 807 // the new socket is connected. |
807 ASSERT(server_address().proto == PROTO_TCP); | 808 RTC_DCHECK(server_address().proto == PROTO_TCP); |
808 ASSERT(!SharedSocket()); | 809 RTC_DCHECK(!SharedSocket()); |
809 delete socket_; | 810 delete socket_; |
810 socket_ = NULL; | 811 socket_ = NULL; |
811 PrepareAddress(); | 812 PrepareAddress(); |
812 } | 813 } |
813 break; | 814 break; |
814 default: | 815 default: |
815 Port::OnMessage(message); | 816 Port::OnMessage(message); |
816 } | 817 } |
817 } | 818 } |
818 | 819 |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 entry = new TurnEntry(this, next_channel_number_++, addr); | 1015 entry = new TurnEntry(this, next_channel_number_++, addr); |
1015 entries_.push_back(entry); | 1016 entries_.push_back(entry); |
1016 } else { | 1017 } else { |
1017 // The channel binding request for the entry will be refreshed automatically | 1018 // The channel binding request for the entry will be refreshed automatically |
1018 // until the entry is destroyed. | 1019 // until the entry is destroyed. |
1019 CancelEntryDestruction(entry); | 1020 CancelEntryDestruction(entry); |
1020 } | 1021 } |
1021 } | 1022 } |
1022 | 1023 |
1023 void TurnPort::DestroyEntry(TurnEntry* entry) { | 1024 void TurnPort::DestroyEntry(TurnEntry* entry) { |
1024 ASSERT(entry != NULL); | 1025 RTC_DCHECK(entry != NULL); |
1025 entry->SignalDestroyed(entry); | 1026 entry->SignalDestroyed(entry); |
1026 entries_.remove(entry); | 1027 entries_.remove(entry); |
1027 delete entry; | 1028 delete entry; |
1028 } | 1029 } |
1029 | 1030 |
1030 void TurnPort::DestroyEntryIfNotCancelled(TurnEntry* entry, int64_t timestamp) { | 1031 void TurnPort::DestroyEntryIfNotCancelled(TurnEntry* entry, int64_t timestamp) { |
1031 if (!EntryExists(entry)) { | 1032 if (!EntryExists(entry)) { |
1032 return; | 1033 return; |
1033 } | 1034 } |
1034 bool cancelled = timestamp != entry->destruction_timestamp(); | 1035 bool cancelled = timestamp != entry->destruction_timestamp(); |
1035 if (!cancelled) { | 1036 if (!cancelled) { |
1036 DestroyEntry(entry); | 1037 DestroyEntry(entry); |
1037 } | 1038 } |
1038 } | 1039 } |
1039 | 1040 |
1040 void TurnPort::HandleConnectionDestroyed(Connection* conn) { | 1041 void TurnPort::HandleConnectionDestroyed(Connection* conn) { |
1041 // Schedule an event to destroy TurnEntry for the connection, which is | 1042 // Schedule an event to destroy TurnEntry for the connection, which is |
1042 // already destroyed. | 1043 // already destroyed. |
1043 const rtc::SocketAddress& remote_address = conn->remote_candidate().address(); | 1044 const rtc::SocketAddress& remote_address = conn->remote_candidate().address(); |
1044 TurnEntry* entry = FindEntry(remote_address); | 1045 TurnEntry* entry = FindEntry(remote_address); |
1045 ASSERT(entry != NULL); | 1046 RTC_DCHECK(entry != NULL); |
1046 ScheduleEntryDestruction(entry); | 1047 ScheduleEntryDestruction(entry); |
1047 } | 1048 } |
1048 | 1049 |
1049 void TurnPort::ScheduleEntryDestruction(TurnEntry* entry) { | 1050 void TurnPort::ScheduleEntryDestruction(TurnEntry* entry) { |
1050 ASSERT(entry->destruction_timestamp() == 0); | 1051 RTC_DCHECK(entry->destruction_timestamp() == 0); |
1051 int64_t timestamp = rtc::TimeMillis(); | 1052 int64_t timestamp = rtc::TimeMillis(); |
1052 entry->set_destruction_timestamp(timestamp); | 1053 entry->set_destruction_timestamp(timestamp); |
1053 invoker_.AsyncInvokeDelayed<void>( | 1054 invoker_.AsyncInvokeDelayed<void>( |
1054 RTC_FROM_HERE, thread(), | 1055 RTC_FROM_HERE, thread(), |
1055 rtc::Bind(&TurnPort::DestroyEntryIfNotCancelled, this, entry, timestamp), | 1056 rtc::Bind(&TurnPort::DestroyEntryIfNotCancelled, this, entry, timestamp), |
1056 TURN_PERMISSION_TIMEOUT); | 1057 TURN_PERMISSION_TIMEOUT); |
1057 } | 1058 } |
1058 | 1059 |
1059 void TurnPort::CancelEntryDestruction(TurnEntry* entry) { | 1060 void TurnPort::CancelEntryDestruction(TurnEntry* entry) { |
1060 ASSERT(entry->destruction_timestamp() != 0); | 1061 RTC_DCHECK(entry->destruction_timestamp() != 0); |
1061 entry->set_destruction_timestamp(0); | 1062 entry->set_destruction_timestamp(0); |
1062 } | 1063 } |
1063 | 1064 |
1064 bool TurnPort::SetEntryChannelId(const rtc::SocketAddress& address, | 1065 bool TurnPort::SetEntryChannelId(const rtc::SocketAddress& address, |
1065 int channel_id) { | 1066 int channel_id) { |
1066 TurnEntry* entry = FindEntry(address); | 1067 TurnEntry* entry = FindEntry(address); |
1067 if (!entry) { | 1068 if (!entry) { |
1068 return false; | 1069 return false; |
1069 } | 1070 } |
1070 entry->set_channel_id(channel_id); | 1071 entry->set_channel_id(channel_id); |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1361 | 1362 |
1362 void TurnCreatePermissionRequest::OnTimeout() { | 1363 void TurnCreatePermissionRequest::OnTimeout() { |
1363 LOG_J(LS_WARNING, port_) << "TURN create permission timeout " | 1364 LOG_J(LS_WARNING, port_) << "TURN create permission timeout " |
1364 << rtc::hex_encode(id()); | 1365 << rtc::hex_encode(id()); |
1365 if (entry_) { | 1366 if (entry_) { |
1366 entry_->OnCreatePermissionTimeout(); | 1367 entry_->OnCreatePermissionTimeout(); |
1367 } | 1368 } |
1368 } | 1369 } |
1369 | 1370 |
1370 void TurnCreatePermissionRequest::OnEntryDestroyed(TurnEntry* entry) { | 1371 void TurnCreatePermissionRequest::OnEntryDestroyed(TurnEntry* entry) { |
1371 ASSERT(entry_ == entry); | 1372 RTC_DCHECK(entry_ == entry); |
1372 entry_ = NULL; | 1373 entry_ = NULL; |
1373 } | 1374 } |
1374 | 1375 |
1375 TurnChannelBindRequest::TurnChannelBindRequest( | 1376 TurnChannelBindRequest::TurnChannelBindRequest( |
1376 TurnPort* port, TurnEntry* entry, | 1377 TurnPort* port, TurnEntry* entry, |
1377 int channel_id, const rtc::SocketAddress& ext_addr) | 1378 int channel_id, const rtc::SocketAddress& ext_addr) |
1378 : StunRequest(new TurnMessage()), | 1379 : StunRequest(new TurnMessage()), |
1379 port_(port), | 1380 port_(port), |
1380 entry_(entry), | 1381 entry_(entry), |
1381 channel_id_(channel_id), | 1382 channel_id_(channel_id), |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1431 | 1432 |
1432 void TurnChannelBindRequest::OnTimeout() { | 1433 void TurnChannelBindRequest::OnTimeout() { |
1433 LOG_J(LS_WARNING, port_) << "TURN channel bind timeout " | 1434 LOG_J(LS_WARNING, port_) << "TURN channel bind timeout " |
1434 << rtc::hex_encode(id()); | 1435 << rtc::hex_encode(id()); |
1435 if (entry_) { | 1436 if (entry_) { |
1436 entry_->OnChannelBindTimeout(); | 1437 entry_->OnChannelBindTimeout(); |
1437 } | 1438 } |
1438 } | 1439 } |
1439 | 1440 |
1440 void TurnChannelBindRequest::OnEntryDestroyed(TurnEntry* entry) { | 1441 void TurnChannelBindRequest::OnEntryDestroyed(TurnEntry* entry) { |
1441 ASSERT(entry_ == entry); | 1442 RTC_DCHECK(entry_ == entry); |
1442 entry_ = NULL; | 1443 entry_ = NULL; |
1443 } | 1444 } |
1444 | 1445 |
1445 TurnEntry::TurnEntry(TurnPort* port, int channel_id, | 1446 TurnEntry::TurnEntry(TurnPort* port, int channel_id, |
1446 const rtc::SocketAddress& ext_addr) | 1447 const rtc::SocketAddress& ext_addr) |
1447 : port_(port), | 1448 : port_(port), |
1448 channel_id_(channel_id), | 1449 channel_id_(channel_id), |
1449 ext_addr_(ext_addr), | 1450 ext_addr_(ext_addr), |
1450 state_(STATE_UNBOUND) { | 1451 state_(STATE_UNBOUND) { |
1451 // Creating permission for |ext_addr_|. | 1452 // Creating permission for |ext_addr_|. |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1526 } | 1527 } |
1527 } | 1528 } |
1528 | 1529 |
1529 void TurnEntry::OnCreatePermissionTimeout() { | 1530 void TurnEntry::OnCreatePermissionTimeout() { |
1530 port_->FailAndPruneConnection(ext_addr_); | 1531 port_->FailAndPruneConnection(ext_addr_); |
1531 } | 1532 } |
1532 | 1533 |
1533 void TurnEntry::OnChannelBindSuccess() { | 1534 void TurnEntry::OnChannelBindSuccess() { |
1534 LOG_J(LS_INFO, port_) << "Channel bind for " << ext_addr_.ToSensitiveString() | 1535 LOG_J(LS_INFO, port_) << "Channel bind for " << ext_addr_.ToSensitiveString() |
1535 << " succeeded"; | 1536 << " succeeded"; |
1536 ASSERT(state_ == STATE_BINDING || state_ == STATE_BOUND); | 1537 RTC_DCHECK(state_ == STATE_BINDING || state_ == STATE_BOUND); |
1537 state_ = STATE_BOUND; | 1538 state_ = STATE_BOUND; |
1538 } | 1539 } |
1539 | 1540 |
1540 void TurnEntry::OnChannelBindError(StunMessage* response, int code) { | 1541 void TurnEntry::OnChannelBindError(StunMessage* response, int code) { |
1541 // If the channel bind fails due to errors other than STATE_NONCE, | 1542 // If the channel bind fails due to errors other than STATE_NONCE, |
1542 // we will fail and prune the connection and rely on ICE restart to | 1543 // we will fail and prune the connection and rely on ICE restart to |
1543 // re-establish a new connection if needed. | 1544 // re-establish a new connection if needed. |
1544 if (code == STUN_ERROR_STALE_NONCE) { | 1545 if (code == STUN_ERROR_STALE_NONCE) { |
1545 if (port_->UpdateNonce(response)) { | 1546 if (port_->UpdateNonce(response)) { |
1546 // Send channel bind request with fresh nonce. | 1547 // Send channel bind request with fresh nonce. |
1547 SendChannelBindRequest(0); | 1548 SendChannelBindRequest(0); |
1548 } | 1549 } |
1549 } else { | 1550 } else { |
1550 state_ = STATE_UNBOUND; | 1551 state_ = STATE_UNBOUND; |
1551 port_->FailAndPruneConnection(ext_addr_); | 1552 port_->FailAndPruneConnection(ext_addr_); |
1552 } | 1553 } |
1553 } | 1554 } |
1554 void TurnEntry::OnChannelBindTimeout() { | 1555 void TurnEntry::OnChannelBindTimeout() { |
1555 state_ = STATE_UNBOUND; | 1556 state_ = STATE_UNBOUND; |
1556 port_->FailAndPruneConnection(ext_addr_); | 1557 port_->FailAndPruneConnection(ext_addr_); |
1557 } | 1558 } |
1558 } // namespace cricket | 1559 } // namespace cricket |
OLD | NEW |