* [PATCH mptcp-next v8 00/22] userspace pm enhancements
@ 2023-11-13 2:48 Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 01/22] mptcp: export pm_nl_get_pernet_from_msk Geliang Tang
` (21 more replies)
0 siblings, 22 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
v8:
- add mptcp_lib_check helper
v7:
- merge 'Squash to "mptcp: add use_id parameter for addresses_equal
v6"', fix packetdrill_add_addr error.
- fix memleak error in "mptcp: add netlink pm addr entry refcount".
- split "selftests: mptcp: flush and dump userspace addrs list" into
two patches.
v6:
- fix kmemleak errors reported by CI.
- drop a patch "mptcp: add netlink pm addr entry refcount".
v5:
- Put the two series "add flush and dump for userspace" and
"add refcount for address entry" together for better CI testing.
Patches 1-12: add flush and dump for userspace
v4:
- fix the deadlock issue in v3 reported by CI.
v3:
- fix warnings reported by CI.
- get id_bitmap using pm_nl_get_pernet_from_msk.
v2:
- add two patches: "mptcp: check userspace pm subflow flag"
"selftests: mptcp: add userspace pm subflow flag"
This series adds flush and dump commands support for userspace pm.
Patches 13-21: add refcount for address entry
v4:
- move two patches here from "add flush and dump for userspace pm":
mptcp: add userspace_pm_get_entry helper
mptcp: drop addr_match and id_match
v3:
- add four selftests patches:
selftests: mptcp: export event macros in mptcp_lib
selftests: mptcp: extract mptcp_lib_check_expected
selftests: mptcp: add mptcp_lib_verify_listener_events
selftests: mptcp: add mptcp_lib_init_ns
v2:
- rebased with "add flush and dump for userspace pm" series.
Add refcount for address entry.
Geliang Tang (22):
mptcp: export pm_nl_get_pernet_from_msk
mptcp: drop mptcp_pm_get_* helpers
mptcp: use pernet id_bitmap in userspace pm
mptcp: add userspace_pm_lookup_addr_by_id helper
mptcp: drop lookup_by_id parameter in lookup_addr
mptcp: dump addrs in userspace pm list
mptcp: check userspace pm subflow flag
selftests: mptcp: add userspace pm subflow flag
selftests: mptcp: pm_netlink: print colored output
selftests: mptcp: add mptcp_lib_cleanup
selftests: mptcp: add mptcp_lib_check helper
selftests: mptcp: dump userspace addrs list
mptcp: add a prefix for free_local_addr_list
mptcp: flush userspace pm addrs list
selftests: mptcp: flush userspace addrs list
mptcp: add use_id parameter for addresses_equal
mptcp: add check_id for lookup_anno_list_by_saddr
mptcp: add userspace_pm_get_entry helper
mptcp: drop addr_match and id_match
mptcp: dup an entry when removing it
mptcp: add userspace pm addr entry refcount
selftests: mptcp: rm userspace addr with random order
net/mptcp/pm.c | 16 +-
net/mptcp/pm_netlink.c | 131 +++++--------
net/mptcp/pm_userspace.c | 181 +++++++++++++-----
net/mptcp/protocol.c | 2 +-
net/mptcp/protocol.h | 38 +++-
net/mptcp/sockopt.c | 9 +-
tools/testing/selftests/net/mptcp/diag.sh | 1 +
.../selftests/net/mptcp/mptcp_connect.sh | 1 +
.../testing/selftests/net/mptcp/mptcp_join.sh | 18 +-
.../testing/selftests/net/mptcp/mptcp_lib.sh | 32 ++++
.../selftests/net/mptcp/mptcp_sockopt.sh | 1 +
.../testing/selftests/net/mptcp/pm_netlink.sh | 30 +--
tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 8 +
.../selftests/net/mptcp/simult_flows.sh | 1 +
.../selftests/net/mptcp/userspace_pm.sh | 1 +
15 files changed, 295 insertions(+), 175 deletions(-)
--
2.35.3
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 01/22] mptcp: export pm_nl_get_pernet_from_msk
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 02/22] mptcp: drop mptcp_pm_get_* helpers Geliang Tang
` (20 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch moves struct pm_nl_pernet from pm_netlink.c to protocol.h,
and export pm_nl_get_pernet_from_msk() helper.
Then every fields of struct pm_nl_pernet can be accessed everywhere,
not only being limited in pm_netlink.c.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_netlink.c | 17 ++---------------
net/mptcp/protocol.h | 17 +++++++++++++++++
2 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index bf4d96f6f99a..1dcf104d7a01 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -31,20 +31,6 @@ struct mptcp_pm_add_entry {
struct mptcp_sock *sock;
};
-struct pm_nl_pernet {
- /* protects pernet updates */
- spinlock_t lock;
- struct list_head local_addr_list;
- unsigned int addrs;
- unsigned int stale_loss_cnt;
- unsigned int add_addr_signal_max;
- unsigned int add_addr_accept_max;
- unsigned int local_addr_max;
- unsigned int subflows_max;
- unsigned int next_id;
- DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
-};
-
#define MPTCP_PM_ADDR_MAX 8
#define ADD_ADDR_RETRANS_MAX 3
@@ -53,11 +39,12 @@ static struct pm_nl_pernet *pm_nl_get_pernet(const struct net *net)
return net_generic(net, pm_nl_pernet_id);
}
-static struct pm_nl_pernet *
+struct pm_nl_pernet *
pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk)
{
return pm_nl_get_pernet(sock_net((struct sock *)msk));
}
+EXPORT_SYMBOL_GPL(pm_nl_get_pernet_from_msk);
bool mptcp_addresses_equal(const struct mptcp_addr_info *a,
const struct mptcp_addr_info *b, bool use_port)
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 8529b3ae55e9..c38a2126071b 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1026,6 +1026,23 @@ void __init mptcp_pm_nl_init(void);
void mptcp_pm_nl_work(struct mptcp_sock *msk);
void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk,
const struct mptcp_rm_list *rm_list);
+
+struct pm_nl_pernet {
+ /* protects pernet updates */
+ spinlock_t lock;
+ struct list_head local_addr_list;
+ unsigned int addrs;
+ unsigned int stale_loss_cnt;
+ unsigned int add_addr_signal_max;
+ unsigned int add_addr_accept_max;
+ unsigned int local_addr_max;
+ unsigned int subflows_max;
+ unsigned int next_id;
+ DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
+};
+
+struct pm_nl_pernet *
+pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk);
unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk);
unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk);
unsigned int mptcp_pm_get_subflows_max(const struct mptcp_sock *msk);
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 02/22] mptcp: drop mptcp_pm_get_* helpers
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 01/22] mptcp: export pm_nl_get_pernet_from_msk Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 03/22] mptcp: use pernet id_bitmap in userspace pm Geliang Tang
` (19 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Drop four mptcp_pm_get_* helpers:
mptcp_pm_get_add_addr_signal_max();
mptcp_pm_get_add_addr_accept_max();
mptcp_pm_get_subflows_max();
mptcp_pm_get_local_addr_max();
The helper pm_nl_get_pernet_from_msk() now can be used to replace each of
them.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm.c | 12 +++++-----
net/mptcp/pm_netlink.c | 50 +++++++++---------------------------------
net/mptcp/protocol.h | 8 +++----
net/mptcp/sockopt.c | 9 ++++----
4 files changed, 25 insertions(+), 54 deletions(-)
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 4ae19113b8eb..48ff7ce20890 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -85,6 +85,7 @@ void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int
bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk)
{
+ struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
struct mptcp_pm_data *pm = &msk->pm;
unsigned int subflows_max;
int ret = 0;
@@ -99,7 +100,7 @@ bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk)
return false;
}
- subflows_max = mptcp_pm_get_subflows_max(msk);
+ subflows_max = READ_ONCE(pernet->subflows_max);
pr_debug("msk=%p subflows=%d max=%d allow=%d", msk, pm->subflows,
subflows_max, READ_ONCE(pm->accept_subflow));
@@ -496,6 +497,7 @@ bool mptcp_pm_addr_families_match(const struct sock *sk,
void mptcp_pm_data_reset(struct mptcp_sock *msk)
{
+ struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
u8 pm_type = mptcp_get_pm_type(sock_net((struct sock *)msk));
struct mptcp_pm_data *pm = &msk->pm;
@@ -508,17 +510,17 @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
WRITE_ONCE(pm->pm_type, pm_type);
if (pm_type == MPTCP_PM_TYPE_KERNEL) {
- bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk);
+ bool subflows_allowed = !!READ_ONCE(pernet->subflows_max);
/* pm->work_pending must be only be set to 'true' when
* pm->pm_type is set to MPTCP_PM_TYPE_KERNEL
*/
WRITE_ONCE(pm->work_pending,
- (!!mptcp_pm_get_local_addr_max(msk) &&
+ (!!READ_ONCE(pernet->local_addr_max) &&
subflows_allowed) ||
- !!mptcp_pm_get_add_addr_signal_max(msk));
+ !!READ_ONCE(pernet->add_addr_signal_max));
WRITE_ONCE(pm->accept_addr,
- !!mptcp_pm_get_add_addr_accept_max(msk) &&
+ !!READ_ONCE(pernet->add_addr_accept_max) &&
subflows_allowed);
WRITE_ONCE(pm->accept_subflow, subflows_allowed);
} else {
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 1dcf104d7a01..dbf040e39af4 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -183,43 +183,11 @@ select_signal_address(struct pm_nl_pernet *pernet, const struct mptcp_sock *msk)
return ret;
}
-unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk)
-{
- const struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
-
- return READ_ONCE(pernet->add_addr_signal_max);
-}
-EXPORT_SYMBOL_GPL(mptcp_pm_get_add_addr_signal_max);
-
-unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk)
-{
- struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
-
- return READ_ONCE(pernet->add_addr_accept_max);
-}
-EXPORT_SYMBOL_GPL(mptcp_pm_get_add_addr_accept_max);
-
-unsigned int mptcp_pm_get_subflows_max(const struct mptcp_sock *msk)
-{
- struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
-
- return READ_ONCE(pernet->subflows_max);
-}
-EXPORT_SYMBOL_GPL(mptcp_pm_get_subflows_max);
-
-unsigned int mptcp_pm_get_local_addr_max(const struct mptcp_sock *msk)
-{
- struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
-
- return READ_ONCE(pernet->local_addr_max);
-}
-EXPORT_SYMBOL_GPL(mptcp_pm_get_local_addr_max);
-
bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk)
{
struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
- if (msk->pm.subflows == mptcp_pm_get_subflows_max(msk) ||
+ if (msk->pm.subflows == READ_ONCE(pernet->subflows_max) ||
(find_next_and_bit(pernet->id_bitmap, msk->pm.id_avail_bitmap,
MPTCP_PM_MAX_ADDR_ID + 1, 0) == MPTCP_PM_MAX_ADDR_ID + 1)) {
WRITE_ONCE(msk->pm.work_pending, false);
@@ -404,6 +372,7 @@ static unsigned int fill_remote_addresses_vec(struct mptcp_sock *msk,
bool fullmesh,
struct mptcp_addr_info *addrs)
{
+ struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
bool deny_id0 = READ_ONCE(msk->pm.remote_deny_join_id0);
struct sock *sk = (struct sock *)msk, *ssk;
struct mptcp_subflow_context *subflow;
@@ -411,7 +380,7 @@ static unsigned int fill_remote_addresses_vec(struct mptcp_sock *msk,
unsigned int subflows_max;
int i = 0;
- subflows_max = mptcp_pm_get_subflows_max(msk);
+ subflows_max = READ_ONCE(pernet->subflows_max);
remote_address((struct sock_common *)sk, &remote);
/* Non-fullmesh endpoint, fill in the single entry
@@ -514,9 +483,9 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
pernet = pm_nl_get_pernet(sock_net(sk));
- add_addr_signal_max = mptcp_pm_get_add_addr_signal_max(msk);
- local_addr_max = mptcp_pm_get_local_addr_max(msk);
- subflows_max = mptcp_pm_get_subflows_max(msk);
+ add_addr_signal_max = READ_ONCE(pernet->add_addr_signal_max);
+ local_addr_max = READ_ONCE(pernet->local_addr_max);
+ subflows_max = READ_ONCE(pernet->subflows_max);
/* do lazy endpoint usage accounting for the MPC subflows */
if (unlikely(!(msk->pm.status & BIT(MPTCP_PM_MPC_ENDPOINT_ACCOUNTED))) && msk->first) {
@@ -621,7 +590,7 @@ static unsigned int fill_local_addresses_vec(struct mptcp_sock *msk,
int i = 0;
pernet = pm_nl_get_pernet_from_msk(msk);
- subflows_max = mptcp_pm_get_subflows_max(msk);
+ subflows_max = READ_ONCE(pernet->subflows_max);
rcu_read_lock();
list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) {
@@ -664,6 +633,7 @@ static unsigned int fill_local_addresses_vec(struct mptcp_sock *msk,
static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
{
+ struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
struct mptcp_addr_info addrs[MPTCP_PM_ADDR_MAX];
struct sock *sk = (struct sock *)msk;
unsigned int add_addr_accept_max;
@@ -671,8 +641,8 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
unsigned int subflows_max;
int i, nr;
- add_addr_accept_max = mptcp_pm_get_add_addr_accept_max(msk);
- subflows_max = mptcp_pm_get_subflows_max(msk);
+ add_addr_accept_max = READ_ONCE(pernet->add_addr_accept_max);
+ subflows_max = READ_ONCE(pernet->subflows_max);
pr_debug("accepted %d:%d remote family %d",
msk->pm.add_addr_accepted, add_addr_accept_max,
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index c38a2126071b..88f5b422f941 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1043,15 +1043,13 @@ struct pm_nl_pernet {
struct pm_nl_pernet *
pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk);
-unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk);
-unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk);
-unsigned int mptcp_pm_get_subflows_max(const struct mptcp_sock *msk);
-unsigned int mptcp_pm_get_local_addr_max(const struct mptcp_sock *msk);
/* called under PM lock */
static inline void __mptcp_pm_close_subflow(struct mptcp_sock *msk)
{
- if (--msk->pm.subflows < mptcp_pm_get_subflows_max(msk))
+ struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
+
+ if (--msk->pm.subflows < READ_ONCE(pernet->subflows_max))
WRITE_ONCE(msk->pm.accept_subflow, true);
}
diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c
index cabe856b2a45..8d63df5ded50 100644
--- a/net/mptcp/sockopt.c
+++ b/net/mptcp/sockopt.c
@@ -893,6 +893,7 @@ static int mptcp_getsockopt_first_sf_only(struct mptcp_sock *msk, int level, int
void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info)
{
+ struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
struct sock *sk = (struct sock *)msk;
u32 flags = 0;
bool slow;
@@ -910,13 +911,13 @@ void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info)
/* The following limits only make sense for the in-kernel PM */
if (mptcp_pm_is_kernel(msk)) {
info->mptcpi_subflows_max =
- mptcp_pm_get_subflows_max(msk);
+ READ_ONCE(pernet->subflows_max);
info->mptcpi_add_addr_signal_max =
- mptcp_pm_get_add_addr_signal_max(msk);
+ READ_ONCE(pernet->add_addr_signal_max);
info->mptcpi_add_addr_accepted_max =
- mptcp_pm_get_add_addr_accept_max(msk);
+ READ_ONCE(pernet->add_addr_accept_max);
info->mptcpi_local_addr_max =
- mptcp_pm_get_local_addr_max(msk);
+ READ_ONCE(pernet->local_addr_max);
}
if (__mptcp_check_fallback(msk))
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 03/22] mptcp: use pernet id_bitmap in userspace pm
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 01/22] mptcp: export pm_nl_get_pernet_from_msk Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 02/22] mptcp: drop mptcp_pm_get_* helpers Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 04/22] mptcp: add userspace_pm_lookup_addr_by_id helper Geliang Tang
` (18 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch uses pm_nl_get_pernet_from_msk() to get the pernet id_bitmap
instead of using a local bitmap when appending a new local address into
the userspace PM local address list.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_userspace.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index efecbe3cf415..b3a606a5e182 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -28,7 +28,7 @@ void mptcp_free_local_addr_list(struct mptcp_sock *msk)
static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
struct mptcp_pm_addr_entry *entry)
{
- DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
+ struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
struct mptcp_pm_addr_entry *match = NULL;
struct sock *sk = (struct sock *)msk;
struct mptcp_pm_addr_entry *e;
@@ -36,8 +36,6 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
bool id_match = false;
int ret = -EINVAL;
- bitmap_zero(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
-
spin_lock_bh(&msk->pm.lock);
list_for_each_entry(e, &msk->pm.userspace_pm_local_addr_list, list) {
addr_match = mptcp_addresses_equal(&e->addr, &entry->addr, true);
@@ -50,7 +48,6 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
} else if (addr_match || id_match) {
break;
}
- __set_bit(e->addr.id, id_bitmap);
}
if (!match && !addr_match && !id_match) {
@@ -65,9 +62,10 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
*e = *entry;
if (!e->addr.id)
- e->addr.id = find_next_zero_bit(id_bitmap,
+ e->addr.id = find_next_zero_bit(pernet->id_bitmap,
MPTCP_PM_MAX_ADDR_ID + 1,
1);
+ __set_bit(e->addr.id, pernet->id_bitmap);
list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list);
msk->pm.local_addr_used++;
ret = e->addr.id;
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 04/22] mptcp: add userspace_pm_lookup_addr_by_id helper
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (2 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 03/22] mptcp: use pernet id_bitmap in userspace pm Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 05/22] mptcp: drop lookup_by_id parameter in lookup_addr Geliang Tang
` (17 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Corresponding __lookup_addr_by_id() helper in the in-kernel netlink PM,
this patch adds a new helper mptcp_userspace_pm_lookup_addr_by_id() to
lookup the address entry with the given id on the userspace pm local
address list.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_userspace.c | 31 ++++++++++++++++---------------
1 file changed, 16 insertions(+), 15 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index b3a606a5e182..6999296cd5db 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -25,6 +25,18 @@ void mptcp_free_local_addr_list(struct mptcp_sock *msk)
}
}
+static struct mptcp_pm_addr_entry *
+mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
+{
+ struct mptcp_pm_addr_entry *entry;
+
+ list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
+ if (entry->addr.id == id)
+ return entry;
+ }
+ return NULL;
+}
+
static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
struct mptcp_pm_addr_entry *entry)
{
@@ -107,15 +119,10 @@ int mptcp_userspace_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk,
unsigned int id,
u8 *flags, int *ifindex)
{
- struct mptcp_pm_addr_entry *entry, *match = NULL;
+ struct mptcp_pm_addr_entry *match;
spin_lock_bh(&msk->pm.lock);
- list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
- if (id == entry->addr.id) {
- match = entry;
- break;
- }
- }
+ match = mptcp_userspace_pm_lookup_addr_by_id(msk, id);
spin_unlock_bh(&msk->pm.lock);
if (match) {
*flags = match->flags;
@@ -247,7 +254,7 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
{
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
struct nlattr *id = info->attrs[MPTCP_PM_ATTR_LOC_ID];
- struct mptcp_pm_addr_entry *match = NULL;
+ struct mptcp_pm_addr_entry *match;
struct mptcp_pm_addr_entry *entry;
struct mptcp_sock *msk;
LIST_HEAD(free_list);
@@ -284,13 +291,7 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
lock_sock(sk);
- list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
- if (entry->addr.id == id_val) {
- match = entry;
- break;
- }
- }
-
+ match = mptcp_userspace_pm_lookup_addr_by_id(msk, id_val);
if (!match) {
GENL_SET_ERR_MSG(info, "address with specified id not found");
release_sock(sk);
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 05/22] mptcp: drop lookup_by_id parameter in lookup_addr
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (3 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 04/22] mptcp: add userspace_pm_lookup_addr_by_id helper Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 06/22] mptcp: dump addrs in userspace pm list Geliang Tang
` (16 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
When the lookup_by_id parameter of __lookup_addr() is true, it's the same
as __lookup_addr_by_id(), it can be replaced by __lookup_addr_by_id()
directly. So drop this parameter, let __lookup_addr() only looks up address
on the local address list by comparing addresses in it, not address ids.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_netlink.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index dbf040e39af4..4cb52df57ba5 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -458,15 +458,12 @@ __lookup_addr_by_id(struct pm_nl_pernet *pernet, unsigned int id)
}
static struct mptcp_pm_addr_entry *
-__lookup_addr(struct pm_nl_pernet *pernet, const struct mptcp_addr_info *info,
- bool lookup_by_id)
+__lookup_addr(struct pm_nl_pernet *pernet, const struct mptcp_addr_info *info)
{
struct mptcp_pm_addr_entry *entry;
list_for_each_entry(entry, &pernet->local_addr_list, list) {
- if ((!lookup_by_id &&
- mptcp_addresses_equal(&entry->addr, info, entry->addr.port)) ||
- (lookup_by_id && entry->addr.id == info->id))
+ if (mptcp_addresses_equal(&entry->addr, info, entry->addr.port))
return entry;
}
return NULL;
@@ -496,7 +493,7 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
mptcp_local_address((struct sock_common *)msk->first, &mpc_addr);
rcu_read_lock();
- entry = __lookup_addr(pernet, &mpc_addr, false);
+ entry = __lookup_addr(pernet, &mpc_addr);
if (entry) {
__clear_bit(entry->addr.id, msk->pm.id_avail_bitmap);
msk->mpc_endpoint_id = entry->addr.id;
@@ -1832,7 +1829,8 @@ int mptcp_pm_nl_set_flags(struct net *net, struct mptcp_pm_addr_entry *addr, u8
}
spin_lock_bh(&pernet->lock);
- entry = __lookup_addr(pernet, &addr->addr, lookup_by_id);
+ entry = lookup_by_id ? __lookup_addr_by_id(pernet, addr->addr.id) :
+ __lookup_addr(pernet, &addr->addr);
if (!entry) {
spin_unlock_bh(&pernet->lock);
return -EINVAL;
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 06/22] mptcp: dump addrs in userspace pm list
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (4 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 05/22] mptcp: drop lookup_by_id parameter in lookup_addr Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 07/22] mptcp: check userspace pm subflow flag Geliang Tang
` (15 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds a new function __userspace_pm_lookup_addr_by_id() to lookup
the address entry by the given id in the userspace local addresses list.
Invoke it when dumping addresses from netlink commands.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_netlink.c | 9 +++++++--
net/mptcp/pm_userspace.c | 25 +++++++++++++++++++++++++
net/mptcp/protocol.h | 2 ++
3 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 4cb52df57ba5..08b4211fbcbd 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1673,8 +1673,13 @@ int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg,
for (i = id; i < MPTCP_PM_MAX_ADDR_ID + 1; i++) {
if (test_bit(i, pernet->id_bitmap)) {
entry = __lookup_addr_by_id(pernet, i);
- if (!entry)
- break;
+ if (!entry) {
+ spin_unlock_bh(&pernet->lock);
+ entry = __userspace_pm_lookup_addr_by_id(net, i);
+ spin_lock_bh(&pernet->lock);
+ if (!entry)
+ break;
+ }
if (entry->addr.id <= id)
continue;
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 6999296cd5db..5e45e36ce1d3 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -549,3 +549,28 @@ int mptcp_userspace_pm_set_flags(struct net *net, struct nlattr *token,
sock_put(sk);
return ret;
}
+
+struct mptcp_pm_addr_entry *
+__userspace_pm_lookup_addr_by_id(struct net *net, unsigned int id)
+{
+ struct mptcp_pm_addr_entry *entry = NULL;
+ long s_slot = 0, s_num = 0;
+ struct mptcp_sock *msk;
+
+ while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
+ struct sock *sk = (struct sock *)msk;
+
+ if (mptcp_pm_is_userspace(msk)) {
+ lock_sock(sk);
+ spin_lock_bh(&msk->pm.lock);
+ entry = mptcp_userspace_pm_lookup_addr_by_id(msk, id);
+ spin_unlock_bh(&msk->pm.lock);
+ release_sock(sk);
+ }
+
+ sock_put(sk);
+ cond_resched();
+ }
+
+ return entry;
+}
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 88f5b422f941..c30e59278080 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1021,6 +1021,8 @@ bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
+struct mptcp_pm_addr_entry *
+__userspace_pm_lookup_addr_by_id(struct net *net, unsigned int id);
void __init mptcp_pm_nl_init(void);
void mptcp_pm_nl_work(struct mptcp_sock *msk);
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 07/22] mptcp: check userspace pm subflow flag
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (5 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 06/22] mptcp: dump addrs in userspace pm list Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 08/22] selftests: mptcp: add " Geliang Tang
` (14 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch uses mptcp_pm_parse_entry() instead of mptcp_pm_parse_addr()
to get the flags of the entry. Add MPTCP_PM_ADDR_FLAG_SUBFLOW flag check
in mptcp_pm_nl_subflow_create_doit().
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_userspace.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 5e45e36ce1d3..de10be21bf26 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -347,12 +347,19 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
goto create_err;
}
- err = mptcp_pm_parse_addr(laddr, info, &addr_l);
+ err = mptcp_pm_parse_entry(laddr, info, true, &local);
if (err < 0) {
NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr");
goto create_err;
}
+ if (!(local.flags & MPTCP_PM_ADDR_FLAG_SUBFLOW)) {
+ GENL_SET_ERR_MSG(info, "invalid addr flags");
+ err = -EINVAL;
+ goto create_err;
+ }
+ addr_l = local.addr;
+
err = mptcp_pm_parse_addr(raddr, info, &addr_r);
if (err < 0) {
NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr");
@@ -365,7 +372,6 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
goto create_err;
}
- local.addr = addr_l;
err = mptcp_userspace_pm_append_new_local_addr(msk, &local);
if (err < 0) {
GENL_SET_ERR_MSG(info, "did not match address and id");
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 08/22] selftests: mptcp: add userspace pm subflow flag
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (6 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 07/22] mptcp: check userspace pm subflow flag Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 09/22] selftests: mptcp: pm_netlink: print colored output Geliang Tang
` (13 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds the address flag MPTCP_PM_ADDR_FLAG_SUBFLOW in csf() in
pm_nl_ctl.c when subflow is created by a userspace PM.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
index 49369c4a5f26..e97856323ec3 100644
--- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
+++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
@@ -453,6 +453,7 @@ int csf(int fd, int pm_family, int argc, char *argv[])
char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) +
NLMSG_ALIGN(sizeof(struct genlmsghdr)) +
1024];
+ u_int32_t flags = MPTCP_PM_ADDR_FLAG_SUBFLOW;
const char *params[5];
struct nlmsghdr *nh;
struct rtattr *addr;
@@ -558,6 +559,13 @@ int csf(int fd, int pm_family, int argc, char *argv[])
off += NLMSG_ALIGN(rta->rta_len);
}
+ /* addr flags */
+ rta = (void *)(data + off);
+ rta->rta_type = MPTCP_PM_ADDR_ATTR_FLAGS;
+ rta->rta_len = RTA_LENGTH(4);
+ memcpy(RTA_DATA(rta), &flags, 4);
+ off += NLMSG_ALIGN(rta->rta_len);
+
addr->rta_len = off - addr_start;
}
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 09/22] selftests: mptcp: pm_netlink: print colored output
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (7 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 08/22] selftests: mptcp: add " Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 10/22] selftests: mptcp: add mptcp_lib_cleanup Geliang Tang
` (12 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
The helper check() will be moved into mptcp_lib.sh, and be used by two
scripts mptcp_join.sh and pm_netlink.sh. The former prints colored
output while the latter is not. It makes sense to unify them.
Use mptcp_lib_print_ok(), mptcp_lib_print_err, and mptcp_lib_echo_err
helpers in script pm_netlink.sh to print test results with colors.
Having colors helps to quickly identify issues when looking at a long
list of output logs and results.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/net/mptcp/pm_netlink.sh | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/pm_netlink.sh b/tools/testing/selftests/net/mptcp/pm_netlink.sh
index 8f4ff123a7eb..b1155f4a8504 100755
--- a/tools/testing/selftests/net/mptcp/pm_netlink.sh
+++ b/tools/testing/selftests/net/mptcp/pm_netlink.sh
@@ -60,16 +60,15 @@ check()
printf "%-50s" "$msg"
if [ $cmd_ret -ne 0 ]; then
- echo "[FAIL] command execution '$cmd' stderr "
+ mptcp_lib_print_err "[FAIL] command execution '$cmd' stderr "
cat $err
mptcp_lib_result_fail "${msg} # error ${cmd_ret}"
ret=1
elif [ "$out" = "$expected" ]; then
- echo "[ OK ]"
+ mptcp_lib_print_ok "[ OK ]"
mptcp_lib_result_pass "${msg}"
else
- echo -n "[FAIL] "
- echo "expected '$expected' got '$out'"
+ mptcp_lib_print_err "[FAIL] expected '$expected' got '$out'"
mptcp_lib_result_fail "${msg} # different output"
ret=1
fi
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 10/22] selftests: mptcp: add mptcp_lib_cleanup
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (8 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 09/22] selftests: mptcp: pm_netlink: print colored output Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 11/22] selftests: mptcp: add mptcp_lib_check helper Geliang Tang
` (11 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds a new helper mptcp_lib_cleanup() in mptcp_lib.sh, it's
a public cleanup interface, being invoked in every cleanup() in all
scripts.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/net/mptcp/diag.sh | 1 +
tools/testing/selftests/net/mptcp/mptcp_connect.sh | 1 +
tools/testing/selftests/net/mptcp/mptcp_join.sh | 1 +
tools/testing/selftests/net/mptcp/mptcp_lib.sh | 5 +++++
tools/testing/selftests/net/mptcp/mptcp_sockopt.sh | 1 +
tools/testing/selftests/net/mptcp/pm_netlink.sh | 1 +
tools/testing/selftests/net/mptcp/simult_flows.sh | 1 +
tools/testing/selftests/net/mptcp/userspace_pm.sh | 1 +
8 files changed, 12 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/diag.sh b/tools/testing/selftests/net/mptcp/diag.sh
index 95b498efacd1..a678ee21973b 100755
--- a/tools/testing/selftests/net/mptcp/diag.sh
+++ b/tools/testing/selftests/net/mptcp/diag.sh
@@ -31,6 +31,7 @@ cleanup()
ip netns pids "${ns}" | xargs --no-run-if-empty kill -SIGKILL &>/dev/null
ip netns del $ns
+ mptcp_lib_cleanup
}
mptcp_lib_check_mptcp
diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.sh b/tools/testing/selftests/net/mptcp/mptcp_connect.sh
index 7898d62fce0b..98f4e82789ba 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_connect.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_connect.sh
@@ -143,6 +143,7 @@ cleanup()
ip netns del $netns
rm -f /tmp/$netns.{nstat,out}
done
+ mptcp_lib_cleanup
}
mptcp_lib_check_mptcp
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 995280882428..3b49a1893772 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -198,6 +198,7 @@ cleanup()
rm -f "$tmpfile"
rm -rf $evts_ns1 $evts_ns2
cleanup_partial
+ mptcp_lib_cleanup
}
print_title()
diff --git a/tools/testing/selftests/net/mptcp/mptcp_lib.sh b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
index 1f8be9dd0e20..cbaa55ab89b1 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
@@ -299,3 +299,8 @@ mptcp_lib_wait_local_port_listen() {
sleep 0.1
done
}
+
+mptcp_lib_cleanup()
+{
+ echo "cleanup"
+}
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
index c643872ddf47..75d8c648f9de 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -85,6 +85,7 @@ cleanup()
done
rm -f "$cin" "$cout"
rm -f "$sin" "$sout"
+ mptcp_lib_cleanup
}
mptcp_lib_check_mptcp
diff --git a/tools/testing/selftests/net/mptcp/pm_netlink.sh b/tools/testing/selftests/net/mptcp/pm_netlink.sh
index b1155f4a8504..85b2c9145601 100755
--- a/tools/testing/selftests/net/mptcp/pm_netlink.sh
+++ b/tools/testing/selftests/net/mptcp/pm_netlink.sh
@@ -34,6 +34,7 @@ cleanup()
{
rm -f $err
ip netns del $ns1
+ mptcp_lib_cleanup
}
mptcp_lib_check_mptcp
diff --git a/tools/testing/selftests/net/mptcp/simult_flows.sh b/tools/testing/selftests/net/mptcp/simult_flows.sh
index ae8ad5d6fb9d..436500c55e12 100755
--- a/tools/testing/selftests/net/mptcp/simult_flows.sh
+++ b/tools/testing/selftests/net/mptcp/simult_flows.sh
@@ -34,6 +34,7 @@ cleanup()
for netns in "$ns1" "$ns2" "$ns3";do
ip netns del $netns
done
+ mptcp_lib_cleanup
}
mptcp_lib_check_mptcp
diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/testing/selftests/net/mptcp/userspace_pm.sh
index 6167837f48e1..005251b61d7a 100755
--- a/tools/testing/selftests/net/mptcp/userspace_pm.sh
+++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh
@@ -129,6 +129,7 @@ cleanup()
rm -rf $file $client_evts $server_evts
+ mptcp_lib_cleanup
_printf "Done\n"
}
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 11/22] selftests: mptcp: add mptcp_lib_check helper
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (9 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 10/22] selftests: mptcp: add mptcp_lib_cleanup Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 12/22] selftests: mptcp: dump userspace addrs list Geliang Tang
` (10 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Extract the main part of check() in pm_netlink.sh to a new function
mptcp_lib_check() in mptcp_lib.sh. It will be used in mptcp_john.sh later.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
.../testing/selftests/net/mptcp/mptcp_lib.sh | 27 ++++++++++++++++++
.../testing/selftests/net/mptcp/pm_netlink.sh | 28 ++++++-------------
2 files changed, 35 insertions(+), 20 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_lib.sh b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
index cbaa55ab89b1..466fde97d3f4 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
@@ -300,7 +300,34 @@ mptcp_lib_wait_local_port_listen() {
done
}
+mptcp_lib_err=$(mktemp)
+
+mptcp_lib_check()
+{
+ local cmd="$1"
+ local expected="$2"
+ local msg="$3"
+ local out=`$cmd 2>$mptcp_lib_err`
+ local cmd_ret=$?
+
+ printf "%-42s" "$msg"
+ if [ $cmd_ret -ne 0 ]; then
+ mptcp_lib_print_err "[FAIL] command execution '$cmd' stderr "
+ cat $mptcp_lib_err
+ ret=1
+ return $cmd_ret
+ elif [ "$out" = "$expected" ]; then
+ mptcp_lib_print_ok "[ OK ]"
+ return 0
+ else
+ mptcp_lib_print_err "[FAIL] expected '$expected' got '$out'"
+ ret=1
+ return 1
+ fi
+}
+
mptcp_lib_cleanup()
{
echo "cleanup"
+ rm -f $mptcp_lib_err
}
diff --git a/tools/testing/selftests/net/mptcp/pm_netlink.sh b/tools/testing/selftests/net/mptcp/pm_netlink.sh
index 85b2c9145601..8d30d4a1db57 100755
--- a/tools/testing/selftests/net/mptcp/pm_netlink.sh
+++ b/tools/testing/selftests/net/mptcp/pm_netlink.sh
@@ -27,12 +27,10 @@ done
sec=$(date +%s)
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
ns1="ns1-$rndh"
-err=$(mktemp)
ret=0
cleanup()
{
- rm -f $err
ip netns del $ns1
mptcp_lib_cleanup
}
@@ -53,25 +51,15 @@ ip netns exec $ns1 sysctl -q net.mptcp.enabled=1
check()
{
- local cmd="$1"
- local expected="$2"
- local msg="$3"
- local out=`$cmd 2>$err`
- local cmd_ret=$?
-
- printf "%-50s" "$msg"
- if [ $cmd_ret -ne 0 ]; then
- mptcp_lib_print_err "[FAIL] command execution '$cmd' stderr "
- cat $err
- mptcp_lib_result_fail "${msg} # error ${cmd_ret}"
- ret=1
- elif [ "$out" = "$expected" ]; then
- mptcp_lib_print_ok "[ OK ]"
- mptcp_lib_result_pass "${msg}"
+ # ${*} doesn't work here since there're spaces in some arguments.
+ mptcp_lib_check "${1}" "${2}" "${3}"
+ local rc=$?
+ if [ ${rc} -eq 0 ]; then
+ mptcp_lib_result_pass "${3}"
+ elif [ ${rc} -eq 1 ]; then
+ mptcp_lib_result_fail "${3} # different output"
else
- mptcp_lib_print_err "[FAIL] expected '$expected' got '$out'"
- mptcp_lib_result_fail "${msg} # different output"
- ret=1
+ mptcp_lib_result_fail "${3} # error ${rc}"
fi
}
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 12/22] selftests: mptcp: dump userspace addrs list
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (10 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 11/22] selftests: mptcp: add mptcp_lib_check helper Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 13/22] mptcp: add a prefix for free_local_addr_list Geliang Tang
` (9 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch tests newly added dump command for the userspace PM. Add these
commands into userspace pm tests.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/net/mptcp/mptcp_join.sh | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 3b49a1893772..9e29251eee15 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -3406,6 +3406,8 @@ userspace_tests()
local tests_pid=$!
wait_mpj $ns1
userspace_pm_add_addr $ns1 10.0.2.1 10
+ mptcp_lib_check "ip netns exec $ns1 ./pm_nl_ctl dump" \
+ "id 10 flags signal 10.0.2.1" " dump addrs"
chk_join_nr 1 1 1
chk_add_nr 1 1
chk_mptcp_info subflows 1 subflows 1
@@ -3430,6 +3432,8 @@ userspace_tests()
local tests_pid=$!
wait_mpj $ns2
userspace_pm_add_sf $ns2 10.0.3.2 20
+ mptcp_lib_check "ip netns exec $ns2 ./pm_nl_ctl dump" \
+ "id 20 flags subflow 10.0.3.2" " dump addrs"
chk_join_nr 1 1 1
chk_mptcp_info subflows 1 subflows 1
chk_subflows_total 2 2
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 13/22] mptcp: add a prefix for free_local_addr_list
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (11 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 12/22] selftests: mptcp: dump userspace addrs list Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 14/22] mptcp: flush userspace pm addrs list Geliang Tang
` (8 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Same as other functions in pm_userspace.c, this patch renames
mptcp_free_local_addr_list() with the userspace pm prefix as
mptcp_userspace_pm_free_local_addr_list().
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_userspace.c | 2 +-
net/mptcp/protocol.c | 2 +-
net/mptcp/protocol.h | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index de10be21bf26..70f6a510e3b4 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -7,7 +7,7 @@
#include "protocol.h"
#include "mib.h"
-void mptcp_free_local_addr_list(struct mptcp_sock *msk)
+void mptcp_userspace_pm_free_local_addr_list(struct mptcp_sock *msk)
{
struct mptcp_pm_addr_entry *entry, *tmp;
struct sock *sk = (struct sock *)msk;
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 6956fde61c68..f2f0ce608219 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -3321,7 +3321,7 @@ void mptcp_destroy_common(struct mptcp_sock *msk, unsigned int flags)
WRITE_ONCE(msk->rmem_fwd_alloc, 0);
mptcp_token_destroy(msk);
mptcp_pm_free_anno_list(msk);
- mptcp_free_local_addr_list(msk);
+ mptcp_userspace_pm_free_local_addr_list(msk);
}
static void mptcp_destroy(struct sock *sk)
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index c30e59278080..76981adcac22 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -943,7 +943,7 @@ void mptcp_pm_remove_addrs(struct mptcp_sock *msk, struct list_head *rm_list);
void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk,
struct list_head *rm_list);
-void mptcp_free_local_addr_list(struct mptcp_sock *msk);
+void mptcp_userspace_pm_free_local_addr_list(struct mptcp_sock *msk);
void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
const struct sock *ssk, gfp_t gfp);
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 14/22] mptcp: flush userspace pm addrs list
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (12 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 13/22] mptcp: add a prefix for free_local_addr_list Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 15/22] selftests: mptcp: flush userspace " Geliang Tang
` (7 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds a new function mptcp_userspace_pm_flush_addrs_list()
to free the userspace local addresses list. Invoke it when flushing
addresses from netlink commands.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_netlink.c | 2 ++
net/mptcp/pm_userspace.c | 25 +++++++++++++++++++++++++
net/mptcp/protocol.h | 1 +
3 files changed, 28 insertions(+)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 08b4211fbcbd..b7e4c8d21078 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1565,6 +1565,8 @@ int mptcp_pm_nl_flush_addrs_doit(struct sk_buff *skb, struct genl_info *info)
mptcp_nl_remove_addrs_list(sock_net(skb->sk), &free_list);
synchronize_rcu();
__flush_addrs(&free_list);
+
+ mptcp_userspace_pm_flush_addrs_list(sock_net(skb->sk));
return 0;
}
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 70f6a510e3b4..abcdc95e7bde 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -20,6 +20,8 @@ void mptcp_userspace_pm_free_local_addr_list(struct mptcp_sock *msk)
list_splice_init(&msk->pm.userspace_pm_local_addr_list, &free_list);
spin_unlock_bh(&msk->pm.lock);
+ mptcp_pm_remove_addrs_and_subflows(msk, &free_list);
+
list_for_each_entry_safe(entry, tmp, &free_list, list) {
sock_kfree_s(sk, entry, sizeof(*entry));
}
@@ -580,3 +582,26 @@ __userspace_pm_lookup_addr_by_id(struct net *net, unsigned int id)
return entry;
}
+
+void mptcp_userspace_pm_flush_addrs_list(struct net *net)
+{
+ long s_slot = 0, s_num = 0;
+ struct mptcp_sock *msk;
+
+ while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
+ struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
+ struct sock *sk = (struct sock *)msk;
+
+ if (mptcp_pm_is_userspace(msk)) {
+ lock_sock(sk);
+ spin_lock_bh(&pernet->lock);
+ bitmap_zero(pernet->id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
+ spin_unlock_bh(&pernet->lock);
+ mptcp_userspace_pm_free_local_addr_list(msk);
+ release_sock(sk);
+ }
+
+ sock_put(sk);
+ cond_resched();
+ }
+}
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 76981adcac22..089fbebd21d3 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -944,6 +944,7 @@ void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk,
struct list_head *rm_list);
void mptcp_userspace_pm_free_local_addr_list(struct mptcp_sock *msk);
+void mptcp_userspace_pm_flush_addrs_list(struct net *net);
void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
const struct sock *ssk, gfp_t gfp);
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 15/22] selftests: mptcp: flush userspace addrs list
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (13 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 14/22] mptcp: flush userspace pm addrs list Geliang Tang
@ 2023-11-13 2:48 ` Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 16/22] mptcp: add use_id parameter for addresses_equal Geliang Tang
` (6 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:48 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch tests newly added flush command for the userspace PM. Add this
command into userspace pm test.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/net/mptcp/mptcp_join.sh | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 9e29251eee15..ada523c160ad 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -3461,6 +3461,10 @@ userspace_tests()
chk_join_nr 1 1 1
chk_mptcp_info subflows 1 subflows 1
chk_subflows_total 2 2
+ ip netns exec $ns2 ./pm_nl_ctl flush
+ mptcp_lib_check "ip netns exec $ns2 ./pm_nl_ctl dump" \
+ "" " dump addrs"
+ chk_rm_nr 0 1
kill_events_pids
wait $tests_pid
fi
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 16/22] mptcp: add use_id parameter for addresses_equal
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (14 preceding siblings ...)
2023-11-13 2:48 ` [PATCH mptcp-next v8 15/22] selftests: mptcp: flush userspace " Geliang Tang
@ 2023-11-13 2:49 ` Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 17/22] mptcp: add check_id for lookup_anno_list_by_saddr Geliang Tang
` (5 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:49 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds a new parameter use_id for mptcp_addresses_equal() to
test the address ids, as well as the address. This can be used to test
if the two given addresses are identically equal, they have both the
same address and the same address id.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm.c | 2 +-
net/mptcp/pm_netlink.c | 32 +++++++++++++++++++-------------
net/mptcp/pm_userspace.c | 4 ++--
net/mptcp/protocol.h | 3 ++-
4 files changed, 24 insertions(+), 17 deletions(-)
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 48ff7ce20890..77a0e859076c 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -420,7 +420,7 @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
*/
mptcp_local_address((struct sock_common *)msk, &msk_local);
mptcp_local_address((struct sock_common *)skc, &skc_local);
- if (mptcp_addresses_equal(&msk_local, &skc_local, false))
+ if (mptcp_addresses_equal(&msk_local, &skc_local, false, false))
return 0;
if (mptcp_pm_is_userspace(msk))
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index b7e4c8d21078..599137001148 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -47,7 +47,8 @@ pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk)
EXPORT_SYMBOL_GPL(pm_nl_get_pernet_from_msk);
bool mptcp_addresses_equal(const struct mptcp_addr_info *a,
- const struct mptcp_addr_info *b, bool use_port)
+ const struct mptcp_addr_info *b,
+ bool use_port, bool use_id)
{
bool addr_equals = false;
@@ -68,10 +69,14 @@ bool mptcp_addresses_equal(const struct mptcp_addr_info *a,
if (!addr_equals)
return false;
- if (!use_port)
+ if (!use_port && !use_id)
return true;
- return a->port == b->port;
+ if (use_port && use_id)
+ return (a->port == b->port) && (a->id == b->id);
+ if (use_port)
+ return a->port == b->port;
+ return a->id == b->id;
}
void mptcp_local_address(const struct sock_common *skc, struct mptcp_addr_info *addr)
@@ -110,7 +115,7 @@ static bool lookup_subflow_by_saddr(const struct list_head *list,
skc = (struct sock_common *)mptcp_subflow_tcp_sock(subflow);
mptcp_local_address(skc, &cur);
- if (mptcp_addresses_equal(&cur, saddr, saddr->port))
+ if (mptcp_addresses_equal(&cur, saddr, saddr->port, false))
return true;
}
@@ -128,7 +133,7 @@ static bool lookup_subflow_by_daddr(const struct list_head *list,
skc = (struct sock_common *)mptcp_subflow_tcp_sock(subflow);
remote_address(skc, &cur);
- if (mptcp_addresses_equal(&cur, daddr, daddr->port))
+ if (mptcp_addresses_equal(&cur, daddr, daddr->port, false))
return true;
}
@@ -205,7 +210,7 @@ mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk,
lockdep_assert_held(&msk->pm.lock);
list_for_each_entry(entry, &msk->pm.anno_list, list) {
- if (mptcp_addresses_equal(&entry->addr, addr, true))
+ if (mptcp_addresses_equal(&entry->addr, addr, true, false))
return entry;
}
@@ -222,7 +227,7 @@ bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk)
spin_lock_bh(&msk->pm.lock);
list_for_each_entry(entry, &msk->pm.anno_list, list) {
- if (mptcp_addresses_equal(&entry->addr, &saddr, true)) {
+ if (mptcp_addresses_equal(&entry->addr, &saddr, true, false)) {
ret = true;
goto out;
}
@@ -463,7 +468,7 @@ __lookup_addr(struct pm_nl_pernet *pernet, const struct mptcp_addr_info *info)
struct mptcp_pm_addr_entry *entry;
list_for_each_entry(entry, &pernet->local_addr_list, list) {
- if (mptcp_addresses_equal(&entry->addr, info, entry->addr.port))
+ if (mptcp_addresses_equal(&entry->addr, info, entry->addr.port, false))
return entry;
}
return NULL;
@@ -704,12 +709,12 @@ int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
struct mptcp_addr_info local, remote;
mptcp_local_address((struct sock_common *)ssk, &local);
- if (!mptcp_addresses_equal(&local, addr, addr->port))
+ if (!mptcp_addresses_equal(&local, addr, addr->port, false))
continue;
if (rem && rem->family != AF_UNSPEC) {
remote_address((struct sock_common *)ssk, &remote);
- if (!mptcp_addresses_equal(&remote, rem, rem->port))
+ if (!mptcp_addresses_equal(&remote, rem, rem->port, false))
continue;
}
@@ -883,7 +888,8 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet,
entry->addr.port = 0;
list_for_each_entry(cur, &pernet->local_addr_list, list) {
if (mptcp_addresses_equal(&cur->addr, &entry->addr,
- cur->addr.port || entry->addr.port)) {
+ cur->addr.port || entry->addr.port,
+ false)) {
/* allow replacing the exiting endpoint only if such
* endpoint is an implicit one and the user-space
* did not provide an endpoint id
@@ -1021,7 +1027,7 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc
rcu_read_lock();
list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) {
- if (mptcp_addresses_equal(&entry->addr, skc, entry->addr.port)) {
+ if (mptcp_addresses_equal(&entry->addr, skc, entry->addr.port, false)) {
ret = entry->addr.id;
break;
}
@@ -1397,7 +1403,7 @@ static int mptcp_nl_remove_id_zero_address(struct net *net,
goto next;
mptcp_local_address((struct sock_common *)msk, &msk_local);
- if (!mptcp_addresses_equal(&msk_local, addr, addr->port))
+ if (!mptcp_addresses_equal(&msk_local, addr, addr->port, false))
goto next;
lock_sock(sk);
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index abcdc95e7bde..58e9ba51ad36 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -52,7 +52,7 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
spin_lock_bh(&msk->pm.lock);
list_for_each_entry(e, &msk->pm.userspace_pm_local_addr_list, list) {
- addr_match = mptcp_addresses_equal(&e->addr, &entry->addr, true);
+ addr_match = mptcp_addresses_equal(&e->addr, &entry->addr, true, false);
if (addr_match && entry->addr.id == 0)
entry->addr.id = e->addr.id;
id_match = (e->addr.id == entry->addr.id);
@@ -103,7 +103,7 @@ static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
struct mptcp_pm_addr_entry *entry, *tmp;
list_for_each_entry_safe(entry, tmp, &msk->pm.userspace_pm_local_addr_list, list) {
- if (mptcp_addresses_equal(&entry->addr, &addr->addr, false)) {
+ if (mptcp_addresses_equal(&entry->addr, &addr->addr, false, false)) {
/* TODO: a refcount is needed because the entry can
* be used multiple times (e.g. fullmesh mode).
*/
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 089fbebd21d3..e66b1fb7b522 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -645,7 +645,8 @@ void __mptcp_unaccepted_force_close(struct sock *sk);
void mptcp_set_owner_r(struct sk_buff *skb, struct sock *sk);
bool mptcp_addresses_equal(const struct mptcp_addr_info *a,
- const struct mptcp_addr_info *b, bool use_port);
+ const struct mptcp_addr_info *b,
+ bool use_port, bool use_id);
void mptcp_local_address(const struct sock_common *skc, struct mptcp_addr_info *addr);
/* called with sk socket lock held */
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 17/22] mptcp: add check_id for lookup_anno_list_by_saddr
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (15 preceding siblings ...)
2023-11-13 2:49 ` [PATCH mptcp-next v8 16/22] mptcp: add use_id parameter for addresses_equal Geliang Tang
@ 2023-11-13 2:49 ` Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 18/22] mptcp: add userspace_pm_get_entry helper Geliang Tang
` (4 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:49 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Add a new parameter check_id for mptcp_lookup_anno_list_by_saddr(), and
pass it to mptcp_addresses_equal(). Then in mptcp_pm_del_add_timer(),
the input parameter check_id can be passed as the new parameter into
mptcp_lookup_anno_list_by_saddr(). After this, this condition:
(!check_id || entry->addr.id == addr->id)
can be dropped, only test if 'entry' is NULL is enough.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm.c | 2 +-
net/mptcp/pm_netlink.c | 13 +++++++------
net/mptcp/protocol.h | 3 ++-
3 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 77a0e859076c..d5ae2e775059 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -259,7 +259,7 @@ void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
spin_lock_bh(&pm->lock);
- if (mptcp_lookup_anno_list_by_saddr(msk, addr) && READ_ONCE(pm->work_pending))
+ if (mptcp_lookup_anno_list_by_saddr(msk, addr, false) && READ_ONCE(pm->work_pending))
mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED);
spin_unlock_bh(&pm->lock);
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 599137001148..af915ba3dff5 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -203,14 +203,15 @@ bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk)
struct mptcp_pm_add_entry *
mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk,
- const struct mptcp_addr_info *addr)
+ const struct mptcp_addr_info *addr,
+ bool check_id)
{
struct mptcp_pm_add_entry *entry;
lockdep_assert_held(&msk->pm.lock);
list_for_each_entry(entry, &msk->pm.anno_list, list) {
- if (mptcp_addresses_equal(&entry->addr, addr, true, false))
+ if (mptcp_addresses_equal(&entry->addr, addr, true, check_id))
return entry;
}
@@ -290,12 +291,12 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
struct sock *sk = (struct sock *)msk;
spin_lock_bh(&msk->pm.lock);
- entry = mptcp_lookup_anno_list_by_saddr(msk, addr);
- if (entry && (!check_id || entry->addr.id == addr->id))
+ entry = mptcp_lookup_anno_list_by_saddr(msk, addr, check_id);
+ if (entry)
entry->retrans_times = ADD_ADDR_RETRANS_MAX;
spin_unlock_bh(&msk->pm.lock);
- if (entry && (!check_id || entry->addr.id == addr->id))
+ if (entry)
sk_stop_timer_sync(sk, &entry->add_timer);
return entry;
@@ -310,7 +311,7 @@ bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
lockdep_assert_held(&msk->pm.lock);
- add_entry = mptcp_lookup_anno_list_by_saddr(msk, addr);
+ add_entry = mptcp_lookup_anno_list_by_saddr(msk, addr, false);
if (add_entry) {
if (mptcp_pm_is_kernel(msk))
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index e66b1fb7b522..d0eb7b84a262 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -919,7 +919,8 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
const struct mptcp_addr_info *addr, bool check_id);
struct mptcp_pm_add_entry *
mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk,
- const struct mptcp_addr_info *addr);
+ const struct mptcp_addr_info *addr,
+ bool check_id);
int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk,
unsigned int id,
u8 *flags, int *ifindex);
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 18/22] mptcp: add userspace_pm_get_entry helper
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (16 preceding siblings ...)
2023-11-13 2:49 ` [PATCH mptcp-next v8 17/22] mptcp: add check_id for lookup_anno_list_by_saddr Geliang Tang
@ 2023-11-13 2:49 ` Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 19/22] mptcp: drop addr_match and id_match Geliang Tang
` (3 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:49 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds a new helper mptcp_userspace_pm_get_entry() to find out
the address entry on the userspace_pm_local_addr_list through the given
address. Use this helper in mptcp_userspace_pm_delete_local_addr().
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_userspace.c | 35 ++++++++++++++++++++++++-----------
1 file changed, 24 insertions(+), 11 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 58e9ba51ad36..71c47fca375c 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -39,6 +39,20 @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
return NULL;
}
+static struct mptcp_pm_addr_entry *mptcp_userspace_pm_get_entry(struct mptcp_sock *msk,
+ struct mptcp_addr_info *addr,
+ bool use_port, bool use_id)
+{
+ struct mptcp_pm_addr_entry *entry;
+
+ list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
+ if (mptcp_addresses_equal(&entry->addr, addr, use_port, use_id))
+ return entry;
+ }
+
+ return NULL;
+}
+
static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
struct mptcp_pm_addr_entry *entry)
{
@@ -100,18 +114,17 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
struct mptcp_pm_addr_entry *addr)
{
- struct mptcp_pm_addr_entry *entry, *tmp;
+ struct mptcp_pm_addr_entry *entry;
- list_for_each_entry_safe(entry, tmp, &msk->pm.userspace_pm_local_addr_list, list) {
- if (mptcp_addresses_equal(&entry->addr, &addr->addr, false, false)) {
- /* TODO: a refcount is needed because the entry can
- * be used multiple times (e.g. fullmesh mode).
- */
- list_del_rcu(&entry->list);
- kfree(entry);
- msk->pm.local_addr_used--;
- return 0;
- }
+ entry = mptcp_userspace_pm_get_entry(msk, &addr->addr, false, false);
+ if (entry) {
+ /* TODO: a refcount is needed because the entry can
+ * be used multiple times (e.g. fullmesh mode).
+ */
+ list_del_rcu(&entry->list);
+ kfree(entry);
+ msk->pm.local_addr_used--;
+ return 0;
}
return -EINVAL;
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 19/22] mptcp: drop addr_match and id_match
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (17 preceding siblings ...)
2023-11-13 2:49 ` [PATCH mptcp-next v8 18/22] mptcp: add userspace_pm_get_entry helper Geliang Tang
@ 2023-11-13 2:49 ` Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 20/22] mptcp: dup an entry when removing it Geliang Tang
` (2 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:49 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch uses the newly defined helper mptcp_userspace_pm_get_entry()
in mptcp_userspace_pm_append_new_local_addr(), and drop local variables
addr_match and id_match to simplify the code.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_userspace.c | 26 ++++++++------------------
1 file changed, 8 insertions(+), 18 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 71c47fca375c..994f2bfd74be 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -59,26 +59,13 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
struct mptcp_pm_addr_entry *match = NULL;
struct sock *sk = (struct sock *)msk;
- struct mptcp_pm_addr_entry *e;
- bool addr_match = false;
- bool id_match = false;
int ret = -EINVAL;
spin_lock_bh(&msk->pm.lock);
- list_for_each_entry(e, &msk->pm.userspace_pm_local_addr_list, list) {
- addr_match = mptcp_addresses_equal(&e->addr, &entry->addr, true, false);
- if (addr_match && entry->addr.id == 0)
- entry->addr.id = e->addr.id;
- id_match = (e->addr.id == entry->addr.id);
- if (addr_match && id_match) {
- match = e;
- break;
- } else if (addr_match || id_match) {
- break;
- }
- }
+ match = mptcp_userspace_pm_get_entry(msk, &entry->addr, true, entry->addr.id);
+ if (!match) {
+ struct mptcp_pm_addr_entry *e;
- if (!match && !addr_match && !id_match) {
/* Memory for the entry is allocated from the
* sock option buffer.
*/
@@ -97,10 +84,13 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list);
msk->pm.local_addr_used++;
ret = e->addr.id;
- } else if (match) {
- ret = entry->addr.id;
+ goto append_err;
}
+ if (entry->addr.id == 0)
+ entry->addr.id = match->addr.id;
+ ret = entry->addr.id;
+
append_err:
spin_unlock_bh(&msk->pm.lock);
return ret;
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 20/22] mptcp: dup an entry when removing it
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (18 preceding siblings ...)
2023-11-13 2:49 ` [PATCH mptcp-next v8 19/22] mptcp: drop addr_match and id_match Geliang Tang
@ 2023-11-13 2:49 ` Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 21/22] mptcp: add userspace pm addr entry refcount Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 22/22] selftests: mptcp: rm userspace addr with random order Geliang Tang
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:49 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
In some cases, the address entry doesn't need to be freed. This patch dups
an entry into the free_list to separate removing an address from freeing
an entry, so that the refcount of address entry can be added later.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_userspace.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 994f2bfd74be..e2f11e821214 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -303,10 +303,18 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
goto out;
}
- list_move(&match->list, &free_list);
+ entry = kmemdup(match, sizeof(*match), GFP_ATOMIC);
+ if (!entry) {
+ err = -ENOMEM;
+ goto out;
+ }
+ list_add(&entry->list, &free_list);
mptcp_pm_remove_addrs(msk, &free_list);
+ list_del_rcu(&match->list);
+ kfree(match);
+
release_sock(sk);
list_for_each_entry_safe(match, entry, &free_list, list) {
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 21/22] mptcp: add userspace pm addr entry refcount
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (19 preceding siblings ...)
2023-11-13 2:49 ` [PATCH mptcp-next v8 20/22] mptcp: dup an entry when removing it Geliang Tang
@ 2023-11-13 2:49 ` Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 22/22] selftests: mptcp: rm userspace addr with random order Geliang Tang
21 siblings, 0 replies; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:49 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds the refcount of addree entry in userspace PM. Add a new
counter 'refcnt' in struct mptcp_pm_addr_entry, initiated to 1.
Increase this counter when an address is announced or a subflow is created
in mptcp_pm_nl_announce_doit() and mptcp_pm_nl_subflow_create_doit(). And
decrease it when an address is removed or a subflow is closed in
mptcp_pm_nl_remove_doit() and mptcp_userspace_pm_delete_local_addr(). If
the counter reaches to 1, free this entry.
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/403
Fixes: 24430f8bf516 ("mptcp: add address into userspace pm list")
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_userspace.c | 33 +++++++++++++++++++++++----------
net/mptcp/protocol.h | 2 ++
2 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index e2f11e821214..f93eaf1b2338 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -83,6 +83,7 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
__set_bit(e->addr.id, pernet->id_bitmap);
list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list);
msk->pm.local_addr_used++;
+ refcount_set(&e->refcnt, 1);
ret = e->addr.id;
goto append_err;
}
@@ -108,12 +109,11 @@ static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
entry = mptcp_userspace_pm_get_entry(msk, &addr->addr, false, false);
if (entry) {
- /* TODO: a refcount is needed because the entry can
- * be used multiple times (e.g. fullmesh mode).
- */
- list_del_rcu(&entry->list);
- kfree(entry);
- msk->pm.local_addr_used--;
+ if (!refcount_dec_not_one(&entry->refcnt)) {
+ list_del_rcu(&entry->list);
+ kfree(entry);
+ msk->pm.local_addr_used--;
+ }
return 0;
}
@@ -207,6 +207,11 @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
spin_lock_bh(&msk->pm.lock);
if (mptcp_pm_alloc_anno_list(msk, &addr_val.addr)) {
+ struct mptcp_pm_addr_entry *entry;
+
+ entry = mptcp_userspace_pm_get_entry(msk, &addr_val.addr, false, false);
+ if (entry && !refcount_inc_not_zero(&entry->refcnt))
+ pr_debug("userspace uninitalized entry");
msk->pm.add_addr_signaled++;
mptcp_pm_announce_addr(msk, &addr_val.addr, false);
mptcp_pm_nl_addr_send_ack(msk);
@@ -312,8 +317,10 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
mptcp_pm_remove_addrs(msk, &free_list);
- list_del_rcu(&match->list);
- kfree(match);
+ if (!refcount_dec_not_one(&match->refcnt)) {
+ list_del_rcu(&match->list);
+ kfree(match);
+ }
release_sock(sk);
@@ -398,10 +405,16 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
release_sock(sk);
spin_lock_bh(&msk->pm.lock);
- if (err)
+ if (err) {
mptcp_userspace_pm_delete_local_addr(msk, &local);
- else
+ } else {
+ struct mptcp_pm_addr_entry *entry;
+
+ entry = mptcp_userspace_pm_get_entry(msk, &addr_l, false, false);
+ if (entry && !refcount_inc_not_zero(&entry->refcnt))
+ pr_debug("userspace uninitalized entry");
msk->pm.subflows++;
+ }
spin_unlock_bh(&msk->pm.lock);
create_err:
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index d0eb7b84a262..3093766dd224 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -8,6 +8,7 @@
#define __MPTCP_PROTOCOL_H
#include <linux/random.h>
+#include <linux/refcount.h>
#include <net/tcp.h>
#include <net/inet_connection_sock.h>
#include <uapi/linux/mptcp.h>
@@ -244,6 +245,7 @@ struct mptcp_pm_addr_entry {
u8 flags;
int ifindex;
struct socket *lsk;
+ refcount_t refcnt;
};
struct mptcp_data_frag {
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH mptcp-next v8 22/22] selftests: mptcp: rm userspace addr with random order
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
` (20 preceding siblings ...)
2023-11-13 2:49 ` [PATCH mptcp-next v8 21/22] mptcp: add userspace pm addr entry refcount Geliang Tang
@ 2023-11-13 2:49 ` Geliang Tang
2023-11-13 4:05 ` selftests: mptcp: rm userspace addr with random order: Tests Results MPTCP CI
21 siblings, 1 reply; 24+ messages in thread
From: Geliang Tang @ 2023-11-13 2:49 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Previously, when deleting a userspace address and subflow, it was necessary
to follow the current order of deleting the address and then deleting the
subflow. With this series of changes, addresses and subflows can be deleted
in any order. This patch uses random numbers to add this type of tests.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/net/mptcp/mptcp_join.sh | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index ada523c160ad..e7560c6f9e3b 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -3413,8 +3413,13 @@ userspace_tests()
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 10
- userspace_pm_rm_sf $ns1 "::ffff:10.0.2.1" $SUB_ESTABLISHED
+ local rm_addr="userspace_pm_rm_addr $ns1 10"
+ local rm_sf="userspace_pm_rm_sf $ns1 ::ffff:10.0.2.1 $SUB_ESTABLISHED"
+ if [ $((RANDOM%2)) -eq 0 ]; then
+ $($rm_addr); $($rm_sf)
+ else
+ $($rm_sf); $($rm_addr)
+ fi
chk_rm_nr 1 1 invert
chk_mptcp_info subflows 0 subflows 0
chk_subflows_total 1 1
--
2.35.3
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: selftests: mptcp: rm userspace addr with random order: Tests Results
2023-11-13 2:49 ` [PATCH mptcp-next v8 22/22] selftests: mptcp: rm userspace addr with random order Geliang Tang
@ 2023-11-13 4:05 ` MPTCP CI
0 siblings, 0 replies; 24+ messages in thread
From: MPTCP CI @ 2023-11-13 4:05 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
Hi Geliang,
Thank you for your modifications, that's great!
Our CI did some validations and here is its report:
- KVM Validation: normal (except selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/6031376642736128
- Summary: https://api.cirrus-ci.com/v1/artifact/task/6031376642736128/summary/summary.txt
- KVM Validation: debug (except selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/6594326596157440
- Summary: https://api.cirrus-ci.com/v1/artifact/task/6594326596157440/summary/summary.txt
- KVM Validation: debug (only selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/4764739247538176
- Summary: https://api.cirrus-ci.com/v1/artifact/task/4764739247538176/summary/summary.txt
- KVM Validation: normal (only selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/5468426689314816
- Summary: https://api.cirrus-ci.com/v1/artifact/task/5468426689314816/summary/summary.txt
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/1e45f73d9483
If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:
$ cd [kernel source code]
$ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
--pull always mptcp/mptcp-upstream-virtme-docker:latest \
auto-debug
For more details:
https://github.com/multipath-tcp/mptcp-upstream-virtme-docker
Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)
Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (Tessares)
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2023-11-13 4:05 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-11-13 2:48 [PATCH mptcp-next v8 00/22] userspace pm enhancements Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 01/22] mptcp: export pm_nl_get_pernet_from_msk Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 02/22] mptcp: drop mptcp_pm_get_* helpers Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 03/22] mptcp: use pernet id_bitmap in userspace pm Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 04/22] mptcp: add userspace_pm_lookup_addr_by_id helper Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 05/22] mptcp: drop lookup_by_id parameter in lookup_addr Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 06/22] mptcp: dump addrs in userspace pm list Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 07/22] mptcp: check userspace pm subflow flag Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 08/22] selftests: mptcp: add " Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 09/22] selftests: mptcp: pm_netlink: print colored output Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 10/22] selftests: mptcp: add mptcp_lib_cleanup Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 11/22] selftests: mptcp: add mptcp_lib_check helper Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 12/22] selftests: mptcp: dump userspace addrs list Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 13/22] mptcp: add a prefix for free_local_addr_list Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 14/22] mptcp: flush userspace pm addrs list Geliang Tang
2023-11-13 2:48 ` [PATCH mptcp-next v8 15/22] selftests: mptcp: flush userspace " Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 16/22] mptcp: add use_id parameter for addresses_equal Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 17/22] mptcp: add check_id for lookup_anno_list_by_saddr Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 18/22] mptcp: add userspace_pm_get_entry helper Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 19/22] mptcp: drop addr_match and id_match Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 20/22] mptcp: dup an entry when removing it Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 21/22] mptcp: add userspace pm addr entry refcount Geliang Tang
2023-11-13 2:49 ` [PATCH mptcp-next v8 22/22] selftests: mptcp: rm userspace addr with random order Geliang Tang
2023-11-13 4:05 ` selftests: mptcp: rm userspace addr with random order: Tests Results MPTCP CI
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.