* [PATCH mptcp-next v13 1/5] mptcp: avoid resetting when another subflow available
2023-10-11 9:50 [PATCH mptcp-next v13 0/5] userspace pm remove id 0 subflow & address Geliang Tang
@ 2023-10-11 9:50 ` Geliang Tang
2023-10-11 9:50 ` [PATCH mptcp-next v13 2/5] selftests: mptcp: userspace pm remove initial subflow Geliang Tang
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Geliang Tang @ 2023-10-11 9:50 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
When closing the msk->first socket in __mptcp_close_ssk(), if there's
another subflow available, it's better to avoid resetting it, just shut
down it.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 30e0c29ae0a4..977bae817e62 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -2400,6 +2400,13 @@ static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
if (dispose_it)
list_del(&subflow->node);
+ if (!dispose_it &&
+ !list_empty(&msk->conn_list) &&
+ !list_is_singular(&msk->conn_list)) {
+ mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
+ goto out;
+ }
+
lock_sock_nested(ssk, SINGLE_DEPTH_NESTING);
if ((flags & MPTCP_CF_FASTCLOSE) && !__mptcp_check_fallback(msk)) {
--
2.35.3
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH mptcp-next v13 2/5] selftests: mptcp: userspace pm remove initial subflow
2023-10-11 9:50 [PATCH mptcp-next v13 0/5] userspace pm remove id 0 subflow & address Geliang Tang
2023-10-11 9:50 ` [PATCH mptcp-next v13 1/5] mptcp: avoid resetting when another subflow available Geliang Tang
@ 2023-10-11 9:50 ` Geliang Tang
2023-10-11 9:50 ` [PATCH mptcp-net v13 3/5] mptcp: userspace pm send RM_ADDR for ID 0 Geliang Tang
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Geliang Tang @ 2023-10-11 9:50 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds a selftest for userpsace PM to remove the initial
subflow. Use userspace_pm_add_sf() to add a subflow, and pass initial
ip address to userspace_pm_rm_sf() to remove the initial subflow.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
.../testing/selftests/net/mptcp/mptcp_join.sh | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index ae38b428e42e..199ebd0d3463 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -3490,6 +3490,28 @@ userspace_tests()
kill_events_pids
wait $tests_pid
fi
+
+ # userspace pm remove initial subflow
+ if reset_with_events "userspace pm remove initial subflow" &&
+ continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
+ set_userspace_pm $ns2
+ pm_nl_set_limits $ns1 0 1
+ speed=10 \
+ run_tests $ns1 $ns2 10.0.1.1 &
+ local tests_pid=$!
+ wait_mpj $ns2
+ userspace_pm_add_sf $ns2 10.0.3.2 20
+ chk_join_nr 1 1 1
+ chk_mptcp_info subflows 1 subflows 1
+ chk_subflows_total 2 2
+ userspace_pm_rm_sf $ns2 10.0.1.2
+ chk_rm_nr 0 1
+ chk_rst_nr 0 0 invert
+ chk_mptcp_info subflows 1 subflows 1
+ chk_subflows_total 2 2
+ kill_events_pids
+ wait $tests_pid
+ fi
}
endpoint_tests()
--
2.35.3
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH mptcp-net v13 3/5] mptcp: userspace pm send RM_ADDR for ID 0
2023-10-11 9:50 [PATCH mptcp-next v13 0/5] userspace pm remove id 0 subflow & address Geliang Tang
2023-10-11 9:50 ` [PATCH mptcp-next v13 1/5] mptcp: avoid resetting when another subflow available Geliang Tang
2023-10-11 9:50 ` [PATCH mptcp-next v13 2/5] selftests: mptcp: userspace pm remove initial subflow Geliang Tang
@ 2023-10-11 9:50 ` Geliang Tang
2023-10-11 9:50 ` [PATCH mptcp-next v13 4/5] mptcp: userspace pm rename remove_err to out Geliang Tang
2023-10-11 9:50 ` [PATCH mptcp-next v13 5/5] selftests: mptcp: userspace pm send RM_ADDR for ID 0 Geliang Tang
4 siblings, 0 replies; 7+ messages in thread
From: Geliang Tang @ 2023-10-11 9:50 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds the ability to send RM_ADDR for local ID 0. Check
whether id 0 address is removed, if not, put id 0 into a removing
list, pass it to mptcp_pm_remove_addr() to remove id 0 address.
There is no reason not to allow the userspace to remove the initial
address (ID 0). This special case was not taken into account not
letting the userspace to delete all addresses as announced.
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/379
Fixes: d9a4594edabf ("mptcp: netlink: Add MPTCP_PM_CMD_REMOVE")
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_userspace.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 6b8083650bc1..ea50e694125d 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -211,6 +211,40 @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
return err;
}
+static int mptcp_userspace_remove_id_zero_address(struct mptcp_sock *msk,
+ struct genl_info *info)
+{
+ struct mptcp_rm_list list = { .nr = 0 };
+ struct mptcp_subflow_context *subflow;
+ struct sock *sk = (struct sock *)msk;
+ bool has_id_0 = false;
+ int err = -EINVAL;
+
+ lock_sock(sk);
+ mptcp_for_each_subflow(msk, subflow) {
+ if (subflow->local_id == 0) {
+ has_id_0 = true;
+ break;
+ }
+ }
+ if (!has_id_0) {
+ GENL_SET_ERR_MSG(info, "address with id 0 not found");
+ goto remove_err;
+ }
+
+ list.ids[list.nr++] = 0;
+
+ spin_lock_bh(&msk->pm.lock);
+ mptcp_pm_remove_addr(msk, &list);
+ spin_unlock_bh(&msk->pm.lock);
+
+ err = 0;
+
+remove_err:
+ release_sock(sk);
+ return err;
+}
+
int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
{
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
@@ -245,6 +279,11 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
goto remove_err;
}
+ if (id_val == 0) {
+ err = mptcp_userspace_remove_id_zero_address(msk, info);
+ goto remove_err;
+ }
+
lock_sock(sk);
list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
--
2.35.3
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH mptcp-next v13 4/5] mptcp: userspace pm rename remove_err to out
2023-10-11 9:50 [PATCH mptcp-next v13 0/5] userspace pm remove id 0 subflow & address Geliang Tang
` (2 preceding siblings ...)
2023-10-11 9:50 ` [PATCH mptcp-net v13 3/5] mptcp: userspace pm send RM_ADDR for ID 0 Geliang Tang
@ 2023-10-11 9:50 ` Geliang Tang
2023-10-11 9:50 ` [PATCH mptcp-next v13 5/5] selftests: mptcp: userspace pm send RM_ADDR for ID 0 Geliang Tang
4 siblings, 0 replies; 7+ messages in thread
From: Geliang Tang @ 2023-10-11 9:50 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang, Matthieu Baerts
The value of 'err' will be not only '-EINVAL', but alse '0' most of the
time. So it's better to rename the lable 'remove_err' to 'out'.
Suggested-by: Matthieu Baerts <matttbe@kernel.org>
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_userspace.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index ea50e694125d..cdff3e631d2d 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -276,12 +276,12 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
if (!mptcp_pm_is_userspace(msk)) {
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
- goto remove_err;
+ goto out;
}
if (id_val == 0) {
err = mptcp_userspace_remove_id_zero_address(msk, info);
- goto remove_err;
+ goto out;
}
lock_sock(sk);
@@ -296,7 +296,7 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
if (!match) {
GENL_SET_ERR_MSG(info, "address with specified id not found");
release_sock(sk);
- goto remove_err;
+ goto out;
}
list_move(&match->list, &free_list);
@@ -310,7 +310,7 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
}
err = 0;
- remove_err:
+out:
sock_put(sk);
return err;
}
--
2.35.3
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH mptcp-next v13 5/5] selftests: mptcp: userspace pm send RM_ADDR for ID 0
2023-10-11 9:50 [PATCH mptcp-next v13 0/5] userspace pm remove id 0 subflow & address Geliang Tang
` (3 preceding siblings ...)
2023-10-11 9:50 ` [PATCH mptcp-next v13 4/5] mptcp: userspace pm rename remove_err to out Geliang Tang
@ 2023-10-11 9:50 ` Geliang Tang
2023-10-11 10:58 ` selftests: mptcp: userspace pm send RM_ADDR for ID 0: Tests Results MPTCP CI
4 siblings, 1 reply; 7+ messages in thread
From: Geliang Tang @ 2023-10-11 9:50 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds a selftest for userpsace PM to remove id 0 address.
Use userspace_pm_add_addr() helper to add a id 10 address, then use
userspace_pm_rm_addr() helper to remove id 0 address.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
.../testing/selftests/net/mptcp/mptcp_join.sh | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 199ebd0d3463..3e537ba3a68b 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -3512,6 +3512,31 @@ userspace_tests()
kill_events_pids
wait $tests_pid
fi
+
+ # userspace pm send RM_ADDR for ID 0
+ if reset_with_events "userspace pm send RM_ADDR for ID 0" &&
+ continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
+ set_userspace_pm $ns1
+ pm_nl_set_limits $ns2 1 1
+ speed=10 \
+ run_tests $ns1 $ns2 10.0.1.1 &
+ local tests_pid=$!
+ wait_mpj $ns1
+ userspace_pm_add_addr $ns1 10.0.2.1 10
+ chk_join_nr 1 1 1
+ chk_add_nr 1 1
+ chk_mptcp_info subflows 1 subflows 1
+ chk_subflows_total 2 2
+ chk_mptcp_info add_addr_signal 1 add_addr_accepted 1
+ userspace_pm_rm_addr $ns1 0
+ sleep 0.5
+ chk_rm_nr 1 0 invert
+ chk_rst_nr 0 0 invert
+ chk_mptcp_info subflows 1 subflows 1
+ chk_subflows_total 2 2
+ kill_events_pids
+ wait $tests_pid
+ fi
}
endpoint_tests()
--
2.35.3
^ permalink raw reply related [flat|nested] 7+ messages in thread