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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 sigslot::signal1<AllocationSequence*> SignalPortAllocationComplete; | 114 sigslot::signal1<AllocationSequence*> SignalPortAllocationComplete; |
115 | 115 |
116 private: | 116 private: |
117 typedef std::vector<ProtocolType> ProtocolList; | 117 typedef std::vector<ProtocolType> ProtocolList; |
118 | 118 |
119 bool IsFlagSet(uint32 flag) { | 119 bool IsFlagSet(uint32 flag) { |
120 return ((flags_ & flag) != 0); | 120 return ((flags_ & flag) != 0); |
121 } | 121 } |
122 void CreateUDPPorts(); | 122 void CreateUDPPorts(); |
123 void CreateTCPPorts(); | 123 void CreateTCPPorts(); |
124 void CreateStunPorts(); | |
125 void CreateRelayPorts(); | 124 void CreateRelayPorts(); |
126 void CreateGturnPort(const RelayServerConfig& config); | 125 void CreateGturnPort(const RelayServerConfig& config); |
127 void CreateTurnPort(const RelayServerConfig& config); | 126 void CreateTurnPort(const RelayServerConfig& config); |
128 | 127 |
129 void OnReadPacket(rtc::AsyncPacketSocket* socket, | 128 void OnReadPacket(rtc::AsyncPacketSocket* socket, |
130 const char* data, size_t size, | 129 const char* data, size_t size, |
131 const rtc::SocketAddress& remote_addr, | 130 const rtc::SocketAddress& remote_addr, |
132 const rtc::PacketTime& packet_time); | 131 const rtc::PacketTime& packet_time); |
133 | 132 |
134 void OnPortDestroyed(PortInterface* port); | 133 void OnPortDestroyed(PortInterface* port); |
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 ip_(network->GetBestIP()), | 746 ip_(network->GetBestIP()), |
748 config_(config), | 747 config_(config), |
749 state_(kInit), | 748 state_(kInit), |
750 flags_(flags), | 749 flags_(flags), |
751 udp_socket_(), | 750 udp_socket_(), |
752 udp_port_(NULL), | 751 udp_port_(NULL), |
753 phase_(0) { | 752 phase_(0) { |
754 } | 753 } |
755 | 754 |
756 bool AllocationSequence::Init() { | 755 bool AllocationSequence::Init() { |
757 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) && | 756 udp_socket_.reset(session_->socket_factory()->CreateUdpSocket( |
758 !IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_UFRAG)) { | 757 rtc::SocketAddress(ip_, 0), session_->allocator()->min_port(), |
759 LOG(LS_ERROR) << "Shared socket option can't be set without " | 758 session_->allocator()->max_port())); |
760 << "shared ufrag."; | 759 if (udp_socket_) { |
761 ASSERT(false); | 760 udp_socket_->SignalReadPacket.connect( |
762 return false; | 761 this, &AllocationSequence::OnReadPacket); |
763 } | 762 } |
764 | 763 // Continuing if |udp_socket_| is NULL, as local TCP and RelayPort using TCP |
765 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) { | 764 // are next available options to setup a communication channel. |
766 udp_socket_.reset(session_->socket_factory()->CreateUdpSocket( | |
767 rtc::SocketAddress(ip_, 0), session_->allocator()->min_port(), | |
768 session_->allocator()->max_port())); | |
769 if (udp_socket_) { | |
770 udp_socket_->SignalReadPacket.connect( | |
771 this, &AllocationSequence::OnReadPacket); | |
772 } | |
773 // Continuing if |udp_socket_| is NULL, as local TCP and RelayPort using TCP | |
774 // are next available options to setup a communication channel. | |
775 } | |
776 return true; | 765 return true; |
777 } | 766 } |
778 | 767 |
779 void AllocationSequence::Clear() { | 768 void AllocationSequence::Clear() { |
780 udp_port_ = NULL; | 769 udp_port_ = NULL; |
781 turn_ports_.clear(); | 770 turn_ports_.clear(); |
782 } | 771 } |
783 | 772 |
784 AllocationSequence::~AllocationSequence() { | 773 AllocationSequence::~AllocationSequence() { |
785 session_->network_thread()->Clear(this); | 774 session_->network_thread()->Clear(this); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
835 "Udp", "Relay", "Tcp", "SslTcp" | 824 "Udp", "Relay", "Tcp", "SslTcp" |
836 }; | 825 }; |
837 | 826 |
838 // Perform all of the phases in the current step. | 827 // Perform all of the phases in the current step. |
839 LOG_J(LS_INFO, network_) << "Allocation Phase=" | 828 LOG_J(LS_INFO, network_) << "Allocation Phase=" |
840 << PHASE_NAMES[phase_]; | 829 << PHASE_NAMES[phase_]; |
841 | 830 |
842 switch (phase_) { | 831 switch (phase_) { |
843 case PHASE_UDP: | 832 case PHASE_UDP: |
844 CreateUDPPorts(); | 833 CreateUDPPorts(); |
845 CreateStunPorts(); | |
846 EnableProtocol(PROTO_UDP); | 834 EnableProtocol(PROTO_UDP); |
847 break; | 835 break; |
848 | 836 |
849 case PHASE_RELAY: | 837 case PHASE_RELAY: |
850 CreateRelayPorts(); | 838 CreateRelayPorts(); |
851 break; | 839 break; |
852 | 840 |
853 case PHASE_TCP: | 841 case PHASE_TCP: |
854 CreateTCPPorts(); | 842 CreateTCPPorts(); |
855 EnableProtocol(PROTO_TCP); | 843 EnableProtocol(PROTO_TCP); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
895 | 883 |
896 void AllocationSequence::CreateUDPPorts() { | 884 void AllocationSequence::CreateUDPPorts() { |
897 if (IsFlagSet(PORTALLOCATOR_DISABLE_UDP)) { | 885 if (IsFlagSet(PORTALLOCATOR_DISABLE_UDP)) { |
898 LOG(LS_VERBOSE) << "AllocationSequence: UDP ports disabled, skipping."; | 886 LOG(LS_VERBOSE) << "AllocationSequence: UDP ports disabled, skipping."; |
899 return; | 887 return; |
900 } | 888 } |
901 | 889 |
902 // TODO(mallinath) - Remove UDPPort creating socket after shared socket | 890 // TODO(mallinath) - Remove UDPPort creating socket after shared socket |
903 // is enabled completely. | 891 // is enabled completely. |
904 UDPPort* port = NULL; | 892 UDPPort* port = NULL; |
905 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) && udp_socket_) { | 893 port = UDPPort::Create(session_->network_thread(), |
906 port = UDPPort::Create(session_->network_thread(), | 894 session_->socket_factory(), network_, |
907 session_->socket_factory(), network_, | 895 udp_socket_.get(), |
908 udp_socket_.get(), | 896 session_->username(), session_->password(), |
909 session_->username(), session_->password(), | 897 session_->allocator()->origin()); |
910 session_->allocator()->origin()); | |
911 } else { | |
912 port = UDPPort::Create(session_->network_thread(), | |
913 session_->socket_factory(), | |
914 network_, ip_, | |
915 session_->allocator()->min_port(), | |
916 session_->allocator()->max_port(), | |
917 session_->username(), session_->password(), | |
918 session_->allocator()->origin()); | |
919 } | |
920 | |
921 if (port) { | 898 if (port) { |
922 // If shared socket is enabled, STUN candidate will be allocated by the | 899 // If shared socket is enabled, STUN candidate will be allocated by the |
923 // UDPPort. | 900 // UDPPort. |
924 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) { | 901 udp_port_ = port; |
925 udp_port_ = port; | 902 port->SignalDestroyed.connect(this, &AllocationSequence::OnPortDestroyed); |
926 port->SignalDestroyed.connect(this, &AllocationSequence::OnPortDestroyed); | |
927 | 903 |
928 // If STUN is not disabled, setting stun server address to port. | 904 // If STUN is not disabled, setting stun server address to port. |
929 if (!IsFlagSet(PORTALLOCATOR_DISABLE_STUN)) { | 905 if (!IsFlagSet(PORTALLOCATOR_DISABLE_STUN)) { |
930 if (config_ && !config_->StunServers().empty()) { | 906 if (config_ && !config_->StunServers().empty()) { |
931 LOG(LS_INFO) << "AllocationSequence: UDPPort will be handling the " | 907 LOG(LS_INFO) << "AllocationSequence: UDPPort will be handling the " |
932 << "STUN candidate generation."; | 908 << "STUN candidate generation."; |
933 port->set_server_addresses(config_->StunServers()); | 909 port->set_server_addresses(config_->StunServers()); |
934 } | |
935 } | 910 } |
936 } | 911 } |
937 | 912 |
938 session_->AddAllocatedPort(port, this, true); | 913 session_->AddAllocatedPort(port, this, true); |
939 } | 914 } |
940 } | 915 } |
941 | 916 |
942 void AllocationSequence::CreateTCPPorts() { | 917 void AllocationSequence::CreateTCPPorts() { |
943 if (IsFlagSet(PORTALLOCATOR_DISABLE_TCP)) { | 918 if (IsFlagSet(PORTALLOCATOR_DISABLE_TCP)) { |
944 LOG(LS_VERBOSE) << "AllocationSequence: TCP ports disabled, skipping."; | 919 LOG(LS_VERBOSE) << "AllocationSequence: TCP ports disabled, skipping."; |
945 return; | 920 return; |
946 } | 921 } |
947 | 922 |
948 Port* port = TCPPort::Create(session_->network_thread(), | 923 Port* port = TCPPort::Create(session_->network_thread(), |
949 session_->socket_factory(), | 924 session_->socket_factory(), |
950 network_, ip_, | 925 network_, ip_, |
951 session_->allocator()->min_port(), | 926 session_->allocator()->min_port(), |
952 session_->allocator()->max_port(), | 927 session_->allocator()->max_port(), |
953 session_->username(), session_->password(), | 928 session_->username(), session_->password(), |
954 session_->allocator()->allow_tcp_listen()); | 929 session_->allocator()->allow_tcp_listen()); |
955 if (port) { | 930 if (port) { |
956 session_->AddAllocatedPort(port, this, true); | 931 session_->AddAllocatedPort(port, this, true); |
957 // Since TCPPort is not created using shared socket, |port| will not be | 932 // Since TCPPort is not created using shared socket, |port| will not be |
958 // added to the dequeue. | 933 // added to the dequeue. |
959 } | 934 } |
960 } | 935 } |
961 | 936 |
962 void AllocationSequence::CreateStunPorts() { | |
963 if (IsFlagSet(PORTALLOCATOR_DISABLE_STUN)) { | |
964 LOG(LS_VERBOSE) << "AllocationSequence: STUN ports disabled, skipping."; | |
965 return; | |
966 } | |
967 | |
968 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) { | |
969 return; | |
970 } | |
971 | |
972 if (!(config_ && !config_->StunServers().empty())) { | |
973 LOG(LS_WARNING) | |
974 << "AllocationSequence: No STUN server configured, skipping."; | |
975 return; | |
976 } | |
977 | |
978 StunPort* port = StunPort::Create(session_->network_thread(), | |
979 session_->socket_factory(), | |
980 network_, ip_, | |
981 session_->allocator()->min_port(), | |
982 session_->allocator()->max_port(), | |
983 session_->username(), session_->password(), | |
984 config_->StunServers(), | |
985 session_->allocator()->origin()); | |
986 if (port) { | |
987 session_->AddAllocatedPort(port, this, true); | |
988 // Since StunPort is not created using shared socket, |port| will not be | |
989 // added to the dequeue. | |
990 } | |
991 } | |
992 | |
993 void AllocationSequence::CreateRelayPorts() { | 937 void AllocationSequence::CreateRelayPorts() { |
994 if (IsFlagSet(PORTALLOCATOR_DISABLE_RELAY)) { | 938 if (IsFlagSet(PORTALLOCATOR_DISABLE_RELAY)) { |
995 LOG(LS_VERBOSE) << "AllocationSequence: Relay ports disabled, skipping."; | 939 LOG(LS_VERBOSE) << "AllocationSequence: Relay ports disabled, skipping."; |
996 return; | 940 return; |
997 } | 941 } |
998 | 942 |
999 // If BasicPortAllocatorSession::OnAllocate left relay ports enabled then we | 943 // If BasicPortAllocatorSession::OnAllocate left relay ports enabled then we |
1000 // ought to have a relay list for them here. | 944 // ought to have a relay list for them here. |
1001 ASSERT(config_ && !config_->relays.empty()); | 945 ASSERT(config_ && !config_->relays.empty()); |
1002 if (!(config_ && !config_->relays.empty())) { | 946 if (!(config_ && !config_->relays.empty())) { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1051 | 995 |
1052 void AllocationSequence::CreateTurnPort(const RelayServerConfig& config) { | 996 void AllocationSequence::CreateTurnPort(const RelayServerConfig& config) { |
1053 PortList::const_iterator relay_port; | 997 PortList::const_iterator relay_port; |
1054 for (relay_port = config.ports.begin(); | 998 for (relay_port = config.ports.begin(); |
1055 relay_port != config.ports.end(); ++relay_port) { | 999 relay_port != config.ports.end(); ++relay_port) { |
1056 TurnPort* port = NULL; | 1000 TurnPort* port = NULL; |
1057 // Shared socket mode must be enabled only for UDP based ports. Hence | 1001 // Shared socket mode must be enabled only for UDP based ports. Hence |
1058 // don't pass shared socket for ports which will create TCP sockets. | 1002 // don't pass shared socket for ports which will create TCP sockets. |
1059 // TODO(mallinath) - Enable shared socket mode for TURN ports. Disabled | 1003 // TODO(mallinath) - Enable shared socket mode for TURN ports. Disabled |
1060 // due to webrtc bug https://code.google.com/p/webrtc/issues/detail?id=3537 | 1004 // due to webrtc bug https://code.google.com/p/webrtc/issues/detail?id=3537 |
1061 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) && | 1005 if (relay_port->proto == PROTO_UDP) { |
1062 relay_port->proto == PROTO_UDP) { | |
1063 port = TurnPort::Create(session_->network_thread(), | 1006 port = TurnPort::Create(session_->network_thread(), |
1064 session_->socket_factory(), | 1007 session_->socket_factory(), |
1065 network_, udp_socket_.get(), | 1008 network_, udp_socket_.get(), |
1066 session_->username(), session_->password(), | 1009 session_->username(), session_->password(), |
1067 *relay_port, config.credentials, config.priority, | 1010 *relay_port, config.credentials, config.priority, |
1068 session_->allocator()->origin()); | 1011 session_->allocator()->origin()); |
1069 turn_ports_.push_back(port); | 1012 turn_ports_.push_back(port); |
1070 // Listen to the port destroyed signal, to allow AllocationSequence to | 1013 // Listen to the port destroyed signal, to allow AllocationSequence to |
1071 // remove entrt from it's map. | 1014 // remove entrt from it's map. |
1072 port->SignalDestroyed.connect(this, &AllocationSequence::OnPortDestroyed); | 1015 port->SignalDestroyed.connect(this, &AllocationSequence::OnPortDestroyed); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 ServerAddresses servers; | 1147 ServerAddresses servers; |
1205 for (size_t i = 0; i < relays.size(); ++i) { | 1148 for (size_t i = 0; i < relays.size(); ++i) { |
1206 if (relays[i].type == turn_type && SupportsProtocol(relays[i], type)) { | 1149 if (relays[i].type == turn_type && SupportsProtocol(relays[i], type)) { |
1207 servers.insert(relays[i].ports.front().address); | 1150 servers.insert(relays[i].ports.front().address); |
1208 } | 1151 } |
1209 } | 1152 } |
1210 return servers; | 1153 return servers; |
1211 } | 1154 } |
1212 | 1155 |
1213 } // namespace cricket | 1156 } // namespace cricket |
OLD | NEW |