* [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm
@ 2023-11-04 8:35 Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 01/12] mptcp: export pm_nl_get_pernet_from_msk Geliang Tang
` (12 more replies)
0 siblings, 13 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
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.
Geliang Tang (12):
mptcp: export pm_nl_get_pernet_from_msk
mptcp: use pernet id_bitmap in userspace pm
mptcp: rename free_local_addr_list with prefix
mptcp: flush userspace pm addrs list
mptcp: lookup_addr_by_id helper in userspace pm
mptcp: dump userspace pm addrs
mptcp: check userspace pm subflow flag
selftests: mptcp: add userspace pm subflow flag
selftests: mptcp: flush and dump userspace addrs list
mptcp: drop mptcp_pm_get_* helpers
mptcp: add addresses_identically_equal helper
mptcp: drop lookup_by_id parameter in lookup_addr
net/mptcp/pm.c | 14 ++-
net/mptcp/pm_netlink.c | 113 +++++++-----------
net/mptcp/pm_userspace.c | 104 ++++++++++++----
net/mptcp/protocol.c | 2 +-
net/mptcp/protocol.h | 33 +++--
net/mptcp/sockopt.c | 9 +-
.../testing/selftests/net/mptcp/mptcp_join.sh | 5 +
tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 8 ++
8 files changed, 177 insertions(+), 111 deletions(-)
--
2.35.3
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH mptcp-next v3 01/12] mptcp: export pm_nl_get_pernet_from_msk
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 02/12] mptcp: use pernet id_bitmap in userspace pm Geliang Tang
` (11 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 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().
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] 28+ messages in thread
* [PATCH mptcp-next v3 02/12] mptcp: use pernet id_bitmap in userspace pm
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 01/12] mptcp: export pm_nl_get_pernet_from_msk Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 03/12] mptcp: rename free_local_addr_list with prefix Geliang Tang
` (10 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 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 | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index efecbe3cf415..ab953eed7aac 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,9 +36,8 @@ 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);
if (addr_match && entry->addr.id == 0)
@@ -50,7 +49,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) {
@@ -64,10 +62,13 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
}
*e = *entry;
+ spin_lock_bh(&pernet->lock);
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);
+ spin_unlock_bh(&pernet->lock);
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] 28+ messages in thread
* [PATCH mptcp-next v3 03/12] mptcp: rename free_local_addr_list with prefix
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 01/12] mptcp: export pm_nl_get_pernet_from_msk Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 02/12] mptcp: use pernet id_bitmap in userspace pm Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 04/12] mptcp: flush userspace pm addrs list Geliang Tang
` (9 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
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 ab953eed7aac..720d58ccab70 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 0ad507ac6bc7..3bbccb53eb29 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -3317,7 +3317,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 c38a2126071b..953632ba7eb6 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] 28+ messages in thread
* [PATCH mptcp-next v3 04/12] mptcp: flush userspace pm addrs list
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
` (2 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v3 03/12] mptcp: rename free_local_addr_list with prefix Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 05/12] mptcp: lookup_addr_by_id helper in userspace pm Geliang Tang
` (8 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 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 1dcf104d7a01..344362ec17fa 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1598,6 +1598,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 720d58ccab70..6602abcb00f4 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));
}
@@ -551,3 +553,26 @@ int mptcp_userspace_pm_set_flags(struct net *net, struct nlattr *token,
sock_put(sk);
return ret;
}
+
+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 953632ba7eb6..0014b6b542a4 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] 28+ messages in thread
* [PATCH mptcp-next v3 05/12] mptcp: lookup_addr_by_id helper in userspace pm
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
` (3 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v3 04/12] mptcp: flush userspace pm addrs list Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 06/12] mptcp: dump userspace pm addrs Geliang Tang
` (7 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Corresponding __lookup_addr_by_id() function 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 6602abcb00f4..8c369cd77e2c 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -27,6 +27,18 @@ void mptcp_userspace_pm_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)
{
@@ -112,15 +124,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;
@@ -252,7 +259,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);
@@ -289,13 +296,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] 28+ messages in thread
* [PATCH mptcp-next v3 06/12] mptcp: dump userspace pm addrs
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
` (4 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v3 05/12] mptcp: lookup_addr_by_id helper in userspace pm Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 07/12] mptcp: check userspace pm subflow flag Geliang Tang
` (6 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 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 | 7 +++++--
net/mptcp/pm_userspace.c | 25 +++++++++++++++++++++++++
net/mptcp/protocol.h | 2 ++
3 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 344362ec17fa..e21ef13b5ed9 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1708,8 +1708,11 @@ 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) {
+ entry = __userspace_pm_lookup_addr_by_id(net, i);
+ if (!entry)
+ break;
+ }
if (entry->addr.id <= id)
continue;
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 8c369cd77e2c..0e65b32cc073 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -577,3 +577,28 @@ void mptcp_userspace_pm_flush_addrs_list(struct net *net)
cond_resched();
}
}
+
+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 0014b6b542a4..8bfa9bb0552d 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1022,6 +1022,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] 28+ messages in thread
* [PATCH mptcp-next v3 07/12] mptcp: check userspace pm subflow flag
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
` (5 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v3 06/12] mptcp: dump userspace pm addrs Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 08/12] selftests: mptcp: add " Geliang Tang
` (5 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 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 0e65b32cc073..98390d048ab3 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -352,12 +352,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");
@@ -370,7 +377,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] 28+ messages in thread
* [PATCH mptcp-next v3 08/12] selftests: mptcp: add userspace pm subflow flag
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
` (6 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v3 07/12] mptcp: check userspace pm subflow flag Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 09/12] selftests: mptcp: flush and dump userspace addrs list Geliang Tang
` (4 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds the address flag MPTCP_PM_ADDR_FLAG_SUBFLOW in csf()
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] 28+ messages in thread
* [PATCH mptcp-next v3 09/12] selftests: mptcp: flush and dump userspace addrs list
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
` (7 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v3 08/12] selftests: mptcp: add " Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 10/12] mptcp: drop mptcp_pm_get_* helpers Geliang Tang
` (3 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch tests newly added flush and dump commands 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 | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 995280882428..b56e141547db 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -3405,6 +3405,7 @@ userspace_tests()
local tests_pid=$!
wait_mpj $ns1
userspace_pm_add_addr $ns1 10.0.2.1 10
+ ip netns exec $ns1 ./pm_nl_ctl dump
chk_join_nr 1 1 1
chk_add_nr 1 1
chk_mptcp_info subflows 1 subflows 1
@@ -3429,6 +3430,7 @@ userspace_tests()
local tests_pid=$!
wait_mpj $ns2
userspace_pm_add_sf $ns2 10.0.3.2 20
+ ip netns exec $ns2 ./pm_nl_ctl dump
chk_join_nr 1 1 1
chk_mptcp_info subflows 1 subflows 1
chk_subflows_total 2 2
@@ -3456,6 +3458,9 @@ 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
+ ip netns exec $ns2 ./pm_nl_ctl dump
+ chk_rm_nr 0 1
kill_events_pids
wait $tests_pid
fi
--
2.35.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH mptcp-next v3 10/12] mptcp: drop mptcp_pm_get_* helpers
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
` (8 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v3 09/12] selftests: mptcp: flush and dump userspace addrs list Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 11/12] mptcp: add addresses_identically_equal helper Geliang Tang
` (2 subsequent siblings)
12 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Drop four mptcp_pm_get_* helpers:
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);
The helper pm_nl_get_pernet_from_msk() can be used instead of 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 e21ef13b5ed9..52f54d57aca3 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 8bfa9bb0552d..089fbebd21d3 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1046,15 +1046,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 8d485c40585a..98f39c2a377a 100644
--- a/net/mptcp/sockopt.c
+++ b/net/mptcp/sockopt.c
@@ -890,6 +890,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;
@@ -907,13 +908,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] 28+ messages in thread
* [PATCH mptcp-next v3 11/12] mptcp: add addresses_identically_equal helper
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
` (9 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v3 10/12] mptcp: drop mptcp_pm_get_* helpers Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 12/12] mptcp: drop lookup_by_id parameter in lookup_addr Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
12 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Similar to addresses_equal() helper, this patch adds a new helper
addresses_identically_equal() to test if the two given addresses
have both the same address and the same address id.
Add a new parameter check_id for mptcp_lookup_anno_list_by_saddr(),
and use the newly added helper instead of mptcp_addresses_equal()
in it.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm.c | 2 +-
net/mptcp/pm_netlink.c | 25 +++++++++++++++++++------
net/mptcp/protocol.h | 3 ++-
3 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 48ff7ce20890..475534e51317 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 52f54d57aca3..ae5489beb31e 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -74,6 +74,18 @@ bool mptcp_addresses_equal(const struct mptcp_addr_info *a,
return a->port == b->port;
}
+static bool addresses_identically_equal(const struct mptcp_addr_info *a,
+ const struct mptcp_addr_info *b,
+ bool use_port, bool check_id)
+{
+ if (!mptcp_addresses_equal(a, b, use_port))
+ return false;
+ if (!check_id)
+ return true;
+
+ return a->id == b->id;
+}
+
void mptcp_local_address(const struct sock_common *skc, struct mptcp_addr_info *addr)
{
addr->family = skc->skc_family;
@@ -198,14 +210,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))
+ if (addresses_identically_equal(&entry->addr, addr, true, check_id))
return entry;
}
@@ -285,12 +298,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;
@@ -305,7 +318,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 089fbebd21d3..5f2c52c82cf7 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -918,7 +918,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] 28+ messages in thread
* [PATCH mptcp-next v3 12/12] mptcp: drop lookup_by_id parameter in lookup_addr
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
` (10 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v3 11/12] mptcp: add addresses_identically_equal helper Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 9:56 ` mptcp: drop lookup_by_id parameter in lookup_addr: Tests Results MPTCP CI
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
12 siblings, 1 reply; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
When lookup_by_id parameter of __lookup_addr() is true, it's the same as
__lookup_addr_by_id(). Drop this parameter.
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 ae5489beb31e..ea507ed7aad1 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -471,15 +471,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;
@@ -509,7 +506,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;
@@ -1850,7 +1847,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] 28+ messages in thread
* [PATCH mptcp-next v4 00/12] add refcount for address entry
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
` (11 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v3 12/12] mptcp: drop lookup_by_id parameter in lookup_addr Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 01/12] mptcp: add userspace_pm_get_entry helper Geliang Tang
` (11 more replies)
12 siblings, 12 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
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 (12):
mptcp: add userspace_pm_get_entry helper
mptcp: dup an entry when removing it
mptcp: add userspace pm addr entry refcount
selftests: mptcp: rm userspace addr with random order
mptcp: add netlink pm addr entry refcount
mptcp: drop addr_match and id_match
selftests: mptcp: add mptcp_lib_evts_*
selftests: mptcp: userspace: print colored results
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
net/mptcp/pm_netlink.c | 19 +-
net/mptcp/pm_userspace.c | 75 +++++---
net/mptcp/protocol.h | 2 +
tools/testing/selftests/net/mptcp/diag.sh | 48 +++--
.../selftests/net/mptcp/mptcp_connect.sh | 7 +-
.../testing/selftests/net/mptcp/mptcp_join.sh | 129 ++++---------
.../testing/selftests/net/mptcp/mptcp_lib.sh | 162 +++++++++++++++++
.../selftests/net/mptcp/mptcp_sockopt.sh | 16 +-
.../testing/selftests/net/mptcp/pm_netlink.sh | 4 +-
.../selftests/net/mptcp/simult_flows.sh | 6 +-
.../selftests/net/mptcp/userspace_pm.sh | 172 +++++-------------
11 files changed, 341 insertions(+), 299 deletions(-)
--
2.35.3
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH mptcp-next v4 01/12] mptcp: add userspace_pm_get_entry helper
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 02/12] mptcp: dup an entry when removing it Geliang Tang
` (10 subsequent siblings)
11 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 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() and
mptcp_nl_cmd_sf_destroy().
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 98390d048ab3..3f42323c30c6 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)
+{
+ 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))
+ return entry;
+ }
+
+ return NULL;
+}
+
static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
struct mptcp_pm_addr_entry *entry)
{
@@ -103,18 +117,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)) {
- /* 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);
+ 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] 28+ messages in thread
* [PATCH mptcp-next v4 02/12] mptcp: dup an entry when removing it
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 01/12] mptcp: add userspace_pm_get_entry helper Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 03/12] mptcp: add userspace pm addr entry refcount Geliang Tang
` (9 subsequent siblings)
11 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
In some cases, the address entry does not require free. This patch dups
an entry to separate the deleted address from the free address, so that
the refcounts 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 3f42323c30c6..919428b9edae 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -316,10 +316,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] 28+ messages in thread
* [PATCH mptcp-next v4 03/12] mptcp: add userspace pm addr entry refcount
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 01/12] mptcp: add userspace_pm_get_entry helper Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 02/12] mptcp: dup an entry when removing it Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 04/12] selftests: mptcp: rm userspace addr with random order Geliang Tang
` (8 subsequent siblings)
11 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds userspace PM address entry refcount. Add a new filed
'refcnt' in struct mptcp_pm_addr_entry, initiated to 1.
Increase this counter in mptcp_nl_cmd_sf_create(), and decrease it in
mptcp_userspace_pm_delete_local_addr() according the subflows value.
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 919428b9edae..3e8304fc1271 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -99,6 +99,7 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
spin_unlock_bh(&pernet->lock);
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;
} else if (match) {
ret = entry->addr.id;
@@ -121,12 +122,11 @@ static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
entry = mptcp_userspace_pm_get_entry(msk, &addr->addr, 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;
}
@@ -220,6 +220,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);
+ if (entry && !refcount_inc_not_zero(&entry->refcnt))
+ pr_debug("userspace refcount inc error");
msk->pm.add_addr_signaled++;
mptcp_pm_announce_addr(msk, &addr_val.addr, false);
mptcp_pm_nl_addr_send_ack(msk);
@@ -325,8 +330,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);
@@ -411,10 +418,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);
+ if (entry && !refcount_inc_not_zero(&entry->refcnt))
+ pr_debug("userspace refcount inc error");
msk->pm.subflows++;
+ }
spin_unlock_bh(&msk->pm.lock);
create_err:
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 5f2c52c82cf7..a7db86901e77 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] 28+ messages in thread
* [PATCH mptcp-next v4 04/12] selftests: mptcp: rm userspace addr with random order
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
` (2 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v4 03/12] mptcp: add userspace pm addr entry refcount Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 05/12] mptcp: add netlink pm addr entry refcount Geliang Tang
` (7 subsequent siblings)
11 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 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 b56e141547db..148ff0f57481 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -3411,8 +3411,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
+ if [ $((RANDOM%2)) -eq 0 ]; then
+ userspace_pm_rm_addr $ns1 10
+ userspace_pm_rm_sf $ns1 "::ffff:10.0.2.1" $SUB_ESTABLISHED
+ else
+ userspace_pm_rm_sf $ns1 "::ffff:10.0.2.1" $SUB_ESTABLISHED
+ userspace_pm_rm_addr $ns1 10
+ 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] 28+ messages in thread
* [PATCH mptcp-next v4 05/12] mptcp: add netlink pm addr entry refcount
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
` (3 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v4 04/12] selftests: mptcp: rm userspace addr with random order Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 06/12] mptcp: drop addr_match and id_match Geliang Tang
` (6 subsequent siblings)
11 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds netlink PM address entry refcount. Init 'refcont' of
every address entry to 1.
Increase this refcount counter when a subflow connecting or an address
signaling in mptcp_pm_create_subflow_or_signal_addr() and
fill_local_addresses_vec().
Decrease it in __mptcp_pm_release_addr_entry(). When the counter reaches
1, then free this entry.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm_netlink.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index ea507ed7aad1..7aa4faa47f07 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -569,8 +569,10 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
continue;
spin_unlock_bh(&msk->pm.lock);
- for (i = 0; i < nr; i++)
- __mptcp_subflow_connect(sk, &local->addr, &addrs[i]);
+ for (i = 0; i < nr; i++) {
+ if (refcount_inc_not_zero(&local->refcnt))
+ __mptcp_subflow_connect(sk, &local->addr, &addrs[i]);
+ }
spin_lock_bh(&msk->pm.lock);
}
mptcp_pm_nl_check_work_pending(msk);
@@ -610,7 +612,8 @@ static unsigned int fill_local_addresses_vec(struct mptcp_sock *msk,
if (!mptcp_pm_addr_families_match(sk, &entry->addr, remote))
continue;
- if (msk->pm.subflows < subflows_max) {
+ if (msk->pm.subflows < subflows_max &&
+ refcount_inc_not_zero(&entry->refcnt)) {
msk->pm.subflows++;
addrs[i++] = entry->addr;
}
@@ -862,9 +865,11 @@ static bool address_use_port(struct mptcp_pm_addr_entry *entry)
/* caller must ensure the RCU grace period is already elapsed */
static void __mptcp_pm_release_addr_entry(struct mptcp_pm_addr_entry *entry)
{
- if (entry->lsk)
- sock_release(entry->lsk);
- kfree(entry);
+ if (!refcount_dec_not_one(&entry->refcnt)) {
+ if (entry->lsk)
+ sock_release(entry->lsk);
+ kfree(entry);
+ }
}
static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet,
@@ -1054,6 +1059,7 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc
entry->ifindex = 0;
entry->flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
entry->lsk = NULL;
+ refcount_set(&entry->refcnt, 1);
ret = mptcp_pm_nl_append_new_local_addr(pernet, entry);
if (ret < 0)
kfree(entry);
@@ -1281,6 +1287,7 @@ int mptcp_pm_nl_add_addr_doit(struct sk_buff *skb, struct genl_info *info)
}
*entry = addr;
+ refcount_set(&entry->refcnt, 1);
if (entry->addr.port) {
ret = mptcp_pm_nl_create_listen_socket(skb->sk, entry);
if (ret) {
--
2.35.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH mptcp-next v4 06/12] mptcp: drop addr_match and id_match
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
` (4 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v4 05/12] mptcp: add netlink pm addr entry refcount Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 07/12] selftests: mptcp: add mptcp_lib_evts_* Geliang Tang
` (5 subsequent siblings)
11 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 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 | 21 ++++++---------------
1 file changed, 6 insertions(+), 15 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 3e8304fc1271..a00c3d8854ff 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -60,26 +60,17 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *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);
- 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;
- }
- }
+ e = mptcp_userspace_pm_get_entry(msk, &entry->addr, true);
+ if (e && entry->addr.id == 0)
+ entry->addr.id = e->addr.id;
+ if (e && e->addr.id == entry->addr.id)
+ match = e;
- if (!match && !addr_match && !id_match) {
+ if (!match) {
/* Memory for the entry is allocated from the
* sock option buffer.
*/
--
2.35.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH mptcp-next v4 07/12] selftests: mptcp: add mptcp_lib_evts_*
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
` (5 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v4 06/12] mptcp: drop addr_match and id_match Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 08/12] selftests: mptcp: userspace: print colored results Geliang Tang
` (4 subsequent siblings)
11 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
To avoid duplicated code in different MPTCP selftests, we can add and
use helpers defined in mptcp_lib.sh.
This patch unifies "pm_nl_ctl events" related code in userspace_pm.sh
and mptcp_join.sh into four functions: _init, _start, _kill and _remove.
Define them in mptcp_lib.sh and use these new helper in both scripts.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
.../testing/selftests/net/mptcp/mptcp_join.sh | 54 ++++++----------
.../testing/selftests/net/mptcp/mptcp_lib.sh | 63 +++++++++++++++++++
.../selftests/net/mptcp/userspace_pm.sh | 31 ++-------
3 files changed, 88 insertions(+), 60 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 148ff0f57481..9b614a214ea9 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -35,10 +35,6 @@ ip_mptcp=0
check_invert=0
validate_checksum=0
init=0
-evts_ns1=""
-evts_ns2=""
-evts_ns1_pid=0
-evts_ns2_pid=0
last_test_failed=0
last_test_skipped=0
last_test_ignored=1
@@ -182,8 +178,7 @@ init() {
cin=$(mktemp)
cinsent=$(mktemp)
cout=$(mktemp)
- evts_ns1=$(mktemp)
- evts_ns2=$(mktemp)
+ mptcp_lib_evts_init
trap cleanup EXIT
@@ -196,7 +191,7 @@ cleanup()
rm -f "$cin" "$cout" "$sinfail"
rm -f "$sin" "$sout" "$cinsent" "$cinfail"
rm -f "$tmpfile"
- rm -rf $evts_ns1 $evts_ns2
+ mptcp_lib_evts_remove
cleanup_partial
}
@@ -460,12 +455,7 @@ reset_with_events()
{
reset "${1}" || return 1
- :> "$evts_ns1"
- :> "$evts_ns2"
- ip netns exec $ns1 ./pm_nl_ctl events >> "$evts_ns1" 2>&1 &
- evts_ns1_pid=$!
- ip netns exec $ns2 ./pm_nl_ctl events >> "$evts_ns2" 2>&1 &
- evts_ns2_pid=$!
+ mptcp_lib_evts_start "${ns1}" "${ns2}"
}
reset_with_tcp_filter()
@@ -635,12 +625,6 @@ wait_mpj()
done
}
-kill_events_pids()
-{
- mptcp_lib_kill_wait $evts_ns1_pid
- mptcp_lib_kill_wait $evts_ns2_pid
-}
-
kill_tests_wait()
{
#shellcheck disable=SC2046
@@ -2882,9 +2866,9 @@ add_addr_ports_tests()
chk_add_nr 1 1 1
chk_rm_nr 1 1 invert
- verify_listener_events $evts_ns1 $LISTENER_CREATED $AF_INET 10.0.2.1 10100
- verify_listener_events $evts_ns1 $LISTENER_CLOSED $AF_INET 10.0.2.1 10100
- kill_events_pids
+ verify_listener_events $server_evts $LISTENER_CREATED $AF_INET 10.0.2.1 10100
+ verify_listener_events $server_evts $LISTENER_CLOSED $AF_INET 10.0.2.1 10100
+ mptcp_lib_evts_kill
fi
# subflow and signal with port, remove
@@ -3257,10 +3241,10 @@ fail_tests()
# $1: ns ; $2: addr ; $3: id
userspace_pm_add_addr()
{
- local evts=$evts_ns1
+ local evts=$server_evts
local tk
- [ "$1" == "$ns2" ] && evts=$evts_ns2
+ [ "$1" == "$ns2" ] && evts=$client_evts
tk=$(mptcp_lib_evts_get_info token "$evts")
ip netns exec $1 ./pm_nl_ctl ann $2 token $tk id $3
@@ -3270,11 +3254,11 @@ userspace_pm_add_addr()
# $1: ns ; $2: id
userspace_pm_rm_addr()
{
- local evts=$evts_ns1
+ local evts=$server_evts
local tk
local cnt
- [ "$1" == "$ns2" ] && evts=$evts_ns2
+ [ "$1" == "$ns2" ] && evts=$client_evts
tk=$(mptcp_lib_evts_get_info token "$evts")
cnt=$(rm_addr_count ${1})
@@ -3285,10 +3269,10 @@ userspace_pm_rm_addr()
# $1: ns ; $2: addr ; $3: id
userspace_pm_add_sf()
{
- local evts=$evts_ns1
+ local evts=$server_evts
local tk da dp
- [ "$1" == "$ns2" ] && evts=$evts_ns2
+ [ "$1" == "$ns2" ] && evts=$client_evts
tk=$(mptcp_lib_evts_get_info token "$evts")
da=$(mptcp_lib_evts_get_info daddr4 "$evts")
dp=$(mptcp_lib_evts_get_info dport "$evts")
@@ -3301,13 +3285,13 @@ userspace_pm_add_sf()
# $1: ns ; $2: addr $3: event type
userspace_pm_rm_sf()
{
- local evts=$evts_ns1
+ local evts=$server_evts
local t=${3:-1}
local ip=4
local tk da dp sp
local cnt
- [ "$1" == "$ns2" ] && evts=$evts_ns2
+ [ "$1" == "$ns2" ] && evts=$client_evts
if mptcp_lib_is_v6 $2; then ip=6; fi
tk=$(mptcp_lib_evts_get_info token "$evts")
da=$(mptcp_lib_evts_get_info "daddr$ip" "$evts" $t)
@@ -3421,7 +3405,7 @@ userspace_tests()
chk_rm_nr 1 1 invert
chk_mptcp_info subflows 0 subflows 0
chk_subflows_total 1 1
- kill_events_pids
+ mptcp_lib_evts_kill
wait $tests_pid
fi
@@ -3444,7 +3428,7 @@ userspace_tests()
chk_rm_nr 1 1
chk_mptcp_info subflows 0 subflows 0
chk_subflows_total 1 1
- kill_events_pids
+ mptcp_lib_evts_kill
wait $tests_pid
fi
@@ -3466,7 +3450,7 @@ userspace_tests()
ip netns exec $ns2 ./pm_nl_ctl flush
ip netns exec $ns2 ./pm_nl_ctl dump
chk_rm_nr 0 1
- kill_events_pids
+ mptcp_lib_evts_kill
wait $tests_pid
fi
@@ -3490,7 +3474,7 @@ userspace_tests()
chk_rst_nr 0 0 invert
chk_mptcp_info subflows 1 subflows 1
chk_subflows_total 1 1
- kill_events_pids
+ mptcp_lib_evts_kill
wait $tests_pid
fi
@@ -3516,7 +3500,7 @@ userspace_tests()
chk_rst_nr 0 0 invert
chk_mptcp_info subflows 1 subflows 1
chk_subflows_total 1 1
- kill_events_pids
+ mptcp_lib_evts_kill
wait $tests_pid
fi
}
diff --git a/tools/testing/selftests/net/mptcp/mptcp_lib.sh b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
index 1f8be9dd0e20..980ef3dbb6ab 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
@@ -299,3 +299,66 @@ mptcp_lib_wait_local_port_listen() {
sleep 0.1
done
}
+
+server_evts=""
+client_evts=""
+server_evts_pid=0
+client_evts_pid=0
+
+# server_evts(_pid) and client_evts(_pid) are needed
+# by mptcp_lib_evts_init, _start, _kill and _remove.
+mptcp_lib_evts_init() {
+ : "${server_evts?}"
+ : "${client_evts?}"
+
+ if [ -z "${server_evts}" ]; then
+ server_evts=$(mktemp)
+ fi
+ if [ -z "${client_evts}" ]; then
+ client_evts=$(mktemp)
+ fi
+}
+
+# $1 ns1, $2 ns2
+mptcp_lib_evts_start() {
+ : "${server_evts:?}"
+ : "${client_evts:?}"
+ : "${server_evts_pid:?}"
+ : "${client_evts_pid:?}"
+
+ local ns_1="${1}"
+ local ns_2="${2}"
+
+ :>"$server_evts"
+ :>"$client_evts"
+
+ if [ "${server_evts_pid}" -ne 0 ]; then
+ mptcp_lib_kill_wait "${server_evts_pid}"
+ fi
+ ip netns exec "${ns_1}" ./pm_nl_ctl events >> "${server_evts}" 2>&1 &
+ server_evts_pid=$!
+
+ if [ "${client_evts_pid}" -ne 0 ]; then
+ mptcp_lib_kill_wait "${client_evts_pid}"
+ fi
+ ip netns exec "${ns_2}" ./pm_nl_ctl events >> "${client_evts}" 2>&1 &
+ client_evts_pid=$!
+}
+
+mptcp_lib_evts_kill() {
+ : "${server_evts_pid:?}"
+ : "${client_evts_pid:?}"
+
+ mptcp_lib_kill_wait "${server_evts_pid}"
+ mptcp_lib_kill_wait "${client_evts_pid}"
+
+ server_evts_pid=0
+ client_evts_pid=0
+}
+
+mptcp_lib_evts_remove() {
+ : "${server_evts:?}"
+ : "${client_evts:?}"
+
+ rm -rf "${server_evts}" "${client_evts}"
+}
diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/testing/selftests/net/mptcp/userspace_pm.sh
index f9156f544ebf..bba42f165340 100755
--- a/tools/testing/selftests/net/mptcp/userspace_pm.sh
+++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh
@@ -34,10 +34,6 @@ AF_INET=2
AF_INET6=10
file=""
-server_evts=""
-client_evts=""
-server_evts_pid=0
-client_evts_pid=0
client4_pid=0
server4_pid=0
client6_pid=0
@@ -116,18 +112,19 @@ cleanup()
# Terminate the MPTCP connection and related processes
local pid
- for pid in $client4_pid $server4_pid $client6_pid $server6_pid\
- $server_evts_pid $client_evts_pid
+ for pid in $client4_pid $server4_pid $client6_pid $server6_pid
do
mptcp_lib_kill_wait $pid
done
+ mptcp_lib_evts_kill
local netns
for netns in "$ns1" "$ns2" ;do
ip netns del "$netns"
done
- rm -rf $file $client_evts $server_evts
+ rm -rf $file
+ mptcp_lib_evts_remove
_printf "Done\n"
}
@@ -186,24 +183,8 @@ make_connection()
# Capture netlink events over the two network namespaces running
# the MPTCP client and server
- if [ -z "$client_evts" ]; then
- client_evts=$(mktemp)
- fi
- :>"$client_evts"
- if [ $client_evts_pid -ne 0 ]; then
- mptcp_lib_kill_wait $client_evts_pid
- fi
- ip netns exec "$ns2" ./pm_nl_ctl events >> "$client_evts" 2>&1 &
- client_evts_pid=$!
- if [ -z "$server_evts" ]; then
- server_evts=$(mktemp)
- fi
- :>"$server_evts"
- if [ $server_evts_pid -ne 0 ]; then
- mptcp_lib_kill_wait $server_evts_pid
- fi
- ip netns exec "$ns1" ./pm_nl_ctl events >> "$server_evts" 2>&1 &
- server_evts_pid=$!
+ mptcp_lib_evts_init
+ mptcp_lib_evts_start "${ns1}" "${ns2}"
sleep 0.5
# Run the server
--
2.35.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH mptcp-next v4 08/12] selftests: mptcp: userspace: print colored results
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
` (6 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v4 07/12] selftests: mptcp: add mptcp_lib_evts_* Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 09/12] selftests: mptcp: export event macros in mptcp_lib Geliang Tang
` (3 subsequent siblings)
11 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang, Matthieu Baerts
Use mptcp_lib_print_ok(), _warn() and _err() to instead print_results()
in test_pass(), _skip() and _fail() in userspace_pm.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.
Reviewed-by: Matthieu Baerts <matttbe@kernel.org>
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/net/mptcp/userspace_pm.sh | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/testing/selftests/net/mptcp/userspace_pm.sh
index bba42f165340..27ddbd8cf03f 100755
--- a/tools/testing/selftests/net/mptcp/userspace_pm.sh
+++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh
@@ -74,27 +74,22 @@ print_test()
_printf "%-63s" "${test_name}"
}
-print_results()
-{
- _printf "[%s]\n" "${1}"
-}
-
test_pass()
{
- print_results " OK "
+ mptcp_lib_print_ok "[ ok ]${1:+ ${*}}"
mptcp_lib_result_pass "${test_name}"
}
test_skip()
{
- print_results "SKIP"
+ mptcp_lib_print_warn "[skip]${1:+ ${*}}"
mptcp_lib_result_skip "${test_name}"
}
# $1: msg
test_fail()
{
- print_results "FAIL"
+ mptcp_lib_print_err "[fail]${1:+ ${*}}"
ret=1
if [ -n "${1}" ]; then
--
2.35.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH mptcp-next v4 09/12] selftests: mptcp: export event macros in mptcp_lib
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
` (7 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v4 08/12] selftests: mptcp: userspace: print colored results Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 10/12] selftests: mptcp: extract mptcp_lib_check_expected Geliang Tang
` (2 subsequent siblings)
11 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
SUB_ESTABLISHED, LISTENER_CREATED, LISTENER_CLOSED AF_INET and AF_INET6
are defined in both mptcp_join.sh and userspace_pm.sh, export them into
mptcp_lib.sh. Add MPTCP_LIB_ prefix for the first three and add readonly
for the last two.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
.../testing/selftests/net/mptcp/mptcp_join.sh | 23 +++----
.../testing/selftests/net/mptcp/mptcp_lib.sh | 7 +++
.../selftests/net/mptcp/userspace_pm.sh | 60 +++++++++----------
3 files changed, 45 insertions(+), 45 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 9b614a214ea9..8f7112cb120e 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -2777,13 +2777,6 @@ backup_tests()
fi
}
-SUB_ESTABLISHED=10 # MPTCP_EVENT_SUB_ESTABLISHED
-LISTENER_CREATED=15 #MPTCP_EVENT_LISTENER_CREATED
-LISTENER_CLOSED=16 #MPTCP_EVENT_LISTENER_CLOSED
-
-AF_INET=2
-AF_INET6=10
-
verify_listener_events()
{
local evt=$1
@@ -2797,9 +2790,9 @@ verify_listener_events()
local sport
local name
- if [ $e_type = $LISTENER_CREATED ]; then
+ if [ $e_type = $MPTCP_LIB_LISTENER_CREATED ]; then
name="LISTENER_CREATED"
- elif [ $e_type = $LISTENER_CLOSED ]; then
+ elif [ $e_type = $MPTCP_LIB_LISTENER_CLOSED ]; then
name="LISTENER_CLOSED "
else
name="$e_type"
@@ -2866,8 +2859,10 @@ add_addr_ports_tests()
chk_add_nr 1 1 1
chk_rm_nr 1 1 invert
- verify_listener_events $server_evts $LISTENER_CREATED $AF_INET 10.0.2.1 10100
- verify_listener_events $server_evts $LISTENER_CLOSED $AF_INET 10.0.2.1 10100
+ verify_listener_events $server_evts $MPTCP_LIB_LISTENER_CREATED \
+ $AF_INET 10.0.2.1 10100
+ verify_listener_events $server_evts $MPTCP_LIB_LISTENER_CLOSED \
+ $AF_INET 10.0.2.1 10100
mptcp_lib_evts_kill
fi
@@ -3397,9 +3392,9 @@ userspace_tests()
chk_mptcp_info add_addr_signal 1 add_addr_accepted 1
if [ $((RANDOM%2)) -eq 0 ]; then
userspace_pm_rm_addr $ns1 10
- userspace_pm_rm_sf $ns1 "::ffff:10.0.2.1" $SUB_ESTABLISHED
+ userspace_pm_rm_sf $ns1 "::ffff:10.0.2.1" $MPTCP_LIB_SUB_ESTABLISHED
else
- userspace_pm_rm_sf $ns1 "::ffff:10.0.2.1" $SUB_ESTABLISHED
+ userspace_pm_rm_sf $ns1 "::ffff:10.0.2.1" $MPTCP_LIB_SUB_ESTABLISHED
userspace_pm_rm_addr $ns1 10
fi
chk_rm_nr 1 1 invert
@@ -3424,7 +3419,7 @@ userspace_tests()
chk_mptcp_info subflows 1 subflows 1
chk_subflows_total 2 2
userspace_pm_rm_addr $ns2 20
- userspace_pm_rm_sf $ns2 10.0.3.2 $SUB_ESTABLISHED
+ userspace_pm_rm_sf $ns2 10.0.3.2 $MPTCP_LIB_SUB_ESTABLISHED
chk_rm_nr 1 1
chk_mptcp_info subflows 0 subflows 0
chk_subflows_total 1 1
diff --git a/tools/testing/selftests/net/mptcp/mptcp_lib.sh b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
index 980ef3dbb6ab..ffd78187237b 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
@@ -8,6 +8,13 @@ readonly KSFT_SKIP=4
# shellcheck disable=SC2155 # declare and assign separately
readonly KSFT_TEST=$(basename "${0}" | sed 's/\.sh$//g')
+MPTCP_LIB_SUB_ESTABLISHED=10 # MPTCP_EVENT_SUB_ESTABLISHED
+MPTCP_LIB_LISTENER_CREATED=15 #MPTCP_EVENT_LISTENER_CREATED
+MPTCP_LIB_LISTENER_CLOSED=16 #MPTCP_EVENT_LISTENER_CLOSED
+
+readonly AF_INET=2
+readonly AF_INET6=10
+
MPTCP_LIB_SUBTESTS=()
# only if supported (or forced) and not disabled, see no-color.org
diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/testing/selftests/net/mptcp/userspace_pm.sh
index 27ddbd8cf03f..fb05d207fa44 100755
--- a/tools/testing/selftests/net/mptcp/userspace_pm.sh
+++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh
@@ -25,13 +25,7 @@ fi
ANNOUNCED=6 # MPTCP_EVENT_ANNOUNCED
REMOVED=7 # MPTCP_EVENT_REMOVED
-SUB_ESTABLISHED=10 # MPTCP_EVENT_SUB_ESTABLISHED
SUB_CLOSED=11 # MPTCP_EVENT_SUB_CLOSED
-LISTENER_CREATED=15 #MPTCP_EVENT_LISTENER_CREATED
-LISTENER_CLOSED=16 #MPTCP_EVENT_LISTENER_CLOSED
-
-AF_INET=2
-AF_INET6=10
file=""
client4_pid=0
@@ -520,7 +514,7 @@ verify_subflow_events()
info="${e_saddr} (${e_from}) => ${e_daddr} (${e_to})"
- if [ "$e_type" = "$SUB_ESTABLISHED" ]
+ if [ "$e_type" = "$MPTCP_LIB_SUB_ESTABLISHED" ]
then
if [ "$e_family" = "$AF_INET6" ]
then
@@ -577,14 +571,15 @@ test_subflows()
ip netns exec "$ns1" ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2\
rport "$client4_port" token "$server4_token"
sleep 0.5
- verify_subflow_events $server_evts $SUB_ESTABLISHED $server4_token $AF_INET "10.0.2.1" \
- "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2"
+ verify_subflow_events $server_evts $MPTCP_LIB_SUB_ESTABLISHED $server4_token \
+ $AF_INET "10.0.2.1" "10.0.2.2" "$client4_port" "23" \
+ "$client_addr_id" "ns1" "ns2"
# Delete the listener from the client ns, if one was created
mptcp_lib_kill_wait $listener_pid
local sport
- sport=$(mptcp_lib_evts_get_info sport "$server_evts" $SUB_ESTABLISHED)
+ sport=$(mptcp_lib_evts_get_info sport "$server_evts" $MPTCP_LIB_SUB_ESTABLISHED)
# DESTROY_SUBFLOW from server to client machine
:>"$server_evts"
@@ -615,14 +610,14 @@ test_subflows()
ip netns exec "$ns1" ./pm_nl_ctl csf lip dead:beef:2::1 lid 23 rip\
dead:beef:2::2 rport "$client6_port" token "$server6_token"
sleep 0.5
- verify_subflow_events "$server_evts" "$SUB_ESTABLISHED" "$server6_token" "$AF_INET6"\
- "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\
- "$client_addr_id" "ns1" "ns2"
+ verify_subflow_events "$server_evts" "$MPTCP_LIB_SUB_ESTABLISHED" "$server6_token" \
+ "$AF_INET6" "dead:beef:2::1" "dead:beef:2::2" "$client6_port" \
+ "23" "$client_addr_id" "ns1" "ns2"
# Delete the listener from the client ns, if one was created
mptcp_lib_kill_wait $listener_pid
- sport=$(mptcp_lib_evts_get_info sport "$server_evts" $SUB_ESTABLISHED)
+ sport=$(mptcp_lib_evts_get_info sport "$server_evts" $MPTCP_LIB_SUB_ESTABLISHED)
# DESTROY_SUBFLOW6 from server to client machine
:>"$server_evts"
@@ -654,14 +649,14 @@ test_subflows()
ip netns exec "$ns1" ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2 rport\
$new4_port token "$server4_token"
sleep 0.5
- verify_subflow_events "$server_evts" "$SUB_ESTABLISHED" "$server4_token" "$AF_INET"\
- "10.0.2.1" "10.0.2.2" "$new4_port" "23"\
+ verify_subflow_events "$server_evts" "$MPTCP_LIB_SUB_ESTABLISHED" "$server4_token" \
+ "$AF_INET" "10.0.2.1" "10.0.2.2" "$new4_port" "23" \
"$client_addr_id" "ns1" "ns2"
# Delete the listener from the client ns, if one was created
mptcp_lib_kill_wait $listener_pid
- sport=$(mptcp_lib_evts_get_info sport "$server_evts" $SUB_ESTABLISHED)
+ sport=$(mptcp_lib_evts_get_info sport "$server_evts" $MPTCP_LIB_SUB_ESTABLISHED)
# DESTROY_SUBFLOW from server to client machine
:>"$server_evts"
@@ -693,13 +688,13 @@ test_subflows()
ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport\
$app4_port token "$client4_token"
sleep 0.5
- verify_subflow_events $client_evts $SUB_ESTABLISHED $client4_token $AF_INET "10.0.2.2"\
- "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1"
+ verify_subflow_events $client_evts $MPTCP_LIB_SUB_ESTABLISHED $client4_token $AF_INET \
+ "10.0.2.2" "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1"
# Delete the listener from the server ns, if one was created
mptcp_lib_kill_wait $listener_pid
- sport=$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED)
+ sport=$(mptcp_lib_evts_get_info sport "$client_evts" $MPTCP_LIB_SUB_ESTABLISHED)
# DESTROY_SUBFLOW from client to server machine
:>"$client_evts"
@@ -730,7 +725,7 @@ test_subflows()
ip netns exec "$ns2" ./pm_nl_ctl csf lip dead:beef:2::2 lid 23 rip\
dead:beef:2::1 rport $app6_port token "$client6_token"
sleep 0.5
- verify_subflow_events "$client_evts" "$SUB_ESTABLISHED" "$client6_token"\
+ verify_subflow_events "$client_evts" "$MPTCP_LIB_SUB_ESTABLISHED" "$client6_token"\
"$AF_INET6" "dead:beef:2::2"\
"dead:beef:2::1" "$app6_port" "23"\
"$server_addr_id" "ns2" "ns1"
@@ -738,7 +733,7 @@ test_subflows()
# Delete the listener from the server ns, if one was created
mptcp_lib_kill_wait $listener_pid
- sport=$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED)
+ sport=$(mptcp_lib_evts_get_info sport "$client_evts" $MPTCP_LIB_SUB_ESTABLISHED)
# DESTROY_SUBFLOW6 from client to server machine
:>"$client_evts"
@@ -769,13 +764,14 @@ test_subflows()
ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport\
$new4_port token "$client4_token"
sleep 0.5
- verify_subflow_events "$client_evts" "$SUB_ESTABLISHED" "$client4_token" "$AF_INET"\
- "10.0.2.2" "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "ns1"
+ verify_subflow_events "$client_evts" "$MPTCP_LIB_SUB_ESTABLISHED" "$client4_token" \
+ "$AF_INET" "10.0.2.2" "10.0.2.1" "$new4_port" "23" \
+ "$server_addr_id" "ns2" "ns1"
# Delete the listener from the server ns, if one was created
mptcp_lib_kill_wait $listener_pid
- sport=$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED)
+ sport=$(mptcp_lib_evts_get_info sport "$client_evts" $MPTCP_LIB_SUB_ESTABLISHED)
# DESTROY_SUBFLOW from client to server machine
:>"$client_evts"
@@ -814,14 +810,14 @@ test_subflows_v4_v6_mix()
ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport\
$app6_port token "$client6_token"
sleep 0.5
- verify_subflow_events "$client_evts" "$SUB_ESTABLISHED" "$client6_token"\
+ verify_subflow_events "$client_evts" "$MPTCP_LIB_SUB_ESTABLISHED" "$client6_token"\
"$AF_INET" "10.0.2.2" "10.0.2.1" "$app6_port" "23"\
"$server_addr_id" "ns2" "ns1"
# Delete the listener from the server ns, if one was created
mptcp_lib_kill_wait $listener_pid
- sport=$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED)
+ sport=$(mptcp_lib_evts_get_info sport "$client_evts" $MPTCP_LIB_SUB_ESTABLISHED)
# DESTROY_SUBFLOW from client to server machine
:>"$client_evts"
@@ -881,9 +877,9 @@ verify_listener_events()
local saddr
local sport
- if [ $e_type = $LISTENER_CREATED ]; then
+ if [ $e_type = $MPTCP_LIB_LISTENER_CREATED ]; then
print_test "CREATE_LISTENER $e_saddr:$e_sport"
- elif [ $e_type = $LISTENER_CLOSED ]; then
+ elif [ $e_type = $MPTCP_LIB_LISTENER_CLOSED ]; then
print_test "CLOSE_LISTENER $e_saddr:$e_sport"
fi
@@ -918,7 +914,8 @@ test_listener()
local listener_pid=$!
sleep 0.5
- verify_listener_events $client_evts $LISTENER_CREATED $AF_INET 10.0.2.2 $client4_port
+ verify_listener_events $client_evts $MPTCP_LIB_LISTENER_CREATED \
+ $AF_INET 10.0.2.2 $client4_port
# ADD_ADDR from client to server machine reusing the subflow port
ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id\
@@ -934,7 +931,8 @@ test_listener()
mptcp_lib_kill_wait $listener_pid
sleep 0.5
- verify_listener_events $client_evts $LISTENER_CLOSED $AF_INET 10.0.2.2 $client4_port
+ verify_listener_events $client_evts $MPTCP_LIB_LISTENER_CLOSED \
+ $AF_INET 10.0.2.2 $client4_port
}
print_title "Make connections"
--
2.35.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH mptcp-next v4 10/12] selftests: mptcp: extract mptcp_lib_check_expected
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
` (8 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v4 09/12] selftests: mptcp: export event macros in mptcp_lib Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 11/12] selftests: mptcp: add mptcp_lib_verify_listener_events Geliang Tang
2023-11-04 8:36 ` [PATCH mptcp-next v4 12/12] selftests: mptcp: add mptcp_lib_init_ns Geliang Tang
11 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Extract the main part of check_expected() in userspace_pm.sh to a new
function mptcp_lib_check_expected() in mptcp_lib.sh. It will be used
in both mptcp_john.sh and userspace_pm.sh.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
.../testing/selftests/net/mptcp/mptcp_lib.sh | 42 +++++++++++++++++++
.../selftests/net/mptcp/userspace_pm.sh | 39 +----------------
2 files changed, 44 insertions(+), 37 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_lib.sh b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
index ffd78187237b..68b07216e47a 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
@@ -369,3 +369,45 @@ mptcp_lib_evts_remove() {
rm -rf "${server_evts}" "${client_evts}"
}
+
+# $1: var name ; $2: prev ret
+mptcp_lib_check_expected_one()
+{
+ local var="${1}"
+ local exp="e_${var}"
+ local prev_ret="${2}"
+
+ if [ "${!var}" = "${!exp}" ]
+ then
+ return 0
+ fi
+
+ if [ "${prev_ret}" = "0" ]
+ then
+ mptcp_lib_result_fail
+ fi
+
+ printf "\tExpected value for '%s': '%s', got '%s'.\n" \
+ "${var}" "${!exp}" "${!var}"
+ return 1
+}
+
+# $@: all var names to check
+mptcp_lib_check_expected()
+{
+ local rc=0
+ local var
+
+ for var in "${@}"
+ do
+ mptcp_lib_check_expected_one "${var}" "${rc}" || rc=1
+ done
+
+ if [ ${rc} -eq 0 ]
+ then
+ mptcp_lib_print_ok "[ ok ]"
+ return 0
+ fi
+
+ return 1
+}
diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/testing/selftests/net/mptcp/userspace_pm.sh
index fb05d207fa44..6a84e563b2ca 100755
--- a/tools/testing/selftests/net/mptcp/userspace_pm.sh
+++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh
@@ -231,46 +231,11 @@ make_connection()
fi
}
-# $1: var name ; $2: prev ret
-check_expected_one()
-{
- local var="${1}"
- local exp="e_${var}"
- local prev_ret="${2}"
-
- if [ "${!var}" = "${!exp}" ]
- then
- return 0
- fi
-
- if [ "${prev_ret}" = "0" ]
- then
- test_fail
- fi
-
- _printf "\tExpected value for '%s': '%s', got '%s'.\n" \
- "${var}" "${!exp}" "${!var}"
- return 1
-}
-
# $@: all var names to check
check_expected()
{
- local rc=0
- local var
-
- for var in "${@}"
- do
- check_expected_one "${var}" "${rc}" || rc=1
- done
-
- if [ ${rc} -eq 0 ]
- then
- test_pass
- return 0
- fi
-
- return 1
+ mptcp_lib_check_expected ${*}
+ [ $? -eq 0 ] && mptcp_lib_result_pass "${TEST_NAME}"
}
verify_announce_event()
--
2.35.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH mptcp-next v4 11/12] selftests: mptcp: add mptcp_lib_verify_listener_events
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
` (9 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v4 10/12] selftests: mptcp: extract mptcp_lib_check_expected Geliang Tang
@ 2023-11-04 8:35 ` Geliang Tang
2023-11-04 8:36 ` [PATCH mptcp-next v4 12/12] selftests: mptcp: add mptcp_lib_init_ns Geliang Tang
11 siblings, 0 replies; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:35 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
To avoid duplicated code in different MPTCP selftests, we can add
and use helpers defined in mptcp_lib.sh.
verify_listener_events() helper is defined both in mptcp_join.sh and
userspace_pm.sh, export it into mptcp_lib.sh and rename it with
mptcp_lib_ prefix. Use this new helper in both scripts.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
.../testing/selftests/net/mptcp/mptcp_join.sh | 54 +++++--------------
.../testing/selftests/net/mptcp/mptcp_lib.sh | 32 +++++++++++
.../selftests/net/mptcp/userspace_pm.sh | 30 ++---------
3 files changed, 49 insertions(+), 67 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 8f7112cb120e..ae58a38d941b 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -2779,49 +2779,17 @@ backup_tests()
verify_listener_events()
{
- local evt=$1
- local e_type=$2
- local e_family=$3
- local e_saddr=$4
- local e_sport=$5
- local type
- local family
- local saddr
- local sport
local name
- if [ $e_type = $MPTCP_LIB_LISTENER_CREATED ]; then
+ if [ $2 = $MPTCP_LIB_LISTENER_CREATED ]; then
name="LISTENER_CREATED"
- elif [ $e_type = $MPTCP_LIB_LISTENER_CLOSED ]; then
+ elif [ $2 = $MPTCP_LIB_LISTENER_CLOSED ]; then
name="LISTENER_CLOSED "
- else
- name="$e_type"
fi
+ printf "%-6s%-36s" " " "$name $4:$5"
- print_check "$name $e_saddr:$e_sport"
-
- if ! mptcp_lib_kallsyms_has "mptcp_event_pm_listener$"; then
- print_skip "event not supported"
- return
- fi
-
- type=$(mptcp_lib_evts_get_info type "$evt" "$e_type")
- family=$(mptcp_lib_evts_get_info family "$evt" "$e_type")
- sport=$(mptcp_lib_evts_get_info sport "$evt" "$e_type")
- if [ $family ] && [ $family = $AF_INET6 ]; then
- saddr=$(mptcp_lib_evts_get_info saddr6 "$evt" "$e_type")
- else
- saddr=$(mptcp_lib_evts_get_info saddr4 "$evt" "$e_type")
- fi
-
- if [ $type ] && [ $type = $e_type ] &&
- [ $family ] && [ $family = $e_family ] &&
- [ $saddr ] && [ $saddr = $e_saddr ] &&
- [ $sport ] && [ $sport = $e_sport ]; then
- print_ok
- return 0
- fi
- fail_test "$e_type:$type $e_family:$family $e_saddr:$saddr $e_sport:$sport"
+ mptcp_lib_verify_listener_events ${*}
+ [ $? -eq 1 ] && fail_test "$name $4:$5"
}
add_addr_ports_tests()
@@ -2859,10 +2827,14 @@ add_addr_ports_tests()
chk_add_nr 1 1 1
chk_rm_nr 1 1 invert
- verify_listener_events $server_evts $MPTCP_LIB_LISTENER_CREATED \
- $AF_INET 10.0.2.1 10100
- verify_listener_events $server_evts $MPTCP_LIB_LISTENER_CLOSED \
- $AF_INET 10.0.2.1 10100
+ if mptcp_lib_kallsyms_has "mptcp_event_pm_listener$"; then
+ verify_listener_events $server_evts $MPTCP_LIB_LISTENER_CREATED \
+ $AF_INET 10.0.2.1 10100
+ verify_listener_events $server_evts $MPTCP_LIB_LISTENER_CLOSED \
+ $AF_INET 10.0.2.1 10100
+ else
+ mptcp_lib_print_warn "[skip] event not supported"
+ fi
mptcp_lib_evts_kill
fi
diff --git a/tools/testing/selftests/net/mptcp/mptcp_lib.sh b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
index 68b07216e47a..0aea2c5175d5 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
@@ -411,3 +411,35 @@ mptcp_lib_check_expected()
return 1
}
+
+mptcp_lib_verify_listener_events() {
+ local evt=$1
+ local e_type=$2
+ local e_family=$3
+ local e_saddr=$4
+ local e_sport=$5
+ local type
+ local family
+ local saddr
+ local sport
+ local name
+
+ if [ $e_type = $MPTCP_LIB_LISTENER_CREATED ]; then
+ name="LISTENER_CREATED"
+ elif [ $e_type = $MPTCP_LIB_LISTENER_CLOSED ]; then
+ name="LISTENER_CLOSED "
+ else
+ name="$e_type"
+ fi
+
+ type=$(mptcp_lib_evts_get_info type "$evt" "$e_type")
+ family=$(mptcp_lib_evts_get_info family "$evt" "$e_type")
+ sport=$(mptcp_lib_evts_get_info sport "$evt" "$e_type")
+ if [ $family ] && [ $family = $AF_INET6 ]; then
+ saddr=$(mptcp_lib_evts_get_info saddr6 "$evt" "$e_type")
+ else
+ saddr=$(mptcp_lib_evts_get_info saddr4 "$evt" "$e_type")
+ fi
+
+ mptcp_lib_check_expected "type" "family" "saddr" "sport"
+}
diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/testing/selftests/net/mptcp/userspace_pm.sh
index 6a84e563b2ca..f99edce8171f 100755
--- a/tools/testing/selftests/net/mptcp/userspace_pm.sh
+++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh
@@ -832,32 +832,8 @@ test_prio()
verify_listener_events()
{
- local evt=$1
- local e_type=$2
- local e_family=$3
- local e_saddr=$4
- local e_sport=$5
- local type
- local family
- local saddr
- local sport
-
- if [ $e_type = $MPTCP_LIB_LISTENER_CREATED ]; then
- print_test "CREATE_LISTENER $e_saddr:$e_sport"
- elif [ $e_type = $MPTCP_LIB_LISTENER_CLOSED ]; then
- print_test "CLOSE_LISTENER $e_saddr:$e_sport"
- fi
-
- type=$(mptcp_lib_evts_get_info type $evt $e_type)
- family=$(mptcp_lib_evts_get_info family $evt $e_type)
- sport=$(mptcp_lib_evts_get_info sport $evt $e_type)
- if [ $family ] && [ $family = $AF_INET6 ]; then
- saddr=$(mptcp_lib_evts_get_info saddr6 $evt $e_type)
- else
- saddr=$(mptcp_lib_evts_get_info saddr4 $evt $e_type)
- fi
-
- check_expected "type" "family" "saddr" "sport"
+ mptcp_lib_verify_listener_events ${*}
+ [ $? -eq 0 ] && mptcp_lib_result_pass "${TEST_NAME}"
}
test_listener()
@@ -879,6 +855,7 @@ test_listener()
local listener_pid=$!
sleep 0.5
+ print_test "LISTENER_CREATED 10.0.2.2:$client4_port"
verify_listener_events $client_evts $MPTCP_LIB_LISTENER_CREATED \
$AF_INET 10.0.2.2 $client4_port
@@ -896,6 +873,7 @@ test_listener()
mptcp_lib_kill_wait $listener_pid
sleep 0.5
+ print_test "LISTENER_CLOSED 10.0.2.2:$client4_port"
verify_listener_events $client_evts $MPTCP_LIB_LISTENER_CLOSED \
$AF_INET 10.0.2.2 $client4_port
}
--
2.35.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH mptcp-next v4 12/12] selftests: mptcp: add mptcp_lib_init_ns
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
` (10 preceding siblings ...)
2023-11-04 8:35 ` [PATCH mptcp-next v4 11/12] selftests: mptcp: add mptcp_lib_verify_listener_events Geliang Tang
@ 2023-11-04 8:36 ` Geliang Tang
2023-11-06 22:13 ` selftests: mptcp: add mptcp_lib_init_ns: Tests Results MPTCP CI
11 siblings, 1 reply; 28+ messages in thread
From: Geliang Tang @ 2023-11-04 8:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
To unify the namespace name, rename 'ns' in diag.sh to 'ns1', and rename
'ns_sbox' in mptcp_sockopt.sh to 'ns3'. Add a new helper mptcp_lib_init_ns
in mptcp_lib.sh to init all namespaces ns1, ns2, ns3 and ns4. Then every
test script can invoke mptcp_lib_init_ns and use all namespaces.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/net/mptcp/diag.sh | 48 +++++++++----------
.../selftests/net/mptcp/mptcp_connect.sh | 7 +--
.../testing/selftests/net/mptcp/mptcp_join.sh | 9 +---
.../testing/selftests/net/mptcp/mptcp_lib.sh | 18 +++++++
.../selftests/net/mptcp/mptcp_sockopt.sh | 16 +++----
.../testing/selftests/net/mptcp/pm_netlink.sh | 4 +-
.../selftests/net/mptcp/simult_flows.sh | 6 +--
.../selftests/net/mptcp/userspace_pm.sh | 5 +-
8 files changed, 52 insertions(+), 61 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/diag.sh b/tools/testing/selftests/net/mptcp/diag.sh
index 95b498efacd1..13c677cc2999 100755
--- a/tools/testing/selftests/net/mptcp/diag.sh
+++ b/tools/testing/selftests/net/mptcp/diag.sh
@@ -3,9 +3,7 @@
. "$(dirname "${0}")/mptcp_lib.sh"
-sec=$(date +%s)
-rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
-ns="ns1-$rndh"
+mptcp_lib_init_ns
ksft_skip=4
test_cnt=1
timeout_poll=100
@@ -18,19 +16,19 @@ flush_pids()
# give it some time
sleep 1.1
- ip netns pids "${ns}" | xargs --no-run-if-empty kill -SIGUSR1 &>/dev/null
+ ip netns pids "${ns1}" | xargs --no-run-if-empty kill -SIGUSR1 &>/dev/null
for _ in $(seq 10); do
- [ -z "$(ip netns pids "${ns}")" ] && break
+ [ -z "$(ip netns pids "${ns1}")" ] && break
sleep 0.1
done
}
cleanup()
{
- ip netns pids "${ns}" | xargs --no-run-if-empty kill -SIGKILL &>/dev/null
+ ip netns pids "${ns1}" | xargs --no-run-if-empty kill -SIGKILL &>/dev/null
- ip netns del $ns
+ ip netns del $ns1
}
mptcp_lib_check_mptcp
@@ -48,7 +46,7 @@ fi
get_msk_inuse()
{
- ip netns exec $ns cat /proc/net/protocols | awk '$1~/^MPTCP$/{print $3}'
+ ip netns exec $ns1 cat /proc/net/protocols | awk '$1~/^MPTCP$/{print $3}'
}
__chk_nr()
@@ -83,7 +81,7 @@ __chk_msk_nr()
local condition=$1
shift 1
- __chk_nr "ss -inmHMN $ns | $condition" "$@"
+ __chk_nr "ss -inmHMN $ns1 | $condition" "$@"
}
chk_msk_nr()
@@ -104,7 +102,7 @@ wait_msk_nr()
msg=$*
while [ $i -lt $timeout ]; do
- nr=$(ss -inmHMN $ns | $condition)
+ nr=$(ss -inmHMN $ns1 | $condition)
[ $nr == $expected ] && break;
[ $nr -gt $max ] && max=$nr
i=$((i + 1))
@@ -143,7 +141,7 @@ __chk_listen()
local expected=$2
local msg="$3"
- __chk_nr "ss -N $ns -Ml '$filter' | grep -c LISTEN" "$expected" "$msg" 0
+ __chk_nr "ss -N $ns1 -Ml '$filter' | grep -c LISTEN" "$expected" "$msg" 0
}
chk_msk_listen()
@@ -169,7 +167,7 @@ chk_msk_inuse()
local msg="$2"
local listen_nr
- listen_nr=$(ss -N "${ns}" -Ml | grep -c LISTEN)
+ listen_nr=$(ss -N "${ns1}" -Ml | grep -c LISTEN)
expected=$((expected + listen_nr))
for _ in $(seq 10); do
@@ -197,24 +195,24 @@ wait_connected()
}
trap cleanup EXIT
-ip netns add $ns
-ip -n $ns link set dev lo up
+ip netns add $ns1
+ip -n $ns1 link set dev lo up
echo "a" | \
timeout ${timeout_test} \
- ip netns exec $ns \
+ ip netns exec $ns1 \
./mptcp_connect -p 10000 -l -t ${timeout_poll} -w 20 \
0.0.0.0 >/dev/null &
-mptcp_lib_wait_local_port_listen $ns 10000
+mptcp_lib_wait_local_port_listen $ns1 10000
chk_msk_nr 0 "no msk on netns creation"
chk_msk_listen 10000
echo "b" | \
timeout ${timeout_test} \
- ip netns exec $ns \
+ ip netns exec $ns1 \
./mptcp_connect -p 10000 -r 0 -t ${timeout_poll} -w 20 \
127.0.0.1 >/dev/null &
-wait_connected $ns 10000
+wait_connected $ns1 10000
chk_msk_nr 2 "after MPC handshake "
chk_msk_remote_key_nr 2 "....chk remote_key"
chk_msk_fallback_nr 0 "....chk no fallback"
@@ -225,16 +223,16 @@ chk_msk_inuse 0 "....chk 0 msk in use after flush"
echo "a" | \
timeout ${timeout_test} \
- ip netns exec $ns \
+ ip netns exec $ns1 \
./mptcp_connect -p 10001 -l -s TCP -t ${timeout_poll} -w 20 \
0.0.0.0 >/dev/null &
-mptcp_lib_wait_local_port_listen $ns 10001
+mptcp_lib_wait_local_port_listen $ns1 10001
echo "b" | \
timeout ${timeout_test} \
- ip netns exec $ns \
+ ip netns exec $ns1 \
./mptcp_connect -p 10001 -r 0 -t ${timeout_poll} -w 20 \
127.0.0.1 >/dev/null &
-wait_connected $ns 10001
+wait_connected $ns1 10001
chk_msk_fallback_nr 1 "check fallback"
chk_msk_inuse 1 "....chk 1 msk in use"
flush_pids
@@ -245,16 +243,16 @@ NR_CLIENTS=100
for I in `seq 1 $NR_CLIENTS`; do
echo "a" | \
timeout ${timeout_test} \
- ip netns exec $ns \
+ ip netns exec $ns1 \
./mptcp_connect -p $((I+10001)) -l -w 20 \
-t ${timeout_poll} 0.0.0.0 >/dev/null &
done
-mptcp_lib_wait_local_port_listen $ns $((NR_CLIENTS + 10001))
+mptcp_lib_wait_local_port_listen $ns1 $((NR_CLIENTS + 10001))
for I in `seq 1 $NR_CLIENTS`; do
echo "b" | \
timeout ${timeout_test} \
- ip netns exec $ns \
+ ip netns exec $ns1 \
./mptcp_connect -p $((I+10001)) -w 20 \
-t ${timeout_poll} 127.0.0.1 >/dev/null &
done
diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.sh b/tools/testing/selftests/net/mptcp/mptcp_connect.sh
index 7898d62fce0b..8a0ce9ed1e9e 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_connect.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_connect.sh
@@ -121,12 +121,7 @@ while getopts "$optstring" option;do
esac
done
-sec=$(date +%s)
-rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
-ns1="ns1-$rndh"
-ns2="ns2-$rndh"
-ns3="ns3-$rndh"
-ns4="ns4-$rndh"
+mptcp_lib_init_ns
TEST_COUNT=0
TEST_GROUP=""
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index ae58a38d941b..8109f92e56a0 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -22,8 +22,6 @@ cinsent=""
tmpfile=""
cout=""
capout=""
-ns1=""
-ns2=""
ksft_skip=4
iptables="iptables"
ip6tables="ip6tables"
@@ -79,12 +77,7 @@ init_partial()
{
capout=$(mktemp)
- local sec rndh
- sec=$(date +%s)
- rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
-
- ns1="ns1-$rndh"
- ns2="ns2-$rndh"
+ mptcp_lib_init_ns
local netns
for netns in "$ns1" "$ns2"; do
diff --git a/tools/testing/selftests/net/mptcp/mptcp_lib.sh b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
index 0aea2c5175d5..ee5a5b9adc47 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
@@ -15,6 +15,12 @@ MPTCP_LIB_LISTENER_CLOSED=16 #MPTCP_EVENT_LISTENER_CLOSED
readonly AF_INET=2
readonly AF_INET6=10
+rndh=""
+ns1=""
+ns2=""
+ns3=""
+ns4=""
+
MPTCP_LIB_SUBTESTS=()
# only if supported (or forced) and not disabled, see no-color.org
@@ -443,3 +449,15 @@ mptcp_lib_verify_listener_events() {
mptcp_lib_check_expected "type" "family" "saddr" "sport"
}
+
+mptcp_lib_init_ns() {
+ local sec
+
+ sec=$(date +%s)
+ rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
+
+ ns1="ns1-$rndh"
+ ns2="ns2-$rndh"
+ ns3="ns3-$rndh"
+ ns4="ns4-$rndh"
+}
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
index c643872ddf47..f4dfeaf52c73 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -14,11 +14,7 @@ timeout_test=$((timeout_poll * 2 + 1))
iptables="iptables"
ip6tables="ip6tables"
-sec=$(date +%s)
-rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
-ns1="ns1-$rndh"
-ns2="ns2-$rndh"
-ns_sbox="ns_sbox-$rndh"
+mptcp_lib_init_ns
add_mark_rules()
{
@@ -41,7 +37,7 @@ add_mark_rules()
init()
{
local netns
- for netns in "$ns1" "$ns2" "$ns_sbox";do
+ for netns in "$ns1" "$ns2" "$ns3";do
ip netns add $netns || exit $ksft_skip
ip -net $netns link set lo up
ip netns exec $netns sysctl -q net.mptcp.enabled=1
@@ -80,7 +76,7 @@ init()
cleanup()
{
local netns
- for netns in "$ns1" "$ns2" "$ns_sbox"; do
+ for netns in "$ns1" "$ns2" "$ns3"; do
ip netns del $netns
done
rm -f "$cin" "$cout"
@@ -240,7 +236,7 @@ do_mptcp_sockopt_tests()
return
fi
- ip netns exec "$ns_sbox" ./mptcp_sockopt
+ ip netns exec "$ns3" ./mptcp_sockopt
lret=$?
if [ $lret -ne 0 ]; then
@@ -251,7 +247,7 @@ do_mptcp_sockopt_tests()
fi
mptcp_lib_result_pass "sockopt v4"
- ip netns exec "$ns_sbox" ./mptcp_sockopt -6
+ ip netns exec "$ns3" ./mptcp_sockopt -6
lret=$?
if [ $lret -ne 0 ]; then
@@ -282,7 +278,7 @@ run_tests()
do_tcpinq_test()
{
- ip netns exec "$ns_sbox" ./mptcp_inq "$@"
+ ip netns exec "$ns3" ./mptcp_inq "$@"
local lret=$?
if [ $lret -ne 0 ];then
ret=$lret
diff --git a/tools/testing/selftests/net/mptcp/pm_netlink.sh b/tools/testing/selftests/net/mptcp/pm_netlink.sh
index 8f4ff123a7eb..1208cba4797f 100755
--- a/tools/testing/selftests/net/mptcp/pm_netlink.sh
+++ b/tools/testing/selftests/net/mptcp/pm_netlink.sh
@@ -24,9 +24,7 @@ while getopts "$optstring" option;do
esac
done
-sec=$(date +%s)
-rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
-ns1="ns1-$rndh"
+mptcp_lib_init_ns
err=$(mktemp)
ret=0
diff --git a/tools/testing/selftests/net/mptcp/simult_flows.sh b/tools/testing/selftests/net/mptcp/simult_flows.sh
index ae8ad5d6fb9d..8f8bad051b1f 100755
--- a/tools/testing/selftests/net/mptcp/simult_flows.sh
+++ b/tools/testing/selftests/net/mptcp/simult_flows.sh
@@ -3,11 +3,7 @@
. "$(dirname "${0}")/mptcp_lib.sh"
-sec=$(date +%s)
-rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
-ns1="ns1-$rndh"
-ns2="ns2-$rndh"
-ns3="ns3-$rndh"
+mptcp_lib_init_ns
capture=false
ksft_skip=4
timeout_poll=30
diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/testing/selftests/net/mptcp/userspace_pm.sh
index f99edce8171f..03b9353d93f3 100755
--- a/tools/testing/selftests/net/mptcp/userspace_pm.sh
+++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh
@@ -44,10 +44,7 @@ app6_port=50004
client_addr_id=${RANDOM:0:2}
server_addr_id=${RANDOM:0:2}
-sec=$(date +%s)
-rndh=$(printf %x "$sec")-$(mktemp -u XXXXXX)
-ns1="ns1-$rndh"
-ns2="ns2-$rndh"
+mptcp_lib_init_ns
ret=0
test_name=""
--
2.35.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: mptcp: drop lookup_by_id parameter in lookup_addr: Tests Results
2023-11-04 8:35 ` [PATCH mptcp-next v3 12/12] mptcp: drop lookup_by_id parameter in lookup_addr Geliang Tang
@ 2023-11-04 9:56 ` MPTCP CI
0 siblings, 0 replies; 28+ messages in thread
From: MPTCP CI @ 2023-11-04 9:56 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/5715754092331008
- Summary: https://api.cirrus-ci.com/v1/artifact/task/5715754092331008/summary/summary.txt
- KVM Validation: normal (only selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/5152804138909696
- Summary: https://api.cirrus-ci.com/v1/artifact/task/5152804138909696/summary/summary.txt
- KVM Validation: debug (except selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/6278704045752320
- Summary: https://api.cirrus-ci.com/v1/artifact/task/6278704045752320/summary/summary.txt
- KVM Validation: debug (only selftest_mptcp_join):
- Critical: 3 Call Trace(s) ❌:
- Task: https://cirrus-ci.com/task/4871329162199040
- Summary: https://api.cirrus-ci.com/v1/artifact/task/4871329162199040/summary/summary.txt
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/5c73e0a6e105
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] 28+ messages in thread
* Re: selftests: mptcp: add mptcp_lib_init_ns: Tests Results
2023-11-04 8:36 ` [PATCH mptcp-next v4 12/12] selftests: mptcp: add mptcp_lib_init_ns Geliang Tang
@ 2023-11-06 22:13 ` MPTCP CI
0 siblings, 0 replies; 28+ messages in thread
From: MPTCP CI @ 2023-11-06 22:13 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/4943139908091904
- Summary: https://api.cirrus-ci.com/v1/artifact/task/4943139908091904/summary/summary.txt
- KVM Validation: debug (only selftest_mptcp_join):
- Critical: KMemLeak ❌:
- Task: https://cirrus-ci.com/task/6631989768355840
- Summary: https://api.cirrus-ci.com/v1/artifact/task/6631989768355840/summary/summary.txt
- KVM Validation: debug (except selftest_mptcp_join):
- Critical: KMemLeak ❌:
- Task: https://cirrus-ci.com/task/5506089861513216
- Summary: https://api.cirrus-ci.com/v1/artifact/task/5506089861513216/summary/summary.txt
- KVM Validation: normal (only selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/6069039814934528
- Summary: https://api.cirrus-ci.com/v1/artifact/task/6069039814934528/summary/summary.txt
Initiator: Matthieu Baerts
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/e05a56ecc88a
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] 28+ messages in thread
end of thread, other threads:[~2023-11-06 22:13 UTC | newest]
Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-11-04 8:35 [PATCH mptcp-next v3 00/12] add flush and dump for userspace pm Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 01/12] mptcp: export pm_nl_get_pernet_from_msk Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 02/12] mptcp: use pernet id_bitmap in userspace pm Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 03/12] mptcp: rename free_local_addr_list with prefix Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 04/12] mptcp: flush userspace pm addrs list Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 05/12] mptcp: lookup_addr_by_id helper in userspace pm Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 06/12] mptcp: dump userspace pm addrs Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 07/12] mptcp: check userspace pm subflow flag Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 08/12] selftests: mptcp: add " Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 09/12] selftests: mptcp: flush and dump userspace addrs list Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 10/12] mptcp: drop mptcp_pm_get_* helpers Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 11/12] mptcp: add addresses_identically_equal helper Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v3 12/12] mptcp: drop lookup_by_id parameter in lookup_addr Geliang Tang
2023-11-04 9:56 ` mptcp: drop lookup_by_id parameter in lookup_addr: Tests Results MPTCP CI
2023-11-04 8:35 ` [PATCH mptcp-next v4 00/12] add refcount for address entry Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 01/12] mptcp: add userspace_pm_get_entry helper Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 02/12] mptcp: dup an entry when removing it Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 03/12] mptcp: add userspace pm addr entry refcount Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 04/12] selftests: mptcp: rm userspace addr with random order Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 05/12] mptcp: add netlink pm addr entry refcount Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 06/12] mptcp: drop addr_match and id_match Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 07/12] selftests: mptcp: add mptcp_lib_evts_* Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 08/12] selftests: mptcp: userspace: print colored results Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 09/12] selftests: mptcp: export event macros in mptcp_lib Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 10/12] selftests: mptcp: extract mptcp_lib_check_expected Geliang Tang
2023-11-04 8:35 ` [PATCH mptcp-next v4 11/12] selftests: mptcp: add mptcp_lib_verify_listener_events Geliang Tang
2023-11-04 8:36 ` [PATCH mptcp-next v4 12/12] selftests: mptcp: add mptcp_lib_init_ns Geliang Tang
2023-11-06 22:13 ` selftests: mptcp: add mptcp_lib_init_ns: 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.