mptcp.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
* [PATCH net 0/7] mptcp: Path manager fixes for 5.19
@ 2022-07-05 21:32 Mat Martineau
  2022-07-05 21:32 ` [PATCH net 1/7] mptcp: fix locking in mptcp_nl_cmd_sf_destroy() Mat Martineau
                   ` (8 more replies)
  0 siblings, 9 replies; 12+ messages in thread
From: Mat Martineau @ 2022-07-05 21:32 UTC (permalink / raw)
  To: netdev
  Cc: Mat Martineau, davem, kuba, pabeni, edumazet, fw, geliang.tang,
	matthieu.baerts, mptcp

The MPTCP userspace path manager is new in 5.19, and these patches fix
some issues in that new code.

Patches 1-3 fix path manager locking issues.

Patches 4 and 5 allow userspace path managers to change priority of
established subflows using the existing MPTCP_PM_CMD_SET_FLAGS generic
netlink command. Includes corresponding self test update.

Patches 6 and 7 fix accounting of available endpoint IDs and the
MPTCP_MIB_RMSUBFLOW counter.

Geliang Tang (1):
  mptcp: update MIB_RMSUBFLOW in cmd_sf_destroy

Kishen Maloor (2):
  mptcp: netlink: issue MP_PRIO signals from userspace PMs
  selftests: mptcp: userspace PM support for MP_PRIO signals

Mat Martineau (2):
  mptcp: Avoid acquiring PM lock for subflow priority changes
  mptcp: Acquire the subflow socket lock before modifying MP_PRIO flags

Paolo Abeni (2):
  mptcp: fix locking in mptcp_nl_cmd_sf_destroy()
  mptcp: fix local endpoint accounting

 net/mptcp/options.c                           |  3 +
 net/mptcp/pm_netlink.c                        | 46 ++++++++----
 net/mptcp/pm_userspace.c                      | 51 +++++++++----
 net/mptcp/protocol.c                          |  9 ++-
 net/mptcp/protocol.h                          |  9 ++-
 tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 73 ++++++++++++++++++-
 .../selftests/net/mptcp/userspace_pm.sh       | 32 ++++++++
 7 files changed, 192 insertions(+), 31 deletions(-)


base-commit: 029cc0963412c4f989d2731759ce4578f7e1a667
-- 
2.37.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH net 1/7] mptcp: fix locking in mptcp_nl_cmd_sf_destroy()
  2022-07-05 21:32 [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Mat Martineau
@ 2022-07-05 21:32 ` Mat Martineau
  2022-07-05 21:32 ` [PATCH net 2/7] mptcp: Avoid acquiring PM lock for subflow priority changes Mat Martineau
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Mat Martineau @ 2022-07-05 21:32 UTC (permalink / raw)
  To: netdev
  Cc: Paolo Abeni, davem, kuba, edumazet, fw, geliang.tang,
	matthieu.baerts, mptcp, Mat Martineau

From: Paolo Abeni <pabeni@redhat.com>

The user-space PM subflow removal path uses a couple of helpers
that must be called under the msk socket lock and the current
code lacks such requirement.

Change the existing lock scope so that the relevant code is under
its protection.

Fixes: 702c2f646d42 ("mptcp: netlink: allow userspace-driven subflow establishment")
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/287
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
---
 net/mptcp/pm_userspace.c | 19 ++++++-------------
 1 file changed, 6 insertions(+), 13 deletions(-)

diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index f56378e4f597..26212bebc5ed 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -306,15 +306,11 @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
 				      const struct mptcp_addr_info *local,
 				      const struct mptcp_addr_info *remote)
 {
-	struct sock *sk = &msk->sk.icsk_inet.sk;
 	struct mptcp_subflow_context *subflow;
-	struct sock *found = NULL;
 
 	if (local->family != remote->family)
 		return NULL;
 
-	lock_sock(sk);
-
 	mptcp_for_each_subflow(msk, subflow) {
 		const struct inet_sock *issk;
 		struct sock *ssk;
@@ -347,16 +343,11 @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
 		}
 
 		if (issk->inet_sport == local->port &&
-		    issk->inet_dport == remote->port) {
-			found = ssk;
-			goto found;
-		}
+		    issk->inet_dport == remote->port)
+			return ssk;
 	}
 
-found:
-	release_sock(sk);
-
-	return found;
+	return NULL;
 }
 
 int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info)
@@ -412,6 +403,7 @@ int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info)
 	}
 
 	sk = &msk->sk.icsk_inet.sk;
+	lock_sock(sk);
 	ssk = mptcp_nl_find_ssk(msk, &addr_l, &addr_r);
 	if (ssk) {
 		struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
@@ -422,8 +414,9 @@ int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info)
 	} else {
 		err = -ESRCH;
 	}
+	release_sock(sk);
 
- destroy_err:
+destroy_err:
 	sock_put((struct sock *)msk);
 	return err;
 }
-- 
2.37.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net 2/7] mptcp: Avoid acquiring PM lock for subflow priority changes
  2022-07-05 21:32 [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Mat Martineau
  2022-07-05 21:32 ` [PATCH net 1/7] mptcp: fix locking in mptcp_nl_cmd_sf_destroy() Mat Martineau
@ 2022-07-05 21:32 ` Mat Martineau
  2022-07-05 21:32 ` [PATCH net 3/7] mptcp: Acquire the subflow socket lock before modifying MP_PRIO flags Mat Martineau
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Mat Martineau @ 2022-07-05 21:32 UTC (permalink / raw)
  To: netdev
  Cc: Mat Martineau, davem, kuba, pabeni, edumazet, fw, geliang.tang,
	matthieu.baerts, mptcp

The in-kernel path manager code for changing subflow flags acquired both
the msk socket lock and the PM lock when possibly changing the "backup"
and "fullmesh" flags. mptcp_pm_nl_mp_prio_send_ack() does not access
anything protected by the PM lock, and it must release and reacquire
the PM lock.

By pushing the PM lock to where it is needed in mptcp_pm_nl_fullmesh(),
the lock is only acquired when the fullmesh flag is changed and the
backup flag code no longer has to release and reacquire the PM lock. The
change in locking context requires the MIB update to be modified - move
that to a better location instead.

This change also makes it possible to call
mptcp_pm_nl_mp_prio_send_ack() for the userspace PM commands without
manipulating the in-kernel PM lock.

Fixes: 0f9f696a502e ("mptcp: add set_flags command in PM netlink")
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
---
 net/mptcp/options.c    | 3 +++
 net/mptcp/pm_netlink.c | 8 ++------
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/net/mptcp/options.c b/net/mptcp/options.c
index aead331866a0..bd8f0f425be4 100644
--- a/net/mptcp/options.c
+++ b/net/mptcp/options.c
@@ -1584,6 +1584,9 @@ void mptcp_write_options(struct tcphdr *th, __be32 *ptr, struct tcp_sock *tp,
 		*ptr++ = mptcp_option(MPTCPOPT_MP_PRIO,
 				      TCPOLEN_MPTCP_PRIO,
 				      opts->backup, TCPOPT_NOP);
+
+		MPTCP_INC_STATS(sock_net((const struct sock *)tp),
+				MPTCP_MIB_MPPRIOTX);
 	}
 
 mp_capable_done:
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index e099f2a12504..5ff93b73f33d 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -727,7 +727,6 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
 
 	mptcp_for_each_subflow(msk, subflow) {
 		struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
-		struct sock *sk = (struct sock *)msk;
 		struct mptcp_addr_info local;
 
 		local_address((struct sock_common *)ssk, &local);
@@ -739,12 +738,9 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
 		subflow->backup = bkup;
 		subflow->send_mp_prio = 1;
 		subflow->request_bkup = bkup;
-		__MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPPRIOTX);
 
-		spin_unlock_bh(&msk->pm.lock);
 		pr_debug("send ack for mp_prio");
 		mptcp_subflow_send_ack(ssk);
-		spin_lock_bh(&msk->pm.lock);
 
 		return 0;
 	}
@@ -1816,8 +1812,10 @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk,
 
 	list.ids[list.nr++] = addr->id;
 
+	spin_lock_bh(&msk->pm.lock);
 	mptcp_pm_nl_rm_subflow_received(msk, &list);
 	mptcp_pm_create_subflow_or_signal_addr(msk);
+	spin_unlock_bh(&msk->pm.lock);
 }
 
 static int mptcp_nl_set_flags(struct net *net,
@@ -1835,12 +1833,10 @@ static int mptcp_nl_set_flags(struct net *net,
 			goto next;
 
 		lock_sock(sk);
-		spin_lock_bh(&msk->pm.lock);
 		if (changed & MPTCP_PM_ADDR_FLAG_BACKUP)
 			ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, bkup);
 		if (changed & MPTCP_PM_ADDR_FLAG_FULLMESH)
 			mptcp_pm_nl_fullmesh(msk, addr);
-		spin_unlock_bh(&msk->pm.lock);
 		release_sock(sk);
 
 next:
-- 
2.37.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net 3/7] mptcp: Acquire the subflow socket lock before modifying MP_PRIO flags
  2022-07-05 21:32 [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Mat Martineau
  2022-07-05 21:32 ` [PATCH net 1/7] mptcp: fix locking in mptcp_nl_cmd_sf_destroy() Mat Martineau
  2022-07-05 21:32 ` [PATCH net 2/7] mptcp: Avoid acquiring PM lock for subflow priority changes Mat Martineau
@ 2022-07-05 21:32 ` Mat Martineau
  2022-07-05 21:32 ` [PATCH net 4/7] mptcp: netlink: issue MP_PRIO signals from userspace PMs Mat Martineau
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Mat Martineau @ 2022-07-05 21:32 UTC (permalink / raw)
  To: netdev
  Cc: Mat Martineau, davem, kuba, pabeni, edumazet, fw, geliang.tang,
	matthieu.baerts, mptcp

When setting up a subflow's flags for sending MP_PRIO MPTCP options, the
subflow socket lock was not held while reading and modifying several
struct members that are also read and modified in mptcp_write_options().

Acquire the subflow socket lock earlier and send the MP_PRIO ACK with
that lock already acquired. Add a new variant of the
mptcp_subflow_send_ack() helper to use with the subflow lock held.

Fixes: 067065422fcd ("mptcp: add the outgoing MP_PRIO support")
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
---
 net/mptcp/pm_netlink.c | 5 ++++-
 net/mptcp/protocol.c   | 9 +++++++--
 net/mptcp/protocol.h   | 1 +
 3 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 5ff93b73f33d..ca86c88f89e0 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -728,11 +728,13 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
 	mptcp_for_each_subflow(msk, subflow) {
 		struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
 		struct mptcp_addr_info local;
+		bool slow;
 
 		local_address((struct sock_common *)ssk, &local);
 		if (!mptcp_addresses_equal(&local, addr, addr->port))
 			continue;
 
+		slow = lock_sock_fast(ssk);
 		if (subflow->backup != bkup)
 			msk->last_snd = NULL;
 		subflow->backup = bkup;
@@ -740,7 +742,8 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
 		subflow->request_bkup = bkup;
 
 		pr_debug("send ack for mp_prio");
-		mptcp_subflow_send_ack(ssk);
+		__mptcp_subflow_send_ack(ssk);
+		unlock_sock_fast(ssk, slow);
 
 		return 0;
 	}
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index e475212f2618..cc21fafd9726 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -506,13 +506,18 @@ static inline bool tcp_can_send_ack(const struct sock *ssk)
 	       (TCPF_SYN_SENT | TCPF_SYN_RECV | TCPF_TIME_WAIT | TCPF_CLOSE | TCPF_LISTEN));
 }
 
+void __mptcp_subflow_send_ack(struct sock *ssk)
+{
+	if (tcp_can_send_ack(ssk))
+		tcp_send_ack(ssk);
+}
+
 void mptcp_subflow_send_ack(struct sock *ssk)
 {
 	bool slow;
 
 	slow = lock_sock_fast(ssk);
-	if (tcp_can_send_ack(ssk))
-		tcp_send_ack(ssk);
+	__mptcp_subflow_send_ack(ssk);
 	unlock_sock_fast(ssk, slow);
 }
 
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index c14d70c036d0..033c995772dc 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -607,6 +607,7 @@ void __init mptcp_subflow_init(void);
 void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
 void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
 		     struct mptcp_subflow_context *subflow);
+void __mptcp_subflow_send_ack(struct sock *ssk);
 void mptcp_subflow_send_ack(struct sock *ssk);
 void mptcp_subflow_reset(struct sock *ssk);
 void mptcp_subflow_queue_clean(struct sock *ssk);
-- 
2.37.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net 4/7] mptcp: netlink: issue MP_PRIO signals from userspace PMs
  2022-07-05 21:32 [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Mat Martineau
                   ` (2 preceding siblings ...)
  2022-07-05 21:32 ` [PATCH net 3/7] mptcp: Acquire the subflow socket lock before modifying MP_PRIO flags Mat Martineau
@ 2022-07-05 21:32 ` Mat Martineau
  2022-07-05 21:32 ` [PATCH net 5/7] selftests: mptcp: userspace PM support for MP_PRIO signals Mat Martineau
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Mat Martineau @ 2022-07-05 21:32 UTC (permalink / raw)
  To: netdev
  Cc: Kishen Maloor, davem, kuba, pabeni, edumazet, fw, geliang.tang,
	matthieu.baerts, mptcp, Mat Martineau

From: Kishen Maloor <kishen.maloor@intel.com>

This change updates MPTCP_PM_CMD_SET_FLAGS to allow userspace PMs
to issue MP_PRIO signals over a specific subflow selected by
the connection token, local and remote address+port.

Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/286
Fixes: 702c2f646d42 ("mptcp: netlink: allow userspace-driven subflow establishment")
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Kishen Maloor <kishen.maloor@intel.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
---
 net/mptcp/pm_netlink.c   | 30 +++++++++++++++++++++++++-----
 net/mptcp/pm_userspace.c | 30 ++++++++++++++++++++++++++++++
 net/mptcp/protocol.h     |  8 +++++++-
 3 files changed, 62 insertions(+), 6 deletions(-)

diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index ca86c88f89e0..2da251dd7c00 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -717,9 +717,10 @@ void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk)
 	}
 }
 
-static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
-					struct mptcp_addr_info *addr,
-					u8 bkup)
+int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
+				 struct mptcp_addr_info *addr,
+				 struct mptcp_addr_info *rem,
+				 u8 bkup)
 {
 	struct mptcp_subflow_context *subflow;
 
@@ -727,13 +728,19 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
 
 	mptcp_for_each_subflow(msk, subflow) {
 		struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
-		struct mptcp_addr_info local;
+		struct mptcp_addr_info local, remote;
 		bool slow;
 
 		local_address((struct sock_common *)ssk, &local);
 		if (!mptcp_addresses_equal(&local, addr, addr->port))
 			continue;
 
+		if (rem && rem->family != AF_UNSPEC) {
+			remote_address((struct sock_common *)ssk, &remote);
+			if (!mptcp_addresses_equal(&remote, rem, rem->port))
+				continue;
+		}
+
 		slow = lock_sock_fast(ssk);
 		if (subflow->backup != bkup)
 			msk->last_snd = NULL;
@@ -1837,7 +1844,7 @@ static int mptcp_nl_set_flags(struct net *net,
 
 		lock_sock(sk);
 		if (changed & MPTCP_PM_ADDR_FLAG_BACKUP)
-			ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, bkup);
+			ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, NULL, bkup);
 		if (changed & MPTCP_PM_ADDR_FLAG_FULLMESH)
 			mptcp_pm_nl_fullmesh(msk, addr);
 		release_sock(sk);
@@ -1853,6 +1860,9 @@ static int mptcp_nl_set_flags(struct net *net,
 static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
 {
 	struct mptcp_pm_addr_entry addr = { .addr = { .family = AF_UNSPEC }, }, *entry;
+	struct mptcp_pm_addr_entry remote = { .addr = { .family = AF_UNSPEC }, };
+	struct nlattr *attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
+	struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
 	struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
 	struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
 	u8 changed, mask = MPTCP_PM_ADDR_FLAG_BACKUP |
@@ -1865,6 +1875,12 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
 	if (ret < 0)
 		return ret;
 
+	if (attr_rem) {
+		ret = mptcp_pm_parse_entry(attr_rem, info, false, &remote);
+		if (ret < 0)
+			return ret;
+	}
+
 	if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
 		bkup = 1;
 	if (addr.addr.family == AF_UNSPEC) {
@@ -1873,6 +1889,10 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
 			return -EOPNOTSUPP;
 	}
 
+	if (token)
+		return mptcp_userspace_pm_set_flags(sock_net(skb->sk),
+						    token, &addr, &remote, bkup);
+
 	spin_lock_bh(&pernet->lock);
 	entry = __lookup_addr(pernet, &addr.addr, lookup_by_id);
 	if (!entry) {
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 26212bebc5ed..51e2f066d54f 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -420,3 +420,33 @@ int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info)
 	sock_put((struct sock *)msk);
 	return err;
 }
+
+int mptcp_userspace_pm_set_flags(struct net *net, struct nlattr *token,
+				 struct mptcp_pm_addr_entry *loc,
+				 struct mptcp_pm_addr_entry *rem, u8 bkup)
+{
+	struct mptcp_sock *msk;
+	int ret = -EINVAL;
+	u32 token_val;
+
+	token_val = nla_get_u32(token);
+
+	msk = mptcp_token_get_sock(net, token_val);
+	if (!msk)
+		return ret;
+
+	if (!mptcp_pm_is_userspace(msk))
+		goto set_flags_err;
+
+	if (loc->addr.family == AF_UNSPEC ||
+	    rem->addr.family == AF_UNSPEC)
+		goto set_flags_err;
+
+	lock_sock((struct sock *)msk);
+	ret = mptcp_pm_nl_mp_prio_send_ack(msk, &loc->addr, &rem->addr, bkup);
+	release_sock((struct sock *)msk);
+
+set_flags_err:
+	sock_put((struct sock *)msk);
+	return ret;
+}
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 033c995772dc..480c5320b86e 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -772,6 +772,10 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
 			       const struct mptcp_rm_list *rm_list);
 void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
 void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq);
+int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
+				 struct mptcp_addr_info *addr,
+				 struct mptcp_addr_info *rem,
+				 u8 bkup);
 bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
 			      const struct mptcp_pm_addr_entry *entry);
 void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
@@ -788,7 +792,9 @@ int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk,
 int mptcp_userspace_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk,
 						   unsigned int id,
 						   u8 *flags, int *ifindex);
-
+int mptcp_userspace_pm_set_flags(struct net *net, struct nlattr *token,
+				 struct mptcp_pm_addr_entry *loc,
+				 struct mptcp_pm_addr_entry *rem, u8 bkup);
 int mptcp_pm_announce_addr(struct mptcp_sock *msk,
 			   const struct mptcp_addr_info *addr,
 			   bool echo);
-- 
2.37.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net 5/7] selftests: mptcp: userspace PM support for MP_PRIO signals
  2022-07-05 21:32 [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Mat Martineau
                   ` (3 preceding siblings ...)
  2022-07-05 21:32 ` [PATCH net 4/7] mptcp: netlink: issue MP_PRIO signals from userspace PMs Mat Martineau
@ 2022-07-05 21:32 ` Mat Martineau
  2022-07-05 21:32 ` [PATCH net 6/7] mptcp: fix local endpoint accounting Mat Martineau
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Mat Martineau @ 2022-07-05 21:32 UTC (permalink / raw)
  To: netdev
  Cc: Kishen Maloor, davem, kuba, pabeni, edumazet, fw, geliang.tang,
	matthieu.baerts, mptcp, Mat Martineau

From: Kishen Maloor <kishen.maloor@intel.com>

This change updates the testing sample (pm_nl_ctl) to exercise
the updated MPTCP_PM_CMD_SET_FLAGS command for userspace PMs to
issue MP_PRIO signals over the selected subflow.

E.g. ./pm_nl_ctl set 10.0.1.2 port 47234 flags backup token 823274047 rip 10.0.1.1 rport 50003

userspace_pm.sh has a new selftest that invokes this command.

Fixes: 259a834fadda ("selftests: mptcp: functional tests for the userspace PM type")
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Kishen Maloor <kishen.maloor@intel.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
---
 tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 73 ++++++++++++++++++-
 .../selftests/net/mptcp/userspace_pm.sh       | 32 ++++++++
 2 files changed, 103 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
index 6a2f4b981e1d..cb79f0719e3b 100644
--- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
+++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
@@ -39,7 +39,7 @@ static void syntax(char *argv[])
 	fprintf(stderr, "\tdsf lip <local-ip> lport <local-port> rip <remote-ip> rport <remote-port> token <token>\n");
 	fprintf(stderr, "\tdel <id> [<ip>]\n");
 	fprintf(stderr, "\tget <id>\n");
-	fprintf(stderr, "\tset [<ip>] [id <nr>] flags [no]backup|[no]fullmesh [port <nr>]\n");
+	fprintf(stderr, "\tset [<ip>] [id <nr>] flags [no]backup|[no]fullmesh [port <nr>] [token <token>] [rip <ip>] [rport <port>]\n");
 	fprintf(stderr, "\tflush\n");
 	fprintf(stderr, "\tdump\n");
 	fprintf(stderr, "\tlimits [<rcv addr max> <subflow max>]\n");
@@ -1279,7 +1279,10 @@ int set_flags(int fd, int pm_family, int argc, char *argv[])
 	struct rtattr *rta, *nest;
 	struct nlmsghdr *nh;
 	u_int32_t flags = 0;
+	u_int32_t token = 0;
+	u_int16_t rport = 0;
 	u_int16_t family;
+	void *rip = NULL;
 	int nest_start;
 	int use_id = 0;
 	u_int8_t id;
@@ -1339,7 +1342,13 @@ int set_flags(int fd, int pm_family, int argc, char *argv[])
 		error(1, 0, " missing flags keyword");
 
 	for (; arg < argc; arg++) {
-		if (!strcmp(argv[arg], "flags")) {
+		if (!strcmp(argv[arg], "token")) {
+			if (++arg >= argc)
+				error(1, 0, " missing token value");
+
+			/* token */
+			token = atoi(argv[arg]);
+		} else if (!strcmp(argv[arg], "flags")) {
 			char *tok, *str;
 
 			/* flags */
@@ -1378,12 +1387,72 @@ int set_flags(int fd, int pm_family, int argc, char *argv[])
 			rta->rta_len = RTA_LENGTH(2);
 			memcpy(RTA_DATA(rta), &port, 2);
 			off += NLMSG_ALIGN(rta->rta_len);
+		} else if (!strcmp(argv[arg], "rport")) {
+			if (++arg >= argc)
+				error(1, 0, " missing remote port");
+
+			rport = atoi(argv[arg]);
+		} else if (!strcmp(argv[arg], "rip")) {
+			if (++arg >= argc)
+				error(1, 0, " missing remote ip");
+
+			rip = argv[arg];
 		} else {
 			error(1, 0, "unknown keyword %s", argv[arg]);
 		}
 	}
 	nest->rta_len = off - nest_start;
 
+	/* token */
+	if (token) {
+		rta = (void *)(data + off);
+		rta->rta_type = MPTCP_PM_ATTR_TOKEN;
+		rta->rta_len = RTA_LENGTH(4);
+		memcpy(RTA_DATA(rta), &token, 4);
+		off += NLMSG_ALIGN(rta->rta_len);
+	}
+
+	/* remote addr/port */
+	if (rip) {
+		nest_start = off;
+		nest = (void *)(data + off);
+		nest->rta_type = NLA_F_NESTED | MPTCP_PM_ATTR_ADDR_REMOTE;
+		nest->rta_len = RTA_LENGTH(0);
+		off += NLMSG_ALIGN(nest->rta_len);
+
+		/* addr data */
+		rta = (void *)(data + off);
+		if (inet_pton(AF_INET, rip, RTA_DATA(rta))) {
+			family = AF_INET;
+			rta->rta_type = MPTCP_PM_ADDR_ATTR_ADDR4;
+			rta->rta_len = RTA_LENGTH(4);
+		} else if (inet_pton(AF_INET6, rip, RTA_DATA(rta))) {
+			family = AF_INET6;
+			rta->rta_type = MPTCP_PM_ADDR_ATTR_ADDR6;
+			rta->rta_len = RTA_LENGTH(16);
+		} else {
+			error(1, errno, "can't parse ip %s", (char *)rip);
+		}
+		off += NLMSG_ALIGN(rta->rta_len);
+
+		/* family */
+		rta = (void *)(data + off);
+		rta->rta_type = MPTCP_PM_ADDR_ATTR_FAMILY;
+		rta->rta_len = RTA_LENGTH(2);
+		memcpy(RTA_DATA(rta), &family, 2);
+		off += NLMSG_ALIGN(rta->rta_len);
+
+		if (rport) {
+			rta = (void *)(data + off);
+			rta->rta_type = MPTCP_PM_ADDR_ATTR_PORT;
+			rta->rta_len = RTA_LENGTH(2);
+			memcpy(RTA_DATA(rta), &rport, 2);
+			off += NLMSG_ALIGN(rta->rta_len);
+		}
+
+		nest->rta_len = off - nest_start;
+	}
+
 	do_nl_req(fd, nh, off, 0);
 	return 0;
 }
diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/testing/selftests/net/mptcp/userspace_pm.sh
index 78d0bb640b11..abe3d4ebe554 100755
--- a/tools/testing/selftests/net/mptcp/userspace_pm.sh
+++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh
@@ -770,10 +770,42 @@ test_subflows()
 	rm -f "$evts"
 }
 
+test_prio()
+{
+	local count
+
+	# Send MP_PRIO signal from client to server machine
+	ip netns exec "$ns2" ./pm_nl_ctl set 10.0.1.2 port "$client4_port" flags backup token "$client4_token" rip 10.0.1.1 rport "$server4_port"
+	sleep 0.5
+
+	# Check TX
+	stdbuf -o0 -e0 printf "MP_PRIO TX                                                 \t"
+	count=$(ip netns exec "$ns2" nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}')
+	[ -z "$count" ] && count=0
+	if [ $count != 1 ]; then
+		stdbuf -o0 -e0 printf "[FAIL]\n"
+		exit 1
+	else
+		stdbuf -o0 -e0 printf "[OK]\n"
+	fi
+
+	# Check RX
+	stdbuf -o0 -e0 printf "MP_PRIO RX                                                 \t"
+	count=$(ip netns exec "$ns1" nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}')
+	[ -z "$count" ] && count=0
+	if [ $count != 1 ]; then
+		stdbuf -o0 -e0 printf "[FAIL]\n"
+		exit 1
+	else
+		stdbuf -o0 -e0 printf "[OK]\n"
+	fi
+}
+
 make_connection
 make_connection "v6"
 test_announce
 test_remove
 test_subflows
+test_prio
 
 exit 0
-- 
2.37.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net 6/7] mptcp: fix local endpoint accounting
  2022-07-05 21:32 [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Mat Martineau
                   ` (4 preceding siblings ...)
  2022-07-05 21:32 ` [PATCH net 5/7] selftests: mptcp: userspace PM support for MP_PRIO signals Mat Martineau
@ 2022-07-05 21:32 ` Mat Martineau
  2022-07-05 21:32 ` [PATCH net 7/7] mptcp: update MIB_RMSUBFLOW in cmd_sf_destroy Mat Martineau
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Mat Martineau @ 2022-07-05 21:32 UTC (permalink / raw)
  To: netdev
  Cc: Paolo Abeni, davem, kuba, edumazet, fw, geliang.tang,
	matthieu.baerts, mptcp, Mat Martineau

From: Paolo Abeni <pabeni@redhat.com>

In mptcp_pm_nl_rm_addr_or_subflow() we always mark as available
the id corresponding to the just removed address.

The used bitmap actually tracks only the local IDs: we must
restrict the operation when a (local) subflow is removed.

Fixes: a88c9e496937 ("mptcp: do not block subflows creation on errors")
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
---
 net/mptcp/pm_netlink.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 2da251dd7c00..7c7395b58944 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -807,7 +807,8 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp_sock *msk,
 			removed = true;
 			__MPTCP_INC_STATS(sock_net(sk), rm_type);
 		}
-		__set_bit(rm_list->ids[i], msk->pm.id_avail_bitmap);
+		if (rm_type == MPTCP_MIB_RMSUBFLOW)
+			__set_bit(rm_list->ids[i], msk->pm.id_avail_bitmap);
 		if (!removed)
 			continue;
 
-- 
2.37.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net 7/7] mptcp: update MIB_RMSUBFLOW in cmd_sf_destroy
  2022-07-05 21:32 [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Mat Martineau
                   ` (5 preceding siblings ...)
  2022-07-05 21:32 ` [PATCH net 6/7] mptcp: fix local endpoint accounting Mat Martineau
@ 2022-07-05 21:32 ` Mat Martineau
  2022-07-06  1:00 ` [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Jakub Kicinski
  2022-07-06 12:00 ` patchwork-bot+netdevbpf
  8 siblings, 0 replies; 12+ messages in thread
From: Mat Martineau @ 2022-07-05 21:32 UTC (permalink / raw)
  To: netdev
  Cc: Geliang Tang, davem, kuba, pabeni, edumazet, fw, matthieu.baerts,
	mptcp, Mat Martineau

From: Geliang Tang <geliang.tang@suse.com>

This patch increases MPTCP_MIB_RMSUBFLOW mib counter in userspace pm
destroy subflow function mptcp_nl_cmd_sf_destroy() when removing subflow.

Fixes: 702c2f646d42 ("mptcp: netlink: allow userspace-driven subflow establishment")
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
---
 net/mptcp/pm_userspace.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 51e2f066d54f..9e82250cbb70 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -5,6 +5,7 @@
  */
 
 #include "protocol.h"
+#include "mib.h"
 
 void mptcp_free_local_addr_list(struct mptcp_sock *msk)
 {
@@ -410,6 +411,7 @@ int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info)
 
 		mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
 		mptcp_close_ssk(sk, ssk, subflow);
+		MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
 		err = 0;
 	} else {
 		err = -ESRCH;
-- 
2.37.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH net 0/7] mptcp: Path manager fixes for 5.19
  2022-07-05 21:32 [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Mat Martineau
                   ` (6 preceding siblings ...)
  2022-07-05 21:32 ` [PATCH net 7/7] mptcp: update MIB_RMSUBFLOW in cmd_sf_destroy Mat Martineau
@ 2022-07-06  1:00 ` Jakub Kicinski
  2022-07-06 17:14   ` Mat Martineau
  2022-07-06 12:00 ` patchwork-bot+netdevbpf
  8 siblings, 1 reply; 12+ messages in thread
From: Jakub Kicinski @ 2022-07-06  1:00 UTC (permalink / raw)
  To: Mat Martineau
  Cc: netdev, davem, pabeni, edumazet, fw, geliang.tang,
	matthieu.baerts, mptcp

On Tue,  5 Jul 2022 14:32:10 -0700 Mat Martineau wrote:
> The MPTCP userspace path manager is new in 5.19, and these patches fix
> some issues in that new code.

Two questions looking at patchwork checks:

Is userspace_pm.sh not supposed to be included in the Makefile 
so that it's run by all the CIs that execute selftests?

Is it possible to CC folks who authored patches under Fixes?
Sorry if I already asked about this. I'm trying to work on refining 
the CC check in patchwork but I'm a little ambivalent about adding
this one to exceptions.

Those are sort of independent of the series, no need to repost.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH net 0/7] mptcp: Path manager fixes for 5.19
  2022-07-05 21:32 [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Mat Martineau
                   ` (7 preceding siblings ...)
  2022-07-06  1:00 ` [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Jakub Kicinski
@ 2022-07-06 12:00 ` patchwork-bot+netdevbpf
  8 siblings, 0 replies; 12+ messages in thread
From: patchwork-bot+netdevbpf @ 2022-07-06 12:00 UTC (permalink / raw)
  To: Mat Martineau
  Cc: netdev, davem, kuba, pabeni, edumazet, fw, geliang.tang,
	matthieu.baerts, mptcp

Hello:

This series was applied to netdev/net.git (master)
by David S. Miller <davem@davemloft.net>:

On Tue,  5 Jul 2022 14:32:10 -0700 you wrote:
> The MPTCP userspace path manager is new in 5.19, and these patches fix
> some issues in that new code.
> 
> Patches 1-3 fix path manager locking issues.
> 
> Patches 4 and 5 allow userspace path managers to change priority of
> established subflows using the existing MPTCP_PM_CMD_SET_FLAGS generic
> netlink command. Includes corresponding self test update.
> 
> [...]

Here is the summary with links:
  - [net,1/7] mptcp: fix locking in mptcp_nl_cmd_sf_destroy()
    https://git.kernel.org/netdev/net/c/5ccecaec5c1e
  - [net,2/7] mptcp: Avoid acquiring PM lock for subflow priority changes
    https://git.kernel.org/netdev/net/c/c21b50d5912b
  - [net,3/7] mptcp: Acquire the subflow socket lock before modifying MP_PRIO flags
    https://git.kernel.org/netdev/net/c/a657430260e5
  - [net,4/7] mptcp: netlink: issue MP_PRIO signals from userspace PMs
    https://git.kernel.org/netdev/net/c/892f396c8e68
  - [net,5/7] selftests: mptcp: userspace PM support for MP_PRIO signals
    https://git.kernel.org/netdev/net/c/ca188a25d43f
  - [net,6/7] mptcp: fix local endpoint accounting
    https://git.kernel.org/netdev/net/c/843b5e75efff
  - [net,7/7] mptcp: update MIB_RMSUBFLOW in cmd_sf_destroy
    https://git.kernel.org/netdev/net/c/d2d21f175f1f

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH net 0/7] mptcp: Path manager fixes for 5.19
  2022-07-06  1:00 ` [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Jakub Kicinski
@ 2022-07-06 17:14   ` Mat Martineau
  2022-07-06 20:20     ` Jakub Kicinski
  0 siblings, 1 reply; 12+ messages in thread
From: Mat Martineau @ 2022-07-06 17:14 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: netdev, davem, pabeni, edumazet, fw, geliang.tang,
	matthieu.baerts, mptcp

On Tue, 5 Jul 2022, Jakub Kicinski wrote:

> On Tue,  5 Jul 2022 14:32:10 -0700 Mat Martineau wrote:
>> The MPTCP userspace path manager is new in 5.19, and these patches fix
>> some issues in that new code.
>
> Two questions looking at patchwork checks:
>
> Is userspace_pm.sh not supposed to be included in the Makefile
> so that it's run by all the CIs that execute selftests?

Thanks for noticing that, we have a patch in process now to fix it.

>
> Is it possible to CC folks who authored patches under Fixes?
> Sorry if I already asked about this. I'm trying to work on refining
> the CC check in patchwork but I'm a little ambivalent about adding
> this one to exceptions.

Yes, I do try to do that. Note that Geliang changed his email address, so 
the check script flags his old address though he is cc'd. This is the 
recurring source of most of those red 'fail' blobs in patchwork for MPTCP 
series.

Does your script use the .mailmap file from the kernel repo? Maybe I can 
ask Geliang about adding an entry there.

(I did also forget to add my coworker Kishen to part of the series this 
time, sorry about that)

--
Mat Martineau
Intel

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH net 0/7] mptcp: Path manager fixes for 5.19
  2022-07-06 17:14   ` Mat Martineau
@ 2022-07-06 20:20     ` Jakub Kicinski
  0 siblings, 0 replies; 12+ messages in thread
From: Jakub Kicinski @ 2022-07-06 20:20 UTC (permalink / raw)
  To: Mat Martineau
  Cc: netdev, davem, pabeni, edumazet, fw, geliang.tang,
	matthieu.baerts, mptcp

On Wed, 6 Jul 2022 10:14:21 -0700 (PDT) Mat Martineau wrote:
> > Is it possible to CC folks who authored patches under Fixes?
> > Sorry if I already asked about this. I'm trying to work on refining
> > the CC check in patchwork but I'm a little ambivalent about adding
> > this one to exceptions.  
> 
> Yes, I do try to do that. Note that Geliang changed his email address, so 
> the check script flags his old address though he is cc'd. This is the 
> recurring source of most of those red 'fail' blobs in patchwork for MPTCP 
> series.
> 
> Does your script use the .mailmap file from the kernel repo? Maybe I can 
> ask Geliang about adding an entry there.

That my next TODO item. I'm planning to include a local alias map as
well because I have a suspicion that chasing people to update .mailmap
will be a hassle.

> (I did also forget to add my coworker Kishen to part of the series this 
> time, sorry about that)

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2022-07-06 20:20 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-05 21:32 [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Mat Martineau
2022-07-05 21:32 ` [PATCH net 1/7] mptcp: fix locking in mptcp_nl_cmd_sf_destroy() Mat Martineau
2022-07-05 21:32 ` [PATCH net 2/7] mptcp: Avoid acquiring PM lock for subflow priority changes Mat Martineau
2022-07-05 21:32 ` [PATCH net 3/7] mptcp: Acquire the subflow socket lock before modifying MP_PRIO flags Mat Martineau
2022-07-05 21:32 ` [PATCH net 4/7] mptcp: netlink: issue MP_PRIO signals from userspace PMs Mat Martineau
2022-07-05 21:32 ` [PATCH net 5/7] selftests: mptcp: userspace PM support for MP_PRIO signals Mat Martineau
2022-07-05 21:32 ` [PATCH net 6/7] mptcp: fix local endpoint accounting Mat Martineau
2022-07-05 21:32 ` [PATCH net 7/7] mptcp: update MIB_RMSUBFLOW in cmd_sf_destroy Mat Martineau
2022-07-06  1:00 ` [PATCH net 0/7] mptcp: Path manager fixes for 5.19 Jakub Kicinski
2022-07-06 17:14   ` Mat Martineau
2022-07-06 20:20     ` Jakub Kicinski
2022-07-06 12:00 ` patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).