* [PATCH mptcp-next v1 1/9] mptcp: pm: in-kernel: add address_removed/subflow_closed
2025-02-20 10:36 [PATCH mptcp-next v1 0/9] BPF path manager, part 5 Geliang Tang
@ 2025-02-20 10:36 ` Geliang Tang
2025-02-20 10:36 ` [PATCH mptcp-next v1 2/9] mptcp: pm: in-kernel: address_announced interface Geliang Tang
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-20 10:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
This patch defines the code in the loop of traversing all msks in
mptcp_nl_remove_subflow_and_signal_addr() as two new helpers,
mptcp_pm_nl_address_removed() and mptcp_pm_nl_subflow_closed(),
used for signaling a RM_ADDR and closing a subflow respectively.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/pm_netlink.c | 60 +++++++++++++++++++++++++++---------------
1 file changed, 39 insertions(+), 21 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 3859642792db..3914b80ed225 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1506,11 +1506,47 @@ static void __mark_subflow_endp_available(struct mptcp_sock *msk, u8 id)
msk->pm.local_addr_used--;
}
+static int mptcp_pm_nl_address_removed(struct mptcp_sock *msk,
+ const struct mptcp_pm_addr_entry *local)
+{
+ bool remove_subflow;
+
+ remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, &local->addr);
+ mptcp_pm_remove_anno_addr(msk, &local->addr, remove_subflow &&
+ !(local->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT));
+ return 0;
+}
+
+static int mptcp_pm_nl_subflow_closed(struct mptcp_sock *msk,
+ const struct mptcp_pm_addr_entry *local)
+{
+ struct mptcp_rm_list list = { .nr = 1 };
+ bool remove_subflow;
+
+ list.ids[0] = mptcp_endp_get_local_id(msk, &local->addr);
+ remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, &local->addr);
+ if (remove_subflow) {
+ spin_lock_bh(&msk->pm.lock);
+ mptcp_pm_nl_rm_subflow_received(msk, &list);
+ spin_unlock_bh(&msk->pm.lock);
+ }
+
+ if (local->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) {
+ spin_lock_bh(&msk->pm.lock);
+ __mark_subflow_endp_available(msk, list.ids[0]);
+ spin_unlock_bh(&msk->pm.lock);
+ }
+
+ if (msk->mpc_endpoint_id == local->addr.id)
+ msk->mpc_endpoint_id = 0;
+
+ return 0;
+}
+
static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
const struct mptcp_pm_addr_entry *entry)
{
const struct mptcp_addr_info *addr = &entry->addr;
- struct mptcp_rm_list list = { .nr = 1 };
long s_slot = 0, s_num = 0;
struct mptcp_sock *msk;
@@ -1518,31 +1554,13 @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
struct sock *sk = (struct sock *)msk;
- bool remove_subflow;
if (mptcp_pm_is_userspace(msk))
goto next;
lock_sock(sk);
- remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, addr);
- mptcp_pm_remove_anno_addr(msk, addr, remove_subflow &&
- !(entry->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT));
-
- list.ids[0] = mptcp_endp_get_local_id(msk, addr);
- if (remove_subflow) {
- spin_lock_bh(&msk->pm.lock);
- mptcp_pm_nl_rm_subflow_received(msk, &list);
- spin_unlock_bh(&msk->pm.lock);
- }
-
- if (entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) {
- spin_lock_bh(&msk->pm.lock);
- __mark_subflow_endp_available(msk, list.ids[0]);
- spin_unlock_bh(&msk->pm.lock);
- }
-
- if (msk->mpc_endpoint_id == entry->addr.id)
- msk->mpc_endpoint_id = 0;
+ mptcp_pm_nl_address_removed(msk, entry);
+ mptcp_pm_nl_subflow_closed(msk, entry);
release_sock(sk);
next:
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v1 2/9] mptcp: pm: in-kernel: address_announced interface
2025-02-20 10:36 [PATCH mptcp-next v1 0/9] BPF path manager, part 5 Geliang Tang
2025-02-20 10:36 ` [PATCH mptcp-next v1 1/9] mptcp: pm: in-kernel: add address_removed/subflow_closed Geliang Tang
@ 2025-02-20 10:36 ` Geliang Tang
2025-02-20 10:36 ` [PATCH mptcp-next v1 3/9] mptcp: pm: in-kernel: address_removed interface Geliang Tang
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-20 10:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Extract address_announced() interface of the in-kernel netlink PM from
the helper mptcp_nl_add_subflow_or_signal_addr(), only leave the code
for traversing all msk in the helper.
This interface is invoked under holding the msk socket lock.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/pm_netlink.c | 34 +++++++++++++++++++++++++---------
1 file changed, 25 insertions(+), 9 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 3914b80ed225..107f13560202 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1348,6 +1348,25 @@ static struct pm_nl_pernet *genl_info_pm_nl(struct genl_info *info)
return pm_nl_get_pernet(genl_info_net(info));
}
+static int mptcp_pm_nl_address_announced(struct mptcp_sock *msk,
+ struct mptcp_pm_param *param)
+{
+ struct mptcp_addr_info *addr = ¶m->addr;
+ struct mptcp_addr_info mpc_addr;
+
+ /* if the endp linked to the init sf is re-added with a != ID */
+ mptcp_local_address((struct sock_common *)msk, &mpc_addr);
+
+ spin_lock_bh(&msk->pm.lock);
+ if (mptcp_addresses_equal(addr, &mpc_addr, addr->port))
+ msk->mpc_endpoint_id = addr->id;
+
+ mptcp_pm_create_subflow_or_signal_addr(msk);
+ spin_unlock_bh(&msk->pm.lock);
+
+ return 0;
+}
+
static int mptcp_nl_add_subflow_or_signal_addr(struct net *net,
struct mptcp_addr_info *addr)
{
@@ -1356,21 +1375,17 @@ static int mptcp_nl_add_subflow_or_signal_addr(struct net *net,
while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
struct sock *sk = (struct sock *)msk;
- struct mptcp_addr_info mpc_addr;
+ struct mptcp_pm_param param;
if (!READ_ONCE(msk->fully_established) ||
mptcp_pm_is_userspace(msk))
goto next;
- /* if the endp linked to the init sf is re-added with a != ID */
- mptcp_local_address((struct sock_common *)msk, &mpc_addr);
-
lock_sock(sk);
- spin_lock_bh(&msk->pm.lock);
- if (mptcp_addresses_equal(addr, &mpc_addr, addr->port))
- msk->mpc_endpoint_id = addr->id;
- mptcp_pm_create_subflow_or_signal_addr(msk);
- spin_unlock_bh(&msk->pm.lock);
+ mptcp_pm_param_set_contexts(¶m, NULL, addr);
+ msk->pm.ops && msk->pm.ops->address_announced ?
+ msk->pm.ops->address_announced(msk, ¶m) :
+ mptcp_pm_nl_address_announced(msk, ¶m);
release_sock(sk);
next:
@@ -2394,6 +2409,7 @@ static struct pernet_operations mptcp_pm_pernet_ops = {
};
static struct mptcp_pm_ops mptcp_netlink_pm = {
+ .address_announced = mptcp_pm_nl_address_announced,
.get_local_id = mptcp_pm_nl_get_local_id,
.get_priority = mptcp_pm_nl_get_priority,
.type = MPTCP_PM_TYPE_KERNEL,
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v1 3/9] mptcp: pm: in-kernel: address_removed interface
2025-02-20 10:36 [PATCH mptcp-next v1 0/9] BPF path manager, part 5 Geliang Tang
2025-02-20 10:36 ` [PATCH mptcp-next v1 1/9] mptcp: pm: in-kernel: add address_removed/subflow_closed Geliang Tang
2025-02-20 10:36 ` [PATCH mptcp-next v1 2/9] mptcp: pm: in-kernel: address_announced interface Geliang Tang
@ 2025-02-20 10:36 ` Geliang Tang
2025-02-20 10:36 ` [PATCH mptcp-next v1 4/9] mptcp: pm: in-kernel: subflow_established interface Geliang Tang
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-20 10:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Update the 2nd parameter of mptcp_pm_nl_address_removed(), and define it
as the address_removed() interface of the in-kernel netlink PM.
This interface is invoked under holding the msk socket lock.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/pm_netlink.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 107f13560202..53246a3a1b09 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1522,8 +1522,9 @@ static void __mark_subflow_endp_available(struct mptcp_sock *msk, u8 id)
}
static int mptcp_pm_nl_address_removed(struct mptcp_sock *msk,
- const struct mptcp_pm_addr_entry *local)
+ struct mptcp_pm_param *param)
{
+ struct mptcp_pm_addr_entry *local = ¶m->entry;
bool remove_subflow;
remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, &local->addr);
@@ -1569,12 +1570,16 @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
struct sock *sk = (struct sock *)msk;
+ struct mptcp_pm_param param;
if (mptcp_pm_is_userspace(msk))
goto next;
lock_sock(sk);
- mptcp_pm_nl_address_removed(msk, entry);
+ mptcp_pm_param_set_contexts(¶m, entry, NULL);
+ msk->pm.ops && msk->pm.ops->address_removed ?
+ msk->pm.ops->address_removed(msk, ¶m) :
+ mptcp_pm_nl_address_removed(msk, ¶m);
mptcp_pm_nl_subflow_closed(msk, entry);
release_sock(sk);
@@ -2410,6 +2415,7 @@ static struct pernet_operations mptcp_pm_pernet_ops = {
static struct mptcp_pm_ops mptcp_netlink_pm = {
.address_announced = mptcp_pm_nl_address_announced,
+ .address_removed = mptcp_pm_nl_address_removed,
.get_local_id = mptcp_pm_nl_get_local_id,
.get_priority = mptcp_pm_nl_get_priority,
.type = MPTCP_PM_TYPE_KERNEL,
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v1 4/9] mptcp: pm: in-kernel: subflow_established interface
2025-02-20 10:36 [PATCH mptcp-next v1 0/9] BPF path manager, part 5 Geliang Tang
` (2 preceding siblings ...)
2025-02-20 10:36 ` [PATCH mptcp-next v1 3/9] mptcp: pm: in-kernel: address_removed interface Geliang Tang
@ 2025-02-20 10:36 ` Geliang Tang
2025-02-20 10:36 ` [PATCH mptcp-next v1 5/9] mptcp: pm: in-kernel: subflow_closed interface Geliang Tang
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-20 10:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Update mptcp_pm_nl_subflow_established() to match the parameters and
return value of subflow_established() interface and define it as the
interface of the in-kernel netlink PM.
This interface is invoked under holding the msk socket lock.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
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 53246a3a1b09..9795f08a33a6 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -652,9 +652,12 @@ static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk)
mptcp_pm_create_subflow_or_signal_addr(msk);
}
-static void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk)
+static int mptcp_pm_nl_subflow_established(struct mptcp_sock *msk,
+ struct mptcp_pm_param *param)
{
mptcp_pm_create_subflow_or_signal_addr(msk);
+
+ return 0;
}
/* Fill all the local addresses into the array addrs[],
@@ -927,6 +930,7 @@ static void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk,
void mptcp_pm_nl_work(struct mptcp_sock *msk)
{
struct mptcp_pm_data *pm = &msk->pm;
+ struct mptcp_pm_param param;
msk_owned_by_me(msk);
@@ -954,7 +958,9 @@ void mptcp_pm_nl_work(struct mptcp_sock *msk)
}
if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) {
pm->status &= ~BIT(MPTCP_PM_SUBFLOW_ESTABLISHED);
- mptcp_pm_nl_subflow_established(msk);
+ msk->pm.ops && msk->pm.ops->subflow_established ?
+ msk->pm.ops->subflow_established(msk, ¶m) :
+ mptcp_pm_nl_subflow_established(msk, ¶m);
}
spin_unlock_bh(&msk->pm.lock);
@@ -2416,6 +2422,7 @@ static struct pernet_operations mptcp_pm_pernet_ops = {
static struct mptcp_pm_ops mptcp_netlink_pm = {
.address_announced = mptcp_pm_nl_address_announced,
.address_removed = mptcp_pm_nl_address_removed,
+ .subflow_established = mptcp_pm_nl_subflow_established,
.get_local_id = mptcp_pm_nl_get_local_id,
.get_priority = mptcp_pm_nl_get_priority,
.type = MPTCP_PM_TYPE_KERNEL,
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v1 5/9] mptcp: pm: in-kernel: subflow_closed interface
2025-02-20 10:36 [PATCH mptcp-next v1 0/9] BPF path manager, part 5 Geliang Tang
` (3 preceding siblings ...)
2025-02-20 10:36 ` [PATCH mptcp-next v1 4/9] mptcp: pm: in-kernel: subflow_established interface Geliang Tang
@ 2025-02-20 10:36 ` Geliang Tang
2025-02-20 10:36 ` [PATCH mptcp-next v1 6/9] mptcp: pm: userspace: address_announced interface Geliang Tang
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-20 10:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Update the 2nd parameter of mptcp_pm_nl_subflow_closed(), and define it
as the subflow_closed() interface of the in-kernel netlink PM.
This interface is invoked under holding the msk socket lock.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/pm_netlink.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 9795f08a33a6..a6344945874a 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1540,8 +1540,9 @@ static int mptcp_pm_nl_address_removed(struct mptcp_sock *msk,
}
static int mptcp_pm_nl_subflow_closed(struct mptcp_sock *msk,
- const struct mptcp_pm_addr_entry *local)
+ struct mptcp_pm_param *param)
{
+ struct mptcp_pm_addr_entry *local = ¶m->entry;
struct mptcp_rm_list list = { .nr = 1 };
bool remove_subflow;
@@ -1586,7 +1587,9 @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
msk->pm.ops && msk->pm.ops->address_removed ?
msk->pm.ops->address_removed(msk, ¶m) :
mptcp_pm_nl_address_removed(msk, ¶m);
- mptcp_pm_nl_subflow_closed(msk, entry);
+ msk->pm.ops && msk->pm.ops->subflow_closed ?
+ msk->pm.ops->subflow_closed(msk, ¶m) :
+ mptcp_pm_nl_subflow_closed(msk, ¶m);
release_sock(sk);
next:
@@ -2423,6 +2426,7 @@ static struct mptcp_pm_ops mptcp_netlink_pm = {
.address_announced = mptcp_pm_nl_address_announced,
.address_removed = mptcp_pm_nl_address_removed,
.subflow_established = mptcp_pm_nl_subflow_established,
+ .subflow_closed = mptcp_pm_nl_subflow_closed,
.get_local_id = mptcp_pm_nl_get_local_id,
.get_priority = mptcp_pm_nl_get_priority,
.type = MPTCP_PM_TYPE_KERNEL,
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v1 6/9] mptcp: pm: userspace: address_announced interface
2025-02-20 10:36 [PATCH mptcp-next v1 0/9] BPF path manager, part 5 Geliang Tang
` (4 preceding siblings ...)
2025-02-20 10:36 ` [PATCH mptcp-next v1 5/9] mptcp: pm: in-kernel: subflow_closed interface Geliang Tang
@ 2025-02-20 10:36 ` Geliang Tang
2025-02-20 10:36 ` [PATCH mptcp-next v1 7/9] mptcp: pm: userspace: address_removed interface Geliang Tang
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-20 10:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Extract address_announced() interface of the userspace PM from the handler
of netlink command MPTCP_PM_CMD_ANNOUNCE mptcp_pm_nl_announce_doit(), only
leave the code for obtaining msk through "info" and parsing address entry
in the handler.
This interface is invoked under holding the msk socket lock.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/pm_userspace.c | 49 ++++++++++++++++++++++++++--------------
1 file changed, 32 insertions(+), 17 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index be578f5c3195..baac1027cfb8 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -190,9 +190,33 @@ static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *in
return msk;
}
+static int mptcp_userspace_pm_address_announced(struct mptcp_sock *msk,
+ struct mptcp_pm_param *param)
+{
+ struct mptcp_pm_addr_entry *local = ¶m->entry;
+ int err;
+
+ err = mptcp_userspace_pm_append_new_local_addr(msk, local, false);
+ if (err < 0)
+ return err;
+
+ spin_lock_bh(&msk->pm.lock);
+
+ if (mptcp_pm_alloc_anno_list(msk, &local->addr)) {
+ msk->pm.add_addr_signaled++;
+ mptcp_pm_announce_addr(msk, &local->addr, false);
+ mptcp_pm_nl_addr_send_ack(msk);
+ }
+
+ spin_unlock_bh(&msk->pm.lock);
+
+ return 0;
+}
+
int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
{
struct mptcp_pm_addr_entry addr_val;
+ struct mptcp_pm_param param;
struct mptcp_sock *msk;
struct nlattr *addr;
int err = -EINVAL;
@@ -224,26 +248,16 @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
goto announce_err;
}
- err = mptcp_userspace_pm_append_new_local_addr(msk, &addr_val, false);
- if (err < 0) {
- NL_SET_ERR_MSG_ATTR(info->extack, addr,
- "did not match address and id");
- goto announce_err;
- }
-
lock_sock(sk);
- spin_lock_bh(&msk->pm.lock);
-
- if (mptcp_pm_alloc_anno_list(msk, &addr_val.addr)) {
- msk->pm.add_addr_signaled++;
- mptcp_pm_announce_addr(msk, &addr_val.addr, false);
- mptcp_pm_nl_addr_send_ack(msk);
- }
-
- spin_unlock_bh(&msk->pm.lock);
+ mptcp_pm_param_set_contexts(¶m, &addr_val, NULL);
+ err = msk->pm.ops && msk->pm.ops->address_announced ?
+ msk->pm.ops->address_announced(msk, ¶m) :
+ mptcp_userspace_pm_address_announced(msk, ¶m);
release_sock(sk);
+ if (err)
+ NL_SET_ERR_MSG_ATTR(info->extack, addr,
+ "did not match address and id");
- err = 0;
announce_err:
sock_put(sk);
return err;
@@ -690,6 +704,7 @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
}
static struct mptcp_pm_ops mptcp_userspace_pm = {
+ .address_announced = mptcp_userspace_pm_address_announced,
.get_local_id = mptcp_userspace_pm_get_local_id,
.get_priority = mptcp_userspace_pm_get_priority,
.type = MPTCP_PM_TYPE_USERSPACE,
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v1 7/9] mptcp: pm: userspace: address_removed interface
2025-02-20 10:36 [PATCH mptcp-next v1 0/9] BPF path manager, part 5 Geliang Tang
` (5 preceding siblings ...)
2025-02-20 10:36 ` [PATCH mptcp-next v1 6/9] mptcp: pm: userspace: address_announced interface Geliang Tang
@ 2025-02-20 10:36 ` Geliang Tang
2025-02-20 10:36 ` [PATCH mptcp-next v1 8/9] mptcp: pm: userspace: subflow_established interface Geliang Tang
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-20 10:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Extract address_removed() interface of the userspace PM from the handler
of netlink command MPTCP_PM_CMD_REMOVE mptcp_pm_nl_remove_doit(), only
leave the code for parsing address id and obtaining msk through "info"
in the handler.
This interface is invoked under holding the msk socket lock.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/pm_userspace.c | 74 ++++++++++++++++++++--------------------
1 file changed, 37 insertions(+), 37 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index baac1027cfb8..770d1c3e5c81 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -267,11 +267,8 @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
{
struct mptcp_rm_list list = { .nr = 0 };
struct mptcp_subflow_context *subflow;
- struct sock *sk = (struct sock *)msk;
bool has_id_0 = false;
- int err = -EINVAL;
- lock_sock(sk);
mptcp_for_each_subflow(msk, subflow) {
if (READ_ONCE(subflow->local_id) == 0) {
has_id_0 = true;
@@ -279,7 +276,7 @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
}
}
if (!has_id_0)
- goto remove_err;
+ return -EINVAL;
list.ids[list.nr++] = 0;
@@ -287,11 +284,7 @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
mptcp_pm_remove_addr(msk, &list);
spin_unlock_bh(&msk->pm.lock);
- err = 0;
-
-remove_err:
- release_sock(sk);
- return err;
+ return 0;
}
void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
@@ -314,20 +307,46 @@ void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
spin_unlock_bh(&msk->pm.lock);
}
+static int mptcp_userspace_pm_address_removed(struct mptcp_sock *msk,
+ struct mptcp_pm_param *param)
+{
+ struct mptcp_pm_addr_entry *entry;
+ u8 id = param->addr.id;
+
+ if (id == 0)
+ return mptcp_userspace_pm_remove_id_zero_address(msk);
+
+ spin_lock_bh(&msk->pm.lock);
+ entry = mptcp_userspace_pm_lookup_addr_by_id(msk, id);
+ if (!entry) {
+ spin_unlock_bh(&msk->pm.lock);
+ return -EINVAL;
+ }
+
+ list_del_rcu(&entry->list);
+ spin_unlock_bh(&msk->pm.lock);
+
+ mptcp_pm_remove_addr_entry(msk, entry);
+
+ sock_kfree_s((struct sock *)msk, entry, sizeof(*entry));
+
+ return 0;
+}
+
int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
{
- struct mptcp_pm_addr_entry *match;
+ struct mptcp_addr_info addr;
+ struct mptcp_pm_param param;
struct mptcp_sock *msk;
struct nlattr *id;
int err = -EINVAL;
struct sock *sk;
- u8 id_val;
if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_LOC_ID))
return err;
id = info->attrs[MPTCP_PM_ATTR_LOC_ID];
- id_val = nla_get_u8(id);
+ addr.id = nla_get_u8(id);
msk = mptcp_userspace_pm_get_sock(info);
if (!msk)
@@ -335,36 +354,16 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
sk = (struct sock *)msk;
- if (id_val == 0) {
- err = mptcp_userspace_pm_remove_id_zero_address(msk);
- goto out;
- }
-
lock_sock(sk);
-
- spin_lock_bh(&msk->pm.lock);
- match = mptcp_userspace_pm_lookup_addr_by_id(msk, id_val);
- if (!match) {
- spin_unlock_bh(&msk->pm.lock);
- release_sock(sk);
- goto out;
- }
-
- list_del_rcu(&match->list);
- spin_unlock_bh(&msk->pm.lock);
-
- mptcp_pm_remove_addr_entry(msk, match);
-
+ mptcp_pm_param_set_contexts(¶m, NULL, &addr);
+ err = msk->pm.ops && msk->pm.ops->address_removed ?
+ msk->pm.ops->address_removed(msk, ¶m) :
+ mptcp_userspace_pm_address_removed(msk, ¶m);
release_sock(sk);
-
- sock_kfree_s(sk, match, sizeof(*match));
-
- err = 0;
-out:
if (err)
NL_SET_ERR_MSG_ATTR_FMT(info->extack, id,
"address with id %u not found",
- id_val);
+ addr.id);
sock_put(sk);
return err;
@@ -705,6 +704,7 @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
static struct mptcp_pm_ops mptcp_userspace_pm = {
.address_announced = mptcp_userspace_pm_address_announced,
+ .address_removed = mptcp_userspace_pm_address_removed,
.get_local_id = mptcp_userspace_pm_get_local_id,
.get_priority = mptcp_userspace_pm_get_priority,
.type = MPTCP_PM_TYPE_USERSPACE,
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v1 8/9] mptcp: pm: userspace: subflow_established interface
2025-02-20 10:36 [PATCH mptcp-next v1 0/9] BPF path manager, part 5 Geliang Tang
` (6 preceding siblings ...)
2025-02-20 10:36 ` [PATCH mptcp-next v1 7/9] mptcp: pm: userspace: address_removed interface Geliang Tang
@ 2025-02-20 10:36 ` Geliang Tang
2025-02-20 10:36 ` [PATCH mptcp-next v1 9/9] mptcp: pm: userspace: subflow_closed interface Geliang Tang
2025-02-20 11:41 ` [PATCH mptcp-next v1 0/9] BPF path manager, part 5 MPTCP CI
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-20 10:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Extract subflow_established() interface of the userspace PM from the
handler of netlink command MPTCP_PM_CMD_SUBFLOW_CREATE
mptcp_pm_nl_subflow_create_doit(),
only leave the code for obtaining msk through "info", parsing local address
entry and parsing remote address info in the handler.
This interface is invoked under holding the msk socket lock.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/pm_userspace.c | 54 +++++++++++++++++++++++++---------------
1 file changed, 34 insertions(+), 20 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 770d1c3e5c81..bd497893c927 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -369,12 +369,40 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
return err;
}
+static int mptcp_userspace_pm_subflow_established(struct mptcp_sock *msk,
+ struct mptcp_pm_param *param)
+{
+ struct mptcp_pm_addr_entry *entry = ¶m->entry;
+ struct mptcp_addr_info *remote = ¶m->addr;
+ struct sock *sk = (struct sock *)msk;
+ struct mptcp_pm_local local;
+ int err;
+
+ err = mptcp_userspace_pm_append_new_local_addr(msk, entry, false);
+ if (err < 0)
+ return err;
+
+ local.addr = entry->addr;
+ local.flags = entry->flags;
+ local.ifindex = entry->ifindex;
+
+ err = __mptcp_subflow_connect(sk, &local, remote);
+ spin_lock_bh(&msk->pm.lock);
+ if (err)
+ mptcp_userspace_pm_delete_local_addr(msk, entry);
+ else
+ msk->pm.subflows++;
+ spin_unlock_bh(&msk->pm.lock);
+
+ return err;
+}
+
int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
{
struct mptcp_pm_addr_entry entry = { 0 };
struct mptcp_addr_info addr_r;
struct nlattr *raddr, *laddr;
- struct mptcp_pm_local local;
+ struct mptcp_pm_param param;
struct mptcp_sock *msk;
int err = -EINVAL;
struct sock *sk;
@@ -412,31 +440,16 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
goto create_err;
}
- err = mptcp_userspace_pm_append_new_local_addr(msk, &entry, false);
- if (err < 0) {
- NL_SET_ERR_MSG_ATTR(info->extack, laddr,
- "did not match address and id");
- goto create_err;
- }
-
- local.addr = entry.addr;
- local.flags = entry.flags;
- local.ifindex = entry.ifindex;
-
lock_sock(sk);
- err = __mptcp_subflow_connect(sk, &local, &addr_r);
+ mptcp_pm_param_set_contexts(¶m, &entry, &addr_r);
+ err = msk->pm.ops && msk->pm.ops->subflow_established ?
+ msk->pm.ops->subflow_established(msk, ¶m) :
+ mptcp_userspace_pm_subflow_established(msk, ¶m);
release_sock(sk);
if (err)
GENL_SET_ERR_MSG_FMT(info, "connect error: %d", err);
- spin_lock_bh(&msk->pm.lock);
- if (err)
- mptcp_userspace_pm_delete_local_addr(msk, &entry);
- else
- msk->pm.subflows++;
- spin_unlock_bh(&msk->pm.lock);
-
create_err:
sock_put(sk);
return err;
@@ -705,6 +718,7 @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
static struct mptcp_pm_ops mptcp_userspace_pm = {
.address_announced = mptcp_userspace_pm_address_announced,
.address_removed = mptcp_userspace_pm_address_removed,
+ .subflow_established = mptcp_userspace_pm_subflow_established,
.get_local_id = mptcp_userspace_pm_get_local_id,
.get_priority = mptcp_userspace_pm_get_priority,
.type = MPTCP_PM_TYPE_USERSPACE,
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v1 9/9] mptcp: pm: userspace: subflow_closed interface
2025-02-20 10:36 [PATCH mptcp-next v1 0/9] BPF path manager, part 5 Geliang Tang
` (7 preceding siblings ...)
2025-02-20 10:36 ` [PATCH mptcp-next v1 8/9] mptcp: pm: userspace: subflow_established interface Geliang Tang
@ 2025-02-20 10:36 ` Geliang Tang
2025-02-20 11:41 ` [PATCH mptcp-next v1 0/9] BPF path manager, part 5 MPTCP CI
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-20 10:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Extract subflow_closed() interface of the userspace PM from the handler of
netlink command MPTCP_PM_CMD_SUBFLOW_DESTROY
mptcp_pm_nl_subflow_destroy_doit(),
only leave the code for obtaining msk through "info", parsing local address
entry and parsing remote address info in the handler.
This interface is invoked under holding the msk socket lock.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/pm_userspace.c | 45 ++++++++++++++++++++++++++--------------
1 file changed, 30 insertions(+), 15 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index bd497893c927..9fd93acad38a 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -501,14 +501,36 @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
return NULL;
}
+static int mptcp_userspace_pm_subflow_closed(struct mptcp_sock *msk,
+ struct mptcp_pm_param *param)
+{
+ struct mptcp_pm_addr_entry *local = ¶m->entry;
+ struct mptcp_addr_info *remote = ¶m->addr;
+ struct sock *ssk, *sk = (struct sock *)msk;
+
+ ssk = mptcp_nl_find_ssk(msk, &local->addr, remote);
+ if (!ssk)
+ return -ESRCH;
+
+ spin_lock_bh(&msk->pm.lock);
+ mptcp_userspace_pm_delete_local_addr(msk, local);
+ spin_unlock_bh(&msk->pm.lock);
+ mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
+ mptcp_close_ssk(sk, ssk, mptcp_subflow_ctx(ssk));
+ MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
+
+ return 0;
+}
+
int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info)
{
struct mptcp_pm_addr_entry addr_l;
struct mptcp_addr_info addr_r;
struct nlattr *raddr, *laddr;
+ struct mptcp_pm_param param;
struct mptcp_sock *msk;
- struct sock *sk, *ssk;
int err = -EINVAL;
+ struct sock *sk;
if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR) ||
GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
@@ -559,21 +581,13 @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
}
lock_sock(sk);
- ssk = mptcp_nl_find_ssk(msk, &addr_l.addr, &addr_r);
- if (!ssk) {
- GENL_SET_ERR_MSG(info, "subflow not found");
- err = -ESRCH;
- goto release_sock;
- }
-
- spin_lock_bh(&msk->pm.lock);
- mptcp_userspace_pm_delete_local_addr(msk, &addr_l);
- spin_unlock_bh(&msk->pm.lock);
- mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
- mptcp_close_ssk(sk, ssk, mptcp_subflow_ctx(ssk));
- MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
-release_sock:
+ mptcp_pm_param_set_contexts(¶m, &addr_l, &addr_r);
+ err = msk->pm.ops && msk->pm.ops->subflow_closed ?
+ msk->pm.ops->subflow_closed(msk, ¶m) :
+ mptcp_userspace_pm_subflow_closed(msk, ¶m);
release_sock(sk);
+ if (err)
+ GENL_SET_ERR_MSG(info, "subflow not found");
destroy_err:
sock_put(sk);
@@ -719,6 +733,7 @@ static struct mptcp_pm_ops mptcp_userspace_pm = {
.address_announced = mptcp_userspace_pm_address_announced,
.address_removed = mptcp_userspace_pm_address_removed,
.subflow_established = mptcp_userspace_pm_subflow_established,
+ .subflow_closed = mptcp_userspace_pm_subflow_closed,
.get_local_id = mptcp_userspace_pm_get_local_id,
.get_priority = mptcp_userspace_pm_get_priority,
.type = MPTCP_PM_TYPE_USERSPACE,
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH mptcp-next v1 0/9] BPF path manager, part 5
2025-02-20 10:36 [PATCH mptcp-next v1 0/9] BPF path manager, part 5 Geliang Tang
` (8 preceding siblings ...)
2025-02-20 10:36 ` [PATCH mptcp-next v1 9/9] mptcp: pm: userspace: subflow_closed interface Geliang Tang
@ 2025-02-20 11:41 ` MPTCP CI
9 siblings, 0 replies; 11+ messages in thread
From: MPTCP CI @ 2025-02-20 11:41 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: Success! ✅
- KVM Validation: debug: Success! ✅
- KVM Validation: btf-normal (only bpftest_all): Success! ✅
- KVM Validation: btf-debug (only bpftest_all): Success! ✅
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/13433564994
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/62700b4b6dad
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=935957
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-normal
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] 11+ messages in thread