From 456eb41973e855a4f777290697eedc27a94ff2bb Mon Sep 17 00:00:00 2001 From: Ruediger Pluem Date: Tue, 19 Aug 2025 12:45:15 +0000 Subject: [PATCH 1/2] Make the value set for the socket option TCP_DEFER_ACCEPT configurable * include/ap_listen.h: - Add prototype for include/ap_listen.heraccept - Wire in new directive ListenTCPDeferAccept * include/mpm_common.h: Define the previous static value as default value via DEFAULT_TCP_DEFER_ACCEPT * server/listen.c: - Add static int ap_listentcpdeferaccept - ap_apply_accept_filter: Use value of ap_listenbacklog for setting TCP_DEFER_ACCEPT - ap_listen_pre_config: Set default value - Add ap_set_listentcpdeferaccept git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1927885 13f79535-47bb-0310-9956-ffa450edef68 (cherry picked from commit 713100ca6a88eaf270285f50e56af070bb9feed2) --- include/ap_listen.h | 5 ++++- include/mpm_common.h | 8 ++++++++ server/listen.c | 24 +++++++++++++++++++++++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/include/ap_listen.h b/include/ap_listen.h index d5ed9685c54..9b3431e0cb3 100644 --- a/include/ap_listen.h +++ b/include/ap_listen.h @@ -135,6 +135,7 @@ AP_DECLARE_NONSTD(int) ap_close_selected_listeners(ap_slave_t *); * called. */ AP_DECLARE_NONSTD(const char *) ap_set_listenbacklog(cmd_parms *cmd, void *dummy, const char *arg); +AP_DECLARE_NONSTD(const char *) ap_set_listentcpdeferaccept(cmd_parms *cmd, void *dummy, const char *arg); AP_DECLARE_NONSTD(const char *) ap_set_listencbratio(cmd_parms *cmd, void *dummy, const char *arg); AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy, int argc, char *const argv[]); @@ -163,7 +164,9 @@ AP_INIT_TAKE_ARGV("Listen", ap_set_listener, NULL, RSRC_CONF, \ AP_INIT_TAKE1("SendBufferSize", ap_set_send_buffer_size, NULL, RSRC_CONF, \ "Send buffer size in bytes"), \ AP_INIT_TAKE1("ReceiveBufferSize", ap_set_receive_buffer_size, NULL, \ - RSRC_CONF, "Receive buffer size in bytes") + RSRC_CONF, "Receive buffer size in bytes"), \ +AP_INIT_TAKE1("ListenTCPDeferAccept", ap_set_listentcpdeferaccept, NULL, RSRC_CONF, \ + "Value set for the socket option TCP_DEFER_ACCEPT if it is set") #ifdef __cplusplus } diff --git a/include/mpm_common.h b/include/mpm_common.h index 539d6401bb3..6b3d1f536fb 100644 --- a/include/mpm_common.h +++ b/include/mpm_common.h @@ -63,6 +63,14 @@ extern "C" { #define DEFAULT_LISTENBACKLOG 511 #endif +/* + * Define the default value set for the socket option TCP_DEFER_ACCEPT + * if it is set. + */ +#ifndef DEFAULT_TCP_DEFER_ACCEPT +#define DEFAULT_TCP_DEFER_ACCEPT 30 +#endif + /* Signal used to gracefully restart */ #define AP_SIG_GRACEFUL SIGUSR1 diff --git a/server/listen.c b/server/listen.c index cb7e59eb34c..cd1250f1f0c 100644 --- a/server/listen.c +++ b/server/listen.c @@ -57,6 +57,7 @@ AP_DECLARE_DATA int ap_have_so_reuseport = -1; static ap_listen_rec *old_listeners; static int ap_listenbacklog; +static int ap_listentcpdeferaccept; static int ap_listencbratio; static int send_buffer_size; static int receive_buffer_size; @@ -268,7 +269,7 @@ static void ap_apply_accept_filter(apr_pool_t *p, ap_listen_rec *lis, accf); } #else - rv = apr_socket_opt_set(s, APR_TCP_DEFER_ACCEPT, 30); + rv = apr_socket_opt_set(s, APR_TCP_DEFER_ACCEPT, ap_listenbacklog); if (rv != APR_SUCCESS && !APR_STATUS_IS_ENOTIMPL(rv)) { ap_log_perror(APLOG_MARK, APLOG_WARNING, rv, p, APLOGNO(00076) "Failed to enable APR_TCP_DEFER_ACCEPT"); @@ -947,6 +948,7 @@ AP_DECLARE(void) ap_listen_pre_config(void) ap_listen_buckets = NULL; ap_num_listen_buckets = 0; ap_listenbacklog = DEFAULT_LISTENBACKLOG; + ap_listentcpdeferaccept = DEFAULT_TCP_DEFER_ACCEPT; ap_listencbratio = 0; /* Check once whether or not SO_REUSEPORT is supported. */ @@ -1076,6 +1078,26 @@ AP_DECLARE_NONSTD(const char *) ap_set_listenbacklog(cmd_parms *cmd, return NULL; } +AP_DECLARE_NONSTD(const char *) ap_set_listentcpdeferaccept(cmd_parms *cmd, + void *dummy, + const char *arg) +{ + int b; + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + + b = atoi(arg); + if (b < 1) { + return "ListenTCPDeferAccept must be > 0"; + } + + ap_listentcpdeferaccept = b; + return NULL; +} + AP_DECLARE_NONSTD(const char *) ap_set_listencbratio(cmd_parms *cmd, void *dummy, const char *arg) From 1d2d0c5479f87dbe2887ce168fc551a3bb229cbe Mon Sep 17 00:00:00 2001 From: Ruediger Pluem Date: Wed, 20 Aug 2025 13:39:03 +0000 Subject: [PATCH 2/2] * Use correct configuration variable git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1927916 13f79535-47bb-0310-9956-ffa450edef68 (cherry picked from commit 078449eeeaaf55b79a673b38ed44da4c711c92a8) --- server/listen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/listen.c b/server/listen.c index cd1250f1f0c..aff5348d9a6 100644 --- a/server/listen.c +++ b/server/listen.c @@ -269,7 +269,7 @@ static void ap_apply_accept_filter(apr_pool_t *p, ap_listen_rec *lis, accf); } #else - rv = apr_socket_opt_set(s, APR_TCP_DEFER_ACCEPT, ap_listenbacklog); + rv = apr_socket_opt_set(s, APR_TCP_DEFER_ACCEPT, ap_listentcpdeferaccept); if (rv != APR_SUCCESS && !APR_STATUS_IS_ENOTIMPL(rv)) { ap_log_perror(APLOG_MARK, APLOG_WARNING, rv, p, APLOGNO(00076) "Failed to enable APR_TCP_DEFER_ACCEPT");