From patchwork Tue Mar 11 09:32:25 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011403 X-Patchwork-Delegate: matthieu.baerts@tessares.net Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 205A7EC5 for ; Tue, 11 Mar 2025 09:32:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741685561; cv=none; b=ez/BE3pCASmEQCIaPYr27RNXmhjj81oTMin/9gJx4NCiK7gFpa0aaCLXQb1EdEThCRXYVXV1JKGEgTVwjJx4mgM48R5xPyzfme8IKg/OGAFw/JnedV14rAFkMCfpI9iDJmzzOUH8pTNGj0BD6QhqToToCJZwJ/aZRAvgDSEb+4A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741685561; c=relaxed/simple; bh=dCz4T5AElh58zU61d5J78jmKtcCGBlxD81xMuXlYsP4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cI0CU/e9bKkVLJS2DVxE3LKiUDIy+9mKZj62YIPCooJX6SNkvhwT7wHXpulrUtvK1kxGdxdcsEjhDcu7Mau3nlcu21so4U9PMtNL5YPKvO+zt/TRCN9VArOTrauC2yOqhAMKqWr25f+bg1+PUdW9rBIPH6B7/qPgkz6xb1CHMZc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eqKxo5rC; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="eqKxo5rC" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 60CF7C4CEEB; Tue, 11 Mar 2025 09:32:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741685560; bh=dCz4T5AElh58zU61d5J78jmKtcCGBlxD81xMuXlYsP4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eqKxo5rCrNw4aFvrTr93X+GDTnOhtjNj1hx2Ly8ysvXCTDTcoEgbSscGaNQG7KWK1 cJIpKQOrWKSNUWnXuFIcewhuCAcY6TGF9evisgQvHYkVa5yKSMDIZsrDrDjP+Ge5Kz KK0g9KrIcDA9TSq1N5c693yYhm+pBxWDcO7p1dmqDpkbg8Ohfg/Dk1xr+guBUAfzNf yb24TrlA5K6rpYTSl6Ms9snbXpQ8Yevj7xvSL9+lb5wpPWtEp4dS/DkD/3ojTdOSbb Tpdm8Xtza/DXsAXJXxgVDOYq5vZFlC6Eyd1Pm+86a+Eqw+H7nScR9q/2ZrUFm3Y1IR JLZJI/lJOS7vQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v1 1/6] mptcp: pm: add allow_new_subflow() interface Date: Tue, 11 Mar 2025 17:32:25 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Geliang Tang The helper mptcp_pm_is_userspace() is used to distinguish userspace PM operations from in-kernel PM in mptcp_pm_allow_new_subflow(). It seems reasonable to add a mandatory .allow_new_subflow interface for struct mptcp_pm_ops. Signed-off-by: Geliang Tang --- include/net/mptcp.h | 2 ++ net/mptcp/pm.c | 36 +++--------------------------------- net/mptcp/pm_kernel.c | 27 +++++++++++++++++++++++++++ net/mptcp/pm_userspace.c | 14 ++++++++++++++ 4 files changed, 46 insertions(+), 33 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 6a08ac862bbe..af995387248b 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -123,6 +123,8 @@ struct mptcp_pm_ops { bool (*get_priority)(struct mptcp_sock *msk, struct mptcp_addr_info *skc); + bool (*allow_new_subflow)(struct mptcp_sock *msk); + 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 ba7424582ebf..80293c823a3a 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -452,38 +452,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 mptcp_pm_data *pm = &msk->pm; - unsigned int subflows_max; - int ret = 0; - - if (mptcp_pm_is_userspace(msk)) { - if (mptcp_userspace_pm_active(msk)) { - spin_lock_bh(&pm->lock); - pm->subflows++; - spin_unlock_bh(&pm->lock); - return true; - } - return false; - } - - subflows_max = mptcp_pm_get_subflows_max(msk); - - pr_debug("msk=%p subflows=%d max=%d allow=%d\n", msk, pm->subflows, - subflows_max, READ_ONCE(pm->accept_subflow)); - - /* try to avoid acquiring the lock below */ - if (!READ_ONCE(pm->accept_subflow)) - return false; - - spin_lock_bh(&pm->lock); - if (READ_ONCE(pm->accept_subflow)) { - ret = pm->subflows < subflows_max; - if (ret && ++pm->subflows == subflows_max) - WRITE_ONCE(pm->accept_subflow, false); - } - spin_unlock_bh(&pm->lock); - - return ret; + return msk->pm.ops->allow_new_subflow(msk); } /* return true if the new status bit is currently cleared, that is, this event @@ -1047,7 +1016,8 @@ 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) { + if (!pm_ops->get_local_id || !pm_ops->get_priority || + !pm_ops->allow_new_subflow) { 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 7ec81d5195d4..af69f736c7c7 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -1399,6 +1399,32 @@ static struct pernet_operations mptcp_pm_pernet_ops = { .size = sizeof(struct pm_nl_pernet), }; +static bool mptcp_pm_kernel_allow_new_subflow(struct mptcp_sock *msk) +{ + struct mptcp_pm_data *pm = &msk->pm; + unsigned int subflows_max; + int ret = 0; + + subflows_max = mptcp_pm_get_subflows_max(msk); + + pr_debug("msk=%p subflows=%d max=%d allow=%d\n", msk, pm->subflows, + subflows_max, READ_ONCE(pm->accept_subflow)); + + /* try to avoid acquiring the lock below */ + if (!READ_ONCE(pm->accept_subflow)) + return false; + + spin_lock_bh(&pm->lock); + if (READ_ONCE(pm->accept_subflow)) { + ret = pm->subflows < subflows_max; + if (ret && ++pm->subflows == subflows_max) + WRITE_ONCE(pm->accept_subflow, false); + } + spin_unlock_bh(&pm->lock); + + return ret; +} + static void mptcp_pm_kernel_init(struct mptcp_sock *msk) { bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk); @@ -1422,6 +1448,7 @@ static void mptcp_pm_kernel_init(struct mptcp_sock *msk) struct mptcp_pm_ops mptcp_pm_kernel = { .get_local_id = mptcp_pm_kernel_get_local_id, .get_priority = mptcp_pm_kernel_get_priority, + .allow_new_subflow = mptcp_pm_kernel_allow_new_subflow, .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 7fc19b844384..3a9962ac77b2 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -683,6 +683,19 @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr, return ret; } +static bool mptcp_pm_userspace_allow_new_subflow(struct mptcp_sock *msk) +{ + struct mptcp_pm_data *pm = &msk->pm; + + if (mptcp_userspace_pm_active(msk)) { + spin_lock_bh(&pm->lock); + pm->subflows++; + spin_unlock_bh(&pm->lock); + return true; + } + return false; +} + static void mptcp_pm_userspace_release(struct mptcp_sock *msk) { mptcp_userspace_pm_free_local_addr_list(msk); @@ -691,6 +704,7 @@ static void mptcp_pm_userspace_release(struct mptcp_sock *msk) static struct mptcp_pm_ops mptcp_pm_userspace = { .get_local_id = mptcp_pm_userspace_get_local_id, .get_priority = mptcp_pm_userspace_get_priority, + .allow_new_subflow = mptcp_pm_userspace_allow_new_subflow, .release = mptcp_pm_userspace_release, .name = "userspace", .owner = THIS_MODULE, From patchwork Tue Mar 11 09:32:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011404 X-Patchwork-Delegate: matthieu.baerts@tessares.net Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F0534EC5 for ; Tue, 11 Mar 2025 09:32:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741685563; cv=none; b=pS0pqNA1ksZadBhl1XenqIDzTNdg3JxfMVhVJJMCliZAVLdmAYzCd/Ez+9zEsLcQA1zLPImP95RVveEQLv2auFc1/gmSOE8B2HNdgoy4HCBWQy8fyLRKheJ0pPLZrpSSRMM/Z75yx0PDVn7Fy7OCfjFeZkEh8E0zDTM9FwD70e4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741685563; c=relaxed/simple; bh=qD6HVfTwDFTHVKMekkXWVaBB37R6NfQTAhz1Y374fak=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KltuuojXR9D1W7IaviX3Ewc2PHte+vWx3akyfYg5U7iStt5BO+qpG2QS5NnctJm+vFu7rHGUxrJDLguap+H1j/bOs1ez4+S6UPI/7Cf0wrUa8dOP/9W98CdNLnjAXHrSOk0+x+O2tCKJu882Q5EoU0rCr8s5KmWs9/VfboK1U6Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Gv/rI9rH; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Gv/rI9rH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 39079C4CEE9; Tue, 11 Mar 2025 09:32:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741685562; bh=qD6HVfTwDFTHVKMekkXWVaBB37R6NfQTAhz1Y374fak=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Gv/rI9rHTUuMiFAVAu1c8x/+Oi/ruIMBv7WTeOkLirShNJcXvatYKc4qYCt84/OzW fTnG401P0QN8rRALU3+yuYFxWxgQARQAyLoeN9J6mgzVUScxzPi9CE3itU4A7cqv35 SyisXqjzq1yU85YbNTVrBzZXHBCbaqjszwFb3f21qQIEhlZK3rpVP4uiEh2YqPyNy3 pXcQ8K+v7F3HFzlgg27jCRQrdZanPE/quiPy+Up/MZXCUzQsofPvmgPoHlLV28GXIs nb8PGXH1V3fh8fsGC6X8aZX/eWbqMzUHm6wXhVoVDAClneKAvMyhWszrK2IymOssQS DI3Had/t4qtJQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v1 2/6] mptcp: pm: add accept_new_subflow() interface Date: Tue, 11 Mar 2025 17:32:26 +0800 Message-ID: <72854cb564464ced16eb19ab4bbe6e0cde4ec4ea.1741685260.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Geliang Tang The helper mptcp_pm_is_userspace() is used to distinguish userspace PM operations from in-kernel PM in mptcp_can_accept_new_subflow(). It seems reasonable to add a mandatory .accept_new_subflow interface for struct mptcp_pm_ops. Signed-off-by: Geliang Tang --- include/net/mptcp.h | 1 + net/mptcp/pm.c | 2 +- net/mptcp/pm_kernel.c | 6 ++++++ net/mptcp/pm_userspace.c | 6 ++++++ net/mptcp/subflow.c | 4 +--- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index af995387248b..6f9bc0ca4d37 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -124,6 +124,7 @@ struct mptcp_pm_ops { struct mptcp_addr_info *skc); bool (*allow_new_subflow)(struct mptcp_sock *msk); + bool (*accept_new_subflow)(const struct mptcp_sock *msk); char name[MPTCP_PM_NAME_MAX]; struct module *owner; diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 80293c823a3a..31a2c66a1af3 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -1017,7 +1017,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->allow_new_subflow) { + !pm_ops->allow_new_subflow || !pm_ops->accept_new_subflow) { 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 af69f736c7c7..708a96951cba 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -1425,6 +1425,11 @@ static bool mptcp_pm_kernel_allow_new_subflow(struct mptcp_sock *msk) return ret; } +static bool mptcp_pm_kernel_accept_new_subflow(const struct mptcp_sock *msk) +{ + return READ_ONCE(msk->pm.accept_subflow); +} + static void mptcp_pm_kernel_init(struct mptcp_sock *msk) { bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk); @@ -1449,6 +1454,7 @@ struct mptcp_pm_ops mptcp_pm_kernel = { .get_local_id = mptcp_pm_kernel_get_local_id, .get_priority = mptcp_pm_kernel_get_priority, .allow_new_subflow = mptcp_pm_kernel_allow_new_subflow, + .accept_new_subflow = mptcp_pm_kernel_accept_new_subflow, .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 3a9962ac77b2..4cd9a84477c8 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -696,6 +696,11 @@ static bool mptcp_pm_userspace_allow_new_subflow(struct mptcp_sock *msk) return false; } +static bool mptcp_pm_userspace_accept_new_subflow(const struct mptcp_sock *msk) +{ + return mptcp_userspace_pm_active(msk); +} + static void mptcp_pm_userspace_release(struct mptcp_sock *msk) { mptcp_userspace_pm_free_local_addr_list(msk); @@ -705,6 +710,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, .allow_new_subflow = mptcp_pm_userspace_allow_new_subflow, + .accept_new_subflow = mptcp_pm_userspace_accept_new_subflow, .release = mptcp_pm_userspace_release, .name = "userspace", .owner = THIS_MODULE, diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index efe8d86496db..defef7aa5b28 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -61,9 +61,7 @@ static void subflow_generate_hmac(u64 key1, u64 key2, u32 nonce1, u32 nonce2, static bool mptcp_can_accept_new_subflow(const struct mptcp_sock *msk) { return mptcp_is_fully_established((void *)msk) && - ((mptcp_pm_is_userspace(msk) && - mptcp_userspace_pm_active(msk)) || - READ_ONCE(msk->pm.accept_subflow)); + msk->pm.ops->accept_new_subflow(msk); } /* validate received token and create truncated hmac and nonce for SYN-ACK */ From patchwork Tue Mar 11 09:32:27 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011405 X-Patchwork-Delegate: matthieu.baerts@tessares.net Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C1E561F09AB for ; Tue, 11 Mar 2025 09:32:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741685564; cv=none; b=bnJfzW4QZm3YSyp1YghjNewL2HEnKPkeQU0/WeoI3l8BjC32K0eBBoTa6xr36tnqXQ5T5vBzAXqQ3o2iJrT3OJm97UiEmTyNGB9/KN+08P96dDKrrVOM/40ZKviqJCeDW3HGBihTkrUfg592KcqeP6oBpAh4J6ZN4sYXPV/OQdY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741685564; c=relaxed/simple; bh=ZAVyGnuY0mgldBjHDNWZi1/pllLxbY+xCxTlclrawxk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=roTBvx0HdbTwxtnokurQrMVhb+3o3OF6oOBiT/wn+BejiC/fZ8namidChOcFVtTMOEIdNqc90/QZTQ4yq8jnyZ+/VYI7hzu6LwshXpPiZuD25UogfoFOPtrJltH+/qqGd1upoK+BhOCwj/UPBY/GyDCS7WsNJSJyV9L6YIpLG6E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Z7sJILff; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Z7sJILff" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 13311C4CEEB; Tue, 11 Mar 2025 09:32:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741685564; bh=ZAVyGnuY0mgldBjHDNWZi1/pllLxbY+xCxTlclrawxk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Z7sJILffgTtywvMczmf2lZQX7dXY+bZg3I21rkLVzdxyXn639MYRzDDtr17jtxk3Q jplN25WBvUmxeiu0GYnpwv4rdJ8GI0dB7HA/uevgzqJvsIYcYCHNmbEJce3PT5wofa dHuIY2doFRpWu24cyuisJw7Czyo34uhDnkI1NglXbqXGH39uJw9ONk5J6mcq0XgVTo MfJbUFjM2X0ojykZud81eZLYLYaZAfdyDaiOqNZGbnm7DehhQ6tW57xwuSWgEDbF/A NCNtw+9Y+ugBSL5DFcaVwZkSQ6x2aK5lUIS9P+Q5sXx9SZF3iN+wfY2v+UmwxXRwpr P/cD6/mFUEdJw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v1 3/6] mptcp: pm: add subflow_check_next() interface Date: Tue, 11 Mar 2025 17:32:27 +0800 Message-ID: <2e7dd2f26852e4d5b5cd0434e13069b9461a3f32.1741685260.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Geliang Tang The helper mptcp_pm_is_userspace() is used to distinguish userspace PM operations from in-kernel PM in mptcp_pm_subflow_check_next(). It seems reasonable to add a mandatory .subflow_check_next interface for struct mptcp_pm_ops. Signed-off-by: Geliang Tang --- include/net/mptcp.h | 3 +++ net/mptcp/pm.c | 31 +++---------------------------- net/mptcp/pm_kernel.c | 20 ++++++++++++++++++++ net/mptcp/pm_userspace.c | 15 +++++++++++++++ 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 6f9bc0ca4d37..5f2d94b2f97f 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -15,6 +15,7 @@ struct mptcp_info; struct mptcp_sock; struct mptcp_pm_addr_entry; +struct mptcp_subflow_context; struct seq_file; /* MPTCP sk_buff extension data */ @@ -125,6 +126,8 @@ struct mptcp_pm_ops { bool (*allow_new_subflow)(struct mptcp_sock *msk); bool (*accept_new_subflow)(const struct mptcp_sock *msk); + void (*subflow_check_next)(struct mptcp_sock *msk, + const struct mptcp_subflow_context *subflow); char name[MPTCP_PM_NAME_MAX]; struct module *owner; diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 31a2c66a1af3..d8a5c2c06500 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -526,33 +526,7 @@ void mptcp_pm_subflow_established(struct mptcp_sock *msk) void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct mptcp_subflow_context *subflow) { - struct mptcp_pm_data *pm = &msk->pm; - bool update_subflows; - - update_subflows = subflow->request_join || subflow->mp_join; - if (mptcp_pm_is_userspace(msk)) { - if (update_subflows) { - spin_lock_bh(&pm->lock); - pm->subflows--; - spin_unlock_bh(&pm->lock); - } - return; - } - - if (!READ_ONCE(pm->work_pending) && !update_subflows) - return; - - spin_lock_bh(&pm->lock); - if (update_subflows) - __mptcp_pm_close_subflow(msk); - - /* Even if this subflow is not really established, tell the PM to try - * to pick the next ones, if possible. - */ - if (mptcp_pm_nl_check_work_pending(msk)) - mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED); - - spin_unlock_bh(&pm->lock); + msk->pm.ops->subflow_check_next(msk, subflow); } void mptcp_pm_add_addr_received(const struct sock *ssk, @@ -1017,7 +991,8 @@ 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->allow_new_subflow || !pm_ops->accept_new_subflow) { + !pm_ops->allow_new_subflow || !pm_ops->accept_new_subflow || + !pm_ops->subflow_check_next) { 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 708a96951cba..b40d39232f70 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -1430,6 +1430,25 @@ static bool mptcp_pm_kernel_accept_new_subflow(const struct mptcp_sock *msk) return READ_ONCE(msk->pm.accept_subflow); } +static void mptcp_pm_kernel_subflow_check_next(struct mptcp_sock *msk, + const struct mptcp_subflow_context *subflow) +{ + struct mptcp_pm_data *pm = &msk->pm; + bool update_subflows; + + update_subflows = subflow->request_join || subflow->mp_join; + + if (!READ_ONCE(pm->work_pending) && !update_subflows) + return; + + spin_lock_bh(&pm->lock); + if (update_subflows) + __mptcp_pm_close_subflow(msk); + spin_unlock_bh(&pm->lock); + + mptcp_pm_subflow_established(msk); +} + static void mptcp_pm_kernel_init(struct mptcp_sock *msk) { bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk); @@ -1455,6 +1474,7 @@ struct mptcp_pm_ops mptcp_pm_kernel = { .get_priority = mptcp_pm_kernel_get_priority, .allow_new_subflow = mptcp_pm_kernel_allow_new_subflow, .accept_new_subflow = mptcp_pm_kernel_accept_new_subflow, + .subflow_check_next = mptcp_pm_kernel_subflow_check_next, .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 4cd9a84477c8..68247ec4cdaa 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -701,6 +701,20 @@ static bool mptcp_pm_userspace_accept_new_subflow(const struct mptcp_sock *msk) return mptcp_userspace_pm_active(msk); } +static void mptcp_pm_userspace_subflow_check_next(struct mptcp_sock *msk, + const struct mptcp_subflow_context *subflow) +{ + struct mptcp_pm_data *pm = &msk->pm; + bool update_subflows; + + update_subflows = subflow->request_join || subflow->mp_join; + if (update_subflows) { + spin_lock_bh(&pm->lock); + pm->subflows--; + spin_unlock_bh(&pm->lock); + } +} + static void mptcp_pm_userspace_release(struct mptcp_sock *msk) { mptcp_userspace_pm_free_local_addr_list(msk); @@ -711,6 +725,7 @@ static struct mptcp_pm_ops mptcp_pm_userspace = { .get_priority = mptcp_pm_userspace_get_priority, .allow_new_subflow = mptcp_pm_userspace_allow_new_subflow, .accept_new_subflow = mptcp_pm_userspace_accept_new_subflow, + .subflow_check_next = mptcp_pm_userspace_subflow_check_next, .release = mptcp_pm_userspace_release, .name = "userspace", .owner = THIS_MODULE, From patchwork Tue Mar 11 09:32:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011406 X-Patchwork-Delegate: matthieu.baerts@tessares.net Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7F9431E2312 for ; Tue, 11 Mar 2025 09:32:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741685566; cv=none; b=glSGUsrnsqv2Fvfsk950grHilpKkL+dJXzdRB8yQhaii81M+pD4INSPFsc2s6MsjUxxIWJgPc3EXlg0IU6IzaVJO43hNRcSx73XQSXPyj1UYNloMgb4RH53NkI7Dpeso0XuD2HGjDbB7BxXtvxhWy1LpqMUhrnbXnRU2jOecQBY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741685566; c=relaxed/simple; bh=8mEMRWk+voaAriV8guiXWOtPmFqwC/130wN3tkIinkw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=N4iFfifltSBHOB0Zix1Nj+tAowmuTgDBWECf2P67HCQBd6NCTuDZjeirY5ixt+l5+9YsIMM0OGQN/7O4rOkaV8kO99IMcsoStGpSGmRtcmuey4f2qiGmyJENXr0Flp0HuuDQt8PyMkFzpUNMH8SBc/8eefUwvqDjSm8GSoMUoMc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KVG6Z3/Y; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="KVG6Z3/Y" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E0880C4CEE9; Tue, 11 Mar 2025 09:32:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741685566; bh=8mEMRWk+voaAriV8guiXWOtPmFqwC/130wN3tkIinkw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KVG6Z3/Ye9tT87PM4IcXZgb4+S6Jvfglrvn0iMIgd4AulepwzhNR1PiMMppgxkj9H +uYOlRGv2MXQSqsn6IACnPTRubETsGRC4zBVhZxFFsqgiwGuU11QztxXvgO0I66EX2 M0/eTy/TW5Hw6ivt4KBoW1a9NYLpUbZLNziLMewiGGpfwq6bfFcQgZQD32AXnV1Pt6 UqmnvptVURNORKu5ppBaffnhmMp+Ajm5vthewo3f1Grg9rUbJHcjNYQPRa/Aubi4mc Wf84IevCv8OoLia7cWvLv9T70F+y+9DnC51JJBeeZk2XtuNIzWjbmAWcAb924oGg6v CBKyN70KMBd4w== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v1 4/6] mptcp: pm: add add_addr_echo() interface Date: Tue, 11 Mar 2025 17:32:28 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Geliang Tang The helper mptcp_pm_is_userspace() is used to distinguish userspace PM operations from in-kernel PM in mptcp_pm_add_addr_received(). It seems reasonable to add a mandatory .add_addr_echo interface for struct mptcp_pm_ops. Signed-off-by: Geliang Tang --- include/net/mptcp.h | 2 ++ net/mptcp/pm.c | 36 ++++++++++++++++++------------------ net/mptcp/pm_kernel.c | 7 +++++++ net/mptcp/pm_userspace.c | 12 ++++++++++++ net/mptcp/protocol.h | 2 ++ 5 files changed, 41 insertions(+), 18 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 5f2d94b2f97f..1f4d0d3988c1 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -128,6 +128,8 @@ struct mptcp_pm_ops { bool (*accept_new_subflow)(const struct mptcp_sock *msk); void (*subflow_check_next)(struct mptcp_sock *msk, const struct mptcp_subflow_context *subflow); + void (*add_addr_echo)(struct mptcp_sock *msk, + const struct mptcp_addr_info *addr); char name[MPTCP_PM_NAME_MAX]; struct module *owner; diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index d8a5c2c06500..dc7ab696c24b 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -529,6 +529,22 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, msk->pm.ops->subflow_check_next(msk, subflow); } +void mptcp_pm_add_addr_echo(struct mptcp_sock *msk, + const struct mptcp_addr_info *addr) +{ + struct mptcp_pm_data *pm = &msk->pm; + + if ((addr->id == 0 && !mptcp_pm_is_init_remote_addr(msk, addr)) || + (addr->id > 0 && !READ_ONCE(pm->accept_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); + } +} + void mptcp_pm_add_addr_received(const struct sock *ssk, const struct mptcp_addr_info *addr) { @@ -543,23 +559,7 @@ void mptcp_pm_add_addr_received(const struct sock *ssk, 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); - } - /* id0 should not have a different address */ - } else if ((addr->id == 0 && !mptcp_pm_is_init_remote_addr(msk, addr)) || - (addr->id > 0 && !READ_ONCE(pm->accept_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); - } + pm->ops->add_addr_echo(msk, addr); spin_unlock_bh(&pm->lock); } @@ -992,7 +992,7 @@ int mptcp_pm_validate(struct mptcp_pm_ops *pm_ops) { if (!pm_ops->get_local_id || !pm_ops->get_priority || !pm_ops->allow_new_subflow || !pm_ops->accept_new_subflow || - !pm_ops->subflow_check_next) { + !pm_ops->subflow_check_next || !pm_ops->add_addr_echo) { 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 b40d39232f70..d5002236fe6e 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -1449,6 +1449,12 @@ static void mptcp_pm_kernel_subflow_check_next(struct mptcp_sock *msk, mptcp_pm_subflow_established(msk); } +static void mptcp_pm_kernel_add_addr_echo(struct mptcp_sock *msk, + const struct mptcp_addr_info *addr) +{ + mptcp_pm_add_addr_echo(msk, addr); +} + static void mptcp_pm_kernel_init(struct mptcp_sock *msk) { bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk); @@ -1475,6 +1481,7 @@ struct mptcp_pm_ops mptcp_pm_kernel = { .allow_new_subflow = mptcp_pm_kernel_allow_new_subflow, .accept_new_subflow = mptcp_pm_kernel_accept_new_subflow, .subflow_check_next = mptcp_pm_kernel_subflow_check_next, + .add_addr_echo = mptcp_pm_kernel_add_addr_echo, .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 68247ec4cdaa..848102bd0f4b 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -715,6 +715,17 @@ static void mptcp_pm_userspace_subflow_check_next(struct mptcp_sock *msk, } } +static void mptcp_pm_userspace_add_addr_echo(struct mptcp_sock *msk, + const struct mptcp_addr_info *addr) +{ + 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); + } +} + static void mptcp_pm_userspace_release(struct mptcp_sock *msk) { mptcp_userspace_pm_free_local_addr_list(msk); @@ -726,6 +737,7 @@ static struct mptcp_pm_ops mptcp_pm_userspace = { .allow_new_subflow = mptcp_pm_userspace_allow_new_subflow, .accept_new_subflow = mptcp_pm_userspace_accept_new_subflow, .subflow_check_next = mptcp_pm_userspace_subflow_check_next, + .add_addr_echo = mptcp_pm_userspace_add_addr_echo, .release = mptcp_pm_userspace_release, .name = "userspace", .owner = THIS_MODULE, diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index d9ca3a19a218..8ca8eea1795b 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1013,6 +1013,8 @@ void mptcp_pm_subflow_established(struct mptcp_sock *msk); bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk); void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct mptcp_subflow_context *subflow); +void mptcp_pm_add_addr_echo(struct mptcp_sock *msk, + const struct mptcp_addr_info *addr); void mptcp_pm_add_addr_received(const struct sock *ssk, const struct mptcp_addr_info *addr); void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk, From patchwork Tue Mar 11 09:32:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011407 X-Patchwork-Delegate: matthieu.baerts@tessares.net Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4DF401E2312 for ; Tue, 11 Mar 2025 09:32:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741685568; cv=none; b=EplSnv3bbX2gJ+sD4meyXR7lnwH6RgtSRmk2jHuf2KxPHYQcHJ3aIh5k8WloYlKX/mc0eJDaeW6f3y3nbCmlyizU8pTQ9ZE6erXWT/flxqpGzIIZLU4S6O1QN8YqNCDaF0fdOHfV7/XlEVI+40hsuB0a5m/fuJhlzf4Zn5hpqCc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741685568; c=relaxed/simple; bh=QnWx9k2peACy3hLVXFAZjMdXZuJwUA4nRAr9bZbHJgk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GvZqhlVQbCQU8l3zq4yUhNIeOgPaOuwU6c7oBDIr56JMTFZeZsRaTIRpWon2MVNWkThdo8YP36FzUAekQEksRhd14dNe4pZVxrmZBvioJzADYwBOXGU63RUznBzlzGTWPTPOCek/a+78rxhqeX5qqpYIUmu/qbmJKM2KuO1Whl8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gUKjJhi7; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="gUKjJhi7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A12AAC4CEE9; Tue, 11 Mar 2025 09:32:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741685567; bh=QnWx9k2peACy3hLVXFAZjMdXZuJwUA4nRAr9bZbHJgk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gUKjJhi7gXoF/ldI2eUmzCks/Psn/9zHcubSVAt7rvq7TWNLTvpRK3yuYLOqWX6jM MGTm6cmTm58oKng2yWQIUhS69r1QejF2qc91WDhxHA69cM54CnLVOAMiOv/Wmd9B7P YdNMv3g19+a4x3/NcUt/wbDHHdJR8OrcJPMnVqlaPm2k5UWFEzp7GZPQQYD5MphgnJ gkoSGobBr/1exVD87aNj8l/6EuZjXGujdXwO1t1T2NqghZ7xqV5aBoE0ihUQ6CH5On r8rzOapnwUHZBX4aoxqObTzLBrAJ/OFtb7a33/5IMjzxknkUNaPCelrJdpQrvsgp37 7i6aLRE3iv1Zg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v1 5/6] mptcp: pm: add established() interface Date: Tue, 11 Mar 2025 17:32:29 +0800 Message-ID: <7b91f66e9fcd99e1e7b10bfead7bc01bdcda114a.1741685260.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Geliang Tang This patch adds a .established interface for struct mptcp_pm_ops, and calls pm->ops->established in from mptcp_pm_worker(). Then get rid of the corresponding code from __mptcp_pm_kernel_worker(). Signed-off-by: Geliang Tang --- include/net/mptcp.h | 2 ++ net/mptcp/pm.c | 5 +++++ net/mptcp/pm_kernel.c | 7 ++----- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 1f4d0d3988c1..1d69a0fbb032 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -131,6 +131,8 @@ struct mptcp_pm_ops { void (*add_addr_echo)(struct mptcp_sock *msk, const struct mptcp_addr_info *addr); + void (*established)(struct mptcp_sock *msk); + 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 dc7ab696c24b..dc3ab2fa987f 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -903,6 +903,11 @@ void mptcp_pm_worker(struct mptcp_sock *msk) pm->status &= ~BIT(MPTCP_PM_RM_ADDR_RECEIVED); mptcp_pm_rm_addr_recv(msk); } + if (pm->status & BIT(MPTCP_PM_ESTABLISHED)) { + pm->status &= ~BIT(MPTCP_PM_ESTABLISHED); + if (pm->ops->established) + pm->ops->established(msk); + } __mptcp_pm_kernel_worker(msk); spin_unlock_bh(&msk->pm.lock); diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index d5002236fe6e..5c8764db3805 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -367,7 +367,7 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) mptcp_pm_nl_check_work_pending(msk); } -static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk) +static void mptcp_pm_kernel_established(struct mptcp_sock *msk) { mptcp_pm_create_subflow_or_signal_addr(msk); } @@ -1348,10 +1348,6 @@ void __mptcp_pm_kernel_worker(struct mptcp_sock *msk) pm->status &= ~BIT(MPTCP_PM_ADD_ADDR_RECEIVED); mptcp_pm_nl_add_addr_received(msk); } - if (pm->status & BIT(MPTCP_PM_ESTABLISHED)) { - pm->status &= ~BIT(MPTCP_PM_ESTABLISHED); - mptcp_pm_nl_fully_established(msk); - } if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) { pm->status &= ~BIT(MPTCP_PM_SUBFLOW_ESTABLISHED); mptcp_pm_nl_subflow_established(msk); @@ -1482,6 +1478,7 @@ struct mptcp_pm_ops mptcp_pm_kernel = { .accept_new_subflow = mptcp_pm_kernel_accept_new_subflow, .subflow_check_next = mptcp_pm_kernel_subflow_check_next, .add_addr_echo = mptcp_pm_kernel_add_addr_echo, + .established = mptcp_pm_kernel_established, .init = mptcp_pm_kernel_init, .name = "kernel", .owner = THIS_MODULE, From patchwork Tue Mar 11 09:32:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011408 X-Patchwork-Delegate: matthieu.baerts@tessares.net Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0357FEC5 for ; Tue, 11 Mar 2025 09:32:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741685570; cv=none; b=WEgGFPDUkDsl/A3UZkKCW5GvoDwr042UW0j874ybVuH9qTc4XFrg7rKyVDwNrLHeg5mmS6G0M3Nq9tbc+e1S+NKh8hBsbFjSLnEMwxNLqRjuBIOV/NOzHYSVJlE4PK8E+b7G3zIfNJQYy2+CE3jobnVmZqL5RovF+e3F+oJoMMQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741685570; c=relaxed/simple; bh=owqOVHrz6Ogp+jNLPYPysEfXC2W1jPgjdXewukJmIgg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=G33FYgG5c6vWuIfry+nPX7nMBR2fo11Y2KKSncKKh8M0vpdpvb9Xo0XbwS5FANE1nu7Dfk3DmybiHY/yM/42cpLTn3uG0FEJ+yWkCvOjriAn+A9rzwh7+esTSIDenVEzZ8MUC5PsU7j+ySJqM+LLVXJoJb3CUZELwcRkZOpvFRA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WOf313hH; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="WOf313hH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 62267C4CEEB; Tue, 11 Mar 2025 09:32:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741685569; bh=owqOVHrz6Ogp+jNLPYPysEfXC2W1jPgjdXewukJmIgg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WOf313hHXjq0YbAW9AhWWdsL3+KRLe1XnnScr6+i+LEjAr0P01ukbIjUVPioJyulW ISVxxuZk30Mb9JyxqcmM5XXMN48bG4Pa79fn07TT4UjCdy3Xh7peVLpdARErsPIna1 F7kNq6pKw1SKBXfihaeOc634xV3xxAcjWxpUSrGhyLirlo0BtzxRUZzukFwHXSc8k4 iZX1+apEbctccRm0MJrsPWFpcoDV6pR3ZHrFfeLLuhVGqLM9/KCND15FiKn+mxx8Nf J6cCnOQDFIb0z5IsueK9mwjIgTiUDEh54tUAtLFk179cRuvYCvi4xfPjfqEji8teAm 4fHZvPODLIL6Q== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v1 6/6] mptcp: pm: add subflow_established() interface Date: Tue, 11 Mar 2025 17:32:30 +0800 Message-ID: <5251f022f18eef85a4ddf848cde344dddbb09b99.1741685260.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Geliang Tang This patch adds a .subflow_established interface for struct mptcp_pm_ops, and calls pm->ops->subflow_established in from mptcp_pm_worker(). Then get rid of the corresponding code from __mptcp_pm_kernel_worker(). Signed-off-by: Geliang Tang --- include/net/mptcp.h | 1 + net/mptcp/pm.c | 5 +++++ net/mptcp/pm_kernel.c | 7 ++----- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 1d69a0fbb032..88e0de990578 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -132,6 +132,7 @@ struct mptcp_pm_ops { const struct mptcp_addr_info *addr); void (*established)(struct mptcp_sock *msk); + void (*subflow_established)(struct mptcp_sock *msk); char name[MPTCP_PM_NAME_MAX]; struct module *owner; diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index dc3ab2fa987f..57b32232137e 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -908,6 +908,11 @@ void mptcp_pm_worker(struct mptcp_sock *msk) if (pm->ops->established) pm->ops->established(msk); } + if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) { + pm->status &= ~BIT(MPTCP_PM_SUBFLOW_ESTABLISHED); + if (msk->pm.ops->subflow_established) + msk->pm.ops->subflow_established(msk); + } __mptcp_pm_kernel_worker(msk); spin_unlock_bh(&msk->pm.lock); diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index 5c8764db3805..67f30d7c8080 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -372,7 +372,7 @@ static void mptcp_pm_kernel_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 void mptcp_pm_kernel_subflow_established(struct mptcp_sock *msk) { mptcp_pm_create_subflow_or_signal_addr(msk); } @@ -1348,10 +1348,6 @@ void __mptcp_pm_kernel_worker(struct mptcp_sock *msk) pm->status &= ~BIT(MPTCP_PM_ADD_ADDR_RECEIVED); mptcp_pm_nl_add_addr_received(msk); } - if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) { - pm->status &= ~BIT(MPTCP_PM_SUBFLOW_ESTABLISHED); - mptcp_pm_nl_subflow_established(msk); - } } static int __net_init pm_nl_init_net(struct net *net) @@ -1479,6 +1475,7 @@ struct mptcp_pm_ops mptcp_pm_kernel = { .subflow_check_next = mptcp_pm_kernel_subflow_check_next, .add_addr_echo = mptcp_pm_kernel_add_addr_echo, .established = mptcp_pm_kernel_established, + .subflow_established = mptcp_pm_kernel_subflow_established, .init = mptcp_pm_kernel_init, .name = "kernel", .owner = THIS_MODULE,