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) {