summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGES6
-rw-r--r--docs/manual/mod/mod_proxy.xml4
-rw-r--r--docs/manual/mod/mpm_common.xml6
-rw-r--r--include/ap_listen.h1
-rw-r--r--include/ap_mmn.h3
-rw-r--r--modules/proxy/mod_proxy.c12
-rw-r--r--modules/proxy/mod_proxy.h1
-rw-r--r--modules/proxy/proxy_util.c2
-rw-r--r--server/listen.c22
9 files changed, 53 insertions, 4 deletions
diff --git a/CHANGES b/CHANGES
index b96efd7cc7..db3374a91e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,12 @@
-*- coding: utf-8 -*-
Changes with Apache 2.5.1
+ *) core: Add "multipathtcp" Listen option. PR 69292.
+ [Anthony Doeraene <anthony.doeraene hotmail.com>]
+
+ *) mod_proxy: Add "multipathtcp" worker parameter. PR 69292.
+ [Anthony Doeraene <anthony.doeraene hotmail.com>]
+
*) mod_authnz_ldap.c: Make sure the authentication variables are set in
all cases where another module is the source of the authentication,
and that authenticated user is looked up in LDAP. [Graham Leggett]
diff --git a/docs/manual/mod/mod_proxy.xml b/docs/manual/mod/mod_proxy.xml
index 26247303bd..4a44ad5bb9 100644
--- a/docs/manual/mod/mod_proxy.xml
+++ b/docs/manual/mod/mod_proxy.xml
@@ -1326,6 +1326,10 @@ ProxyPass "/example" "http://backend.example.com" max=20 ttl=120 retry=300
<td><p>TTL in seconds for how long DNS resolutions of the backend address are cached.
-1 means until restart of Apache httpd.</p>
</td></tr>
+ <tr><td><a id="multipathtcp" name="multipathtcp">multipathtcp</a></td>
+ <td>Off</td>
+ <td><p>Enable/disable the use of <a href="https://mptcp.dev">Multipath TCP (MPTCP)</a></p>
+ </td></tr>
</table>
diff --git a/docs/manual/mod/mpm_common.xml b/docs/manual/mod/mpm_common.xml
index bd6840c5a8..36bf061cc2 100644
--- a/docs/manual/mod/mpm_common.xml
+++ b/docs/manual/mod/mpm_common.xml
@@ -278,6 +278,12 @@ Listen 192.170.2.5:8000
to the same port. (If the server is built with IPv4-mapped
addresses <em>disabled</em>, this is the default behaviour and
this option has no effect.)</li>
+
+ <li><code>multipathtcp</code>: Enable the use of
+ <a href="https://mptcp.dev">Multipath TCP (MPTCP)</a> for the
+ sockets. Beware that this option is currently limited to Linux
+ only.
+ </li>
</ul>
<note><title>Error condition</title>
diff --git a/include/ap_listen.h b/include/ap_listen.h
index 184f352574..87cbc119dd 100644
--- a/include/ap_listen.h
+++ b/include/ap_listen.h
@@ -44,6 +44,7 @@ typedef apr_status_t (*accept_function)(void **csd, ap_listen_rec *lr, apr_pool_
#define AP_LISTEN_FREEBIND (0x0002)
#define AP_LISTEN_REUSEPORT (0x0004)
#define AP_LISTEN_V6ONLY (0x0008)
+#define AP_LISTEN_MPTCP (0x0010)
/**
* @brief Apache's listeners record.
diff --git a/include/ap_mmn.h b/include/ap_mmn.h
index c9ae4c157c..659520f745 100644
--- a/include/ap_mmn.h
+++ b/include/ap_mmn.h
@@ -732,6 +732,7 @@
* 20211221.24 (2.5.1-dev) Add ap_proxy_fixup_uds_filename()
* 20211221.25 (2.5.1-dev) AP_SLASHES and AP_IS_SLASH
* 20211221.26 (2.5.1-dev) Add is_host_matchable to proxy_worker_shared
+ * 20211221.27 (2.5.1-dev) Add sock_proto to proxy_worker_shared, and AP_LISTEN_MPTCP
*/
#define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
@@ -739,7 +740,7 @@
#ifndef MODULE_MAGIC_NUMBER_MAJOR
#define MODULE_MAGIC_NUMBER_MAJOR 20211221
#endif
-#define MODULE_MAGIC_NUMBER_MINOR 26 /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 27 /* 0...n */
/**
* Determine if the server's current MODULE_MAGIC_NUMBER is at least a
diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c
index 0cce98ddf1..46d3b07145 100644
--- a/modules/proxy/mod_proxy.c
+++ b/modules/proxy/mod_proxy.c
@@ -356,6 +356,18 @@ static const char *set_worker_param(apr_pool_t *p,
worker->s->response_field_size = (s ? s : HUGE_STRING_LEN);
worker->s->response_field_size_set = 1;
}
+ else if (!strcasecmp(key, "multipathtcp")) {
+#ifdef IPPROTO_MPTCP
+ if (!strcasecmp(val, "On"))
+ worker->s->sock_proto = IPPROTO_MPTCP;
+ else if (!strcasecmp(val, "Off"))
+ worker->s->sock_proto = APR_PROTO_TCP;
+ else
+ return "multipathtcp must be On|Off";
+#else
+ return "multipathtcp is not supported on your platform";
+#endif
+ }
else {
if (set_worker_hc_param_f) {
return set_worker_hc_param_f(p, s, worker, key, val, NULL);
diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h
index 6594159e98..d51510fc02 100644
--- a/modules/proxy/mod_proxy.h
+++ b/modules/proxy/mod_proxy.h
@@ -497,6 +497,7 @@ typedef struct {
unsigned int address_ttl_set:1;
apr_int32_t address_ttl; /* backend address' TTL (seconds) */
apr_uint32_t address_expiry; /* backend address' next expiry time */
+ int sock_proto; /* The protocol to use to create the socket */
} proxy_worker_shared;
#define ALIGNED_PROXY_WORKER_SHARED_SIZE (APR_ALIGN_DEFAULT(sizeof(proxy_worker_shared)))
diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c
index 1a11498f5d..546398da14 100644
--- a/modules/proxy/proxy_util.c
+++ b/modules/proxy/proxy_util.c
@@ -3858,7 +3858,7 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
#endif
{
if ((rv = apr_socket_create(&newsock, backend_addr->family,
- SOCK_STREAM, APR_PROTO_TCP,
+ SOCK_STREAM, worker->s->sock_proto,
conn->scpool)) != APR_SUCCESS) {
loglevel = backend_addr->next ? APLOG_DEBUG : APLOG_ERR;
ap_log_error(APLOG_MARK, loglevel, rv, s, APLOGNO(00952)
diff --git a/server/listen.c b/server/listen.c
index 3aed907e21..cee11943b2 100644
--- a/server/listen.c
+++ b/server/listen.c
@@ -496,6 +496,12 @@ static const char *alloc_listener(process_rec *process, const char *addr,
while (sa) {
ap_listen_rec *new;
+ int sock_proto = 0;
+
+#ifdef IPPROTO_MPTCP
+ if (flags & AP_LISTEN_MPTCP)
+ sock_proto = IPPROTO_MPTCP;
+#endif
/* this has to survive restarts */
new = apr_palloc(process->pool, sizeof(ap_listen_rec));
@@ -509,7 +515,7 @@ static const char *alloc_listener(process_rec *process, const char *addr,
sa = sa->next;
status = apr_socket_create(&new->sd, new->bind_addr->family,
- SOCK_STREAM, 0, process->pool);
+ SOCK_STREAM, sock_proto, process->pool);
#if APR_HAVE_IPV6
/* What could happen is that we got an IPv6 address, but this system
@@ -864,6 +870,7 @@ AP_DECLARE(apr_status_t) ap_duplicate_listeners(apr_pool_t *p, server_rec *s,
char *hostname;
apr_port_t port;
apr_sockaddr_t *sa;
+ int sock_proto = 0;
#ifdef HAVE_SYSTEMD
if (use_systemd) {
int thesock;
@@ -891,8 +898,12 @@ AP_DECLARE(apr_status_t) ap_duplicate_listeners(apr_pool_t *p, server_rec *s,
duplr->bind_addr = sa;
duplr->next = NULL;
duplr->flags = lr->flags;
+#ifdef IPPROTO_MPTCP
+ if (duplr->flags & AP_LISTEN_MPTCP)
+ sock_proto = IPPROTO_MPTCP;
+#endif
stat = apr_socket_create(&duplr->sd, duplr->bind_addr->family,
- SOCK_STREAM, 0, p);
+ SOCK_STREAM, sock_proto, p);
if (stat != APR_SUCCESS) {
ap_log_perror(APLOG_MARK, APLOG_CRIT, 0, p, APLOGNO(02640)
"ap_duplicate_listeners: for address %pI, "
@@ -1038,6 +1049,13 @@ static const char *parse_listen_flags(apr_pool_t *temp_pool, const char *arg,
flags |= AP_LISTEN_REUSEPORT;
else if (ap_cstr_casecmp(token, "v6only") == 0)
flags |= AP_LISTEN_V6ONLY;
+ else if (ap_cstr_casecmp(token, "multipathtcp") == 0)
+#ifdef IPPROTO_MPTCP
+ flags |= AP_LISTEN_MPTCP;
+#else
+ return apr_psprintf(temp_pool, "Listen option '%s' in '%s' is not supported on this system",
+ token, arg);
+#endif
else
return apr_psprintf(temp_pool, "Unknown Listen option '%s' in '%s'",
token, arg);