Welcome! Log In Create A New Profile

Advanced

[PATCH 2 of 4] HTTP: added MPTCP support

Dourov Maxime
April 18, 2024 10:00AM
# HG changeset patch
# User maxime <mux99@live.be>
# Date 1713355399 -7200
# Wed Apr 17 14:03:19 2024 +0200
# Node ID 69e3909234d76c6888fba539f9bbbecc9858a7ab
# Parent b7cbe9281f9d6911fd40a894ebc4ac2d701d8fa4
HTTP: added MPTCP support.

Multipath TCP (MPTCP), standardized in RFC8684 [1], is a TCP extension
that enables a TCP connection to use different paths.

Multipath TCP has been used for several use cases. On smartphones, MPTCP
enables seamless handovers between cellular and Wi-Fi networks while
preserving established connections. This use-case is what pushed Apple
to use MPTCP since 2013 in multiple applications [2]. On dual-stack
hosts, Multipath TCP enables the TCP connection to automatically use the
best performing path, either IPv4 or IPv6. If one path fails, MPTCP
automatically uses the other path.

To benefit from MPTCP, both the client and the server have to support
it. Multipath TCP is a backward-compatible TCP extension that is enabled
by default on recent Linux distributions (Debian, Ubuntu, Redhat, ...).
Multipath TCP is included in the Linux kernel since version 5.6 [3].
To use it on Linux, an application must explicitly enable it when
creating the socket. No need to change anything else in the application.

Even if MPTCP is supported by different OS, only Linux supports the
`IPPROTO_MPTCP` protocol, which is why this feature is currently
limited to Linux only.

This patch adds a new parameter 'mptcp' to the 'listen' directive
in the HTTP module.

Link: https://www.rfc-editor.org/rfc/rfc8684.html [1]
Link: https://www.tessares.net/apples-mptcp-story-so-far/ [2]
Link: https://www.mptcp.dev [3]

diff --git a/contrib/vim/syntax/nginx.vim b/contrib/vim/syntax/nginx.vim
--- a/contrib/vim/syntax/nginx.vim
+++ b/contrib/vim/syntax/nginx.vim
@@ -65,7 +65,7 @@ syn match ngxListenComment '#.*$'
\ contained
\ nextgroup=@ngxListenParams skipwhite skipempty
syn keyword ngxListenOptions contained
- \ default_server ssl quic proxy_protocol
+ \ default_server ssl quic proxy_protocol mptcp
\ setfib fastopen backlog rcvbuf sndbuf accept_filter deferred bind
\ ipv6only reuseport so_keepalive
\ nextgroup=@ngxListenParams skipwhite skipempty
diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c
--- a/src/http/ngx_http.c
+++ b/src/http/ngx_http.c
@@ -1845,6 +1845,7 @@ ngx_http_add_listening(ngx_conf_t *cf, n
#endif

ls->type = addr->opt.type;
+ ls->protocol = addr->opt.protocol;
ls->backlog = addr->opt.backlog;
ls->rcvbuf = addr->opt.rcvbuf;
ls->sndbuf = addr->opt.sndbuf;
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -20,6 +20,10 @@ typedef struct {
#define NGX_HTTP_REQUEST_BODY_FILE_ON 1
#define NGX_HTTP_REQUEST_BODY_FILE_CLEAN 2

+#ifndef IPPROTO_MPTCP
+#define IPPROTO_MPTCP 262
+#endif
+

static ngx_int_t ngx_http_core_auth_delay(ngx_http_request_t *r);
static void ngx_http_core_auth_delay_handler(ngx_http_request_t *r);
@@ -4049,6 +4053,13 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx
}
#endif

+#if (NGX_LINUX)
+ if (ngx_strcmp(value[n].data, "mptcp") == 0) {
+ lsopt.protocol = IPPROTO_MPTCP;
+ continue;
+ }
+#endif
+
if (ngx_strncmp(value[n].data, "backlog=", 8) == 0) {
lsopt.backlog = ngx_atoi(value[n].data + 8, value[n].len - 8);
lsopt.set = 1;
@@ -4351,6 +4362,11 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx
if (lsopt.proxy_protocol) {
return "\"proxy_protocol\" parameter is incompatible with \"quic\"";
}
+#if (NGX_LINUX)
+ if (lsopt.protocol == IPPROTO_MPTCP) {
+ return "\"mptcp\" parameter is incompatible with \"quic\"";
+ }
+#endif
}

for (n = 0; n < u.naddrs; n++) {
diff --git a/src/http/ngx_http_core_module.h b/src/http/ngx_http_core_module.h
--- a/src/http/ngx_http_core_module.h
+++ b/src/http/ngx_http_core_module.h
@@ -88,6 +88,7 @@ typedef struct {
int rcvbuf;
int sndbuf;
int type;
+ int protocol;
#if (NGX_HAVE_SETFIB)
int setfib;
#endif
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[PATCH 2 of 4] HTTP: added MPTCP support

Dourov Maxime 343 April 18, 2024 10:00AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 141
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 500 on July 15, 2024
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready