Allow masque_client to select IP address family for DNS
PiperOrigin-RevId: 486345506
diff --git a/quiche/quic/masque/masque_client_bin.cc b/quiche/quic/masque/masque_client_bin.cc
index 58c388b..b0ec7c0 100644
--- a/quiche/quic/masque/masque_client_bin.cc
+++ b/quiche/quic/masque/masque_client_bin.cc
@@ -32,6 +32,10 @@
bool, disable_certificate_verification, false,
"If true, don't verify the server certificate.");
+DEFINE_QUICHE_COMMAND_LINE_FLAG(int, address_family, 0,
+ "IP address family to use. Must be 0, 4 or 6. "
+ "Defaults to 0 which means any.");
+
DEFINE_QUICHE_COMMAND_LINE_FLAG(
std::string, masque_mode, "",
"Allows setting MASQUE mode, currently only valid value is \"open\".");
@@ -99,6 +103,19 @@
return 1;
}
}
+ const int address_family =
+ quiche::GetQuicheCommandLineFlag(FLAGS_address_family);
+ int address_family_for_lookup;
+ if (address_family == 0) {
+ address_family_for_lookup = AF_UNSPEC;
+ } else if (address_family == 4) {
+ address_family_for_lookup = AF_INET;
+ } else if (address_family == 6) {
+ address_family_for_lookup = AF_INET6;
+ } else {
+ std::cerr << "Invalid address_family " << address_family << std::endl;
+ return 1;
+ }
std::unique_ptr<MasqueClient> masque_client = MasqueClient::Create(
uri_template, masque_mode, event_loop.get(), std::move(proof_verifier));
if (masque_client == nullptr) {
@@ -111,7 +128,7 @@
for (size_t i = 1; i < urls.size(); ++i) {
if (!tools::SendEncapsulatedMasqueRequest(
masque_client.get(), event_loop.get(), urls[i],
- disable_certificate_verification)) {
+ disable_certificate_verification, address_family_for_lookup)) {
return 1;
}
}
diff --git a/quiche/quic/masque/masque_client_tools.cc b/quiche/quic/masque/masque_client_tools.cc
index 06ca3ef..e7405ec 100644
--- a/quiche/quic/masque/masque_client_tools.cc
+++ b/quiche/quic/masque/masque_client_tools.cc
@@ -18,7 +18,8 @@
bool SendEncapsulatedMasqueRequest(MasqueClient* masque_client,
QuicEventLoop* event_loop,
std::string url_string,
- bool disable_certificate_verification) {
+ bool disable_certificate_verification,
+ int address_family_for_lookup) {
const QuicUrl url(url_string, "https");
std::unique_ptr<ProofVerifier> proof_verifier;
if (disable_certificate_verification) {
@@ -28,8 +29,8 @@
}
// Build the client, and try to connect.
- const QuicSocketAddress addr =
- LookupAddress(url.host(), absl::StrCat(url.port()));
+ const QuicSocketAddress addr = LookupAddress(
+ address_family_for_lookup, url.host(), absl::StrCat(url.port()));
if (!addr.IsInitialized()) {
QUIC_LOG(ERROR) << "Unable to resolve address: " << url.host();
return false;
diff --git a/quiche/quic/masque/masque_client_tools.h b/quiche/quic/masque/masque_client_tools.h
index 307a09f..bb30a14 100644
--- a/quiche/quic/masque/masque_client_tools.h
+++ b/quiche/quic/masque/masque_client_tools.h
@@ -17,7 +17,8 @@
bool SendEncapsulatedMasqueRequest(MasqueClient* masque_client,
QuicEventLoop* event_loop,
std::string url_string,
- bool disable_certificate_verification);
+ bool disable_certificate_verification,
+ int address_family_for_lookup);
} // namespace tools
} // namespace quic