diff options
| -rw-r--r-- | src/AsyncNameResolverMan.cc | 34 | ||||
| -rw-r--r-- | src/AsyncNameResolverMan.h | 3 | ||||
| -rw-r--r-- | src/OptionHandlerFactory.cc | 10 | ||||
| -rw-r--r-- | src/SocketCore.cc | 2 | ||||
| -rw-r--r-- | src/prefs.cc | 2 | ||||
| -rw-r--r-- | src/prefs.h | 2 | ||||
| -rw-r--r-- | src/usage_text.h | 7 |
7 files changed, 50 insertions, 10 deletions
diff --git a/src/AsyncNameResolverMan.cc b/src/AsyncNameResolverMan.cc index be073561..d20296da 100644 --- a/src/AsyncNameResolverMan.cc +++ b/src/AsyncNameResolverMan.cc @@ -49,7 +49,11 @@ namespace aria2 { AsyncNameResolverMan::AsyncNameResolverMan() - : numResolver_(0), resolverCheck_(0), ipv4_(true), ipv6_(true) + : numResolver_(0), + resolverCheck_(0), + ipv4_(true), + ipv6_(true), + allowIpv6Only_(false) { } @@ -167,15 +171,25 @@ int AsyncNameResolverMan::getStatus() const break; } } - // If we got a IPv4 lookup response, we don't wait for a IPv6 lookup - // response. This is because DNS servers may drop AAAA queries and we - // have to wait for a long time before timeout. We don't do the - // inverse, because, based on today's deployment of DNS servers, - // almost all of them can respond to A queries just fine. - if ((success && ipv4Success) || success == numResolver_) { - return 1; + if (allowIpv6Only_ == true) { + // The waiting process of IPv4 and IPv6 lookup will eventually timeout + // the resolution of IPv6-only domains, so just report success regardless of + // which address family the result belongs to in such case. + if (success > 0) { + return 1; + } + } + else { + // If we got a IPv4 lookup response, we don't wait for a IPv6 lookup + // response. This is because DNS servers may drop AAAA queries and we + // have to wait for a long time before timeout. We don't do the + // inverse, because, based on today's deployment of DNS servers, + // almost all of them can respond to A queries just fine. + if ((success && ipv4Success) || success == numResolver_) { + return 1; + } } - else if (error == numResolver_) { + if (error == numResolver_) { return -1; } else { @@ -222,6 +236,8 @@ void configureAsyncNameResolverMan(AsyncNameResolverMan* asyncNameResolverMan, if (!net::getIPv6AddrConfigured() || option->getAsBool(PREF_DISABLE_IPV6)) { asyncNameResolverMan->setIPv6(false); } + asyncNameResolverMan->setAllowIpv6Only( + option->getAsBool(PERF_ASYNC_DNS_ALLOW_IPV6ONLY)); } } // namespace aria2 diff --git a/src/AsyncNameResolverMan.h b/src/AsyncNameResolverMan.h index 617474ec..1acd3cc6 100644 --- a/src/AsyncNameResolverMan.h +++ b/src/AsyncNameResolverMan.h @@ -58,6 +58,8 @@ public: void setIPv4(bool ipv4) { ipv4_ = ipv4; } // Enable IPv6 address lookup. default: true void setIPv6(bool ipv6) { ipv6_ = ipv6; } + // Allow resolver returning only ipv6 address. default: false + void setAllowIpv6Only(bool allow) { allowIpv6Only_ = allow; } // Returns true if asynchronous name resolution has been started. bool started() const; // Starts asynchronous name resolution. @@ -92,6 +94,7 @@ private: int resolverCheck_; bool ipv4_; bool ipv6_; + bool allowIpv6Only_; }; void configureAsyncNameResolverMan(AsyncNameResolverMan* asyncNameResolverMan, diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc index 6bff4caa..d478888e 100644 --- a/src/OptionHandlerFactory.cc +++ b/src/OptionHandlerFactory.cc @@ -255,6 +255,16 @@ std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers() op->setChangeOptionForReserved(true); handlers.push_back(op); } + { + OptionHandler* op(new BooleanOptionHandler( + PERF_ASYNC_DNS_ALLOW_IPV6ONLY, TEXT_ASYNC_DNS_ALLOW_IPV6ONLY, + A2_V_FALSE, OptionHandler::OPT_ARG)); + op->addTag(TAG_ADVANCED); + op->setInitialOption(true); + op->setChangeGlobalOption(true); + op->setChangeOptionForReserved(true); + handlers.push_back(op); + } #endif // ENABLE_ASYNC_DNS { OptionHandler* op(new BooleanOptionHandler(PREF_ENABLE_COLOR, diff --git a/src/SocketCore.cc b/src/SocketCore.cc index 8907eb4f..b82ba0b3 100644 --- a/src/SocketCore.cc +++ b/src/SocketCore.cc @@ -1699,7 +1699,7 @@ void checkAddrconfig() found = true; if (!hasGlobalIpv6Addr && inetNtop(AF_INET6, &ad.in6.sin6_addr, globalIpv6Addr, - sizeof(globalIpv6Addr) == 0)) { + sizeof(globalIpv6Addr)) == 0) { hasGlobalIpv6Addr = true; } } diff --git a/src/prefs.cc b/src/prefs.cc index fe982685..d6db87d2 100644 --- a/src/prefs.cc +++ b/src/prefs.cc @@ -322,6 +322,8 @@ PrefPtr PREF_CONDITIONAL_GET = makePref("conditional-get"); PrefPtr PREF_SELECT_LEAST_USED_HOST = makePref("select-least-used-host"); // value: true | false PrefPtr PREF_ENABLE_ASYNC_DNS6 = makePref("enable-async-dns6"); +// values: true | false +PrefPtr PERF_ASYNC_DNS_ALLOW_IPV6ONLY = makePref("async-dns-allow-ipv6only"); // value: 1*digit PrefPtr PREF_MAX_DOWNLOAD_RESULT = makePref("max-download-result"); // value: 1*digit diff --git a/src/prefs.h b/src/prefs.h index 9719b3be..0761c10d 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -275,6 +275,8 @@ extern PrefPtr PREF_CONDITIONAL_GET; extern PrefPtr PREF_SELECT_LEAST_USED_HOST; // value: true | false extern PrefPtr PREF_ENABLE_ASYNC_DNS6; +// values: true | false +extern PrefPtr PERF_ASYNC_DNS_ALLOW_IPV6ONLY; // value: 1*digit extern PrefPtr PREF_MAX_DOWNLOAD_RESULT; // value: 1*digit diff --git a/src/usage_text.h b/src/usage_text.h index ebf67e3d..7374d734 100644 --- a/src/usage_text.h +++ b/src/usage_text.h @@ -764,6 +764,13 @@ _(" --enable-async-dns6[=true|false] Enable IPv6 name resolution in asynchronous\n" \ " DNS resolver. This option will be ignored when\n" \ " --async-dns=false.") +#define TEXT_ASYNC_DNS_ALLOW_IPV6ONLY \ + _(" --async-dns-allow-ipv6only[=true|false]\n" \ + " When using asynchronous DNS resolver, aria2 will\n" \ + " wait until at least one IPv4 resolution succeeds\n" \ + " by default, which will result in the timeout of\n" \ + " the resolution of IPv6-only domains. Turn this on\n" \ + " to avoid such problem.") #define TEXT_ENABLE_DHT6 \ _(" --enable-dht6[=true|false] Enable IPv6 DHT functionality.\n" \ " Use --dht-listen-port option to specify port\n" \ |
