diff options
| author | Jakub Kicinski <kuba@kernel.org> | 2025-09-22 11:51:27 -0700 | 
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2025-09-22 11:51:27 -0700 | 
| commit | 9b277fca90c39c8b749e659bf5c23e924c46c93b (patch) | |
| tree | 1b8a119894767e26a9064222cb6147b2d47c78ac | |
| parent | 35626012877b80436e0627feb16520db4f0ba53e (diff) | |
| parent | 1be5b82c45850f495adf67887075507d5e8a860b (diff) | |
Merge branch 'mptcp-pm-netlink-announce-server-side-flag'
Matthieu Baerts says:
====================
mptcp: pm: netlink: announce server-side flag
Now that the 'flags' attribute is used, it seems interesting to add one
flag for 'server-side', a boolean value.
Here are a few patches related to the 'server-side' attribute:
- Patch 1: only announce this attribute on the server side.
- Patch 2: announce the 'server-side' flag when this is the case.
- Patch 3: deprecate the 'server-side' attribute.
- Patch 4: use the 'server-side' flag in the selftests.
- Patches 5, 6: small cleanups when working on code around.
====================
Link: https://patch.msgid.link/20250919-net-next-mptcp-server-side-flag-v1-0-a97a5d561a8b@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
| -rw-r--r-- | Documentation/netlink/specs/mptcp_pm.yaml | 5 | ||||
| -rw-r--r-- | include/uapi/linux/mptcp.h | 11 | ||||
| -rw-r--r-- | include/uapi/linux/mptcp_pm.h | 4 | ||||
| -rw-r--r-- | net/mptcp/pm_netlink.c | 9 | ||||
| -rw-r--r-- | net/mptcp/protocol.c | 5 | ||||
| -rw-r--r-- | tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 9 | ||||
| -rwxr-xr-x | tools/testing/selftests/net/mptcp/userspace_pm.sh | 2 | 
7 files changed, 28 insertions, 17 deletions
| diff --git a/Documentation/netlink/specs/mptcp_pm.yaml b/Documentation/netlink/specs/mptcp_pm.yaml index d1b4829b580a..ba30a40b9dbf 100644 --- a/Documentation/netlink/specs/mptcp_pm.yaml +++ b/Documentation/netlink/specs/mptcp_pm.yaml @@ -28,13 +28,13 @@ definitions:            traffic-patterns it can take a long time until the            MPTCP_EVENT_ESTABLISHED is sent.            Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, sport, -          dport, server-side, [flags]. +          dport, [server-side], [flags].        -          name: established          doc: >-            A MPTCP connection is established (can start new subflows).            Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, sport, -          dport, server-side, [flags]. +          dport, [server-side], [flags].        -          name: closed          doc: >- @@ -266,6 +266,7 @@ attribute-sets:        -          name: server-side          type: u8 +        doc: "Deprecated: use 'flags'"  operations:    list: diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index 5fd5b4cf75ca..15eef878690b 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -32,12 +32,13 @@  #define MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED	_BITUL(1)  #define MPTCP_PM_EV_FLAG_DENY_JOIN_ID0		_BITUL(0) +#define MPTCP_PM_EV_FLAG_SERVER_SIDE		_BITUL(1) -#define MPTCP_PM_ADDR_FLAG_SIGNAL                      (1 << 0) -#define MPTCP_PM_ADDR_FLAG_SUBFLOW                     (1 << 1) -#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_SIGNAL		_BITUL(0) +#define MPTCP_PM_ADDR_FLAG_SUBFLOW		_BITUL(1) +#define MPTCP_PM_ADDR_FLAG_BACKUP		_BITUL(2) +#define MPTCP_PM_ADDR_FLAG_FULLMESH		_BITUL(3) +#define MPTCP_PM_ADDR_FLAG_IMPLICIT		_BITUL(4)  struct mptcp_info {  	__u8	mptcpi_subflows; diff --git a/include/uapi/linux/mptcp_pm.h b/include/uapi/linux/mptcp_pm.h index 7359d34da446..bf44a5cf5b5a 100644 --- a/include/uapi/linux/mptcp_pm.h +++ b/include/uapi/linux/mptcp_pm.h @@ -16,10 +16,10 @@   *   good time to allocate memory and send ADD_ADDR if needed. Depending on the   *   traffic-patterns it can take a long time until the MPTCP_EVENT_ESTABLISHED   *   is sent. Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, - *   sport, dport, server-side, [flags]. + *   sport, dport, [server-side], [flags].   * @MPTCP_EVENT_ESTABLISHED: A MPTCP connection is established (can start new   *   subflows). Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, - *   sport, dport, server-side, [flags]. + *   sport, dport, [server-side], [flags].   * @MPTCP_EVENT_CLOSED: A MPTCP connection has stopped. Attribute: token.   * @MPTCP_EVENT_ANNOUNCED: A new address has been announced by the peer.   *   Attributes: token, rem_id, family, daddr4 | daddr6 [, dport]. diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 483ddbb9ec40..d5b383870f79 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -413,8 +413,13 @@ static int mptcp_event_created(struct sk_buff *skb,  	if (err)  		return err; -	if (nla_put_u8(skb, MPTCP_ATTR_SERVER_SIDE, READ_ONCE(msk->pm.server_side))) -		return -EMSGSIZE; +	if (READ_ONCE(msk->pm.server_side)) { +		flags |= MPTCP_PM_EV_FLAG_SERVER_SIDE; + +		/* Deprecated, and only set when it is the server side */ +		if (nla_put_u8(skb, MPTCP_ATTR_SERVER_SIDE, 1)) +			return -EMSGSIZE; +	}  	if (READ_ONCE(msk->pm.remote_deny_join_id0))  		flags |= MPTCP_PM_EV_FLAG_DENY_JOIN_ID0; diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index d9fbddb99ad0..735a209d4072 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -545,11 +545,10 @@ static void mptcp_cleanup_rbuf(struct mptcp_sock *msk, int copied)  	}  } -static bool mptcp_check_data_fin(struct sock *sk) +static void mptcp_check_data_fin(struct sock *sk)  {  	struct mptcp_sock *msk = mptcp_sk(sk);  	u64 rcv_data_fin_seq; -	bool ret = false;  	/* Need to ack a DATA_FIN received from a peer while this side  	 * of the connection is in ESTABLISHED, FIN_WAIT1, or FIN_WAIT2. @@ -588,12 +587,10 @@ static bool mptcp_check_data_fin(struct sock *sk)  			break;  		} -		ret = true;  		if (!__mptcp_check_fallback(msk))  			mptcp_send_ack(msk);  		mptcp_close_wake_up(sk);  	} -	return ret;  }  static void mptcp_dss_corruption(struct mptcp_sock *msk, struct sock *ssk) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c index 93fea3442216..d4981b76693b 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -2,6 +2,7 @@  #include <errno.h>  #include <error.h> +#include <stdbool.h>  #include <stdio.h>  #include <stdlib.h>  #include <string.h> @@ -113,6 +114,8 @@ static int capture_events(int fd, int event_group)  		error(1, errno, "could not join the " MPTCP_PM_EV_GRP_NAME " mcast group");  	do { +		bool server_side = false; +  		FD_ZERO(&rfds);  		FD_SET(fd, &rfds);  		res_len = NLMSG_ALIGN(sizeof(struct nlmsghdr)) + @@ -187,18 +190,22 @@ static int capture_events(int fd, int event_group)  				else if (attrs->rta_type == MPTCP_ATTR_ERROR)  					fprintf(stderr, ",error:%u", *(__u8 *)RTA_DATA(attrs));  				else if (attrs->rta_type == MPTCP_ATTR_SERVER_SIDE) -					fprintf(stderr, ",server_side:%u", *(__u8 *)RTA_DATA(attrs)); +					server_side = !!*(__u8 *)RTA_DATA(attrs);  				else if (attrs->rta_type == MPTCP_ATTR_FLAGS) {  					__u16 flags = *(__u16 *)RTA_DATA(attrs);  					/* only print when present, easier */  					if (flags & MPTCP_PM_EV_FLAG_DENY_JOIN_ID0)  						fprintf(stderr, ",deny_join_id0:1"); +					if (flags & MPTCP_PM_EV_FLAG_SERVER_SIDE) +						server_side = true;  				}  				attrs = RTA_NEXT(attrs, msg_len);  			}  		} +		if (server_side) +			fprintf(stderr, ",server_side:1");  		fprintf(stderr, "\n");  	} while (1); diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/testing/selftests/net/mptcp/userspace_pm.sh index 3d45991f24ed..87323942cb8a 100755 --- a/tools/testing/selftests/net/mptcp/userspace_pm.sh +++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh @@ -241,7 +241,7 @@ make_connection()  	print_test "Established IP${is_v6} MPTCP Connection ns2 => ns1"  	if [ "${client_token}" != "" ] && [ "${server_token}" != "" ] && -	   [ "${client_serverside}" = 0 ] && [ "${server_serverside}" = 1 ] && +	   [ "${client_serverside:-0}" = 0 ] && [ "${server_serverside:-0}" = 1 ] &&  	   [ "${client_nojoin:-0}" = 0 ] && [ "${server_nojoin:-0}" = 1 ]  	then  		test_pass | 
