[PATCH 1 of 4] Core: added socket protocol
Anthony Doeraene
anthony.doeraene.dev at gmail.com
Tue Aug 13 09:37:03 UTC 2024
# HG changeset patch
# User Anthony Doeraene <anthony.doeraene.dev at gmail.com>
# Date 1723531815 -7200
# Tue Aug 13 08:50:15 2024 +0200
# Node ID b72362042b52f378e18ff6d01ec533e447331214
# Parent 8149e6e3ea2aa3d7ef3861330e38a2f144e35c47
Core: added socket protocol
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.
The 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 updates the creation of listening sockets to use a new field
of the `ngx_listening_s` structure. The `protocol` field can be used in
conjunction with the `type` to specify the protocol to be used.
Modules will then be able to specify a different protocol, e.g.
IPPROTO_MPTCP.
Co-developed-by: Maxime Dourov <mux99 at live.be>
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 -r 8149e6e3ea2a -r b72362042b52 src/core/ngx_connection.c
--- a/src/core/ngx_connection.c Wed Aug 07 03:59:13 2024 +0300
+++ b/src/core/ngx_connection.c Tue Aug 13 08:50:15 2024 +0200
@@ -487,7 +487,8 @@
continue;
}
- s = ngx_socket(ls[i].sockaddr->sa_family, ls[i].type, 0);
+ s = ngx_socket(ls[i].sockaddr->sa_family, ls[i].type,
+ ls[i].protocol);
if (s == (ngx_socket_t) -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
diff -r 8149e6e3ea2a -r b72362042b52 src/core/ngx_connection.h
--- a/src/core/ngx_connection.h Wed Aug 07 03:59:13 2024 +0300
+++ b/src/core/ngx_connection.h Tue Aug 13 08:50:15 2024 +0200
@@ -24,6 +24,7 @@
ngx_str_t addr_text;
int type;
+ int protocol;
int backlog;
int rcvbuf;
More information about the nginx-devel
mailing list