mptcp.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
* [PATCH mptcp-next v2 00/15] dump for userspace pm
@ 2023-12-18  9:23 Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 01/15] mptcp: add mptcp_pm_nl_put_entry_msg helper Geliang Tang
                   ` (14 more replies)
  0 siblings, 15 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

v2:
Address Mat's comments in v1:
 - patch 2: pass token to dump_addr too.
 - patch 2: add back id in mptcp_userspace_pm_dump_addr().
 - patch 5: pdate mptcp.yaml

v1:
Address Mat's comments in "userspace pm enhancements" v14.

Geliang Tang (15):
  mptcp: add mptcp_pm_nl_put_entry_msg helper
  mptcp: implement mptcp_userspace_pm_dump_addr
  mptcp: dump addrs in userspace pm list
  mptcp: check userspace pm subflow flag
  mptcp: add token for get-addr in yaml
  selftests: mptcp: add userspace pm subflow flag
  selftests: mptcp: add token for dump_addr
  selftests: mptcp: add check_output helper
  selftests: mptcp: dump userspace addrs list
  mptcp: add userspace_pm_lookup_addr_by_id helper
  mptcp: add mptcp_pm_nl_put_entry_info helper
  mptcp: implement mptcp_userspace_pm_get_addr
  mptcp: get addr in userspace pm list
  selftests: mptcp: add token for get_addr
  selftests: mptcp: userspace pm get addr tests

 Documentation/netlink/specs/mptcp.yaml        |   5 +-
 net/mptcp/mptcp_pm_gen.c                      |   7 +-
 net/mptcp/mptcp_pm_gen.h                      |   2 +-
 net/mptcp/pm_netlink.c                        |  95 +++++++++++-----
 net/mptcp/pm_userspace.c                      | 103 +++++++++++++++---
 net/mptcp/protocol.h                          |   9 ++
 .../testing/selftests/net/mptcp/mptcp_join.sh |  99 +++++++++++++++++
 tools/testing/selftests/net/mptcp/pm_nl_ctl.c |  39 ++++++-
 8 files changed, 306 insertions(+), 53 deletions(-)

-- 
2.35.3


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

* [PATCH mptcp-next v2 01/15] mptcp: add mptcp_pm_nl_put_entry_msg helper
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 02/15] mptcp: implement mptcp_userspace_pm_dump_addr Geliang Tang
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Extract the genlmsg related code from mptcp_pm_nl_get_addr_dumpit() into
a new helper mptcp_pm_nl_put_entry_msg(). It will be used in the userspace
PM dump_addr().

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 net/mptcp/pm_netlink.c | 35 ++++++++++++++++++++++++-----------
 net/mptcp/protocol.h   |  3 +++
 2 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index c84cc0908cfc..43062cd23ba3 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1658,6 +1658,29 @@ static int mptcp_nl_fill_addr(struct sk_buff *skb,
 	return -EMSGSIZE;
 }
 
+int mptcp_pm_nl_put_entry_msg(struct sk_buff *msg,
+			      struct netlink_callback *cb,
+			      struct mptcp_pm_addr_entry *entry)
+{
+	void *hdr;
+	int ret;
+
+	hdr = genlmsg_put(msg, NETLINK_CB(cb->skb).portid,
+			  cb->nlh->nlmsg_seq, &mptcp_genl_family,
+			  NLM_F_MULTI, MPTCP_PM_CMD_GET_ADDR);
+	if (!hdr)
+		return -EMSGSIZE;
+
+	ret = mptcp_nl_fill_addr(msg, entry);
+	if (ret < 0) {
+		genlmsg_cancel(msg, hdr);
+		return ret;
+	}
+
+	genlmsg_end(msg, hdr);
+	return 0;
+}
+
 int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info)
 {
 	struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
@@ -1715,7 +1738,6 @@ int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg,
 	struct mptcp_pm_addr_entry *entry;
 	struct pm_nl_pernet *pernet;
 	int id = cb->args[0];
-	void *hdr;
 	int i;
 
 	pernet = pm_nl_get_pernet(net);
@@ -1730,19 +1752,10 @@ int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg,
 			if (entry->addr.id <= id)
 				continue;
 
-			hdr = genlmsg_put(msg, NETLINK_CB(cb->skb).portid,
-					  cb->nlh->nlmsg_seq, &mptcp_genl_family,
-					  NLM_F_MULTI, MPTCP_PM_CMD_GET_ADDR);
-			if (!hdr)
-				break;
-
-			if (mptcp_nl_fill_addr(msg, entry) < 0) {
-				genlmsg_cancel(msg, hdr);
+			if (mptcp_pm_nl_put_entry_msg(msg, cb, entry))
 				break;
-			}
 
 			id = entry->addr.id;
-			genlmsg_end(msg, hdr);
 		}
 	}
 	spin_unlock_bh(&pernet->lock);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index f7b9c1b995df..23d4742f3f30 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1022,6 +1022,9 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, const struct sk_buff *skb,
 			      bool *drop_other_suboptions);
 bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
 			     struct mptcp_rm_list *rm_list);
+int mptcp_pm_nl_put_entry_msg(struct sk_buff *msg,
+			      struct netlink_callback *cb,
+			      struct mptcp_pm_addr_entry *entry);
 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);
-- 
2.35.3


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

* [PATCH mptcp-next v2 02/15] mptcp: implement mptcp_userspace_pm_dump_addr
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 01/15] mptcp: add mptcp_pm_nl_put_entry_msg helper Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 03/15] mptcp: dump addrs in userspace pm list Geliang Tang
                   ` (12 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

This patch implements mptcp_userspace_pm_dump_addr() to dump addresses
from userspace pm address list. Use mptcp_token_get_sock() to get the
msk from the given token, if userspace PM is enabled in it, traverse
each address entry in address list, put every entry to userspace using
mptcp_pm_nl_put_entry_msg().

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 net/mptcp/pm_userspace.c | 39 +++++++++++++++++++++++++++++++++++++++
 net/mptcp/protocol.h     |  2 ++
 2 files changed, 41 insertions(+)

diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index efecbe3cf415..a497148039c6 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -550,3 +550,42 @@ int mptcp_userspace_pm_set_flags(struct net *net, struct nlattr *token,
 	sock_put(sk);
 	return ret;
 }
+
+int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
+				 struct netlink_callback *cb)
+{
+	const struct genl_info *info = genl_info_dump(cb);
+	struct net *net = sock_net(msg->sk);
+	struct mptcp_pm_addr_entry *entry;
+	struct mptcp_sock *msk;
+	int id = cb->args[0];
+	int ret = -EINVAL;
+
+	if (!info->attrs[MPTCP_PM_ATTR_TOKEN])
+		return ret;
+
+	msk = mptcp_token_get_sock(net, nla_get_u32(info->attrs[MPTCP_PM_ATTR_TOKEN]));
+	if (!msk)
+		return ret;
+
+	if (mptcp_pm_is_userspace(msk)) {
+		struct sock *sk = (struct sock *)msk;
+
+		lock_sock(sk);
+		spin_lock_bh(&msk->pm.lock);
+		list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
+			if (entry->addr.id <= id)
+				continue;
+
+			if (mptcp_pm_nl_put_entry_msg(msg, cb, entry))
+				break;
+
+			id = entry->addr.id;
+		}
+		spin_unlock_bh(&msk->pm.lock);
+		release_sock(sk);
+	}
+
+	cb->args[0] = id;
+	return msg->len;
+}
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 23d4742f3f30..a05a6745bc31 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1028,6 +1028,8 @@ int mptcp_pm_nl_put_entry_msg(struct sk_buff *msg,
 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);
+int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
+				 struct netlink_callback *cb);
 
 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] 17+ messages in thread

* [PATCH mptcp-next v2 03/15] mptcp: dump addrs in userspace pm list
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 01/15] mptcp: add mptcp_pm_nl_put_entry_msg helper Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 02/15] mptcp: implement mptcp_userspace_pm_dump_addr Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 04/15] mptcp: check userspace pm subflow flag Geliang Tang
                   ` (11 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

This patch renames mptcp_pm_nl_get_addr_dumpit() to in-kernel netlink PM
dump addrs function mptcp_pm_nl_dump_addr(), then invoke both in-kernel PM
mptcp_pm_nl_dump_addr() and userspace PM mptcp_userspace_pm_dump_addr()
dump addrs functions in mptcp_pm_nl_get_addr_dumpit().

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 net/mptcp/pm_netlink.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 43062cd23ba3..ced8cab36b41 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1731,8 +1731,8 @@ int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info)
 	return ret;
 }
 
-int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg,
-				struct netlink_callback *cb)
+static int mptcp_pm_nl_dump_addr(struct sk_buff *msg,
+				 struct netlink_callback *cb)
 {
 	struct net *net = sock_net(msg->sk);
 	struct mptcp_pm_addr_entry *entry;
@@ -1764,6 +1764,13 @@ int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg,
 	return msg->len;
 }
 
+int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg,
+				struct netlink_callback *cb)
+{
+	return mptcp_pm_nl_dump_addr(msg, cb) +
+	       mptcp_userspace_pm_dump_addr(msg, cb);
+}
+
 static int parse_limit(struct genl_info *info, int id, unsigned int *limit)
 {
 	struct nlattr *attr = info->attrs[id];
-- 
2.35.3


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

* [PATCH mptcp-next v2 04/15] mptcp: check userspace pm subflow flag
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
                   ` (2 preceding siblings ...)
  2023-12-18  9:23 ` [PATCH mptcp-next v2 03/15] mptcp: dump addrs in userspace pm list Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 05/15] mptcp: add token for get-addr in yaml Geliang Tang
                   ` (10 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 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@linux.dev>
---
 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 a497148039c6..b4345d62bdad 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -348,12 +348,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");
@@ -366,7 +373,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] 17+ messages in thread

* [PATCH mptcp-next v2 05/15] mptcp: add token for get-addr in yaml
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
                   ` (3 preceding siblings ...)
  2023-12-18  9:23 ` [PATCH mptcp-next v2 04/15] mptcp: check userspace pm subflow flag Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 06/15] selftests: mptcp: add userspace pm subflow flag Geliang Tang
                   ` (9 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

This patch adds token paramenter together with addr in get-addr section
in mptcp.yaml, then use the following commands to update mptcp_pm_gen.c
and mptcp_pm_gen.h:

./tools/net/ynl/ynl-gen-c.py --mode kernel \
        --spec Documentation/netlink/specs/mptcp.yaml --source \
        -o net/mptcp/mptcp_pm_gen.c
./tools/net/ynl/ynl-gen-c.py --mode kernel \
        --spec Documentation/netlink/specs/mptcp.yaml --header \
        -o net/mptcp/mptcp_pm_gen.h

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 Documentation/netlink/specs/mptcp.yaml | 5 ++++-
 net/mptcp/mptcp_pm_gen.c               | 7 ++++---
 net/mptcp/mptcp_pm_gen.h               | 2 +-
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/Documentation/netlink/specs/mptcp.yaml b/Documentation/netlink/specs/mptcp.yaml
index 49f90cfb4698..cc731dbaa427 100644
--- a/Documentation/netlink/specs/mptcp.yaml
+++ b/Documentation/netlink/specs/mptcp.yaml
@@ -292,20 +292,23 @@ operations:
     -
       name: get-addr
       doc: Get endpoint information
-      attribute-set: endpoint
+      attribute-set: attr
       dont-validate: [ strict ]
       flags: [ uns-admin-perm ]
       do: &get-addr-attrs
         request:
           attributes:
            - addr
+           - token
         reply:
           attributes:
            - addr
+           - token
       dump:
         reply:
          attributes:
            - addr
+           - token
     -
       name:  flush-addrs
       doc: flush addresses
diff --git a/net/mptcp/mptcp_pm_gen.c b/net/mptcp/mptcp_pm_gen.c
index a2325e70ddab..69c8857b4c5d 100644
--- a/net/mptcp/mptcp_pm_gen.c
+++ b/net/mptcp/mptcp_pm_gen.c
@@ -32,8 +32,9 @@ const struct nla_policy mptcp_pm_del_addr_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1]
 };
 
 /* MPTCP_PM_CMD_GET_ADDR - do */
-const struct nla_policy mptcp_pm_get_addr_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1] = {
-	[MPTCP_PM_ENDPOINT_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy),
+const struct nla_policy mptcp_pm_get_addr_nl_policy[MPTCP_PM_ATTR_TOKEN + 1] = {
+	[MPTCP_PM_ATTR_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy),
+	[MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, },
 };
 
 /* MPTCP_PM_CMD_FLUSH_ADDRS - do */
@@ -110,7 +111,7 @@ const struct genl_ops mptcp_pm_nl_ops[11] = {
 		.doit		= mptcp_pm_nl_get_addr_doit,
 		.dumpit		= mptcp_pm_nl_get_addr_dumpit,
 		.policy		= mptcp_pm_get_addr_nl_policy,
-		.maxattr	= MPTCP_PM_ENDPOINT_ADDR,
+		.maxattr	= MPTCP_PM_ATTR_TOKEN,
 		.flags		= GENL_UNS_ADMIN_PERM,
 	},
 	{
diff --git a/net/mptcp/mptcp_pm_gen.h b/net/mptcp/mptcp_pm_gen.h
index 10579d184587..3963c55950b7 100644
--- a/net/mptcp/mptcp_pm_gen.h
+++ b/net/mptcp/mptcp_pm_gen.h
@@ -18,7 +18,7 @@ extern const struct nla_policy mptcp_pm_add_addr_nl_policy[MPTCP_PM_ENDPOINT_ADD
 
 extern const struct nla_policy mptcp_pm_del_addr_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1];
 
-extern const struct nla_policy mptcp_pm_get_addr_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1];
+extern const struct nla_policy mptcp_pm_get_addr_nl_policy[MPTCP_PM_ATTR_TOKEN + 1];
 
 extern const struct nla_policy mptcp_pm_flush_addrs_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1];
 
-- 
2.35.3


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

* [PATCH mptcp-next v2 06/15] selftests: mptcp: add userspace pm subflow flag
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
                   ` (4 preceding siblings ...)
  2023-12-18  9:23 ` [PATCH mptcp-next v2 05/15] mptcp: add token for get-addr in yaml Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 07/15] selftests: mptcp: add token for dump_addr Geliang Tang
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

This patch adds the address flag MPTCP_PM_ADDR_FLAG_SUBFLOW in csf() in
pm_nl_ctl.c when subflow is created by a userspace PM.

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 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] 17+ messages in thread

* [PATCH mptcp-next v2 07/15] selftests: mptcp: add token for dump_addr
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
                   ` (5 preceding siblings ...)
  2023-12-18  9:23 ` [PATCH mptcp-next v2 06/15] selftests: mptcp: add userspace pm subflow flag Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 08/15] selftests: mptcp: add check_output helper Geliang Tang
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

The command dump_addr() of pm_nl_ctl can be used like this in in-kernel PM:

        pm_nl_ctl dump

This patch adds token argument for it to support userspace PM:

        pm_nl_ctl dump token $token

If 'token $token' is passed to dump_addr(), copy it into the kernel
netlink.

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
index e97856323ec3..8d7d1b4ed28e 100644
--- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
+++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
@@ -1127,8 +1127,16 @@ int dump_addrs(int fd, int pm_family, int argc, char *argv[])
 		  1024];
 	pid_t pid = getpid();
 	struct nlmsghdr *nh;
+	u_int32_t token = 0;
+	struct rtattr *rta;
 	int off = 0;
 
+	if (argc != 2 && argc != 4)
+		syntax(argv);
+
+	if (argc == 4 && !strcmp(argv[2], "token"))
+		token = strtoul(argv[3], NULL, 10);
+
 	memset(data, 0, sizeof(data));
 	nh = (void *)data;
 	off = init_genl_req(data, pm_family, MPTCP_PM_CMD_GET_ADDR,
@@ -1138,6 +1146,15 @@ int dump_addrs(int fd, int pm_family, int argc, char *argv[])
 	nh->nlmsg_pid = pid;
 	nh->nlmsg_len = off;
 
+	/* token */
+	if (token) {
+		rta = (void *)(data + off);
+		rta->rta_type = MPTCP_PM_ATTR_TOKEN;
+		rta->rta_len = RTA_LENGTH(4);
+		memcpy(RTA_DATA(rta), &token, 4);
+		off += NLMSG_ALIGN(rta->rta_len);
+	}
+
 	print_addrs(nh, pm_family, do_nl_req(fd, nh, off, sizeof(data)));
 	return 0;
 }
-- 
2.35.3


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

* [PATCH mptcp-next v2 08/15] selftests: mptcp: add check_output helper
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
                   ` (6 preceding siblings ...)
  2023-12-18  9:23 ` [PATCH mptcp-next v2 07/15] selftests: mptcp: add token for dump_addr Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 09/15] selftests: mptcp: dump userspace addrs list Geliang Tang
                   ` (6 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Similar to check() in pm_netlink.sh, add a new helper check_output()
in mptcp_join.sh to check the output of the given commands.

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 .../testing/selftests/net/mptcp/mptcp_join.sh | 27 +++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 3a5b63026191..25d3f32644ed 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -21,6 +21,7 @@ cinfail=""
 cinsent=""
 tmpfile=""
 cout=""
+check_output_err=""
 capout=""
 ns1=""
 ns2=""
@@ -186,6 +187,7 @@ init() {
 	cout=$(mktemp)
 	evts_ns1=$(mktemp)
 	evts_ns2=$(mktemp)
+	check_output_err=$(mktemp)
 
 	trap cleanup EXIT
 
@@ -199,6 +201,7 @@ cleanup()
 	rm -f "$sin" "$sout" "$cinsent" "$cinfail"
 	rm -f "$tmpfile"
 	rm -rf $evts_ns1 $evts_ns2
+	rm -f $check_output_err
 	cleanup_partial
 }
 
@@ -3357,6 +3360,30 @@ userspace_pm_rm_sf()
 	wait_rm_sf $1 "${cnt}"
 }
 
+check_output()
+{
+	local cmd="$1"
+	local expected="$2"
+	local msg="$3"
+	local out=`$cmd 2>$check_output_err`
+	local cmd_ret=$?
+
+	printf "%-42s" "$msg"
+	if [ $cmd_ret -ne 0 ]; then
+		mptcp_lib_print_err "[ FAIL ] command execution '$cmd' stderr "
+		cat $check_output_err
+		ret=${KSFT_FAIL}
+		return $cmd_ret
+	elif [ "$out" = "$expected" ]; then
+		mptcp_lib_print_ok "[ OK ]"
+		return 0
+	else
+		mptcp_lib_print_err "[ FAIL ] expected '$expected' got '$out'"
+		ret=${KSFT_FAIL}
+		return 1
+	fi
+}
+
 userspace_tests()
 {
 	# userspace pm type prevents add_addr
-- 
2.35.3


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

* [PATCH mptcp-next v2 09/15] selftests: mptcp: dump userspace addrs list
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
                   ` (7 preceding siblings ...)
  2023-12-18  9:23 ` [PATCH mptcp-next v2 08/15] selftests: mptcp: add check_output helper Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 10/15] mptcp: add userspace_pm_lookup_addr_by_id helper Geliang Tang
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

This patch adds a new helper userspace_pm_dump() to dump addresses
for the userspace PM. Add two new tests for userspace pm dump address
and subflow. Use userspace_pm_add_addr() and userspace_pm_add_sf() to
add an address and a suflow.

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 .../testing/selftests/net/mptcp/mptcp_join.sh | 56 +++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 25d3f32644ed..403200394aa7 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -3360,6 +3360,18 @@ userspace_pm_rm_sf()
 	wait_rm_sf $1 "${cnt}"
 }
 
+# $1: ns
+userspace_pm_dump()
+{
+	local evts=$evts_ns1
+	local tk
+
+	[ "$1" == "$ns2" ] && evts=$evts_ns2
+	tk=$(mptcp_lib_evts_get_info token "$evts")
+
+	ip netns exec $1 ./pm_nl_ctl dump token $tk
+}
+
 check_output()
 {
 	local cmd="$1"
@@ -3573,6 +3585,50 @@ userspace_tests()
 		kill_events_pids
 		wait $tests_pid
 	fi
+
+	# userspace pm dump address
+	if reset_with_events "userspace pm dump address" &&
+	   continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
+		set_userspace_pm $ns1
+		pm_nl_set_limits $ns2 1 1
+		speed=5 \
+			run_tests $ns1 $ns2 10.0.1.1 &
+		local tests_pid=$!
+		wait_mpj $ns1
+		userspace_pm_add_addr $ns1 10.0.2.1 10
+		chk_join_nr 1 1 1
+		chk_add_nr 1 1
+		chk_mptcp_info subflows 1 subflows 1
+		chk_subflows_total 2 2
+		chk_mptcp_info add_addr_signal 1 add_addr_accepted 1
+		local dump="id 10 flags signal 10.0.2.1"
+		check_output "userspace_pm_dump $ns1" \
+			     "$dump" "      dump addrs signal"
+		kill_events_pids
+		wait $tests_pid
+	fi
+
+	# userspace pm dump subflow
+	if reset_with_events "userspace pm dump subflow" &&
+	   continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
+		set_userspace_pm $ns2
+		pm_nl_set_limits $ns1 0 1
+		speed=5 \
+			run_tests $ns1 $ns2 10.0.1.1 &
+		local tests_pid=$!
+		wait_mpj $ns2
+		chk_mptcp_info subflows 0 subflows 0
+		chk_subflows_total 1 1
+		userspace_pm_add_sf $ns2 10.0.3.2 20
+		chk_join_nr 1 1 1
+		chk_mptcp_info subflows 1 subflows 1
+		chk_subflows_total 2 2
+		local dump="id 20 flags subflow 10.0.3.2"
+		check_output "userspace_pm_dump $ns2" \
+			     "$dump" "      dump addrs subflow"
+		kill_events_pids
+		wait $tests_pid
+	fi
 }
 
 endpoint_tests()
-- 
2.35.3


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

* [PATCH mptcp-next v2 10/15] mptcp: add userspace_pm_lookup_addr_by_id helper
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
                   ` (8 preceding siblings ...)
  2023-12-18  9:23 ` [PATCH mptcp-next v2 09/15] selftests: mptcp: dump userspace addrs list Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 11/15] mptcp: add mptcp_pm_nl_put_entry_info helper Geliang Tang
                   ` (4 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Corresponding __lookup_addr_by_id() helper in the in-kernel netlink PM,
this patch adds a new helper mptcp_userspace_pm_lookup_addr_by_id() to
lookup the address entry with the given id on the userspace pm local
address list.

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 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 b4345d62bdad..0046cde103bb 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -105,19 +105,26 @@ static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
 	return -EINVAL;
 }
 
+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;
+}
+
 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;
@@ -249,7 +256,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);
@@ -286,13 +293,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] 17+ messages in thread

* [PATCH mptcp-next v2 11/15] mptcp: add mptcp_pm_nl_put_entry_info helper
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
                   ` (9 preceding siblings ...)
  2023-12-18  9:23 ` [PATCH mptcp-next v2 10/15] mptcp: add userspace_pm_lookup_addr_by_id helper Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 12/15] mptcp: implement mptcp_userspace_pm_get_addr Geliang Tang
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

This patch extracts the nlmsg related code from mptcp_pm_nl_get_addr_doit()
into a new helper mptcp_pm_nl_put_entry_info(). It will be used in the
userspace PM get_addr().

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 net/mptcp/pm_netlink.c | 55 ++++++++++++++++++++++++------------------
 net/mptcp/protocol.h   |  2 ++
 2 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index ced8cab36b41..ebc9841224a7 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1658,6 +1658,37 @@ static int mptcp_nl_fill_addr(struct sk_buff *skb,
 	return -EMSGSIZE;
 }
 
+int mptcp_pm_nl_put_entry_info(struct genl_info *info,
+			       struct mptcp_pm_addr_entry *entry)
+{
+	struct sk_buff *msg;
+	void *reply;
+	int ret;
+
+	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
+	if (!msg)
+		return -ENOMEM;
+
+	reply = genlmsg_put_reply(msg, info, &mptcp_genl_family, 0,
+				  info->genlhdr->cmd);
+	if (!reply) {
+		GENL_SET_ERR_MSG(info, "not enough space in Netlink message");
+		ret = -EMSGSIZE;
+		goto fail;
+	}
+
+	ret = mptcp_nl_fill_addr(msg, entry);
+	if (ret)
+		goto fail;
+
+	genlmsg_end(msg, reply);
+	ret = genlmsg_reply(msg, info);
+	return ret;
+fail:
+	nlmsg_free(msg);
+	return ret;
+}
+
 int mptcp_pm_nl_put_entry_msg(struct sk_buff *msg,
 			      struct netlink_callback *cb,
 			      struct mptcp_pm_addr_entry *entry)
@@ -1686,26 +1717,12 @@ int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info)
 	struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
 	struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
 	struct mptcp_pm_addr_entry addr, *entry;
-	struct sk_buff *msg;
-	void *reply;
 	int ret;
 
 	ret = mptcp_pm_parse_entry(attr, info, false, &addr);
 	if (ret < 0)
 		return ret;
 
-	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
-	if (!msg)
-		return -ENOMEM;
-
-	reply = genlmsg_put_reply(msg, info, &mptcp_genl_family, 0,
-				  info->genlhdr->cmd);
-	if (!reply) {
-		GENL_SET_ERR_MSG(info, "not enough space in Netlink message");
-		ret = -EMSGSIZE;
-		goto fail;
-	}
-
 	spin_lock_bh(&pernet->lock);
 	entry = __lookup_addr_by_id(pernet, addr.addr.id);
 	if (!entry) {
@@ -1714,20 +1731,12 @@ int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info)
 		goto unlock_fail;
 	}
 
-	ret = mptcp_nl_fill_addr(msg, entry);
-	if (ret)
-		goto unlock_fail;
-
-	genlmsg_end(msg, reply);
-	ret = genlmsg_reply(msg, info);
+	ret = mptcp_pm_nl_put_entry_info(info, entry);
 	spin_unlock_bh(&pernet->lock);
 	return ret;
 
 unlock_fail:
 	spin_unlock_bh(&pernet->lock);
-
-fail:
-	nlmsg_free(msg);
 	return ret;
 }
 
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index a05a6745bc31..a82a42c57c3d 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1025,6 +1025,8 @@ bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
 int mptcp_pm_nl_put_entry_msg(struct sk_buff *msg,
 			      struct netlink_callback *cb,
 			      struct mptcp_pm_addr_entry *entry);
+int mptcp_pm_nl_put_entry_info(struct genl_info *info,
+			       struct mptcp_pm_addr_entry *entry);
 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);
-- 
2.35.3


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

* [PATCH mptcp-next v2 12/15] mptcp: implement mptcp_userspace_pm_get_addr
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
                   ` (10 preceding siblings ...)
  2023-12-18  9:23 ` [PATCH mptcp-next v2 11/15] mptcp: add mptcp_pm_nl_put_entry_info helper Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 13/15] mptcp: get addr in userspace pm list Geliang Tang
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

This patch implements mptcp_userspace_pm_get_addr() to get an address
from userspace pm address list according the given 'token' and 'id'.
Use nla_get_u32() to get the u32 value of 'token', then pass it to
mptcp_token_get_sock() to get the msk. Pass 'msk' and 'id' to the helper
mptcp_userspace_pm_lookup_addr_by_id() to get the address entry. Put
this entry to userspace using mptcp_pm_nl_put_entry_info().

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 net/mptcp/pm_userspace.c | 23 +++++++++++++++++++++++
 net/mptcp/protocol.h     |  2 ++
 2 files changed, 25 insertions(+)

diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 0046cde103bb..4a62739be1b8 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -596,3 +596,26 @@ int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
 	cb->args[0] = id;
 	return msg->len;
 }
+
+int mptcp_userspace_pm_get_addr(struct net *net, struct genl_info *info,
+				u32 token, u8 id)
+{
+	struct mptcp_pm_addr_entry *entry;
+	struct mptcp_sock *msk;
+	int ret = -EINVAL;
+
+	msk = mptcp_token_get_sock(net, token);
+	if (!msk)
+		return ret;
+
+	if (!mptcp_pm_is_userspace(msk))
+		return ret;
+
+	entry = mptcp_userspace_pm_lookup_addr_by_id(msk, id);
+	if (!entry) {
+		GENL_SET_ERR_MSG(info, "address not found");
+		return ret;
+	}
+
+	return mptcp_pm_nl_put_entry_info(info, entry);
+}
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index a82a42c57c3d..9632b52bb95a 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1032,6 +1032,8 @@ 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);
 int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
 				 struct netlink_callback *cb);
+int mptcp_userspace_pm_get_addr(struct net *net, struct genl_info *info,
+				u32 token, u8 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] 17+ messages in thread

* [PATCH mptcp-next v2 13/15] mptcp: get addr in userspace pm list
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
                   ` (11 preceding siblings ...)
  2023-12-18  9:23 ` [PATCH mptcp-next v2 12/15] mptcp: implement mptcp_userspace_pm_get_addr Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 14/15] selftests: mptcp: add token for get_addr Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 15/15] selftests: mptcp: userspace pm get addr tests Geliang Tang
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

If a token is gotten in mptcp_pm_nl_get_addr_doit(), that means a userspace
PM is used. Invoke mptcp_userspace_pm_get_addr() to get addr in userspace
PM list.

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 net/mptcp/pm_netlink.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index ebc9841224a7..cd99c0e5281f 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1715,14 +1715,20 @@ int mptcp_pm_nl_put_entry_msg(struct sk_buff *msg,
 int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info)
 {
 	struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
+	struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
 	struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
 	struct mptcp_pm_addr_entry addr, *entry;
+	struct net *net = sock_net(skb->sk);
 	int ret;
 
 	ret = mptcp_pm_parse_entry(attr, info, false, &addr);
 	if (ret < 0)
 		return ret;
 
+	if (token)
+		return mptcp_userspace_pm_get_addr(net, info, nla_get_u32(token),
+						   addr.addr.id);
+
 	spin_lock_bh(&pernet->lock);
 	entry = __lookup_addr_by_id(pernet, addr.addr.id);
 	if (!entry) {
-- 
2.35.3


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

* [PATCH mptcp-next v2 14/15] selftests: mptcp: add token for get_addr
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
                   ` (12 preceding siblings ...)
  2023-12-18  9:23 ` [PATCH mptcp-next v2 13/15] mptcp: get addr in userspace pm list Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18  9:23 ` [PATCH mptcp-next v2 15/15] selftests: mptcp: userspace pm get addr tests Geliang Tang
  14 siblings, 0 replies; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

The command get_addr() of pm_nl_ctl can be used like this in in-kernel PM:

	pm_nl_ctl get $id

This patch adds token argument for it to support userspace PM:

	pm_nl_ctl get $id token $token

If 'token $token' is passed to get_addr(), copy it into the kernel netlink.

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
index 8d7d1b4ed28e..7426a2cbd4a0 100644
--- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
+++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
@@ -1087,6 +1087,7 @@ int get_addr(int fd, int pm_family, int argc, char *argv[])
 		  1024];
 	struct rtattr *rta, *nest;
 	struct nlmsghdr *nh;
+	u_int32_t token = 0;
 	int nest_start;
 	u_int8_t id;
 	int off = 0;
@@ -1097,10 +1098,12 @@ int get_addr(int fd, int pm_family, int argc, char *argv[])
 			    MPTCP_PM_VER);
 
 	/* the only argument is the address id */
-	if (argc != 3)
+	if (argc != 3 && argc != 5)
 		syntax(argv);
 
 	id = atoi(argv[2]);
+	if (argc == 5 && !strcmp(argv[3], "token"))
+		token = strtoul(argv[4], NULL, 10);
 
 	nest_start = off;
 	nest = (void *)(data + off);
@@ -1116,6 +1119,15 @@ int get_addr(int fd, int pm_family, int argc, char *argv[])
 	off += NLMSG_ALIGN(rta->rta_len);
 	nest->rta_len = off - nest_start;
 
+	/* token */
+	if (token) {
+		rta = (void *)(data + off);
+		rta->rta_type = MPTCP_PM_ATTR_TOKEN;
+		rta->rta_len = RTA_LENGTH(4);
+		memcpy(RTA_DATA(rta), &token, 4);
+		off += NLMSG_ALIGN(rta->rta_len);
+	}
+
 	print_addrs(nh, pm_family, do_nl_req(fd, nh, off, sizeof(data)));
 	return 0;
 }
-- 
2.35.3


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

* [PATCH mptcp-next v2 15/15] selftests: mptcp: userspace pm get addr tests
  2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
                   ` (13 preceding siblings ...)
  2023-12-18  9:23 ` [PATCH mptcp-next v2 14/15] selftests: mptcp: add token for get_addr Geliang Tang
@ 2023-12-18  9:23 ` Geliang Tang
  2023-12-18 10:58   ` selftests: mptcp: userspace pm get addr tests: Tests Results MPTCP CI
  14 siblings, 1 reply; 17+ messages in thread
From: Geliang Tang @ 2023-12-18  9:23 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

This patch adds a new helper userspace_pm_get_addr() in mptcp_join.sh.
In it, parse the token value from the output of 'pm_nl_ctl events', then
pass it to pm_nl_ctl get_addr command. Use this helper in userspace pm
dump tests.

Signed-off-by: Geliang Tang <geliang.tang@linux.dev>
---
 tools/testing/selftests/net/mptcp/mptcp_join.sh | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 403200394aa7..e603baa1d4a8 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -3372,6 +3372,18 @@ userspace_pm_dump()
 	ip netns exec $1 ./pm_nl_ctl dump token $tk
 }
 
+# $1: ns ; $2: id
+userspace_pm_get_addr()
+{
+	local evts=$evts_ns1
+	local tk
+
+	[ "$1" == "$ns2" ] && evts=$evts_ns2
+	tk=$(mptcp_lib_evts_get_info token "$evts")
+
+	ip netns exec $1 ./pm_nl_ctl get $2 token $tk
+}
+
 check_output()
 {
 	local cmd="$1"
@@ -3602,6 +3614,8 @@ userspace_tests()
 		chk_subflows_total 2 2
 		chk_mptcp_info add_addr_signal 1 add_addr_accepted 1
 		local dump="id 10 flags signal 10.0.2.1"
+		check_output "userspace_pm_get_addr $ns1 10" \
+			     "$dump" "      get id 10 addr"
 		check_output "userspace_pm_dump $ns1" \
 			     "$dump" "      dump addrs signal"
 		kill_events_pids
@@ -3624,6 +3638,8 @@ userspace_tests()
 		chk_mptcp_info subflows 1 subflows 1
 		chk_subflows_total 2 2
 		local dump="id 20 flags subflow 10.0.3.2"
+		check_output "userspace_pm_get_addr $ns2 20" \
+			     "$dump" "      get id 20 addr"
 		check_output "userspace_pm_dump $ns2" \
 			     "$dump" "      dump addrs subflow"
 		kill_events_pids
-- 
2.35.3


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

* Re: selftests: mptcp: userspace pm get addr tests: Tests Results
  2023-12-18  9:23 ` [PATCH mptcp-next v2 15/15] selftests: mptcp: userspace pm get addr tests Geliang Tang
@ 2023-12-18 10:58   ` MPTCP CI
  0 siblings, 0 replies; 17+ messages in thread
From: MPTCP CI @ 2023-12-18 10:58 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/4505113289555968
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/4505113289555968/summary/summary.txt

- KVM Validation: debug (except selftest_mptcp_join):
  - Critical: 3 Call Trace(s) ❌:
  - Task: https://cirrus-ci.com/task/5804062763909120
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/5804062763909120/summary/summary.txt

- KVM Validation: normal (only selftest_mptcp_join):
  - Success! ✅:
  - Task: https://cirrus-ci.com/task/5631013196398592
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/5631013196398592/summary/summary.txt

- KVM Validation: debug (only selftest_mptcp_join):
  - Unstable: 1 failed test(s): selftest_mptcp_join - Critical: 3 Call Trace(s) ❌:
  - Task: https://cirrus-ci.com/task/6193963149819904
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/6193963149819904/summary/summary.txt

Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/14e9a9fcd464


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 (NGI0 Core)

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

end of thread, other threads:[~2023-12-18 10:58 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-18  9:23 [PATCH mptcp-next v2 00/15] dump for userspace pm Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 01/15] mptcp: add mptcp_pm_nl_put_entry_msg helper Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 02/15] mptcp: implement mptcp_userspace_pm_dump_addr Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 03/15] mptcp: dump addrs in userspace pm list Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 04/15] mptcp: check userspace pm subflow flag Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 05/15] mptcp: add token for get-addr in yaml Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 06/15] selftests: mptcp: add userspace pm subflow flag Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 07/15] selftests: mptcp: add token for dump_addr Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 08/15] selftests: mptcp: add check_output helper Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 09/15] selftests: mptcp: dump userspace addrs list Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 10/15] mptcp: add userspace_pm_lookup_addr_by_id helper Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 11/15] mptcp: add mptcp_pm_nl_put_entry_info helper Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 12/15] mptcp: implement mptcp_userspace_pm_get_addr Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 13/15] mptcp: get addr in userspace pm list Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 14/15] selftests: mptcp: add token for get_addr Geliang Tang
2023-12-18  9:23 ` [PATCH mptcp-next v2 15/15] selftests: mptcp: userspace pm get addr tests Geliang Tang
2023-12-18 10:58   ` selftests: mptcp: userspace pm get addr tests: Tests Results MPTCP CI

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