Added support for RFC 7413 (TCP Fast Open) on nghttpx proxy listening connections.

Fixed code as per PR comments
This commit is contained in:
Peeyush Aggarwal 2015-10-02 15:32:58 -07:00
parent e262c013bd
commit 349f3e2c7b
4 changed files with 59 additions and 1 deletions

View File

@ -102,6 +102,7 @@ OPTIONS = [
"response-phase-file",
"accept-proxy-protocol",
"conf",
"fastopen",
]
LOGVARS = [

View File

@ -107,6 +107,19 @@ namespace shrpx {
// path.
#define ENV_UNIX_PATH "NGHTTP2_UNIX_PATH"
#ifndef _KERNEL_FASTOPEN
#define _KERNEL_FASTOPEN
// conditional define for TCP_FASTOPEN mostly on ubuntu
#ifndef TCP_FASTOPEN
#define TCP_FASTOPEN 23
#endif
// conditional define for SOL_TCP mostly on ubuntu
#ifndef SOL_TCP
#define SOL_TCP 6
#endif
#endif
struct SignalServer {
SignalServer()
: ipc_fd{{-1, -1}}, server_fd(-1), server_fd6(-1),
@ -605,6 +618,14 @@ int create_tcp_server_socket(int family) {
continue;
}
if(get_config()->fastopen > 0) {
val = get_config()->fastopen;
if (setsockopt(fd, SOL_TCP, TCP_FASTOPEN, &val,
static_cast<socklen_t>(sizeof(val))) == -1) {
LOG(WARN) << "Failed to set TCP_FASTOPEN option to listener socket";
}
}
if (listen(fd, get_config()->backlog) == -1) {
auto error = errno;
LOG(WARN) << "listen() syscall failed, error=" << error;
@ -1009,6 +1030,7 @@ void fill_default_config() {
mod_config()->tls_ticket_key_memcached_max_retry = 3;
mod_config()->tls_ticket_key_memcached_max_fail = 2;
mod_config()->tls_ticket_key_memcached_interval = 10_min;
mod_config()->fastopen = 0;
}
} // namespace
@ -1217,7 +1239,14 @@ Performance:
Default: )"
<< util::utos_with_unit(get_config()->downstream_response_buffer_size)
<< R"(
--fastopen=<N>
enables TCP Fast Open for the listening socket
and limits the maximum length for the queue of connections
that have not yet completed the three-way handshake.
If value is 0 then fast open is disabled.
Default: )"
<< util::utos_with_unit(get_config()->fastopen)
<< R"(
Timeout:
--frontend-http2-read-timeout=<DURATION>
Specify read timeout for HTTP/2 and SPDY frontend
@ -1775,6 +1804,7 @@ int main(int argc, char **argv) {
{SHRPX_OPT_REQUEST_PHASE_FILE, required_argument, &flag, 91},
{SHRPX_OPT_RESPONSE_PHASE_FILE, required_argument, &flag, 92},
{SHRPX_OPT_ACCEPT_PROXY_PROTOCOL, no_argument, &flag, 93},
{SHRPX_OPT_FASTOPEN, required_argument, &flag, 94},
{nullptr, 0, nullptr, 0}};
int option_index = 0;
@ -2180,6 +2210,10 @@ int main(int argc, char **argv) {
// --accept-proxy-protocol
cmdcfgs.emplace_back(SHRPX_OPT_ACCEPT_PROXY_PROTOCOL, "yes");
break;
case 94:
// --fastopen
cmdcfgs.emplace_back(SHRPX_OPT_FASTOPEN, optarg);
break;
default:
break;
}

View File

@ -649,6 +649,7 @@ enum {
SHRPX_OPTID_DH_PARAM_FILE,
SHRPX_OPTID_ERRORLOG_FILE,
SHRPX_OPTID_ERRORLOG_SYSLOG,
SHRPX_OPTID_FASTOPEN,
SHRPX_OPTID_FETCH_OCSP_RESPONSE_FILE,
SHRPX_OPTID_FRONTEND,
SHRPX_OPTID_FRONTEND_FRAME_DEBUG,
@ -814,6 +815,11 @@ int option_lookup_token(const char *name, size_t namelen) {
return SHRPX_OPTID_PID_FILE;
}
break;
case 'n':
if (util::strieq_l("fastope", name, 7)) {
return SHRPX_OPTID_FASTOPEN;
}
break;
case 't':
if (util::strieq_l("npn-lis", name, 7)) {
return SHRPX_OPTID_NPN_LIST;
@ -1444,6 +1450,21 @@ int parse_config(const char *opt, const char *optarg,
mod_config()->errorlog_syslog = util::strieq(optarg, "yes");
return 0;
case SHRPX_OPTID_FASTOPEN: {
int n;
if (parse_int(&n, opt, optarg) != 0) {
return -1;
}
if (n < 0) {
LOG(ERROR) << opt << ": " << optarg << " is not allowed";
return -1;
}
mod_config()->fastopen = n;
return 0;
}
case SHRPX_OPTID_BACKEND_KEEP_ALIVE_TIMEOUT:
return parse_duration(&mod_config()->downstream_idle_read_timeout, opt,
optarg);

View File

@ -187,6 +187,7 @@ constexpr char SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_MAX_FAIL[] =
constexpr char SHRPX_OPT_REQUEST_PHASE_FILE[] = "request-phase-file";
constexpr char SHRPX_OPT_RESPONSE_PHASE_FILE[] = "response-phase-file";
constexpr char SHRPX_OPT_ACCEPT_PROXY_PROTOCOL[] = "accept-proxy-protocol";
constexpr char SHRPX_OPT_FASTOPEN[] = "fastopen";
union sockaddr_union {
sockaddr_storage storage;
@ -377,6 +378,7 @@ struct Config {
int syslog_facility;
int backlog;
int argc;
int fastopen;
uid_t uid;
gid_t gid;
pid_t pid;