| 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 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 max_port_(max_port), | 177 max_port_(max_port), |
| 178 component_(ICE_CANDIDATE_COMPONENT_DEFAULT), | 178 component_(ICE_CANDIDATE_COMPONENT_DEFAULT), |
| 179 generation_(0), | 179 generation_(0), |
| 180 ice_username_fragment_(username_fragment), | 180 ice_username_fragment_(username_fragment), |
| 181 password_(password), | 181 password_(password), |
| 182 timeout_delay_(kPortTimeoutDelay), | 182 timeout_delay_(kPortTimeoutDelay), |
| 183 enable_port_packets_(false), | 183 enable_port_packets_(false), |
| 184 ice_role_(ICEROLE_UNKNOWN), | 184 ice_role_(ICEROLE_UNKNOWN), |
| 185 tiebreaker_(0), | 185 tiebreaker_(0), |
| 186 shared_socket_(false) { | 186 shared_socket_(false) { |
| 187 ASSERT(factory_ != NULL); | 187 RTC_DCHECK(factory_ != NULL); |
| 188 Construct(); | 188 Construct(); |
| 189 } | 189 } |
| 190 | 190 |
| 191 void Port::Construct() { | 191 void Port::Construct() { |
| 192 // TODO(pthatcher): Remove this old behavior once we're sure no one | 192 // TODO(pthatcher): Remove this old behavior once we're sure no one |
| 193 // relies on it. If the username_fragment and password are empty, | 193 // relies on it. If the username_fragment and password are empty, |
| 194 // we should just create one. | 194 // we should just create one. |
| 195 if (ice_username_fragment_.empty()) { | 195 if (ice_username_fragment_.empty()) { |
| 196 ASSERT(password_.empty()); | 196 RTC_DCHECK(password_.empty()); |
| 197 ice_username_fragment_ = rtc::CreateRandomString(ICE_UFRAG_LENGTH); | 197 ice_username_fragment_ = rtc::CreateRandomString(ICE_UFRAG_LENGTH); |
| 198 password_ = rtc::CreateRandomString(ICE_PWD_LENGTH); | 198 password_ = rtc::CreateRandomString(ICE_PWD_LENGTH); |
| 199 } | 199 } |
| 200 network_->SignalTypeChanged.connect(this, &Port::OnNetworkTypeChanged); | 200 network_->SignalTypeChanged.connect(this, &Port::OnNetworkTypeChanged); |
| 201 network_cost_ = network_->GetCost(); | 201 network_cost_ = network_->GetCost(); |
| 202 | 202 |
| 203 thread_->PostDelayed(RTC_FROM_HERE, timeout_delay_, this, | 203 thread_->PostDelayed(RTC_FROM_HERE, timeout_delay_, this, |
| 204 MSG_DESTROY_IF_DEAD); | 204 MSG_DESTROY_IF_DEAD); |
| 205 LOG_J(LS_INFO, this) << "Port created with network cost " << network_cost_; | 205 LOG_J(LS_INFO, this) << "Port created with network cost " << network_cost_; |
| 206 } | 206 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 const rtc::SocketAddress& base_address, | 246 const rtc::SocketAddress& base_address, |
| 247 const rtc::SocketAddress& related_address, | 247 const rtc::SocketAddress& related_address, |
| 248 const std::string& protocol, | 248 const std::string& protocol, |
| 249 const std::string& relay_protocol, | 249 const std::string& relay_protocol, |
| 250 const std::string& tcptype, | 250 const std::string& tcptype, |
| 251 const std::string& type, | 251 const std::string& type, |
| 252 uint32_t type_preference, | 252 uint32_t type_preference, |
| 253 uint32_t relay_preference, | 253 uint32_t relay_preference, |
| 254 bool final) { | 254 bool final) { |
| 255 if (protocol == TCP_PROTOCOL_NAME && type == LOCAL_PORT_TYPE) { | 255 if (protocol == TCP_PROTOCOL_NAME && type == LOCAL_PORT_TYPE) { |
| 256 ASSERT(!tcptype.empty()); | 256 RTC_DCHECK(!tcptype.empty()); |
| 257 } | 257 } |
| 258 | 258 |
| 259 std::string foundation = | 259 std::string foundation = |
| 260 ComputeFoundation(type, protocol, relay_protocol, base_address); | 260 ComputeFoundation(type, protocol, relay_protocol, base_address); |
| 261 Candidate c(component_, protocol, address, 0U, username_fragment(), password_, | 261 Candidate c(component_, protocol, address, 0U, username_fragment(), password_, |
| 262 type, generation_, foundation, network_->id(), network_cost_); | 262 type, generation_, foundation, network_->id(), network_cost_); |
| 263 c.set_priority( | 263 c.set_priority( |
| 264 c.GetPriority(type_preference, network_->preference(), relay_preference)); | 264 c.GetPriority(type_preference, network_->preference(), relay_preference)); |
| 265 c.set_relay_protocol(relay_protocol); | 265 c.set_relay_protocol(relay_protocol); |
| 266 c.set_tcptype(tcptype); | 266 c.set_tcptype(tcptype); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 } | 348 } |
| 349 | 349 |
| 350 bool Port::GetStunMessage(const char* data, | 350 bool Port::GetStunMessage(const char* data, |
| 351 size_t size, | 351 size_t size, |
| 352 const rtc::SocketAddress& addr, | 352 const rtc::SocketAddress& addr, |
| 353 std::unique_ptr<IceMessage>* out_msg, | 353 std::unique_ptr<IceMessage>* out_msg, |
| 354 std::string* out_username) { | 354 std::string* out_username) { |
| 355 // NOTE: This could clearly be optimized to avoid allocating any memory. | 355 // NOTE: This could clearly be optimized to avoid allocating any memory. |
| 356 // However, at the data rates we'll be looking at on the client side, | 356 // However, at the data rates we'll be looking at on the client side, |
| 357 // this probably isn't worth worrying about. | 357 // this probably isn't worth worrying about. |
| 358 ASSERT(out_msg != NULL); | 358 RTC_DCHECK(out_msg != NULL); |
| 359 ASSERT(out_username != NULL); | 359 RTC_DCHECK(out_username != NULL); |
| 360 out_username->clear(); | 360 out_username->clear(); |
| 361 | 361 |
| 362 // Don't bother parsing the packet if we can tell it's not STUN. | 362 // Don't bother parsing the packet if we can tell it's not STUN. |
| 363 // In ICE mode, all STUN packets will have a valid fingerprint. | 363 // In ICE mode, all STUN packets will have a valid fingerprint. |
| 364 if (!StunMessage::ValidateFingerprint(data, size)) { | 364 if (!StunMessage::ValidateFingerprint(data, size)) { |
| 365 return false; | 365 return false; |
| 366 } | 366 } |
| 367 | 367 |
| 368 // Parse the request message. If the packet is not a complete and correct | 368 // Parse the request message. If the packet is not a complete and correct |
| 369 // STUN message, then ignore it. | 369 // STUN message, then ignore it. |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 void Port::CreateStunUsername(const std::string& remote_username, | 547 void Port::CreateStunUsername(const std::string& remote_username, |
| 548 std::string* stun_username_attr_str) const { | 548 std::string* stun_username_attr_str) const { |
| 549 stun_username_attr_str->clear(); | 549 stun_username_attr_str->clear(); |
| 550 *stun_username_attr_str = remote_username; | 550 *stun_username_attr_str = remote_username; |
| 551 stun_username_attr_str->append(":"); | 551 stun_username_attr_str->append(":"); |
| 552 stun_username_attr_str->append(username_fragment()); | 552 stun_username_attr_str->append(username_fragment()); |
| 553 } | 553 } |
| 554 | 554 |
| 555 void Port::SendBindingResponse(StunMessage* request, | 555 void Port::SendBindingResponse(StunMessage* request, |
| 556 const rtc::SocketAddress& addr) { | 556 const rtc::SocketAddress& addr) { |
| 557 ASSERT(request->type() == STUN_BINDING_REQUEST); | 557 RTC_DCHECK(request->type() == STUN_BINDING_REQUEST); |
| 558 | 558 |
| 559 // Retrieve the username from the request. | 559 // Retrieve the username from the request. |
| 560 const StunByteStringAttribute* username_attr = | 560 const StunByteStringAttribute* username_attr = |
| 561 request->GetByteString(STUN_ATTR_USERNAME); | 561 request->GetByteString(STUN_ATTR_USERNAME); |
| 562 ASSERT(username_attr != NULL); | 562 RTC_DCHECK(username_attr != NULL); |
| 563 if (username_attr == NULL) { | 563 if (username_attr == NULL) { |
| 564 // No valid username, skip the response. | 564 // No valid username, skip the response. |
| 565 return; | 565 return; |
| 566 } | 566 } |
| 567 | 567 |
| 568 // Fill in the response message. | 568 // Fill in the response message. |
| 569 StunMessage response; | 569 StunMessage response; |
| 570 response.SetType(STUN_BINDING_RESPONSE); | 570 response.SetType(STUN_BINDING_RESPONSE); |
| 571 response.SetTransactionID(request->transaction_id()); | 571 response.SetTransactionID(request->transaction_id()); |
| 572 const StunUInt32Attribute* retransmit_attr = | 572 const StunUInt32Attribute* retransmit_attr = |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 611 << ", to=" << addr.ToSensitiveString() | 611 << ", to=" << addr.ToSensitiveString() |
| 612 << ", id=" << rtc::hex_encode(response.transaction_id()); | 612 << ", id=" << rtc::hex_encode(response.transaction_id()); |
| 613 | 613 |
| 614 conn->stats_.sent_ping_responses++; | 614 conn->stats_.sent_ping_responses++; |
| 615 } | 615 } |
| 616 } | 616 } |
| 617 | 617 |
| 618 void Port::SendBindingErrorResponse(StunMessage* request, | 618 void Port::SendBindingErrorResponse(StunMessage* request, |
| 619 const rtc::SocketAddress& addr, | 619 const rtc::SocketAddress& addr, |
| 620 int error_code, const std::string& reason) { | 620 int error_code, const std::string& reason) { |
| 621 ASSERT(request->type() == STUN_BINDING_REQUEST); | 621 RTC_DCHECK(request->type() == STUN_BINDING_REQUEST); |
| 622 | 622 |
| 623 // Fill in the response message. | 623 // Fill in the response message. |
| 624 StunMessage response; | 624 StunMessage response; |
| 625 response.SetType(STUN_BINDING_ERROR_RESPONSE); | 625 response.SetType(STUN_BINDING_ERROR_RESPONSE); |
| 626 response.SetTransactionID(request->transaction_id()); | 626 response.SetTransactionID(request->transaction_id()); |
| 627 | 627 |
| 628 // When doing GICE, we need to write out the error code incorrectly to | 628 // When doing GICE, we need to write out the error code incorrectly to |
| 629 // maintain backwards compatiblility. | 629 // maintain backwards compatiblility. |
| 630 StunErrorCodeAttribute* error_attr = StunAttribute::CreateErrorCode(); | 630 StunErrorCodeAttribute* error_attr = StunAttribute::CreateErrorCode(); |
| 631 error_attr->SetCode(error_code); | 631 error_attr->SetCode(error_code); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 654 state_ = State::KEEP_ALIVE_UNTIL_PRUNED; | 654 state_ = State::KEEP_ALIVE_UNTIL_PRUNED; |
| 655 } | 655 } |
| 656 } | 656 } |
| 657 | 657 |
| 658 void Port::Prune() { | 658 void Port::Prune() { |
| 659 state_ = State::PRUNED; | 659 state_ = State::PRUNED; |
| 660 thread_->Post(RTC_FROM_HERE, this, MSG_DESTROY_IF_DEAD); | 660 thread_->Post(RTC_FROM_HERE, this, MSG_DESTROY_IF_DEAD); |
| 661 } | 661 } |
| 662 | 662 |
| 663 void Port::OnMessage(rtc::Message *pmsg) { | 663 void Port::OnMessage(rtc::Message *pmsg) { |
| 664 ASSERT(pmsg->message_id == MSG_DESTROY_IF_DEAD); | 664 RTC_DCHECK(pmsg->message_id == MSG_DESTROY_IF_DEAD); |
| 665 bool dead = | 665 bool dead = |
| 666 (state_ == State::INIT || state_ == State::PRUNED) && | 666 (state_ == State::INIT || state_ == State::PRUNED) && |
| 667 connections_.empty() && | 667 connections_.empty() && |
| 668 rtc::TimeMillis() - last_time_all_connections_removed_ >= timeout_delay_; | 668 rtc::TimeMillis() - last_time_all_connections_removed_ >= timeout_delay_; |
| 669 if (dead) { | 669 if (dead) { |
| 670 Destroy(); | 670 Destroy(); |
| 671 } | 671 } |
| 672 } | 672 } |
| 673 | 673 |
| 674 void Port::OnNetworkTypeChanged(const rtc::Network* network) { | 674 void Port::OnNetworkTypeChanged(const rtc::Network* network) { |
| 675 ASSERT(network == network_); | 675 RTC_DCHECK(network == network_); |
| 676 | 676 |
| 677 UpdateNetworkCost(); | 677 UpdateNetworkCost(); |
| 678 } | 678 } |
| 679 | 679 |
| 680 std::string Port::ToString() const { | 680 std::string Port::ToString() const { |
| 681 std::stringstream ss; | 681 std::stringstream ss; |
| 682 ss << "Port[" << std::hex << this << std::dec << ":" << content_name_ << ":" | 682 ss << "Port[" << std::hex << this << std::dec << ":" << content_name_ << ":" |
| 683 << component_ << ":" << generation_ << ":" << type_ << ":" | 683 << component_ << ":" << generation_ << ":" << type_ << ":" |
| 684 << network_->ToString() << "]"; | 684 << network_->ToString() << "]"; |
| 685 return ss.str(); | 685 return ss.str(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 708 } | 708 } |
| 709 } | 709 } |
| 710 | 710 |
| 711 void Port::EnablePortPackets() { | 711 void Port::EnablePortPackets() { |
| 712 enable_port_packets_ = true; | 712 enable_port_packets_ = true; |
| 713 } | 713 } |
| 714 | 714 |
| 715 void Port::OnConnectionDestroyed(Connection* conn) { | 715 void Port::OnConnectionDestroyed(Connection* conn) { |
| 716 AddressMap::iterator iter = | 716 AddressMap::iterator iter = |
| 717 connections_.find(conn->remote_candidate().address()); | 717 connections_.find(conn->remote_candidate().address()); |
| 718 ASSERT(iter != connections_.end()); | 718 RTC_DCHECK(iter != connections_.end()); |
| 719 connections_.erase(iter); | 719 connections_.erase(iter); |
| 720 HandleConnectionDestroyed(conn); | 720 HandleConnectionDestroyed(conn); |
| 721 | 721 |
| 722 // Ports time out after all connections fail if it is not marked as | 722 // Ports time out after all connections fail if it is not marked as |
| 723 // "keep alive until pruned." | 723 // "keep alive until pruned." |
| 724 // Note: If a new connection is added after this message is posted, but it | 724 // Note: If a new connection is added after this message is posted, but it |
| 725 // fails and is removed before kPortTimeoutDelay, then this message will | 725 // fails and is removed before kPortTimeoutDelay, then this message will |
| 726 // not cause the Port to be destroyed. | 726 // not cause the Port to be destroyed. |
| 727 if (connections_.empty()) { | 727 if (connections_.empty()) { |
| 728 last_time_all_connections_removed_ = rtc::TimeMillis(); | 728 last_time_all_connections_removed_ = rtc::TimeMillis(); |
| 729 thread_->PostDelayed(RTC_FROM_HERE, timeout_delay_, this, | 729 thread_->PostDelayed(RTC_FROM_HERE, timeout_delay_, this, |
| 730 MSG_DESTROY_IF_DEAD); | 730 MSG_DESTROY_IF_DEAD); |
| 731 } | 731 } |
| 732 } | 732 } |
| 733 | 733 |
| 734 void Port::Destroy() { | 734 void Port::Destroy() { |
| 735 ASSERT(connections_.empty()); | 735 RTC_DCHECK(connections_.empty()); |
| 736 LOG_J(LS_INFO, this) << "Port deleted"; | 736 LOG_J(LS_INFO, this) << "Port deleted"; |
| 737 SignalDestroyed(this); | 737 SignalDestroyed(this); |
| 738 delete this; | 738 delete this; |
| 739 } | 739 } |
| 740 | 740 |
| 741 const std::string Port::username_fragment() const { | 741 const std::string Port::username_fragment() const { |
| 742 return ice_username_fragment_; | 742 return ice_username_fragment_; |
| 743 } | 743 } |
| 744 | 744 |
| 745 // A ConnectionRequest is a simple STUN ping used to determine writability. | 745 // A ConnectionRequest is a simple STUN ping used to determine writability. |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 876 // TODO(mallinath) - Start connections from STATE_FROZEN. | 876 // TODO(mallinath) - Start connections from STATE_FROZEN. |
| 877 // Wire up to send stun packets | 877 // Wire up to send stun packets |
| 878 requests_.SignalSendPacket.connect(this, &Connection::OnSendStunPacket); | 878 requests_.SignalSendPacket.connect(this, &Connection::OnSendStunPacket); |
| 879 LOG_J(LS_INFO, this) << "Connection created"; | 879 LOG_J(LS_INFO, this) << "Connection created"; |
| 880 } | 880 } |
| 881 | 881 |
| 882 Connection::~Connection() { | 882 Connection::~Connection() { |
| 883 } | 883 } |
| 884 | 884 |
| 885 const Candidate& Connection::local_candidate() const { | 885 const Candidate& Connection::local_candidate() const { |
| 886 ASSERT(local_candidate_index_ < port_->Candidates().size()); | 886 RTC_DCHECK(local_candidate_index_ < port_->Candidates().size()); |
| 887 return port_->Candidates()[local_candidate_index_]; | 887 return port_->Candidates()[local_candidate_index_]; |
| 888 } | 888 } |
| 889 | 889 |
| 890 const Candidate& Connection::remote_candidate() const { | 890 const Candidate& Connection::remote_candidate() const { |
| 891 return remote_candidate_; | 891 return remote_candidate_; |
| 892 } | 892 } |
| 893 | 893 |
| 894 uint64_t Connection::priority() const { | 894 uint64_t Connection::priority() const { |
| 895 uint64_t priority = 0; | 895 uint64_t priority = 0; |
| 896 // RFC 5245 - 5.7.2. Computing Pair Priority and Ordering Pairs | 896 // RFC 5245 - 5.7.2. Computing Pair Priority and Ordering Pairs |
| (...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1448 remote_candidate_.protocol() == new_candidate.protocol() && | 1448 remote_candidate_.protocol() == new_candidate.protocol() && |
| 1449 remote_candidate_.address() == new_candidate.address() && | 1449 remote_candidate_.address() == new_candidate.address() && |
| 1450 remote_candidate_.username() == new_candidate.username() && | 1450 remote_candidate_.username() == new_candidate.username() && |
| 1451 remote_candidate_.password() == new_candidate.password() && | 1451 remote_candidate_.password() == new_candidate.password() && |
| 1452 remote_candidate_.generation() == new_candidate.generation()) { | 1452 remote_candidate_.generation() == new_candidate.generation()) { |
| 1453 remote_candidate_ = new_candidate; | 1453 remote_candidate_ = new_candidate; |
| 1454 } | 1454 } |
| 1455 } | 1455 } |
| 1456 | 1456 |
| 1457 void Connection::OnMessage(rtc::Message *pmsg) { | 1457 void Connection::OnMessage(rtc::Message *pmsg) { |
| 1458 ASSERT(pmsg->message_id == MSG_DELETE); | 1458 RTC_DCHECK(pmsg->message_id == MSG_DELETE); |
| 1459 LOG(LS_INFO) << "Connection deleted with number of pings sent: " | 1459 LOG(LS_INFO) << "Connection deleted with number of pings sent: " |
| 1460 << num_pings_sent_; | 1460 << num_pings_sent_; |
| 1461 SignalDestroyed(this); | 1461 SignalDestroyed(this); |
| 1462 delete this; | 1462 delete this; |
| 1463 } | 1463 } |
| 1464 | 1464 |
| 1465 int64_t Connection::last_received() const { | 1465 int64_t Connection::last_received() const { |
| 1466 return std::max(last_data_received_, | 1466 return std::max(last_data_received_, |
| 1467 std::max(last_ping_received_, last_ping_response_received_)); | 1467 std::max(last_ping_received_, last_ping_response_received_)); |
| 1468 } | 1468 } |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1573 size_t index, | 1573 size_t index, |
| 1574 const Candidate& remote_candidate) | 1574 const Candidate& remote_candidate) |
| 1575 : Connection(port, index, remote_candidate) {} | 1575 : Connection(port, index, remote_candidate) {} |
| 1576 | 1576 |
| 1577 int ProxyConnection::Send(const void* data, size_t size, | 1577 int ProxyConnection::Send(const void* data, size_t size, |
| 1578 const rtc::PacketOptions& options) { | 1578 const rtc::PacketOptions& options) { |
| 1579 stats_.sent_total_packets++; | 1579 stats_.sent_total_packets++; |
| 1580 int sent = port_->SendTo(data, size, remote_candidate_.address(), | 1580 int sent = port_->SendTo(data, size, remote_candidate_.address(), |
| 1581 options, true); | 1581 options, true); |
| 1582 if (sent <= 0) { | 1582 if (sent <= 0) { |
| 1583 ASSERT(sent < 0); | 1583 RTC_DCHECK(sent < 0); |
| 1584 error_ = port_->GetError(); | 1584 error_ = port_->GetError(); |
| 1585 stats_.sent_discarded_packets++; | 1585 stats_.sent_discarded_packets++; |
| 1586 } else { | 1586 } else { |
| 1587 send_rate_tracker_.AddSamples(sent); | 1587 send_rate_tracker_.AddSamples(sent); |
| 1588 } | 1588 } |
| 1589 return sent; | 1589 return sent; |
| 1590 } | 1590 } |
| 1591 | 1591 |
| 1592 } // namespace cricket | 1592 } // namespace cricket |
| OLD | NEW |