From e3f20ecf95475050f816cdee405d808e091cc7e0 Mon Sep 17 00:00:00 2001 From: "Matthieu Baerts (NGI0)" Date: Thu, 13 Nov 2025 19:19:07 +0100 Subject: [PATCH 1/3] mptcp: add 'laminar' endpoint support This new endpoint type has been recently added to the kernel in v6.18 [1]. It will be used to create new subflows from the associated address to additional addresses announced by the other peer. This will be done if allowed by the MPTCP limits, and if the associated address is not already being used by another subflow from the same MPTCP connection. Note that the fullmesh flag takes precedence over the laminar one. Without any of these two flags, the path-manager will create new subflows to additional addresses announced by the other peer by selecting the source address from the routing tables, which is harder to configure if the announced address is not known in advance. The support of the new flag is easy: simply by declaring a new flag for NM, and adding it in the related helpers and existing checks looking at the different MPTCP endpoint. The documentation now references the new endpoint type. Note that only the new 'define' has been added in the Linux header file: this file has changed a bit since the last sync, now split in two files. Only this new line is needed, so the minimum has been modified here. Link: https://git.kernel.org/torvalds/c/539f6b9de39e [1] Signed-off-by: Matthieu Baerts (NGI0) (cherry picked from commit 2b03057de0dac8182c2537d9fd9af9a9015fb631) --- src/core/nm-l3cfg.c | 4 ++-- src/libnm-core-aux-intern/nm-libnm-core-utils.h | 11 ++++++----- src/libnm-core-impl/nm-setting-connection.c | 5 +++-- src/libnm-core-public/nm-dbus-interface.h | 11 +++++++++++ src/libnm-platform/nm-linux-platform.c | 1 + src/libnm-platform/nm-platform.c | 3 ++- src/libnm-platform/nm-platform.h | 1 + src/libnmc-setting/settings-docs.h.in | 2 +- src/linux-headers/mptcp.h | 1 + src/nmcli/gen-metadata-nm-settings-nmcli.xml.in | 4 ++-- 10 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index d2ec113a53..0d93f76bc2 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -5054,8 +5054,8 @@ _l3_commit_mptcp_af(NML3Cfg *self, (NM_FLAGS_HAS(mptcp_flags, NM_MPTCP_FLAGS_SIGNAL) ? MPTCP_PM_ADDR_FLAG_SIGNAL : 0) | (NM_FLAGS_HAS(mptcp_flags, NM_MPTCP_FLAGS_SUBFLOW) ? MPTCP_PM_ADDR_FLAG_SUBFLOW : 0) | (NM_FLAGS_HAS(mptcp_flags, NM_MPTCP_FLAGS_BACKUP) ? MPTCP_PM_ADDR_FLAG_BACKUP : 0) - | (NM_FLAGS_HAS(mptcp_flags, NM_MPTCP_FLAGS_FULLMESH) ? MPTCP_PM_ADDR_FLAG_FULLMESH - : 0); + | (NM_FLAGS_HAS(mptcp_flags, NM_MPTCP_FLAGS_FULLMESH) ? MPTCP_PM_ADDR_FLAG_FULLMESH : 0) + | (NM_FLAGS_HAS(mptcp_flags, NM_MPTCP_FLAGS_LAMINAR) ? MPTCP_PM_ADDR_FLAG_LAMINAR : 0); NMPlatformMptcpAddr a = { .ifindex = self->priv.ifindex, .id = 0, diff --git a/src/libnm-core-aux-intern/nm-libnm-core-utils.h b/src/libnm-core-aux-intern/nm-libnm-core-utils.h index 8f30b95820..432a21409f 100644 --- a/src/libnm-core-aux-intern/nm-libnm-core-utils.h +++ b/src/libnm-core-aux-intern/nm-libnm-core-utils.h @@ -300,11 +300,12 @@ gpointer _nm_connection_new_setting(NMConnection *connection, GType gtype); /*****************************************************************************/ -#define _NM_MPTCP_FLAGS_ALL \ - ((NMMptcpFlags) (NM_MPTCP_FLAGS_DISABLED | NM_MPTCP_FLAGS_ENABLED \ - | NM_MPTCP_FLAGS_ALSO_WITHOUT_SYSCTL \ - | NM_MPTCP_FLAGS_ALSO_WITHOUT_DEFAULT_ROUTE | NM_MPTCP_FLAGS_SIGNAL \ - | NM_MPTCP_FLAGS_SUBFLOW | NM_MPTCP_FLAGS_BACKUP | NM_MPTCP_FLAGS_FULLMESH)) +#define _NM_MPTCP_FLAGS_ALL \ + ((NMMptcpFlags) (NM_MPTCP_FLAGS_DISABLED | NM_MPTCP_FLAGS_ENABLED \ + | NM_MPTCP_FLAGS_ALSO_WITHOUT_SYSCTL \ + | NM_MPTCP_FLAGS_ALSO_WITHOUT_DEFAULT_ROUTE | NM_MPTCP_FLAGS_SIGNAL \ + | NM_MPTCP_FLAGS_SUBFLOW | NM_MPTCP_FLAGS_BACKUP | NM_MPTCP_FLAGS_FULLMESH \ + | NM_MPTCP_FLAGS_LAMINAR)) #define _NM_MPTCP_FLAGS_DEFAULT ((NMMptcpFlags) (NM_MPTCP_FLAGS_ENABLED | NM_MPTCP_FLAGS_SUBFLOW)) diff --git a/src/libnm-core-impl/nm-setting-connection.c b/src/libnm-core-impl/nm-setting-connection.c index f0b1c96512..4f25533c07 100644 --- a/src/libnm-core-impl/nm-setting-connection.c +++ b/src/libnm-core-impl/nm-setting-connection.c @@ -3458,7 +3458,7 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) * - "disabled", "disabled-on-local-iface", "enable": whether MPTCP handling * is enabled. The flag "disabled-on-local-iface" enables it based on whether * the interface has a default route. - * - "signal", "subflow", "backup", "fullmesh": the endpoint flags + * - "signal", "subflow", "backup", "fullmesh", "laminar": the endpoint flags * that are used. * * The reason is, that it is useful to have one "connection.mptcp-flags" @@ -3518,7 +3518,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) * * When MPTCP handling is enabled then endpoints are configured with * the specified address flags "signal" (0x10), "subflow" (0x20), "backup" (0x40), - * "fullmesh" (0x80). See ip-mptcp(8) manual for additional information about the flags. + * "fullmesh" (0x80), "laminar" (0x100). See ip-mptcp(8) manual for + * additional information about the flags. * * If the flags are zero (0x0), the global connection default from NetworkManager.conf is * honored. If still unspecified, the fallback is "enabled,subflow". diff --git a/src/libnm-core-public/nm-dbus-interface.h b/src/libnm-core-public/nm-dbus-interface.h index 8db76db1f4..42bff04ae0 100644 --- a/src/libnm-core-public/nm-dbus-interface.h +++ b/src/libnm-core-public/nm-dbus-interface.h @@ -1460,6 +1460,16 @@ typedef enum /*< flags >*/ { * any additional addresses using the MPTCP ADD_ADDR sub-option, this will behave the same * as a plain subflow endpoint. When the peer does announce addresses, each received ADD_ADDR * sub-option will trigger creation of an additional subflow to generate a full mesh topology. + * @NM_MPTCP_FLAGS_LAMINAR: Flag for the MPTCP endpoint. The endpoint will be + * used to create new subflows from the associated address to additional + * addresses announced by the other peer. This will be done if allowed by the + * MPTCP limits, and if the associated address is not already being used by + * another subflow from the same MPTCP connection. Note that the 'fullmesh' + * flag takes precedence over the 'laminar' one. Without any of these two + * flags, the path-manager will create new subflows to additional addresses + * announced by the other peer by selecting the source address from the + * routing tables, which is harder to configure if the announced address is + * not known in advance. Since: 1.56 * * Since: 1.40 */ @@ -1476,6 +1486,7 @@ typedef enum /*< flags >*/ { NM_MPTCP_FLAGS_SUBFLOW = 0x20, NM_MPTCP_FLAGS_BACKUP = 0x40, NM_MPTCP_FLAGS_FULLMESH = 0x80, + NM_MPTCP_FLAGS_LAMINAR = 0x100, } NMMptcpFlags; /* For secrets requests, hints starting with "x-vpn-message:" are a message to show, not diff --git a/src/libnm-platform/nm-linux-platform.c b/src/libnm-platform/nm-linux-platform.c index e703774388..cc5b99e095 100644 --- a/src/libnm-platform/nm-linux-platform.c +++ b/src/libnm-platform/nm-linux-platform.c @@ -59,6 +59,7 @@ G_STATIC_ASSERT(NM_MPTCP_PM_ADDR_FLAG_SUBFLOW == MPTCP_PM_ADDR_FLAG_SUBFLOW); G_STATIC_ASSERT(NM_MPTCP_PM_ADDR_FLAG_BACKUP == MPTCP_PM_ADDR_FLAG_BACKUP); G_STATIC_ASSERT(NM_MPTCP_PM_ADDR_FLAG_FULLMESH == MPTCP_PM_ADDR_FLAG_FULLMESH); G_STATIC_ASSERT(NM_MPTCP_PM_ADDR_FLAG_IMPLICIT == MPTCP_PM_ADDR_FLAG_IMPLICIT); +G_STATIC_ASSERT(NM_MPTCP_PM_ADDR_FLAG_LAMINAR == MPTCP_PM_ADDR_FLAG_LAMINAR); /*****************************************************************************/ diff --git a/src/libnm-platform/nm-platform.c b/src/libnm-platform/nm-platform.c index d7fb59b079..853157d204 100644 --- a/src/libnm-platform/nm-platform.c +++ b/src/libnm-platform/nm-platform.c @@ -7982,7 +7982,8 @@ static NM_UTILS_FLAGS2STR_DEFINE(_mptcp_flags_to_string, NM_UTILS_FLAGS2STR(NM_MPTCP_PM_ADDR_FLAG_SIGNAL, "signal"), NM_UTILS_FLAGS2STR(NM_MPTCP_PM_ADDR_FLAG_SUBFLOW, "subflow"), NM_UTILS_FLAGS2STR(NM_MPTCP_PM_ADDR_FLAG_BACKUP, "backup"), - NM_UTILS_FLAGS2STR(NM_MPTCP_PM_ADDR_FLAG_FULLMESH, "fullmesh")); + NM_UTILS_FLAGS2STR(NM_MPTCP_PM_ADDR_FLAG_FULLMESH, "fullmesh"), + NM_UTILS_FLAGS2STR(NM_MPTCP_PM_ADDR_FLAG_LAMINAR, "laminar")); const char * nm_platform_mptcp_addr_to_string(const NMPlatformMptcpAddr *mptcp_addr, char *buf, gsize len) diff --git a/src/libnm-platform/nm-platform.h b/src/libnm-platform/nm-platform.h index 9c8425b883..033dc51541 100644 --- a/src/libnm-platform/nm-platform.h +++ b/src/libnm-platform/nm-platform.h @@ -46,6 +46,7 @@ typedef gboolean (*NMPObjectPredicateFunc)(const NMPObject *obj, gpointer user_d #define NM_MPTCP_PM_ADDR_FLAG_BACKUP ((guint32) (1 << 2)) #define NM_MPTCP_PM_ADDR_FLAG_FULLMESH ((guint32) (1 << 3)) #define NM_MPTCP_PM_ADDR_FLAG_IMPLICIT ((guint32) (1 << 4)) +#define NM_MPTCP_PM_ADDR_FLAG_LAMINAR ((guint32) (1 << 5)) /* Redefine this in host's endianness */ #define NM_GRE_KEY 0x2000 diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in index e4ed5f6ba9..4e8978cb20 100644 --- a/src/libnmc-setting/settings-docs.h.in +++ b/src/libnmc-setting/settings-docs.h.in @@ -21,7 +21,7 @@ #define DESCRIBE_DOC_NM_SETTING_CONNECTION_MASTER N_("Interface name of the controller device or UUID of the controller connection. Deprecated 1.46. Use \"controller\" instead, this is just an alias.") #define DESCRIBE_DOC_NM_SETTING_CONNECTION_MDNS N_("Whether mDNS is enabled for the connection. The permitted values are: \"yes\" (2) register hostname and resolving for the connection, \"no\" (0) disable mDNS for the interface, \"resolve\" (1) do not register hostname but allow resolving of mDNS host names and \"default\" (-1) to allow lookup of a global default in NetworkManager.conf. If unspecified, \"default\" ultimately depends on the DNS plugin. This feature requires a plugin which supports mDNS. Otherwise, the setting has no effect. Currently the only supported DNS plugin is systemd-resolved. For systemd-resolved, the default is configurable via MulticastDNS= setting in resolved.conf.") #define DESCRIBE_DOC_NM_SETTING_CONNECTION_METERED N_("Whether the connection is metered. When updating this property on a currently activated connection, the change takes effect immediately.") -#define DESCRIBE_DOC_NM_SETTING_CONNECTION_MPTCP_FLAGS N_("Whether to configure MPTCP endpoints and the address flags. If MPTCP is enabled in NetworkManager, it will configure the addresses of the interface as MPTCP endpoints. Note that IPv4 loopback addresses (127.0.0.0/8), IPv4 link local addresses (169.254.0.0/16), the IPv6 loopback address (::1), IPv6 link local addresses (fe80::/10), IPv6 unique local addresses (ULA, fc00::/7) and IPv6 privacy extension addresses (rfc3041, ipv6.ip6-privacy) will be excluded from being configured as endpoints. If \"disabled\" (0x1), MPTCP handling for the interface is disabled and no endpoints are registered. The \"enabled\" (0x2) flag means that MPTCP handling is enabled. This flag can also be implied from the presence of other flags. Even when enabled, MPTCP handling will by default still be disabled unless \"/proc/sys/net/mptcp/enabled\" sysctl is on. NetworkManager does not change the sysctl and this is up to the administrator or distribution. To configure endpoints even if the sysctl is disabled, \"also-without-sysctl\" (0x4) flag can be used. In that case, NetworkManager doesn't look at the sysctl and configures endpoints regardless. Even when enabled, NetworkManager will only configure MPTCP endpoints for a certain address family, if there is a unicast default route (0.0.0.0/0 or ::/0) in the main routing table. The flag \"also-without-default-route\" (0x8) can override that. When MPTCP handling is enabled then endpoints are configured with the specified address flags \"signal\" (0x10), \"subflow\" (0x20), \"backup\" (0x40), \"fullmesh\" (0x80). See ip-mptcp(8) manual for additional information about the flags. If the flags are zero (0x0), the global connection default from NetworkManager.conf is honored. If still unspecified, the fallback is \"enabled,subflow\". Note that this means that MPTCP is by default done depending on the \"/proc/sys/net/mptcp/enabled\" sysctl. NetworkManager does not change the MPTCP limits nor enable MPTCP via \"/proc/sys/net/mptcp/enabled\". That is a host configuration which the admin can change via sysctl and ip-mptcp. Strict reverse path filtering (rp_filter) breaks many MPTCP use cases, so when MPTCP handling for IPv4 addresses on the interface is enabled, NetworkManager would loosen the strict reverse path filtering (1) to the loose setting (2).") +#define DESCRIBE_DOC_NM_SETTING_CONNECTION_MPTCP_FLAGS N_("Whether to configure MPTCP endpoints and the address flags. If MPTCP is enabled in NetworkManager, it will configure the addresses of the interface as MPTCP endpoints. Note that IPv4 loopback addresses (127.0.0.0/8), IPv4 link local addresses (169.254.0.0/16), the IPv6 loopback address (::1), IPv6 link local addresses (fe80::/10), IPv6 unique local addresses (ULA, fc00::/7) and IPv6 privacy extension addresses (rfc3041, ipv6.ip6-privacy) will be excluded from being configured as endpoints. If \"disabled\" (0x1), MPTCP handling for the interface is disabled and no endpoints are registered. The \"enabled\" (0x2) flag means that MPTCP handling is enabled. This flag can also be implied from the presence of other flags. Even when enabled, MPTCP handling will by default still be disabled unless \"/proc/sys/net/mptcp/enabled\" sysctl is on. NetworkManager does not change the sysctl and this is up to the administrator or distribution. To configure endpoints even if the sysctl is disabled, \"also-without-sysctl\" (0x4) flag can be used. In that case, NetworkManager doesn't look at the sysctl and configures endpoints regardless. Even when enabled, NetworkManager will only configure MPTCP endpoints for a certain address family, if there is a unicast default route (0.0.0.0/0 or ::/0) in the main routing table. The flag \"also-without-default-route\" (0x8) can override that. When MPTCP handling is enabled then endpoints are configured with the specified address flags \"signal\" (0x10), \"subflow\" (0x20), \"backup\" (0x40), \"fullmesh\" (0x80), \"laminar\" (0x100). See ip-mptcp(8) manual for additional information about the flags. If the flags are zero (0x0), the global connection default from NetworkManager.conf is honored. If still unspecified, the fallback is \"enabled,subflow\". Note that this means that MPTCP is by default done depending on the \"/proc/sys/net/mptcp/enabled\" sysctl. NetworkManager does not change the MPTCP limits nor enable MPTCP via \"/proc/sys/net/mptcp/enabled\". That is a host configuration which the admin can change via sysctl and ip-mptcp. Strict reverse path filtering (rp_filter) breaks many MPTCP use cases, so when MPTCP handling for IPv4 addresses on the interface is enabled, NetworkManager would loosen the strict reverse path filtering (1) to the loose setting (2).") #define DESCRIBE_DOC_NM_SETTING_CONNECTION_MUD_URL N_("If configured, set to a Manufacturer Usage Description (MUD) URL that points to manufacturer-recommended network policies for IoT devices. It is transmitted as a DHCPv4 or DHCPv6 option. The value must be a valid URL starting with \"https://\". The special value \"none\" is allowed to indicate that no MUD URL is used. If the per-profile value is unspecified (the default), a global connection default gets consulted. If still unspecified, the ultimate default is \"none\".") #define DESCRIBE_DOC_NM_SETTING_CONNECTION_MULTI_CONNECT N_("Specifies whether the profile can be active multiple times at a particular moment. The value is of type NMConnectionMultiConnect.") #define DESCRIBE_DOC_NM_SETTING_CONNECTION_PERMISSIONS N_("An array of strings defining what access a given user has to this connection. If this is NULL or empty, all users are allowed to access this connection; otherwise users are allowed if and only if they are in this list. When this is not empty, the connection can be active only when one of the specified users is logged into an active session. Each entry is of the form \"[type]:[id]:[reserved]\"; for example, \"user:dcbw:blah\". At this time only the \"user\" [type] is allowed. Any other values are ignored and reserved for future use. [id] is the username that this permission refers to, which may not contain the \":\" character. Any [reserved] information present must be ignored and is reserved for future use. All of [type], [id], and [reserved] must be valid UTF-8.") diff --git a/src/linux-headers/mptcp.h b/src/linux-headers/mptcp.h index ca502f1edc..ed44b9509b 100644 --- a/src/linux-headers/mptcp.h +++ b/src/linux-headers/mptcp.h @@ -80,6 +80,7 @@ enum { #define MPTCP_PM_ADDR_FLAG_BACKUP (1 << 2) #define MPTCP_PM_ADDR_FLAG_FULLMESH (1 << 3) #define MPTCP_PM_ADDR_FLAG_IMPLICIT (1 << 4) +#define MPTCP_PM_ADDR_FLAG_LAMINAR (1 << 5) enum { MPTCP_PM_CMD_UNSPEC, diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in index 9f3f0ef383..949bc6804e 100644 --- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in +++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in @@ -738,9 +738,9 @@ format="choice (NMSettingConnectionDnssec)" values="default (-1), no (0), allow-downgrade (1), yes (2)" /> + values="none/default (0x0), disabled (0x1), enabled (0x2), also-without-sysctl (0x4), also-without-default-route (0x8), signal (0x10), subflow (0x20), backup (0x40), fullmesh (0x80), laminar (0x100)" /> From 12a4696229a7e6cc33a28fd0d6376a4547cdc93b Mon Sep 17 00:00:00 2001 From: "Matthieu Baerts (NGI0)" Date: Thu, 13 Nov 2025 19:19:22 +0100 Subject: [PATCH 2/3] mptcp: set the laminar flag by default By default, the MPTCP limits have 'add_addr_accepted' set to 0. It means that when the other peer announces an additional address it can be reached from, the receiver will not try to establish any new subflows to this address. If this limit is increased, and without the new 'laminar' flag, the MPTCP in-kernel path-manager will select the source address by looking at the routing tables to establish this new subflow. This is not ideal: very likely, the source address will be the one linked to the default route and a new subflow from the same interface as the initial one will be created instead of using another path. This is especially problematic when the other peer has set the 'C-flag' in the MPTCP connection request (MP_CAPABLE). This flag can be set to tell the other side that the peer will not accept extra subflows requests sent to its initial IP address and port: typically set by a server using an anycast address, behind a legacy Layer 4 load balancer. It sounds better to add the 'laminar' flag by default to pick the source address from well-defined MPTCP endpoints, rather than relying on routing rules which will likely not pick the most interesting solution. Note that older kernels will accept unsupported flags, and ignore them. So it is fine to have the new flag added by default even if it is not supported. Signed-off-by: Matthieu Baerts (NGI0) (cherry picked from commit 8caa781270e0427575381d9815dfb424ee5d0221) --- man/NetworkManager.conf.xml | 2 +- src/libnm-core-aux-intern/nm-libnm-core-utils.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml index 65cad02cf9..6c055e9d2e 100644 --- a/man/NetworkManager.conf.xml +++ b/man/NetworkManager.conf.xml @@ -895,7 +895,7 @@ ipv6.ip6-privacy=0 connection.mptcp-flags - If unspecified, the fallback is 0x22 ("enabled,subflow"). Note that if sysctl /proc/sys/net/mptcp/enabled is disabled, NetworkManager will still not configure endpoints. + If unspecified, the fallback is 0x122 ("enabled,subflow,laminar"). Note that if sysctl /proc/sys/net/mptcp/enabled is disabled, NetworkManager will still not configure endpoints. connection.dns-over-tls diff --git a/src/libnm-core-aux-intern/nm-libnm-core-utils.h b/src/libnm-core-aux-intern/nm-libnm-core-utils.h index 432a21409f..0e75982ecc 100644 --- a/src/libnm-core-aux-intern/nm-libnm-core-utils.h +++ b/src/libnm-core-aux-intern/nm-libnm-core-utils.h @@ -307,7 +307,8 @@ gpointer _nm_connection_new_setting(NMConnection *connection, GType gtype); | NM_MPTCP_FLAGS_SUBFLOW | NM_MPTCP_FLAGS_BACKUP | NM_MPTCP_FLAGS_FULLMESH \ | NM_MPTCP_FLAGS_LAMINAR)) -#define _NM_MPTCP_FLAGS_DEFAULT ((NMMptcpFlags) (NM_MPTCP_FLAGS_ENABLED | NM_MPTCP_FLAGS_SUBFLOW)) +#define _NM_MPTCP_FLAGS_DEFAULT \ + ((NMMptcpFlags) (NM_MPTCP_FLAGS_ENABLED | NM_MPTCP_FLAGS_SUBFLOW | NM_MPTCP_FLAGS_LAMINAR)) NMMptcpFlags nm_mptcp_flags_normalize(NMMptcpFlags flags); From 380cd0d24896553e0ed8596ca069f043537d87d1 Mon Sep 17 00:00:00 2001 From: "Matthieu Baerts (NGI0)" Date: Tue, 18 Nov 2025 14:38:28 +0100 Subject: [PATCH 3/3] NEWS: new MPTCP 'laminar' endpoint & default A summary linked to the last two commits. Signed-off-by: Matthieu Baerts (NGI0) (cherry picked from commit 3ce1da1fd22bc50d3aea8e451c90159a94292874) --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index b8b9212eb3..9e2d0cc15d 100644 --- a/NEWS +++ b/NEWS @@ -34,6 +34,8 @@ USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE! connection.mptcp-flags, ipv6.ip6-privacy) * Update n-acd to always compile with eBPF enabled, as support for eBPF is now detected at run time. +* Add new MPTCP 'laminar' endpoint type, and set it by default alongside + the 'subflow' one. ============================================= NetworkManager-1.54