Decouple bind interface from socket creation to more easily reuse in different implementations.

No behavioral change.

PiperOrigin-RevId: 485633421
diff --git a/quiche/quic/tools/quic_client_default_network_helper.cc b/quiche/quic/tools/quic_client_default_network_helper.cc
index 8a9a347..ab9e1b1 100644
--- a/quiche/quic/tools/quic_client_default_network_helper.cc
+++ b/quiche/quic/tools/quic_client_default_network_helper.cc
@@ -234,17 +234,25 @@
   *overflow_supported = api.EnableDroppedPacketCount(fd);
   api.EnableReceiveTimestamp(fd);
 
+  if (!BindInterfaceNameIfNeeded(fd)) {
+    CleanUpUDPSocket(fd);
+    return kQuicInvalidSocketFd;
+  }
+
+  return fd;
+}
+
+bool QuicClientDefaultNetworkHelper::BindInterfaceNameIfNeeded(int fd) {
+  QuicUdpSocketApi api;
   std::string interface_name = client_->interface_name();
   if (!interface_name.empty()) {
     if (!api.BindInterface(fd, interface_name)) {
       QUIC_DLOG(WARNING) << "Failed to bind socket (" << fd
                          << ") to interface (" << interface_name << ").";
-      CleanUpUDPSocket(fd);
-      return kQuicInvalidSocketFd;
+      return false;
     }
   }
-
-  return fd;
+  return true;
 }
 
 }  // namespace quic
diff --git a/quiche/quic/tools/quic_client_default_network_helper.h b/quiche/quic/tools/quic_client_default_network_helper.h
index a8ebc9d..a44af16 100644
--- a/quiche/quic/tools/quic_client_default_network_helper.h
+++ b/quiche/quic/tools/quic_client_default_network_helper.h
@@ -93,6 +93,9 @@
     fds_unregistered_externally_ = true;
   }
 
+  // Bind a socket to a specific network interface.
+  bool BindInterfaceNameIfNeeded(int fd);
+
  private:
   // Actually clean up |fd|.
   void CleanUpUDPSocketImpl(int fd);