Provide Environment when creating PacketSockets Once always provided, PacketSocket classes will be able to use Environment to query propagated clock. Bug: webrtc:42223992 Change-Id: I18b40694ae4598f9026b9fe3693a2e42e45e24aa Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/407282 Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/main@{#45549}
diff --git a/api/BUILD.gn b/api/BUILD.gn index eefa01c..f7aa830 100644 --- a/api/BUILD.gn +++ b/api/BUILD.gn
@@ -179,7 +179,6 @@ ":audio_options_api", ":make_ref_counted", ":ref_count", - ":ref_count", ":rtp_parameters", ":scoped_refptr", ":sequence_checker", @@ -481,6 +480,8 @@ "../rtc_base:socket_address", "../rtc_base:ssl", "../rtc_base/system:rtc_export", + "environment", + "//third_party/abseil-cpp/absl/memory", ] }
diff --git a/api/packet_socket_factory.h b/api/packet_socket_factory.h index 3c98b24..df48f3b 100644 --- a/api/packet_socket_factory.h +++ b/api/packet_socket_factory.h
@@ -16,7 +16,9 @@ #include <string> #include <vector> +#include "absl/memory/memory.h" #include "api/async_dns_resolver.h" +#include "api/environment/environment.h" #include "rtc_base/async_packet_socket.h" #include "rtc_base/socket_address.h" #include "rtc_base/ssl_certificate.h" @@ -52,8 +54,42 @@ }; PacketSocketFactory() = default; + + PacketSocketFactory(const PacketSocketFactory&) = delete; + PacketSocketFactory& operator=(const PacketSocketFactory&) = delete; + virtual ~PacketSocketFactory() = default; + virtual std::unique_ptr<AsyncPacketSocket> CreateUdpSocket( + const Environment& /*env*/, + const SocketAddress& address, + uint16_t min_port, + uint16_t max_port) { + return absl::WrapUnique(CreateUdpSocket(address, min_port, max_port)); + } + + virtual std::unique_ptr<AsyncListenSocket> CreateServerTcpSocket( + const Environment& /*env*/, + const SocketAddress& local_address, + uint16_t min_port, + uint16_t max_port, + int opts) { + return absl::WrapUnique( + CreateServerTcpSocket(local_address, min_port, max_port, opts)); + } + + virtual std::unique_ptr<AsyncPacketSocket> CreateClientTcpSocket( + const Environment& /*env*/, + const SocketAddress& local_address, + const SocketAddress& remote_address, + const PacketSocketTcpOptions& tcp_options) { + return absl::WrapUnique( + CreateClientTcpSocket(local_address, remote_address, tcp_options)); + } + + // TODO: bugs.webrtc.org/42223992 - deprecate all 3 CreateSomeSocket functions + // below when WebRTC and downstream users are updated to always provide + // Environment to construct a packet socket. virtual AsyncPacketSocket* CreateUdpSocket(const SocketAddress& address, uint16_t min_port, uint16_t max_port) = 0; @@ -70,10 +106,6 @@ virtual std::unique_ptr<AsyncDnsResolverInterface> CreateAsyncDnsResolver() = 0; - - private: - PacketSocketFactory(const PacketSocketFactory&) = delete; - PacketSocketFactory& operator=(const PacketSocketFactory&) = delete; }; } // namespace webrtc
diff --git a/p2p/BUILD.gn b/p2p/BUILD.gn index 34f6ef1..34fb40c 100644 --- a/p2p/BUILD.gn +++ b/p2p/BUILD.gn
@@ -154,6 +154,7 @@ "../rtc_base:net_helpers", "../rtc_base:network", "../rtc_base:network_constants", + "../rtc_base:platform_thread_types", "../rtc_base:socket_address", "../rtc_base:stringutils", "../rtc_base:threading",
diff --git a/p2p/base/stun_port.cc b/p2p/base/stun_port.cc index 9adfeeb..3a001a4 100644 --- a/p2p/base/stun_port.cc +++ b/p2p/base/stun_port.cc
@@ -216,8 +216,10 @@ stun_keepalive_lifetime_ = GetStunKeepaliveLifetime(); if (!SharedSocket()) { RTC_DCHECK(socket_ == nullptr); - socket_ = socket_factory()->CreateUdpSocket( - SocketAddress(Network()->GetBestIP(), 0), min_port(), max_port()); + owned_socket_ = socket_factory()->CreateUdpSocket( + env(), SocketAddress(Network()->GetBestIP(), 0), min_port(), + max_port()); + socket_ = owned_socket_.get(); if (!socket_) { RTC_LOG(LS_WARNING) << ToString() << ": UDP socket creation failed"; return false; @@ -233,10 +235,7 @@ return true; } -UDPPort::~UDPPort() { - if (!SharedSocket()) - delete socket_; -} +UDPPort::~UDPPort() = default; void UDPPort::PrepareAddress() { RTC_DCHECK(request_manager_.empty());
diff --git a/p2p/base/stun_port.h b/p2p/base/stun_port.h index 171e232..c674237 100644 --- a/p2p/base/stun_port.h +++ b/p2p/base/stun_port.h
@@ -232,7 +232,9 @@ ServerAddresses bind_request_succeeded_servers_; ServerAddresses bind_request_failed_servers_; StunRequestManager request_manager_; + AsyncPacketSocket* socket_; + std::unique_ptr<AsyncPacketSocket> owned_socket_; int error_; int send_error_count_ = 0; std::unique_ptr<AddressResolver> resolver_;
diff --git a/p2p/base/tcp_port.cc b/p2p/base/tcp_port.cc index 1e72b11..91bc855 100644 --- a/p2p/base/tcp_port.cc +++ b/p2p/base/tcp_port.cc
@@ -73,7 +73,6 @@ #include <utility> #include "absl/algorithm/container.h" -#include "absl/memory/memory.h" #include "absl/strings/string_view.h" #include "api/candidate.h" #include "api/environment/environment.h" @@ -299,9 +298,9 @@ } void TCPPort::TryCreateServerSocket() { - listen_socket_ = absl::WrapUnique(socket_factory()->CreateServerTcpSocket( - SocketAddress(Network()->GetBestIP(), 0), min_port(), max_port(), - false /* ssl */)); + listen_socket_ = socket_factory()->CreateServerTcpSocket( + env(), SocketAddress(Network()->GetBestIP(), 0), min_port(), max_port(), + /*opts=*/0); if (!listen_socket_) { RTC_LOG(LS_WARNING) << ToString() @@ -599,9 +598,9 @@ PacketSocketTcpOptions tcp_opts; tcp_opts.opts = opts; - socket_.reset(port()->socket_factory()->CreateClientTcpSocket( - SocketAddress(port()->Network()->GetBestIP(), 0), - remote_candidate().address(), tcp_opts)); + socket_ = port()->socket_factory()->CreateClientTcpSocket( + env(), SocketAddress(port()->Network()->GetBestIP(), 0), + remote_candidate().address(), tcp_opts); if (socket_) { RTC_LOG(LS_VERBOSE) << ToString() << ": Connecting from " << socket_->GetLocalAddress().ToSensitiveString()
diff --git a/p2p/base/turn_port.cc b/p2p/base/turn_port.cc index fe18fa6..1c0a386 100644 --- a/p2p/base/turn_port.cc +++ b/p2p/base/turn_port.cc
@@ -300,10 +300,6 @@ if (socket_) socket_->UnsubscribeCloseEvent(this); - - if (!SharedSocket()) { - delete socket_; - } } void TurnPort::set_realm(absl::string_view realm) { @@ -437,8 +433,10 @@ RTC_DCHECK(!socket_ || SharedSocket()); if (server_address_.proto == PROTO_UDP && !SharedSocket()) { - socket_ = socket_factory()->CreateUdpSocket( - SocketAddress(Network()->GetBestIP(), 0), min_port(), max_port()); + owned_socket_ = socket_factory()->CreateUdpSocket( + env(), SocketAddress(Network()->GetBestIP(), 0), min_port(), + max_port()); + socket_ = owned_socket_.get(); } else if (server_address_.proto == PROTO_TCP || server_address_.proto == PROTO_TLS) { RTC_DCHECK(!SharedSocket()); @@ -459,9 +457,10 @@ tcp_options.tls_alpn_protocols = tls_alpn_protocols_; tcp_options.tls_elliptic_curves = tls_elliptic_curves_; tcp_options.tls_cert_verifier = tls_cert_verifier_; - socket_ = socket_factory()->CreateClientTcpSocket( - SocketAddress(Network()->GetBestIP(), 0), server_address_.address, - tcp_options); + owned_socket_ = socket_factory()->CreateClientTcpSocket( + env(), SocketAddress(Network()->GetBestIP(), 0), + server_address_.address, tcp_options); + socket_ = owned_socket_.get(); } if (!socket_) { @@ -589,9 +588,8 @@ if (SharedSocket()) { ResetSharedSocket(); - } else { - delete socket_; } + owned_socket_ = nullptr; socket_ = nullptr; ResetNonce(); @@ -1017,7 +1015,7 @@ RTC_DCHECK(server_address().proto == PROTO_TCP || server_address().proto == PROTO_TLS); RTC_DCHECK(!SharedSocket()); - delete socket_; + owned_socket_ = nullptr; socket_ = nullptr; PrepareAddress(); }
diff --git a/p2p/base/turn_port.h b/p2p/base/turn_port.h index 0674a5a..8955acf 100644 --- a/p2p/base/turn_port.h +++ b/p2p/base/turn_port.h
@@ -326,6 +326,7 @@ AttemptedServerSet attempted_server_addresses_; AsyncPacketSocket* socket_; + std::unique_ptr<AsyncPacketSocket> owned_socket_; SocketOptionsMap socket_options_; std::unique_ptr<AsyncDnsResolverInterface> resolver_; int error_;
diff --git a/p2p/client/basic_port_allocator.cc b/p2p/client/basic_port_allocator.cc index eb61d7e..a83f7db 100644 --- a/p2p/client/basic_port_allocator.cc +++ b/p2p/client/basic_port_allocator.cc
@@ -46,10 +46,10 @@ #include "rtc_base/ip_address.h" #include "rtc_base/logging.h" #include "rtc_base/net_helper.h" -#include "rtc_base/net_helpers.h" #include "rtc_base/network.h" #include "rtc_base/network/received_packet.h" #include "rtc_base/network_constants.h" +#include "rtc_base/platform_thread_types.h" #include "rtc_base/socket_address.h" #include "rtc_base/strings/string_builder.h" #include "rtc_base/thread.h" @@ -1268,9 +1268,10 @@ void AllocationSequence::Init() { if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) { - udp_socket_.reset(session_->socket_factory()->CreateUdpSocket( - SocketAddress(network_->GetBestIP(), 0), - session_->allocator()->min_port(), session_->allocator()->max_port())); + BasicPortAllocator& allocator = *session_->allocator(); + udp_socket_ = session_->socket_factory()->CreateUdpSocket( + allocator.env(), SocketAddress(network_->GetBestIP(), 0), + allocator.min_port(), allocator.max_port()); if (udp_socket_) { udp_socket_->RegisterReceivedPacketCallback( [&](AsyncPacketSocket* socket, const ReceivedIpPacket& packet) {