diff mbox series

[mptcp-next,v1,2/9] mptcp: pm: in-kernel: address_announced interface

Message ID 5881dc057b4927f30070193bde21703f0079e233.1740047738.git.tanggeliang@kylinos.cn (mailing list archive)
State New
Delegated to: Matthieu Baerts
Headers show
Series BPF path manager, part 5 | expand

Checks

Context Check Description
matttbe/checkpatch success total: 0 errors, 0 warnings, 0 checks, 58 lines checked
matttbe/shellcheck success MPTCP selftests files have not been modified
matttbe/build success Build and static analysis OK
matttbe/KVM_Validation__normal success Success! ✅
matttbe/KVM_Validation__debug success Success! ✅
matttbe/KVM_Validation__btf-normal__only_bpftest_all_ success Success! ✅
matttbe/KVM_Validation__btf-debug__only_bpftest_all_ success Success! ✅

Commit Message

Geliang Tang Feb. 20, 2025, 10:36 a.m. UTC
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 mbox series

Patch

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 = &param->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(&param, NULL, addr);
+		msk->pm.ops && msk->pm.ops->address_announced ?
+			msk->pm.ops->address_announced(msk, &param) :
+			mptcp_pm_nl_address_announced(msk, &param);
 		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,