Add flag --ip_version_for_host_lookup to quic_client to indicate the preferred IP version of host address, if host lookup is needed.

PiperOrigin-RevId: 333753224
Change-Id: I4333bb7bdfdafe592410458718f571c35f8d9abe
diff --git a/quic/tools/quic_client.cc b/quic/tools/quic_client.cc
index a9a9320..16499d2 100644
--- a/quic/tools/quic_client.cc
+++ b/quic/tools/quic_client.cc
@@ -32,9 +32,12 @@
 
 namespace tools {
 
-QuicSocketAddress LookupAddress(std::string host, std::string port) {
+QuicSocketAddress LookupAddress(int address_family_for_lookup,
+                                std::string host,
+                                std::string port) {
   addrinfo hint;
   memset(&hint, 0, sizeof(hint));
+  hint.ai_family = address_family_for_lookup;
   hint.ai_protocol = IPPROTO_UDP;
 
   addrinfo* info_list = nullptr;
diff --git a/quic/tools/quic_client.h b/quic/tools/quic_client.h
index 7ce795d..ff01cec 100644
--- a/quic/tools/quic_client.h
+++ b/quic/tools/quic_client.h
@@ -31,7 +31,13 @@
 
 namespace tools {
 
-QuicSocketAddress LookupAddress(std::string host, std::string port);
+QuicSocketAddress LookupAddress(int address_family_for_lookup,
+                                std::string host,
+                                std::string port);
+
+inline QuicSocketAddress LookupAddress(std::string host, std::string port) {
+  return LookupAddress(0, host, port);
+}
 
 }  // namespace tools
 
diff --git a/quic/tools/quic_epoll_client_factory.cc b/quic/tools/quic_epoll_client_factory.cc
index 38dc582..b7dbb07 100644
--- a/quic/tools/quic_epoll_client_factory.cc
+++ b/quic/tools/quic_epoll_client_factory.cc
@@ -20,12 +20,13 @@
 std::unique_ptr<QuicSpdyClientBase> QuicEpollClientFactory::CreateClient(
     std::string host_for_handshake,
     std::string host_for_lookup,
+    int address_family_for_lookup,
     uint16_t port,
     ParsedQuicVersionVector versions,
     const QuicConfig& config,
     std::unique_ptr<ProofVerifier> verifier) {
-  QuicSocketAddress addr =
-      tools::LookupAddress(host_for_lookup, quiche::QuicheStrCat(port));
+  QuicSocketAddress addr = tools::LookupAddress(
+      address_family_for_lookup, host_for_lookup, quiche::QuicheStrCat(port));
   if (!addr.IsInitialized()) {
     QUIC_LOG(ERROR) << "Unable to resolve address: " << host_for_lookup;
     return nullptr;
diff --git a/quic/tools/quic_epoll_client_factory.h b/quic/tools/quic_epoll_client_factory.h
index 392bd6c..84dbc98 100644
--- a/quic/tools/quic_epoll_client_factory.h
+++ b/quic/tools/quic_epoll_client_factory.h
@@ -16,6 +16,7 @@
   std::unique_ptr<QuicSpdyClientBase> CreateClient(
       std::string host_for_handshake,
       std::string host_for_lookup,
+      int address_family_for_lookup,
       uint16_t port,
       ParsedQuicVersionVector versions,
       const QuicConfig& config,
diff --git a/quic/tools/quic_toy_client.cc b/quic/tools/quic_toy_client.cc
index b42f967..3bd5834 100644
--- a/quic/tools/quic_toy_client.cc
+++ b/quic/tools/quic_toy_client.cc
@@ -41,6 +41,7 @@
 // instructions at go/quic_client_binary_update
 
 #include "net/third_party/quiche/src/quic/tools/quic_toy_client.h"
+#include <sys/socket.h>
 
 #include <iostream>
 #include <memory>
@@ -78,6 +79,12 @@
 DEFINE_QUIC_COMMAND_LINE_FLAG(int32_t, port, 0, "The port to connect to.");
 
 DEFINE_QUIC_COMMAND_LINE_FLAG(std::string,
+                              ip_version_for_host_lookup,
+                              "",
+                              "Only used if host address lookup is needed. "
+                              "4=ipv4; 6=ipv6; otherwise=don't care.");
+
+DEFINE_QUIC_COMMAND_LINE_FLAG(std::string,
                               body,
                               "",
                               "If set, send a POST with this body.");
@@ -259,9 +266,17 @@
         ParseQuicTagVector(client_connection_options_string));
   }
 
+  int address_family_for_lookup = AF_UNSPEC;
+  if (GetQuicFlag(FLAGS_ip_version_for_host_lookup) == "4") {
+    address_family_for_lookup = AF_INET;
+  } else if (GetQuicFlag(FLAGS_ip_version_for_host_lookup) == "6") {
+    address_family_for_lookup = AF_INET6;
+  }
+
   // Build the client, and try to connect.
   std::unique_ptr<QuicSpdyClientBase> client = client_factory_->CreateClient(
-      url.host(), host, port, versions, config, std::move(proof_verifier));
+      url.host(), host, address_family_for_lookup, port, versions, config,
+      std::move(proof_verifier));
 
   if (client == nullptr) {
     std::cerr << "Failed to create client." << std::endl;
diff --git a/quic/tools/quic_toy_client.h b/quic/tools/quic_toy_client.h
index d9d8eca..bf56bf8 100644
--- a/quic/tools/quic_toy_client.h
+++ b/quic/tools/quic_toy_client.h
@@ -24,6 +24,8 @@
     virtual std::unique_ptr<QuicSpdyClientBase> CreateClient(
         std::string host_for_handshake,
         std::string host_for_lookup,
+        // AF_INET, AF_INET6, or AF_UNSPEC(=don't care).
+        int address_family_for_lookup,
         uint16_t port,
         ParsedQuicVersionVector versions,
         const QuicConfig& config,