diff mbox series

[mptcp-next,2/4] mptcp: pm: add accept_new_address() interface

Message ID 94e82037a2f86ba85bc0f7c5ada46424b785073b.1743481566.git.tanggeliang@kylinos.cn (mailing list archive)
State New
Headers show
Series BPF path manager, part 7 | expand

Checks

Context Check Description
matttbe/checkpatch warning total: 0 errors, 2 warnings, 0 checks, 86 lines checked
matttbe/shellcheck success MPTCP selftests files have not been modified
matttbe/build success Build and static analysis OK
matttbe/KVM_Validation__normal warning Unstable: 2 failed test(s): packetdrill_mp_join packetdrill_sockopts
matttbe/KVM_Validation__debug warning Unstable: 2 failed test(s): packetdrill_mp_join packetdrill_sockopts
matttbe/KVM_Validation__btf-normal__only_bpftest_all_ success Success! ✅
matttbe/KVM_Validation__btf-debug__only_bpftest_all_ warning Unstable: 1 failed test(s): bpftest_test_progs-cpuv4_mptcp

Commit Message

Geliang Tang April 1, 2025, 4:30 a.m. UTC
From: Geliang Tang <tanggeliang@kylinos.cn>

Similar to the accept_new_subflow() interface, this patch adds a mandatory
accept_new_address() interface for struct mptcp_pm_ops, which is used to
determine whether an ADD_ADDR address is accepted by PM.

This interface is called in mptcp_pm_add_addr_received(). If the address is
not accepted, increase MPTCP_MIB_ADDADDRDROP counter and return.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 include/net/mptcp.h      |  4 ++++
 net/mptcp/pm.c           | 17 ++++++++---------
 net/mptcp/pm_kernel.c    |  8 ++++++++
 net/mptcp/pm_userspace.c |  7 +++++++
 4 files changed, 27 insertions(+), 9 deletions(-)
diff mbox series

Patch

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 1eae68c9e662..d6bb030b14c6 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -129,6 +129,10 @@  struct mptcp_pm_ops {
 	void (*established)(struct mptcp_sock *msk);
 	void (*subflow_established)(struct mptcp_sock *msk);
 
+	/* required */
+	bool (*accept_new_address)(struct mptcp_sock *msk,
+				   const struct mptcp_addr_info *addr);
+
 	char			name[MPTCP_PM_NAME_MAX];
 	struct module		*owner;
 	struct list_head	list;
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index f37ddd6111de..519beb8cadfa 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -589,22 +589,21 @@  void mptcp_pm_add_addr_received(const struct sock *ssk,
 
 	mptcp_event_addr_announced(ssk, addr);
 
+	if (!pm->ops->accept_new_address(msk, addr)) {
+		MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_ADDADDRDROP);
+		return;
+	}
+
 	spin_lock_bh(&pm->lock);
 
 	if (mptcp_pm_is_userspace(msk)) {
-		if (mptcp_userspace_pm_active(msk)) {
-			mptcp_pm_announce_addr(msk, addr, true);
-			mptcp_pm_add_addr_send_ack(msk);
-		} else {
-			__MPTCP_INC_STATS(sock_net((struct sock *)msk), MPTCP_MIB_ADDADDRDROP);
-		}
+		mptcp_pm_announce_addr(msk, addr, true);
+		mptcp_pm_add_addr_send_ack(msk);
 	} else if (!mptcp_pm_accept_address(msk, addr)) {
 		mptcp_pm_announce_addr(msk, addr, true);
 		mptcp_pm_add_addr_send_ack(msk);
 	} else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) {
 		pm->remote = *addr;
-	} else {
-		__MPTCP_INC_STATS(sock_net((struct sock *)msk), MPTCP_MIB_ADDADDRDROP);
 	}
 
 	spin_unlock_bh(&pm->lock);
@@ -1046,7 +1045,7 @@  struct mptcp_pm_ops *mptcp_pm_find(const char *name)
 int mptcp_pm_validate(struct mptcp_pm_ops *pm_ops)
 {
 	if (!pm_ops->get_local_id || !pm_ops->get_priority ||
-	    !pm_ops->accept_new_subflow) {
+	    !pm_ops->accept_new_subflow || !pm_ops->accept_new_address) {
 		pr_err("%s does not implement required ops\n", pm_ops->name);
 		return -EINVAL;
 	}
diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c
index 000f4f173ad5..defd8312a764 100644
--- a/net/mptcp/pm_kernel.c
+++ b/net/mptcp/pm_kernel.c
@@ -1413,6 +1413,13 @@  static bool mptcp_pm_kernel_accept_new_subflow(struct mptcp_sock *msk,
 	return ret;
 }
 
+static bool mptcp_pm_kernel_accept_new_address(struct mptcp_sock *msk,
+					       const struct mptcp_addr_info *addr)
+{
+	return !(mptcp_pm_accept_address(msk, addr) &&
+		 msk->pm.status & BIT(MPTCP_PM_ADD_ADDR_RECEIVED));
+}
+
 static void mptcp_pm_kernel_init(struct mptcp_sock *msk)
 {
 	bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk);
@@ -1439,6 +1446,7 @@  struct mptcp_pm_ops mptcp_pm_kernel = {
 	.accept_new_subflow	= mptcp_pm_kernel_accept_new_subflow,
 	.established		= mptcp_pm_kernel_established,
 	.subflow_established	= mptcp_pm_kernel_subflow_established,
+	.accept_new_address	= mptcp_pm_kernel_accept_new_address,
 	.init			= mptcp_pm_kernel_init,
 	.name			= "kernel",
 	.owner			= THIS_MODULE,
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 31da3b9f4cc8..b09582c0118d 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -689,6 +689,12 @@  static bool mptcp_pm_userspace_accept_new_subflow(struct mptcp_sock *msk,
 	return mptcp_userspace_pm_active(msk);
 }
 
+static bool mptcp_pm_userspace_accept_new_address(struct mptcp_sock *msk,
+						  const struct mptcp_addr_info *addr)
+{
+	return mptcp_userspace_pm_active(msk);
+}
+
 static void mptcp_pm_userspace_release(struct mptcp_sock *msk)
 {
 	mptcp_userspace_pm_free_local_addr_list(msk);
@@ -698,6 +704,7 @@  static struct mptcp_pm_ops mptcp_pm_userspace = {
 	.get_local_id		= mptcp_pm_userspace_get_local_id,
 	.get_priority		= mptcp_pm_userspace_get_priority,
 	.accept_new_subflow	= mptcp_pm_userspace_accept_new_subflow,
+	.accept_new_address	= mptcp_pm_userspace_accept_new_address,
 	.release		= mptcp_pm_userspace_release,
 	.name			= "userspace",
 	.owner			= THIS_MODULE,