From baf2dc3ddfccff0db5e828ce0842a3709818c42f Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 23 Nov 2012 21:11:01 +0900 Subject: [PATCH] shrpx: Add --backend-ipv4 and --backend-ipv6 options. --- src/shrpx.cc | 30 +++++++++++++++++++++++++++++- src/shrpx_config.cc | 6 ++++++ src/shrpx_config.h | 4 ++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/shrpx.cc b/src/shrpx.cc index 0d104b5a..617d997f 100644 --- a/src/shrpx.cc +++ b/src/shrpx.cc @@ -82,7 +82,13 @@ int cache_downstream_host_address() snprintf(service, sizeof(service), "%u", get_config()->downstream_port); memset(&hints, 0, sizeof(addrinfo)); - hints.ai_family = AF_UNSPEC; + if(get_config()->backend_ipv4) { + hints.ai_family = AF_INET; + } else if(get_config()->backend_ipv6) { + hints.ai_family = AF_INET6; + } else { + hints.ai_family = AF_UNSPEC; + } hints.ai_socktype = SOCK_STREAM; #ifdef AI_ADDRCONFIG hints.ai_flags |= AI_ADDRCONFIG; @@ -360,6 +366,8 @@ void fill_default_config() mod_config()->pid_file = 0; mod_config()->uid = 0; mod_config()->gid = 0; + mod_config()->backend_ipv4 = false; + mod_config()->backend_ipv6 = false; } } // namespace @@ -407,6 +415,10 @@ void print_help(std::ostream& out) << " --backlog= Set listen backlog size.\n" << " Default: " << get_config()->backlog << "\n" + << " --backend-ipv4 Resolve backend hostname to IPv4 address\n" + << " only.\n" + << " --backend-ipv6 Resolve backend hostname to IPv6 address\n" + << " only.\n" << "\n" << " Performance:\n" << " -n, --workers=\n" @@ -552,6 +564,8 @@ int main(int argc, char **argv) {"client", no_argument, &flag, 17 }, {"backend-spdy-window-bits", required_argument, &flag, 18 }, {"cacert", required_argument, &flag, 19 }, + {"backend-ipv4", no_argument, &flag, 20 }, + {"backend-ipv6", no_argument, &flag, 21 }, {0, 0, 0, 0 } }; int option_index = 0; @@ -681,6 +695,14 @@ int main(int argc, char **argv) // --cacert cmdcfgs.push_back(std::make_pair(SHRPX_OPT_CACERT, optarg)); break; + case 20: + // --backend-ipv4 + cmdcfgs.push_back(std::make_pair(SHRPX_OPT_BACKEND_IPV4, "yes")); + break; + case 21: + // --backend-ipv6 + cmdcfgs.push_back(std::make_pair(SHRPX_OPT_BACKEND_IPV6, "yes")); + break; default: break; } @@ -712,6 +734,12 @@ int main(int argc, char **argv) } } + if(get_config()->backend_ipv4 && get_config()->backend_ipv6) { + LOG(FATAL) << "--backend-ipv4 and --backend-ipv6 cannot be used at the " + << "same time."; + exit(EXIT_FAILURE); + } + int mode = get_config()->spdy_proxy | (get_config()->client_proxy << 1) | (get_config()->client << 2); if(mode != 0 && mode != 1 && mode != 2 && mode != 4) { diff --git a/src/shrpx_config.cc b/src/shrpx_config.cc index 0c8591a8..05520b9d 100644 --- a/src/shrpx_config.cc +++ b/src/shrpx_config.cc @@ -73,6 +73,8 @@ const char SHRPX_OPT_CIPHERS[] = "ciphers"; const char SHRPX_OPT_CLIENT[] = "client"; const char SHRPX_OPT_INSECURE[] = "insecure"; const char SHRPX_OPT_CACERT[] = "cacert"; +const char SHRPX_OPT_BACKEND_IPV4[] = "backend-ipv4"; +const char SHRPX_OPT_BACKEND_IPV6[] = "backend-ipv6"; namespace { Config *config = 0; @@ -240,6 +242,10 @@ int parse_config(const char *opt, const char *optarg) mod_config()->insecure = util::strieq(optarg, "yes"); } else if(util::strieq(opt, SHRPX_OPT_CACERT)) { set_config_str(&mod_config()->cacert, optarg); + } else if(util::strieq(opt, SHRPX_OPT_BACKEND_IPV4)) { + mod_config()->backend_ipv4 = util::strieq(optarg, "yes"); + } else if(util::strieq(opt, SHRPX_OPT_BACKEND_IPV6)) { + mod_config()->backend_ipv6 = util::strieq(optarg, "yes"); } else if(util::strieq(opt, "conf")) { LOG(WARNING) << "conf is ignored"; } else { diff --git a/src/shrpx_config.h b/src/shrpx_config.h index 926ab9b9..275afe2e 100644 --- a/src/shrpx_config.h +++ b/src/shrpx_config.h @@ -65,6 +65,8 @@ extern const char SHRPX_OPT_CIPHERS[]; extern const char SHRPX_OPT_CLIENT[]; extern const char SHRPX_OPT_INSECURE[]; extern const char SHRPX_OPT_CACERT[]; +extern const char SHRPX_OPT_BACKEND_IPV4[]; +extern const char SHRPX_OPT_BACKEND_IPV6[]; union sockaddr_union { sockaddr sa; @@ -116,6 +118,8 @@ struct Config { bool client_mode; bool insecure; char *cacert; + bool backend_ipv4; + bool backend_ipv6; }; const Config* get_config();