diff --git a/api/BUILD.gn b/api/BUILD.gn index cb23ea32cf..08e33ca92e 100644 --- a/api/BUILD.gn +++ b/api/BUILD.gn @@ -334,7 +334,7 @@ rtc_library("libjingle_peerconnection_api") { ":sequence_checker", ":turn_customizer", "../call:rtp_interfaces", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:rtc_p2p", "../pc:media_factory", "../rtc_base:copy_on_write_buffer", @@ -936,7 +936,7 @@ rtc_library("ice_transport_factory") { ":make_ref_counted", ":packet_socket_factory", ":scoped_refptr", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:ice_transport_internal", "../p2p:p2p_constants", "../p2p:p2p_transport_channel", diff --git a/api/test/pclf/BUILD.gn b/api/test/pclf/BUILD.gn index 6d1d2bef5d..20d7077449 100644 --- a/api/test/pclf/BUILD.gn +++ b/api/test/pclf/BUILD.gn @@ -74,7 +74,7 @@ rtc_library("media_quality_test_params") { "../../../api/transport:network_control", "../../../api/video_codecs:video_codecs_api", "../../../modules/audio_processing:api", - "../../../p2p:connection_and_port", + "../../../p2p:connection", "../../../p2p:rtc_p2p", "../../../rtc_base:network", "../../../rtc_base:rtc_certificate_generator", diff --git a/examples/BUILD.gn b/examples/BUILD.gn index 991f9d8686..c3f66e0b98 100644 --- a/examples/BUILD.gn +++ b/examples/BUILD.gn @@ -702,7 +702,7 @@ if (is_linux || is_chromeos || is_win) { "../api/video_codecs:video_codecs_api", "../media:media_channel", "../media:rtc_media_base", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:rtc_p2p", "../pc:video_track_source", "../rtc_base:async_dns_resolver", diff --git a/p2p/BUILD.gn b/p2p/BUILD.gn index 140bf215c6..8a5c8df065 100644 --- a/p2p/BUILD.gn +++ b/p2p/BUILD.gn @@ -74,7 +74,7 @@ rtc_library("rtc_p2p") { ":basic_async_resolver_factory", ":basic_ice_controller", ":candidate_pair_interface", - ":connection_and_port", + ":connection", ":connection_info", ":ice_agent_interface", ":ice_controller_factory_interface", @@ -169,6 +169,7 @@ rtc_library("rtc_p2p") { absl_deps = [ "//third_party/abseil-cpp/absl/algorithm:container", "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/functional:any_invocable", "//third_party/abseil-cpp/absl/memory", "//third_party/abseil-cpp/absl/strings", "//third_party/abseil-cpp/absl/types:optional", @@ -187,7 +188,7 @@ rtc_source_set("active_ice_controller_factory_interface") { rtc_source_set("active_ice_controller_interface") { sources = [ "base/active_ice_controller_interface.h" ] deps = [ - ":connection_and_port", + ":connection", ":ice_switch_reason", ":ice_transport_internal", ":transport_description", @@ -248,14 +249,10 @@ rtc_source_set("candidate_pair_interface") { # This set of files is too intertwined to break into separate # targets at this point. # TODO(bugs.webrtc.org/15796): Finish breakup -rtc_library("connection_and_port") { +rtc_library("connection") { sources = [ "base/connection.cc", "base/connection.h", - "base/port.cc", - "base/port.h", - "base/port_allocator.cc", - "base/port_allocator.h", ] deps = [ ":candidate_pair_interface", @@ -276,28 +273,37 @@ rtc_library("connection_and_port") { "../api/transport:enums", "../api/transport:field_trial_based_config", "../api/transport:stun_types", + "../api/units:time_delta", "../api/units:timestamp", "../logging:ice_log", "../rtc_base:async_packet_socket", + "../rtc_base:byte_buffer", "../rtc_base:callback_list", "../rtc_base:checks", "../rtc_base:crc32", + "../rtc_base:dscp", "../rtc_base:event_tracer", + "../rtc_base:ip_address", "../rtc_base:logging", + "../rtc_base:macromagic", "../rtc_base:mdns_responder_interface", "../rtc_base:net_helper", "../rtc_base:network", + "../rtc_base:network_constants", "../rtc_base:proxy_info", "../rtc_base:rate_tracker", "../rtc_base:rtc_numerics", "../rtc_base:safe_minmax", + "../rtc_base:socket", "../rtc_base:socket_address", "../rtc_base:ssl", "../rtc_base:stringutils", "../rtc_base:threading", + "../rtc_base:timeutils", "../rtc_base:weak_ptr", "../rtc_base/memory:always_valid_pointer", "../rtc_base/network:received_packet", + "../rtc_base/network:sent_packet", "../rtc_base/system:rtc_export", "../rtc_base/third_party/base64", "../rtc_base/third_party/sigslot", @@ -305,6 +311,7 @@ rtc_library("connection_and_port") { absl_deps = [ "//third_party/abseil-cpp/absl/algorithm:container", "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/functional:any_invocable", "//third_party/abseil-cpp/absl/memory", "//third_party/abseil-cpp/absl/strings", "//third_party/abseil-cpp/absl/strings:string_view", @@ -327,7 +334,7 @@ rtc_library("connection_info") { rtc_source_set("ice_agent_interface") { sources = [ "base/ice_agent_interface.h" ] deps = [ - ":connection_and_port", + ":connection", ":ice_switch_reason", "../api:array_view", ] @@ -339,7 +346,7 @@ rtc_library("ice_controller_interface") { "base/ice_controller_interface.h", ] deps = [ - ":connection_and_port", + ":connection", ":ice_switch_reason", ":ice_transport_internal", "../rtc_base:checks", @@ -382,9 +389,10 @@ rtc_library("ice_transport_internal") { "base/ice_transport_internal.h", ] deps = [ - ":connection_and_port", + ":connection", ":p2p_constants", ":packet_transport_internal", + ":port", ":stun_dictionary", ":transport_description", "../api:candidate", @@ -418,7 +426,7 @@ rtc_library("p2p_transport_channel") { ":active_ice_controller_factory_interface", ":basic_ice_controller", ":candidate_pair_interface", - ":connection_and_port", + ":connection", ":connection_info", ":ice_agent_interface", ":ice_controller_factory_interface", @@ -427,6 +435,8 @@ rtc_library("p2p_transport_channel") { ":ice_transport_internal", ":p2p_constants", ":p2p_transport_channel_ice_field_trials", + ":port", + ":port_allocator", ":port_interface", ":regathering_controller", ":stun_dictionary", @@ -487,7 +497,8 @@ rtc_library("packet_transport_internal") { "base/packet_transport_internal.h", ] deps = [ - ":connection_and_port", + ":connection", + ":port", "../rtc_base:async_packet_socket", "../rtc_base:network_route", "../rtc_base:socket", @@ -497,6 +508,94 @@ rtc_library("packet_transport_internal") { absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] } +rtc_library("port") { + sources = [ + "base/port.cc", + "base/port.h", + ] + deps = [ + ":candidate_pair_interface", + ":connection", + ":connection_info", + ":p2p_constants", + ":port_interface", + ":stun_request", + ":transport_description", + "../api:array_view", + "../api:candidate", + "../api:field_trials_view", + "../api:packet_socket_factory", + "../api:rtc_error", + "../api:sequence_checker", + "../api/task_queue", + "../api/transport:field_trial_based_config", + "../api/transport:stun_types", + "../api/units:time_delta", + "../logging:ice_log", + "../rtc_base:async_packet_socket", + "../rtc_base:byte_buffer", + "../rtc_base:callback_list", + "../rtc_base:checks", + "../rtc_base:crc32", + "../rtc_base:dscp", + "../rtc_base:event_tracer", + "../rtc_base:ip_address", + "../rtc_base:logging", + "../rtc_base:macromagic", + "../rtc_base:mdns_responder_interface", + "../rtc_base:net_helper", + "../rtc_base:network", + "../rtc_base:proxy_info", + "../rtc_base:rate_tracker", + "../rtc_base:socket_address", + "../rtc_base:ssl", + "../rtc_base:stringutils", + "../rtc_base:timeutils", + "../rtc_base:weak_ptr", + "../rtc_base/memory:always_valid_pointer", + "../rtc_base/network:received_packet", + "../rtc_base/network:sent_packet", + "../rtc_base/system:rtc_export", + "../rtc_base/third_party/sigslot", + ] + absl_deps = [ + "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/memory", + "//third_party/abseil-cpp/absl/strings", + "//third_party/abseil-cpp/absl/strings:string_view", + "//third_party/abseil-cpp/absl/types:optional", + ] +} + +rtc_library("port_allocator") { + sources = [ + "base/port_allocator.cc", + "base/port_allocator.h", + ] + deps = [ + ":connection", + ":ice_credentials_iterator", + ":port", + ":port_interface", + ":transport_description", + "../api:candidate", + "../api:sequence_checker", + "../api/transport:enums", + "../rtc_base:checks", + "../rtc_base:network", + "../rtc_base:proxy_info", + "../rtc_base:socket_address", + "../rtc_base:ssl", + "../rtc_base:threading", + "../rtc_base/system:rtc_export", + "../rtc_base/third_party/sigslot", + ] + absl_deps = [ + "//third_party/abseil-cpp/absl/strings:string_view", + "//third_party/abseil-cpp/absl/types:optional", + ] +} + rtc_library("port_interface") { sources = [ "base/port_interface.cc", @@ -505,8 +604,10 @@ rtc_library("port_interface") { deps = [ ":transport_description", "../api:candidate", + "../api:packet_socket_factory", "../rtc_base:async_packet_socket", "../rtc_base:callback_list", + "../rtc_base:proxy_info", "../rtc_base:socket_address", ] absl_deps = [ @@ -521,8 +622,9 @@ rtc_library("regathering_controller") { "base/regathering_controller.h", ] deps = [ - ":connection_and_port", + ":connection", ":ice_transport_internal", + ":port_allocator", "../api/task_queue:pending_task_safety_flag", "../api/units:time_delta", "../rtc_base:threading", @@ -590,7 +692,7 @@ rtc_library("wrapping_active_ice_controller") { deps = [ ":active_ice_controller_interface", ":basic_ice_controller", - ":connection_and_port", + ":connection", ":ice_agent_interface", ":ice_controller_factory_interface", ":ice_controller_interface", @@ -634,7 +736,7 @@ if (rtc_include_tests) { visibility = [ "*" ] sources = [ "base/fake_port_allocator.h" ] deps = [ - ":connection_and_port", + ":connection", ":rtc_p2p", "../rtc_base:net_helpers", "../rtc_base:net_test_helpers", @@ -663,7 +765,7 @@ if (rtc_include_tests) { deps = [ ":active_ice_controller_factory_interface", ":active_ice_controller_interface", - ":connection_and_port", + ":connection", ":fake_ice_transport", ":fake_port_allocator", ":ice_agent_interface", @@ -731,7 +833,7 @@ if (rtc_include_tests) { ":active_ice_controller_interface", ":async_stun_tcp_socket", ":basic_ice_controller", - ":connection_and_port", + ":connection", ":fake_ice_transport", ":fake_port_allocator", ":ice_credentials_iterator", diff --git a/p2p/base/candidate_pair_interface.h b/p2p/base/candidate_pair_interface.h index 2b68fd7ea9..a04ab130cf 100644 --- a/p2p/base/candidate_pair_interface.h +++ b/p2p/base/candidate_pair_interface.h @@ -23,6 +23,18 @@ class CandidatePairInterface { virtual const Candidate& remote_candidate() const = 0; }; +// Specific implementation of the interface, suitable for being a +// data member of other structs. +struct CandidatePair final : public CandidatePairInterface { + ~CandidatePair() override = default; + + const Candidate& local_candidate() const override { return local; } + const Candidate& remote_candidate() const override { return remote; } + + Candidate local; + Candidate remote; +}; + } // namespace cricket #endif // P2P_BASE_CANDIDATE_PAIR_INTERFACE_H_ diff --git a/p2p/base/connection.cc b/p2p/base/connection.cc index bf07dec607..9dd8a80631 100644 --- a/p2p/base/connection.cc +++ b/p2p/base/connection.cc @@ -19,25 +19,26 @@ #include #include "absl/algorithm/container.h" -#include "absl/strings/escaping.h" -#include "absl/strings/match.h" #include "absl/strings/string_view.h" #include "absl/types/optional.h" #include "api/array_view.h" #include "api/units/timestamp.h" -#include "p2p/base/port_allocator.h" +#include "p2p/base/p2p_constants.h" +#include "rtc_base/byte_buffer.h" #include "rtc_base/checks.h" -#include "rtc_base/crc32.h" #include "rtc_base/helpers.h" #include "rtc_base/logging.h" -#include "rtc_base/mdns_responder_interface.h" -#include "rtc_base/message_digest.h" +#include "rtc_base/net_helper.h" #include "rtc_base/network.h" +#include "rtc_base/network/sent_packet.h" +#include "rtc_base/network_constants.h" #include "rtc_base/numerics/safe_minmax.h" +#include "rtc_base/socket.h" +#include "rtc_base/socket_address.h" #include "rtc_base/string_encode.h" #include "rtc_base/string_utils.h" #include "rtc_base/strings/string_builder.h" -#include "rtc_base/third_party/base64/base64.h" +#include "rtc_base/time_utils.h" namespace cricket { namespace { @@ -213,7 +214,7 @@ int Connection::ConnectionRequest::resend_delay() { return CONNECTION_RESPONSE_TIMEOUT; } -Connection::Connection(rtc::WeakPtr port, +Connection::Connection(rtc::WeakPtr port, size_t index, const Candidate& remote_candidate) : network_thread_(port->thread()), @@ -1784,7 +1785,7 @@ void Connection::ForgetLearnedState() { pings_since_last_response_.clear(); } -ProxyConnection::ProxyConnection(rtc::WeakPtr port, +ProxyConnection::ProxyConnection(rtc::WeakPtr port, size_t index, const Candidate& remote_candidate) : Connection(std::move(port), index, remote_candidate) {} diff --git a/p2p/base/connection.h b/p2p/base/connection.h index cf54dc800f..583e62e264 100644 --- a/p2p/base/connection.h +++ b/p2p/base/connection.h @@ -11,19 +11,31 @@ #ifndef P2P_BASE_CONNECTION_H_ #define P2P_BASE_CONNECTION_H_ +#include + +#include +#include #include #include +#include #include #include +#include "absl/functional/any_invocable.h" #include "absl/strings/string_view.h" #include "absl/types/optional.h" #include "api/candidate.h" +#include "api/rtc_error.h" +#include "api/sequence_checker.h" +#include "api/task_queue/task_queue_base.h" #include "api/transport/stun.h" +#include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h" +#include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.h" #include "logging/rtc_event_log/ice_logger.h" #include "p2p/base/candidate_pair_interface.h" #include "p2p/base/connection_info.h" #include "p2p/base/p2p_transport_channel_ice_field_trials.h" +#include "p2p/base/port_interface.h" #include "p2p/base/stun_request.h" #include "p2p/base/transport_description.h" #include "rtc_base/async_packet_socket.h" @@ -32,6 +44,8 @@ #include "rtc_base/numerics/event_based_exponential_moving_average.h" #include "rtc_base/rate_tracker.h" #include "rtc_base/system/rtc_export.h" +#include "rtc_base/third_party/sigslot/sigslot.h" +#include "rtc_base/thread_annotations.h" #include "rtc_base/weak_ptr.h" namespace cricket { @@ -40,23 +54,9 @@ namespace cricket { // adding other flavors in the future. constexpr int kGoogPingVersion = 1; -// Connection and Port has circular dependencies. -// So we use forward declaration rather than include. -class Port; - // Forward declaration so that a ConnectionRequest can contain a Connection. class Connection; -struct CandidatePair final : public CandidatePairInterface { - ~CandidatePair() override = default; - - const Candidate& local_candidate() const override { return local; } - const Candidate& remote_candidate() const override { return remote; } - - Candidate local; - Candidate remote; -}; - // Represents a communication link between a port on the local client and a // port on the remote client. class RTC_EXPORT Connection : public CandidatePairInterface { @@ -102,7 +102,7 @@ class RTC_EXPORT Connection : public CandidatePairInterface { bool writable() const; bool receiving() const; - const Port* port() const { + const PortInterface* port() const { RTC_DCHECK_RUN_ON(network_thread_); return port_.get(); } @@ -326,8 +326,8 @@ class RTC_EXPORT Connection : public CandidatePairInterface { void SendResponseMessage(const StunMessage& response); // An accessor for unit tests. - Port* PortForTest() { return port_.get(); } - const Port* PortForTest() const { return port_.get(); } + PortInterface* PortForTest() { return port_.get(); } + const PortInterface* PortForTest() const { return port_.get(); } std::unique_ptr BuildPingRequestForTest() { RTC_DCHECK_RUN_ON(network_thread_); @@ -364,7 +364,9 @@ class RTC_EXPORT Connection : public CandidatePairInterface { class ConnectionRequest; // Constructs a new connection to the given remote port. - Connection(rtc::WeakPtr port, size_t index, const Candidate& candidate); + Connection(rtc::WeakPtr port, + size_t index, + const Candidate& candidate); // Called back when StunRequestManager has a stun packet to send void OnSendStunPacket(const void* data, size_t size, StunRequest* req); @@ -393,7 +395,7 @@ class RTC_EXPORT Connection : public CandidatePairInterface { void set_connected(bool value); // The local port where this connection sends and receives packets. - Port* port() { return port_.get(); } + PortInterface* port() { return port_.get(); } // NOTE: A pointer to the network thread is held by `port_` so in theory we // shouldn't need to hold on to this pointer here, but rather defer to @@ -402,7 +404,7 @@ class RTC_EXPORT Connection : public CandidatePairInterface { // TODO(tommi): This ^^^ should be fixed. webrtc::TaskQueueBase* const network_thread_; const uint32_t id_; - rtc::WeakPtr port_; + rtc::WeakPtr port_; Candidate local_candidate_ RTC_GUARDED_BY(network_thread_); Candidate remote_candidate_; @@ -515,7 +517,7 @@ class RTC_EXPORT Connection : public CandidatePairInterface { // ProxyConnection defers all the interesting work to the port. class ProxyConnection : public Connection { public: - ProxyConnection(rtc::WeakPtr port, + ProxyConnection(rtc::WeakPtr port, size_t index, const Candidate& remote_candidate); diff --git a/p2p/base/p2p_constants.h b/p2p/base/p2p_constants.h index 3af00bbc2e..c5a2b7058d 100644 --- a/p2p/base/p2p_constants.h +++ b/p2p/base/p2p_constants.h @@ -111,6 +111,19 @@ extern const int CONNECTION_RESPONSE_TIMEOUT; // it. extern const int MIN_CONNECTION_LIFETIME; +// The type preference MUST be an integer from 0 to 126 inclusive. +// https://datatracker.ietf.org/doc/html/rfc5245#section-4.1.2.1 +enum IcePriorityValue : uint8_t { + ICE_TYPE_PREFERENCE_RELAY_TLS = 0, + ICE_TYPE_PREFERENCE_RELAY_TCP = 1, + ICE_TYPE_PREFERENCE_RELAY_UDP = 2, + ICE_TYPE_PREFERENCE_PRFLX_TCP = 80, + ICE_TYPE_PREFERENCE_HOST_TCP = 90, + ICE_TYPE_PREFERENCE_SRFLX = 100, + ICE_TYPE_PREFERENCE_PRFLX = 110, + ICE_TYPE_PREFERENCE_HOST = 126 +}; + } // namespace cricket #endif // P2P_BASE_P2P_CONSTANTS_H_ diff --git a/p2p/base/p2p_transport_channel.cc b/p2p/base/p2p_transport_channel.cc index 35d7f85d69..0bccb67209 100644 --- a/p2p/base/p2p_transport_channel.cc +++ b/p2p/base/p2p_transport_channel.cc @@ -1693,7 +1693,7 @@ void P2PTransportChannel::OnStartedPinging() { regathering_controller_->Start(); } -bool P2PTransportChannel::IsPortPruned(const Port* port) const { +bool P2PTransportChannel::IsPortPruned(const PortInterface* port) const { RTC_DCHECK_RUN_ON(network_thread_); return !absl::c_linear_search(ports_, port); } diff --git a/p2p/base/p2p_transport_channel.h b/p2p/base/p2p_transport_channel.h index 6413d2dc64..da7933f2e7 100644 --- a/p2p/base/p2p_transport_channel.h +++ b/p2p/base/p2p_transport_channel.h @@ -370,7 +370,7 @@ class RTC_EXPORT P2PTransportChannel : public IceTransportInternal, } // Indicates if the given local port has been pruned. - bool IsPortPruned(const Port* port) const; + bool IsPortPruned(const PortInterface* port) const; // Indicates if the given remote candidate has been pruned. bool IsRemoteCandidatePruned(const Candidate& cand) const; diff --git a/p2p/base/port.cc b/p2p/base/port.cc index 1289d17d76..aacfef0ede 100644 --- a/p2p/base/port.cc +++ b/p2p/base/port.cc @@ -10,31 +10,34 @@ #include "p2p/base/port.h" -#include - -#include #include +#include #include #include #include -#include "absl/algorithm/container.h" #include "absl/memory/memory.h" #include "absl/strings/match.h" #include "absl/strings/string_view.h" +#include "api/array_view.h" +#include "api/rtc_error.h" +#include "api/units/time_delta.h" +#include "p2p/base/p2p_constants.h" +#include "p2p/base/stun_request.h" +#include "rtc_base/byte_buffer.h" #include "rtc_base/checks.h" #include "rtc_base/crc32.h" #include "rtc_base/helpers.h" +#include "rtc_base/ip_address.h" #include "rtc_base/logging.h" #include "rtc_base/mdns_responder_interface.h" -#include "rtc_base/message_digest.h" +#include "rtc_base/net_helper.h" #include "rtc_base/network.h" -#include "rtc_base/numerics/safe_minmax.h" #include "rtc_base/socket_address.h" #include "rtc_base/string_encode.h" #include "rtc_base/string_utils.h" #include "rtc_base/strings/string_builder.h" -#include "rtc_base/third_party/base64/base64.h" +#include "rtc_base/time_utils.h" #include "rtc_base/trace_event.h" namespace cricket { diff --git a/p2p/base/port.h b/p2p/base/port.h index 7b44e534de..e0fccd3907 100644 --- a/p2p/base/port.h +++ b/p2p/base/port.h @@ -11,10 +11,15 @@ #ifndef P2P_BASE_PORT_H_ #define P2P_BASE_PORT_H_ +#include +#include + +#include #include #include #include #include +#include #include #include @@ -25,6 +30,7 @@ #include "api/field_trials_view.h" #include "api/packet_socket_factory.h" #include "api/rtc_error.h" +#include "api/sequence_checker.h" #include "api/task_queue/task_queue_base.h" #include "api/transport/field_trial_based_config.h" #include "api/transport/stun.h" @@ -37,18 +43,22 @@ #include "p2p/base/p2p_constants.h" #include "p2p/base/port_interface.h" #include "p2p/base/stun_request.h" +#include "p2p/base/transport_description.h" #include "rtc_base/async_packet_socket.h" #include "rtc_base/callback_list.h" #include "rtc_base/checks.h" +#include "rtc_base/dscp.h" #include "rtc_base/memory/always_valid_pointer.h" #include "rtc_base/net_helper.h" #include "rtc_base/network.h" #include "rtc_base/network/received_packet.h" +#include "rtc_base/network/sent_packet.h" #include "rtc_base/proxy_info.h" #include "rtc_base/rate_tracker.h" #include "rtc_base/socket_address.h" #include "rtc_base/system/rtc_export.h" #include "rtc_base/third_party/sigslot/sigslot.h" +#include "rtc_base/thread_annotations.h" #include "rtc_base/weak_ptr.h" namespace cricket { @@ -59,19 +69,6 @@ extern const char TCPTYPE_ACTIVE_STR[]; extern const char TCPTYPE_PASSIVE_STR[]; extern const char TCPTYPE_SIMOPEN_STR[]; -// The type preference MUST be an integer from 0 to 126 inclusive. -// https://datatracker.ietf.org/doc/html/rfc5245#section-4.1.2.1 -enum IcePriorityValue : uint8_t { - ICE_TYPE_PREFERENCE_RELAY_TLS = 0, - ICE_TYPE_PREFERENCE_RELAY_TCP = 1, - ICE_TYPE_PREFERENCE_RELAY_UDP = 2, - ICE_TYPE_PREFERENCE_PRFLX_TCP = 80, - ICE_TYPE_PREFERENCE_HOST_TCP = 90, - ICE_TYPE_PREFERENCE_SRFLX = 100, - ICE_TYPE_PREFERENCE_PRFLX = 110, - ICE_TYPE_PREFERENCE_HOST = 126 -}; - enum class MdnsNameRegistrationStatus { // IP concealment with mDNS is not enabled or the name registration process is // not started yet. @@ -227,13 +224,13 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> { void CancelPendingTasks(); // The thread on which this port performs its I/O. - webrtc::TaskQueueBase* thread() { return thread_; } + webrtc::TaskQueueBase* thread() override { return thread_; } // The factory used to create the sockets of this port. - rtc::PacketSocketFactory* socket_factory() const { return factory_; } + rtc::PacketSocketFactory* socket_factory() const override { return factory_; } // For debugging purposes. - const std::string& content_name() const { return content_name_; } + const std::string& content_name() const override { return content_name_; } void set_content_name(absl::string_view content_name) { content_name_ = std::string(content_name); } @@ -241,7 +238,7 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> { int component() const { return component_; } void set_component(int component) { component_ = component; } - bool send_retransmit_count_attribute() const { + bool send_retransmit_count_attribute() const override { return send_retransmit_count_attribute_; } void set_send_retransmit_count_attribute(bool enable) { @@ -249,8 +246,10 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> { } // Identifies the generation that this port was created in. - uint32_t generation() const { return generation_; } - void set_generation(uint32_t generation) { generation_ = generation; } + uint32_t generation() const override { return generation_; } + void set_generation(uint32_t generation) override { + generation_ = generation; + } const std::string& username_fragment() const; const std::string& password() const { return password_; } @@ -296,11 +295,11 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> { // defers the `delete` operation to when the call stack has been unwound. // Async may be needed when deleting a connection object from within a // callback. - void DestroyConnection(Connection* conn) { + void DestroyConnection(Connection* conn) override { DestroyConnectionInternal(conn, false); } - void DestroyConnectionAsync(Connection* conn) { + void DestroyConnectionAsync(Connection* conn) override { DestroyConnectionInternal(conn, true); } @@ -330,8 +329,8 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> { user_agent_ = std::string(user_agent); proxy_ = proxy; } - const std::string& user_agent() { return user_agent_; } - const rtc::ProxyInfo& proxy() { return proxy_; } + const std::string& user_agent() override { return user_agent_; } + const rtc::ProxyInfo& proxy() override { return proxy_; } void EnablePortPackets() override; @@ -350,12 +349,13 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> { // stun username attribute if present. bool ParseStunUsername(const StunMessage* stun_msg, std::string* local_username, - std::string* remote_username) const; - std::string CreateStunUsername(absl::string_view remote_username) const; + std::string* remote_username) const override; + std::string CreateStunUsername( + absl::string_view remote_username) const override; bool MaybeIceRoleConflict(const rtc::SocketAddress& addr, IceMessage* stun_msg, - absl::string_view remote_ufrag); + absl::string_view remote_ufrag) override; // Called when a packet has been sent to the socket. // This is made pure virtual to notify subclasses of Port that they MUST @@ -368,9 +368,9 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> { void OnReadyToSend(); // Called when the Connection discovers a local peer reflexive candidate. - void AddPrflxCandidate(const Candidate& local); + void AddPrflxCandidate(const Candidate& local) override; - int16_t network_cost() const { return network_cost_; } + int16_t network_cost() const override { return network_cost_; } void GetStunStats(absl::optional* stats) override {} @@ -380,13 +380,14 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> { // then the foundation will be different. Two candidate pairs with // the same foundation pairs are likely to have similar network // characteristics. Foundations are used in the frozen algorithm. - std::string ComputeFoundation(absl::string_view type, - absl::string_view protocol, - absl::string_view relay_protocol, - const rtc::SocketAddress& base_address); + std::string ComputeFoundation( + absl::string_view type, + absl::string_view protocol, + absl::string_view relay_protocol, + const rtc::SocketAddress& base_address) override; protected: - virtual void UpdateNetworkCost(); + void UpdateNetworkCost() override; rtc::WeakPtr NewWeakPtr() { return weak_factory_.GetWeakPtr(); } @@ -438,13 +439,13 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> { size_t size, const rtc::SocketAddress& addr, std::unique_ptr* out_msg, - std::string* out_username); + std::string* out_username) override; // Checks if the address in addr is compatible with the port's ip. bool IsCompatibleAddress(const rtc::SocketAddress& addr); // Returns DSCP value packets generated by the port itself should use. - virtual rtc::DiffServCodePoint StunDscpValue() const; + rtc::DiffServCodePoint StunDscpValue() const override; // Extra work to be done in subclasses when a connection is destroyed. virtual void HandleConnectionDestroyed(Connection* conn) {} @@ -528,7 +529,6 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> { absl::string_view type, bool is_final) RTC_RUN_ON(thread_); - friend class Connection; webrtc::CallbackList port_destroyed_callback_list_; }; diff --git a/p2p/base/port_allocator.cc b/p2p/base/port_allocator.cc index 16f5afe36c..3745717510 100644 --- a/p2p/base/port_allocator.cc +++ b/p2p/base/port_allocator.cc @@ -11,13 +11,13 @@ #include "p2p/base/port_allocator.h" #include +#include #include #include #include "absl/strings/string_view.h" #include "p2p/base/ice_credentials_iterator.h" #include "rtc_base/checks.h" -#include "rtc_base/logging.h" namespace cricket { diff --git a/p2p/base/port_allocator.h b/p2p/base/port_allocator.h index 11462f78f2..b8cffca9c0 100644 --- a/p2p/base/port_allocator.h +++ b/p2p/base/port_allocator.h @@ -11,18 +11,26 @@ #ifndef P2P_BASE_PORT_ALLOCATOR_H_ #define P2P_BASE_PORT_ALLOCATOR_H_ +#include + #include #include #include #include #include "absl/strings/string_view.h" +#include "absl/types/optional.h" +#include "api/candidate.h" #include "api/sequence_checker.h" #include "api/transport/enums.h" #include "p2p/base/port.h" #include "p2p/base/port_interface.h" +#include "p2p/base/transport_description.h" +#include "rtc_base/checks.h" #include "rtc_base/helpers.h" +#include "rtc_base/network.h" #include "rtc_base/proxy_info.h" +#include "rtc_base/socket_address.h" #include "rtc_base/ssl_certificate.h" #include "rtc_base/system/rtc_export.h" #include "rtc_base/third_party/sigslot/sigslot.h" diff --git a/p2p/base/port_interface.h b/p2p/base/port_interface.h index fe4b204c95..fb8023b5dd 100644 --- a/p2p/base/port_interface.h +++ b/p2p/base/port_interface.h @@ -11,6 +11,7 @@ #ifndef P2P_BASE_PORT_INTERFACE_H_ #define P2P_BASE_PORT_INTERFACE_H_ +#include #include #include #include @@ -18,9 +19,11 @@ #include "absl/strings/string_view.h" #include "absl/types/optional.h" #include "api/candidate.h" +#include "api/packet_socket_factory.h" #include "p2p/base/transport_description.h" #include "rtc_base/async_packet_socket.h" #include "rtc_base/callback_list.h" +#include "rtc_base/proxy_info.h" #include "rtc_base/socket_address.h" namespace rtc { @@ -137,8 +140,80 @@ class PortInterface { virtual void GetStunStats(absl::optional* stats) = 0; + // Removes and deletes a connection object. `DestroyConnection` will + // delete the connection object directly whereas `DestroyConnectionAsync` + // defers the `delete` operation to when the call stack has been unwound. + // Async may be needed when deleting a connection object from within a + // callback. + virtual void DestroyConnection(Connection* conn) = 0; + + virtual void DestroyConnectionAsync(Connection* conn) = 0; + + // The thread on which this port performs its I/O. + virtual webrtc::TaskQueueBase* thread() = 0; + + // The factory used to create the sockets of this port. + virtual rtc::PacketSocketFactory* socket_factory() const = 0; + virtual const std::string& user_agent() = 0; + virtual const rtc::ProxyInfo& proxy() = 0; + + // Identifies the generation that this port was created in. + virtual uint32_t generation() const = 0; + virtual void set_generation(uint32_t generation) = 0; + virtual bool send_retransmit_count_attribute() const = 0; + // For debugging purposes. + virtual const std::string& content_name() const = 0; + + // Called when the Connection discovers a local peer reflexive candidate. + virtual void AddPrflxCandidate(const Candidate& local) = 0; + + // Foundation: An arbitrary string that is the same for two candidates + // that have the same type, base IP address, protocol (UDP, TCP, + // etc.), and STUN or TURN server. If any of these are different, + // then the foundation will be different. Two candidate pairs with + // the same foundation pairs are likely to have similar network + // characteristics. Foundations are used in the frozen algorithm. + virtual std::string ComputeFoundation( + absl::string_view type, + absl::string_view protocol, + absl::string_view relay_protocol, + const rtc::SocketAddress& base_address) = 0; + protected: PortInterface(); + virtual void UpdateNetworkCost() = 0; + + // Returns DSCP value packets generated by the port itself should use. + virtual rtc::DiffServCodePoint StunDscpValue() const = 0; + + // If the given data comprises a complete and correct STUN message then the + // return value is true, otherwise false. If the message username corresponds + // with this port's username fragment, msg will contain the parsed STUN + // message. Otherwise, the function may send a STUN response internally. + // remote_username contains the remote fragment of the STUN username. + virtual bool GetStunMessage(const char* data, + size_t size, + const rtc::SocketAddress& addr, + std::unique_ptr* out_msg, + std::string* out_username) = 0; + + // This method will return local and remote username fragements from the + // stun username attribute if present. + virtual bool ParseStunUsername(const StunMessage* stun_msg, + std::string* local_username, + std::string* remote_username) const = 0; + virtual std::string CreateStunUsername( + absl::string_view remote_username) const = 0; + + virtual bool MaybeIceRoleConflict(const rtc::SocketAddress& addr, + IceMessage* stun_msg, + absl::string_view remote_ufrag) = 0; + + virtual int16_t network_cost() const = 0; + + // Connection and Port are entangled; functions exposed to Port only + // should not be public. + friend class Connection; }; } // namespace cricket diff --git a/pc/BUILD.gn b/pc/BUILD.gn index 1f814cb1aa..a426e9b8c5 100644 --- a/pc/BUILD.gn +++ b/pc/BUILD.gn @@ -301,7 +301,7 @@ rtc_source_set("jsep_transport_controller") { "../api/transport:enums", "../api/transport:sctp_transport_factory_interface", "../media:rtc_data_sctp_transport_internal", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:ice_transport_internal", "../p2p:p2p_constants", "../p2p:p2p_transport_channel", @@ -654,7 +654,7 @@ rtc_source_set("transport_stats") { deps = [ "../api:dtls_transport_interface", "../api:libjingle_peerconnection_api", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:ice_transport_internal", "../p2p:rtc_p2p", "../rtc_base:ssl", @@ -932,7 +932,7 @@ rtc_source_set("rtc_stats_collector") { "../modules/audio_device", "../modules/audio_processing:audio_processing_statistics", "../modules/rtp_rtcp:rtp_rtcp_format", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:connection_info", "../p2p:ice_transport_internal", "../p2p:p2p_constants", @@ -1029,7 +1029,7 @@ rtc_source_set("sdp_offer_answer") { "../media:rid_description", "../media:rtc_media_base", "../media:stream_params", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:ice_transport_internal", "../p2p:p2p_constants", "../p2p:p2p_transport_channel", @@ -1140,7 +1140,7 @@ rtc_source_set("peer_connection") { "../media:stream_params", "../modules/rtp_rtcp:rtp_rtcp_format", "../p2p:basic_async_resolver_factory", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:connection_info", "../p2p:ice_transport_internal", "../p2p:p2p_constants", @@ -1237,7 +1237,7 @@ rtc_source_set("legacy_stats_collector") { "../media:media_channel", "../media:rtc_media_base", "../modules/audio_processing:audio_processing_statistics", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:connection_info", "../p2p:ice_transport_internal", "../p2p:p2p_constants", @@ -1315,7 +1315,7 @@ rtc_source_set("webrtc_sdp") { "../media:rtp_utils", "../media:stream_params", "../p2p:candidate_pair_interface", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:ice_transport_internal", "../p2p:p2p_constants", "../p2p:port_interface", @@ -1382,7 +1382,7 @@ rtc_library("ice_server_parsing") { deps = [ "../api:libjingle_peerconnection_api", "../api:rtc_error", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:port_interface", "../p2p:rtc_p2p", "../rtc_base:checks", @@ -1446,7 +1446,7 @@ rtc_source_set("peer_connection_factory") { "../call:rtp_interfaces", "../call:rtp_sender", "../media:rtc_media_base", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:rtc_p2p", "../pc:audio_track", "../pc:connection_context", @@ -2167,7 +2167,7 @@ if (rtc_include_tests && !build_with_chromium) { "../media:rtc_media_tests_utils", "../modules/audio_device:audio_device_api", "../modules/audio_processing:api", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:p2p_test_utils", "../p2p:port_interface", "../p2p:rtc_p2p", @@ -2220,7 +2220,7 @@ if (rtc_include_tests && !build_with_chromium) { "../api:libjingle_peerconnection_api", "../api:scoped_refptr", "../api/units:time_delta", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:p2p_server_utils", "../p2p:p2p_test_utils", "../p2p:port_interface", @@ -2403,7 +2403,7 @@ if (rtc_include_tests && !build_with_chromium) { "../modules/audio_device:audio_device_api", "../modules/audio_processing:audio_processing_statistics", "../modules/rtp_rtcp:rtp_rtcp_format", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:connection_info", "../p2p:fake_port_allocator", "../p2p:ice_transport_internal", @@ -2619,7 +2619,7 @@ if (rtc_include_tests && !build_with_chromium) { "../modules/audio_processing:audio_processing_statistics", "../modules/audio_processing:audioproc_test_utils", "../modules/rtp_rtcp:rtp_rtcp_format", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:fake_ice_transport", "../p2p:fake_port_allocator", "../p2p:ice_transport_internal", @@ -2773,7 +2773,7 @@ if (rtc_include_tests && !build_with_chromium) { "../modules/audio_processing", "../modules/audio_processing:api", "../modules/rtp_rtcp:rtp_rtcp_format", - "../p2p:connection_and_port", + "../p2p:connection", "../p2p:fake_port_allocator", "../p2p:p2p_test_utils", "../p2p:rtc_p2p",