| 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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 } | 53 } |
| 54 | 54 |
| 55 // Constructs a STUN error response and sends it on the given socket. | 55 // Constructs a STUN error response and sends it on the given socket. |
| 56 void SendStunError(const StunMessage& msg, rtc::AsyncPacketSocket* socket, | 56 void SendStunError(const StunMessage& msg, rtc::AsyncPacketSocket* socket, |
| 57 const rtc::SocketAddress& remote_addr, int error_code, | 57 const rtc::SocketAddress& remote_addr, int error_code, |
| 58 const char* error_desc, const std::string& magic_cookie) { | 58 const char* error_desc, const std::string& magic_cookie) { |
| 59 RelayMessage err_msg; | 59 RelayMessage err_msg; |
| 60 err_msg.SetType(GetStunErrorResponseType(msg.type())); | 60 err_msg.SetType(GetStunErrorResponseType(msg.type())); |
| 61 err_msg.SetTransactionID(msg.transaction_id()); | 61 err_msg.SetTransactionID(msg.transaction_id()); |
| 62 | 62 |
| 63 StunByteStringAttribute* magic_cookie_attr = | 63 auto magic_cookie_attr = |
| 64 StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE); | 64 StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE); |
| 65 if (magic_cookie.size() == 0) { | 65 if (magic_cookie.size() == 0) { |
| 66 magic_cookie_attr->CopyBytes(cricket::TURN_MAGIC_COOKIE_VALUE, | 66 magic_cookie_attr->CopyBytes(cricket::TURN_MAGIC_COOKIE_VALUE, |
| 67 sizeof(cricket::TURN_MAGIC_COOKIE_VALUE)); | 67 sizeof(cricket::TURN_MAGIC_COOKIE_VALUE)); |
| 68 } else { | 68 } else { |
| 69 magic_cookie_attr->CopyBytes(magic_cookie.c_str(), magic_cookie.size()); | 69 magic_cookie_attr->CopyBytes(magic_cookie.c_str(), magic_cookie.size()); |
| 70 } | 70 } |
| 71 err_msg.AddAttribute(magic_cookie_attr); | 71 err_msg.AddAttribute(std::move(magic_cookie_attr)); |
| 72 | 72 |
| 73 StunErrorCodeAttribute* err_code = StunAttribute::CreateErrorCode(); | 73 auto err_code = StunAttribute::CreateErrorCode(); |
| 74 err_code->SetClass(error_code / 100); | 74 err_code->SetClass(error_code / 100); |
| 75 err_code->SetNumber(error_code % 100); | 75 err_code->SetNumber(error_code % 100); |
| 76 err_code->SetReason(error_desc); | 76 err_code->SetReason(error_desc); |
| 77 err_msg.AddAttribute(err_code); | 77 err_msg.AddAttribute(std::move(err_code)); |
| 78 | 78 |
| 79 SendStun(err_msg, socket, remote_addr); | 79 SendStun(err_msg, socket, remote_addr); |
| 80 } | 80 } |
| 81 | 81 |
| 82 RelayServer::RelayServer(rtc::Thread* thread) | 82 RelayServer::RelayServer(rtc::Thread* thread) |
| 83 : thread_(thread), log_bindings_(true) { | 83 : thread_(thread), log_bindings_(true) { |
| 84 } | 84 } |
| 85 | 85 |
| 86 RelayServer::~RelayServer() { | 86 RelayServer::~RelayServer() { |
| 87 // Deleting the binding will cause it to be removed from the map. | 87 // Deleting the binding will cause it to be removed from the map. |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 void RelayServer::HandleStunAllocate( | 414 void RelayServer::HandleStunAllocate( |
| 415 RelayServerConnection* int_conn, const StunMessage& request) { | 415 RelayServerConnection* int_conn, const StunMessage& request) { |
| 416 | 416 |
| 417 // Create a response message that includes an address with which external | 417 // Create a response message that includes an address with which external |
| 418 // clients can communicate. | 418 // clients can communicate. |
| 419 | 419 |
| 420 RelayMessage response; | 420 RelayMessage response; |
| 421 response.SetType(STUN_ALLOCATE_RESPONSE); | 421 response.SetType(STUN_ALLOCATE_RESPONSE); |
| 422 response.SetTransactionID(request.transaction_id()); | 422 response.SetTransactionID(request.transaction_id()); |
| 423 | 423 |
| 424 StunByteStringAttribute* magic_cookie_attr = | 424 auto magic_cookie_attr = |
| 425 StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE); | 425 StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE); |
| 426 magic_cookie_attr->CopyBytes(int_conn->binding()->magic_cookie().c_str(), | 426 magic_cookie_attr->CopyBytes(int_conn->binding()->magic_cookie().c_str(), |
| 427 int_conn->binding()->magic_cookie().size()); | 427 int_conn->binding()->magic_cookie().size()); |
| 428 response.AddAttribute(magic_cookie_attr); | 428 response.AddAttribute(std::move(magic_cookie_attr)); |
| 429 | 429 |
| 430 size_t index = rand() % external_sockets_.size(); | 430 size_t index = rand() % external_sockets_.size(); |
| 431 rtc::SocketAddress ext_addr = | 431 rtc::SocketAddress ext_addr = |
| 432 external_sockets_[index]->GetLocalAddress(); | 432 external_sockets_[index]->GetLocalAddress(); |
| 433 | 433 |
| 434 StunAddressAttribute* addr_attr = | 434 auto addr_attr = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); |
| 435 StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); | |
| 436 addr_attr->SetIP(ext_addr.ipaddr()); | 435 addr_attr->SetIP(ext_addr.ipaddr()); |
| 437 addr_attr->SetPort(ext_addr.port()); | 436 addr_attr->SetPort(ext_addr.port()); |
| 438 response.AddAttribute(addr_attr); | 437 response.AddAttribute(std::move(addr_attr)); |
| 439 | 438 |
| 440 StunUInt32Attribute* res_lifetime_attr = | 439 auto res_lifetime_attr = StunAttribute::CreateUInt32(STUN_ATTR_LIFETIME); |
| 441 StunAttribute::CreateUInt32(STUN_ATTR_LIFETIME); | |
| 442 res_lifetime_attr->SetValue(int_conn->binding()->lifetime() / 1000); | 440 res_lifetime_attr->SetValue(int_conn->binding()->lifetime() / 1000); |
| 443 response.AddAttribute(res_lifetime_attr); | 441 response.AddAttribute(std::move(res_lifetime_attr)); |
| 444 | 442 |
| 445 // TODO: Support transport-prefs (preallocate RTCP port). | 443 // TODO: Support transport-prefs (preallocate RTCP port). |
| 446 // TODO: Support bandwidth restrictions. | 444 // TODO: Support bandwidth restrictions. |
| 447 // TODO: Add message integrity check. | 445 // TODO: Add message integrity check. |
| 448 | 446 |
| 449 // Send a response to the caller. | 447 // Send a response to the caller. |
| 450 int_conn->SendStun(response); | 448 int_conn->SendStun(response); |
| 451 } | 449 } |
| 452 | 450 |
| 453 void RelayServer::HandleStunSend( | 451 void RelayServer::HandleStunSend( |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 const StunUInt32Attribute* options_attr = | 485 const StunUInt32Attribute* options_attr = |
| 488 request.GetUInt32(STUN_ATTR_OPTIONS); | 486 request.GetUInt32(STUN_ATTR_OPTIONS); |
| 489 if (options_attr && (options_attr->value() & 0x01)) { | 487 if (options_attr && (options_attr->value() & 0x01)) { |
| 490 int_conn->set_default_destination(ext_addr); | 488 int_conn->set_default_destination(ext_addr); |
| 491 int_conn->Lock(); | 489 int_conn->Lock(); |
| 492 | 490 |
| 493 RelayMessage response; | 491 RelayMessage response; |
| 494 response.SetType(STUN_SEND_RESPONSE); | 492 response.SetType(STUN_SEND_RESPONSE); |
| 495 response.SetTransactionID(request.transaction_id()); | 493 response.SetTransactionID(request.transaction_id()); |
| 496 | 494 |
| 497 StunByteStringAttribute* magic_cookie_attr = | 495 auto magic_cookie_attr = |
| 498 StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE); | 496 StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE); |
| 499 magic_cookie_attr->CopyBytes(int_conn->binding()->magic_cookie().c_str(), | 497 magic_cookie_attr->CopyBytes(int_conn->binding()->magic_cookie().c_str(), |
| 500 int_conn->binding()->magic_cookie().size()); | 498 int_conn->binding()->magic_cookie().size()); |
| 501 response.AddAttribute(magic_cookie_attr); | 499 response.AddAttribute(std::move(magic_cookie_attr)); |
| 502 | 500 |
| 503 StunUInt32Attribute* options2_attr = | 501 auto options2_attr = |
| 504 StunAttribute::CreateUInt32(cricket::STUN_ATTR_OPTIONS); | 502 StunAttribute::CreateUInt32(cricket::STUN_ATTR_OPTIONS); |
| 505 options2_attr->SetValue(0x01); | 503 options2_attr->SetValue(0x01); |
| 506 response.AddAttribute(options2_attr); | 504 response.AddAttribute(std::move(options2_attr)); |
| 507 | 505 |
| 508 int_conn->SendStun(response); | 506 int_conn->SendStun(response); |
| 509 } | 507 } |
| 510 } | 508 } |
| 511 | 509 |
| 512 void RelayServer::AddConnection(RelayServerConnection* conn) { | 510 void RelayServer::AddConnection(RelayServerConnection* conn) { |
| 513 RTC_DCHECK(connections_.find(conn->addr_pair()) == connections_.end()); | 511 RTC_DCHECK(connections_.find(conn->addr_pair()) == connections_.end()); |
| 514 connections_[conn->addr_pair()] = conn; | 512 connections_[conn->addr_pair()] = conn; |
| 515 } | 513 } |
| 516 | 514 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 if (locked() && (from_addr == default_dest_)) { | 594 if (locked() && (from_addr == default_dest_)) { |
| 597 Send(data, size); | 595 Send(data, size); |
| 598 return; | 596 return; |
| 599 } | 597 } |
| 600 | 598 |
| 601 // Wrap the given data in a data-indication packet. | 599 // Wrap the given data in a data-indication packet. |
| 602 | 600 |
| 603 RelayMessage msg; | 601 RelayMessage msg; |
| 604 msg.SetType(STUN_DATA_INDICATION); | 602 msg.SetType(STUN_DATA_INDICATION); |
| 605 | 603 |
| 606 StunByteStringAttribute* magic_cookie_attr = | 604 auto magic_cookie_attr = |
| 607 StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE); | 605 StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE); |
| 608 magic_cookie_attr->CopyBytes(binding_->magic_cookie().c_str(), | 606 magic_cookie_attr->CopyBytes(binding_->magic_cookie().c_str(), |
| 609 binding_->magic_cookie().size()); | 607 binding_->magic_cookie().size()); |
| 610 msg.AddAttribute(magic_cookie_attr); | 608 msg.AddAttribute(std::move(magic_cookie_attr)); |
| 611 | 609 |
| 612 StunAddressAttribute* addr_attr = | 610 auto addr_attr = StunAttribute::CreateAddress(STUN_ATTR_SOURCE_ADDRESS2); |
| 613 StunAttribute::CreateAddress(STUN_ATTR_SOURCE_ADDRESS2); | |
| 614 addr_attr->SetIP(from_addr.ipaddr()); | 611 addr_attr->SetIP(from_addr.ipaddr()); |
| 615 addr_attr->SetPort(from_addr.port()); | 612 addr_attr->SetPort(from_addr.port()); |
| 616 msg.AddAttribute(addr_attr); | 613 msg.AddAttribute(std::move(addr_attr)); |
| 617 | 614 |
| 618 StunByteStringAttribute* data_attr = | 615 auto data_attr = StunAttribute::CreateByteString(STUN_ATTR_DATA); |
| 619 StunAttribute::CreateByteString(STUN_ATTR_DATA); | |
| 620 RTC_DCHECK(size <= 65536); | 616 RTC_DCHECK(size <= 65536); |
| 621 data_attr->CopyBytes(data, uint16_t(size)); | 617 data_attr->CopyBytes(data, uint16_t(size)); |
| 622 msg.AddAttribute(data_attr); | 618 msg.AddAttribute(std::move(data_attr)); |
| 623 | 619 |
| 624 SendStun(msg); | 620 SendStun(msg); |
| 625 } | 621 } |
| 626 | 622 |
| 627 void RelayServerConnection::SendStun(const StunMessage& msg) { | 623 void RelayServerConnection::SendStun(const StunMessage& msg) { |
| 628 // Note that the binding has been used again. | 624 // Note that the binding has been used again. |
| 629 binding_->NoteUsed(); | 625 binding_->NoteUsed(); |
| 630 | 626 |
| 631 cricket::SendStun(msg, socket_, addr_pair_.source()); | 627 cricket::SendStun(msg, socket_, addr_pair_.source()); |
| 632 } | 628 } |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 744 server_->thread()->PostDelayed(RTC_FROM_HERE, lifetime_, this, | 740 server_->thread()->PostDelayed(RTC_FROM_HERE, lifetime_, this, |
| 745 MSG_LIFETIME_TIMER); | 741 MSG_LIFETIME_TIMER); |
| 746 } | 742 } |
| 747 | 743 |
| 748 } else { | 744 } else { |
| 749 RTC_NOTREACHED(); | 745 RTC_NOTREACHED(); |
| 750 } | 746 } |
| 751 } | 747 } |
| 752 | 748 |
| 753 } // namespace cricket | 749 } // namespace cricket |
| OLD | NEW |