From: Ruediger Pluem Date: Fri, 7 Nov 2025 08:32:34 +0000 (+0000) Subject: Merge r1927885, r1927916, r1928022 from trunk: X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a26b0095ca908029e205dbee218ba97be0accdc3;p=thirdparty%2Fapache%2Fhttpd.git Merge r1927885, r1927916, r1928022 from trunk: Make the value set for the socket option TCP_DEFER_ACCEPT configurable * include/ap_listen.h: - Add prototype for ap_set_listentcpdeferaccept - 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 * Follow up to r1927885: Use correct configuration variable. Thanks to @ylavic for finding this. * Follow up to r1927885: Changelog entry and documentation Reviewed by: rpluem, jorton, covener Github: closes #555 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1929574 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index f608213a84..d15c415132 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ -*- coding: utf-8 -*- Changes with Apache 2.4.66 + *) mpm_common: Add new ListenTCPDeferAccept directive that allows to specify + the value set for the TCP_DEFER_ACCEPT socket option on listen sockets. + [Ruediger Pluem] + *) mod_ssl: Add SSLVHostSNIPolicy directive to control the virtual host compatibility policy. PR 69743. [Joe Orton] diff --git a/STATUS b/STATUS index b655880142..ff1836cb57 100644 --- a/STATUS +++ b/STATUS @@ -175,17 +175,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK: 2.4.x patch: svn merge -c 1927792 ^/httpd/httpd/trunk . +1: icing, rpluem, jorton - *) mpm_common: Add new ListenTCPDeferAccept directive that allows to specify - the value set for the TCP_DEFER_ACCEPT socket option on listen sockets. - Trunk version of patch: - https://svn.apache.org/r1927885 - https://svn.apache.org/r1927916 - https://svn.apache.org/r1928022 - Backport version for 2.4.x of patch: - https://patch-diff.githubusercontent.com/raw/apache/httpd/pull/555.diff - Can be applied via apply_backport_pr.sh 555 - +1: rpluem, jorton, covener - *) mod_http2: Fix handling of 304 responses from mod_cache. PR 69580. Trunk version of patch: https://svn.apache.org/r1924267 diff --git a/docs/manual/mod/mpm_common.xml b/docs/manual/mod/mpm_common.xml index cab75eed30..252890851e 100644 --- a/docs/manual/mod/mpm_common.xml +++ b/docs/manual/mod/mpm_common.xml @@ -363,6 +363,29 @@ in *BSDs. + +ListenTCPDeferAccept +Value set for the socket option TCP_DEFER_ACCEPT if it is set +ListenTCPDeferAccept integer +ListenTCPDeferAccept 30 +server config +eventworker +prefork + +Available in Apache HTTP Server 2.5.1 and later + + +

The value specified here is set as a value for the socket option + TCP_DEFER_ACCEPT if it is set on the listen socket. + This happens when running on Linux and AcceptFilter is set to anything besides + none. In any other cases this setting is ignored. + For more details see the Linux + + tcp(7) man page.

+
+
+ MaxRequestWorkers Maximum number of connections that will be processed diff --git a/include/ap_listen.h b/include/ap_listen.h index d5ed9685c5..9b3431e0cb 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 539d6401bb..6b3d1f536f 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 cb7e59eb34..aff5348d9a 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_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"); @@ -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)