From nobody Mon Sep 16 19:11:58 2024 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 9FEECEEB2 for ; Fri, 26 Jul 2024 14:28: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=1722004127; cv=none; b=NXwOGvckH6m0Ye4lEuGG1XiBHbfyGbr0AcKzDOB7mrya6ev5Ac4MkOh6TxcvSgL1//Z5NpBmdZXmOZB3jgRMAJIM+q/MQS0u3jOmfKYaefFZWwwveBaHQ1WQseOT6o2gBY8LcsiKOxQe60wyP9JP/zwTmkUW458JDJA3JQoiSvE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004127; c=relaxed/simple; bh=CTC4imhwpdnjUeig5ztGalOlfqSBGDia+U0aTVysw74=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SJm/22No6lwWh0u5x7mRYtfgJPVubAx0TuoNachM5reWZ9taaeZEHaKxIpktjqziObHfaNvKAeiWHPMvJGdqCNNwmJAVyz/1M4u9thb27ajLYujadxec2STuT1uQTtSd8z4g61q+A52ytGRaoI0RvYutKFoTzY2gV47D7II+KUo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tKVHJpdI; 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="tKVHJpdI" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 521A8C32786; Fri, 26 Jul 2024 14:28:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004127; bh=CTC4imhwpdnjUeig5ztGalOlfqSBGDia+U0aTVysw74=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=tKVHJpdIXGHNkeHCjd6XNvvxvDMUNF4IxaNU4p93c8slGCatpaagz1hMzxNg5Fy6H Snp2zH/eL/NHf4847KqxOMpoth69tSLEZfs8IqvK1hvb+nMoljnVaSdX/DVywgVO9X cYyV4ov/zzBD1fMJudh7d6xiXTvSkdvgpZFhnDa8njWmQtbUOqug6ioFUzjlmNHLl6 2pjkK2vpwhgck6jpe0+W0Y2Pm132skZdh0kn1NxYrcYkCVc6BoADAfb8/A+oGTVeAM DYmx0yLA9qbQv9KPK0d9Wi3hbdwH49IJJF+EDG4XlSiAzJuoD/pxqmYbIs+E5OPX6Z +Kuug1goOMg4A== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:27 +0200 Subject: [PATCH mptcp-net v5 01/13] mptcp: pm: re-using ID of unused flushed subflows Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-1-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=1469; i=matttbe@kernel.org; h=from:subject:message-id; bh=CTC4imhwpdnjUeig5ztGalOlfqSBGDia+U0aTVysw74=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7KbCTc/M63gndE9FQzjo49tma+l4iD3XO6EE JZ07HeivsWJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOymwAKCRD2t4JPQmmg c+0tEADg8vQ0Lb4JyjJB07sf/gUxpmBOjUNvOhnFlQPvVEjhAbZLR4LgAeWWSFDyReS50d5/hy6 L4EFw5DiTHStpNj42BoQqXqcQNYHMy+WRORmN0uE5erxCG9JHypxLQcvrohAKl39JKrNeQTjqLC n0Fcxz42MiOfYCXYBZSBpQvkoUW0hkpk4QunoRz/LHCmApRNmRCcX/S0pzvt/PJeHITALo7CfjF hLCQQ5BTEYiO3/4oWL+eDaYSaVIoH0wWhUKTEV3daLrKxplKr9nc4vzllgEASIuwHG8yplOMXcX aQi7nxmRwa8pcYbmbJCwyd4as292lcXkKuVFtwQyR/IqriKP8vUvCTjzBAABQNIffeoy8/5G5Nb 2GLy/jXLxuEv83oIQYqdtesyIyrFCgG+DPOfXMXJqkdZjKCOkAZGhbeKDRJfhrVF3p2yEz5v2Im 99fYVp3SB880FgMWYW3UGRjSSljwncT83C12xjGro+XY2HwnJT034lKeyVKIDxGL1jv0ROHdxtK WgkPaf1tEIWrZ0FBVLti970ZLSjE6EaSfp7NAsCXQUgvt/9byC6O6GN0Svk8jXXo+Z0aJsEyhts X5fRu+4T6xr8iUhaE1nASubNEKL7mWqF+kU8BxPg3SaoLSZAzFWpOPqTxUKwl4ZqijwONlOcU3K eieNW4U2Vhl/37Q== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 If no subflows are attached to the 'subflow' endpoints that are being flushed, the corresponding addr IDs will not be marked as available again. Mark all ID as being available when flushing all the 'subflow' endpoints, and reset local_addr_used counter to cover these cases. Note that mptcp_pm_remove_addrs_and_subflows() helper is only called for flushing operations, not to remove a specific set of addresses and subflows. Fixes: 06faa2271034 ("mptcp: remove multi addresses and subflows in PM") Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Mat Martineau --- Notes: - v5: move the renaming of the helpers in a dedicated patch for -next (Mat) --- net/mptcp/pm_netlink.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 44336ee22707..00b3184be45b 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1625,8 +1625,15 @@ static void mptcp_pm_remove_addrs_and_subflows(struc= t mptcp_sock *msk, mptcp_pm_remove_addr(msk, &alist); spin_unlock_bh(&msk->pm.lock); } + if (slist.nr) mptcp_pm_remove_subflow(msk, &slist); + + /* Reset counters: maybe some subflows have been removed before */ + spin_lock_bh(&msk->pm.lock); + bitmap_fill(msk->pm.id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); + msk->pm.local_addr_used =3D 0; + spin_unlock_bh(&msk->pm.lock); } =20 static void mptcp_nl_remove_addrs_list(struct net *net, --=20 2.45.2 From nobody Mon Sep 16 19:11:58 2024 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 0F8BEEEB2 for ; Fri, 26 Jul 2024 14:28:48 +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=1722004129; cv=none; b=BqOSx5VD20FT1XsY14gBOHcMaq9APGqhNpeX30TWxLWbXVf/hq7LYPr/gIqA5kYFHD17nJnv2RPRFkpRxuWZmRBLi3pvJfsxpKmzcMhJj/f4QXfLJDuEpwaKAsHbxd1JA70smRhF0w0mDw94MBMgJjo/JRf0TXj8jUDcGOkt2Ao= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004129; c=relaxed/simple; bh=7OL9zvu2u9aLyHzCDngnpG9zPMbwRs6yG2DXD+ku5gs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NiXjLvgL2j07h//BnxlnJ6u20H9cYKncBFqUsw3VgZQEeBIx2WoKFBnnPg65rPC0yZms36uEMF+iWxNCkMZegKWPSSHdgSGAFNSRX8BuchANAHq385oIUuO7ovB7nvzsiqXcsL1+ir1F2de9IXqFk9+VCdESPDpgRrTFBqARfCI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ha+h1hHn; 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="Ha+h1hHn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AB8B0C32782; Fri, 26 Jul 2024 14:28:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004128; bh=7OL9zvu2u9aLyHzCDngnpG9zPMbwRs6yG2DXD+ku5gs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Ha+h1hHnE9jyRJuzhddilhj4xJAA/BLEMsVlYCIhcBcjuMlk2A7nkTU9P3R038rSH SoBVPBSQZXHwISOJ/MC4BFcah3aZkfyUZlQY2n1APtMiiQxzycOKCQ5HtNo/mtr9lF rhTUpV9RtDkZv0u1v7xvgW7m2SgGjveADQxBySOTu3T0x7itzZPL/sgw493xnBNk0O GS/1KgmaNKSqJWWCo+E32F/502yLHaIr9ly2YAA9vpOsgSxAFN1XJiRXj/fUdXL0Le WCJ52Q9ob+6Us0YeKyj1RNsOno0gBKeZZXjyNE33taq14/2s/fG04I6Jh3R27UhNGk n+dR+1qf2iBug== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:28 +0200 Subject: [PATCH mptcp-net v5 02/13] selftests: mptcp: join: test for flush/re-add endpoints Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-2-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=2174; i=matttbe@kernel.org; h=from:subject:message-id; bh=7OL9zvu2u9aLyHzCDngnpG9zPMbwRs6yG2DXD+ku5gs=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7KbTkL+Y9BDtm3OhlTggcDz5BcloIjFqjlGE 7PgOb22PhWJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOymwAKCRD2t4JPQmmg cyKRD/95klQg8SG+DYyLytK424doIJnBQOzoFFS4w0Aa5VDSzK4AWqAtGyhFWp9IUtX3EfRbitl xwVOV09BDPcttYDnSQw8YfENG6H7aOAG6FIDzMpeUHfAkcxGEBE+pKQ0hF2wnZ4GK+weJFiMLHv +T9eqTweL+15hbRQhQBhjAsL5J4nW59Q2WcWkdgoiQ+63JqFBg5uUmTalF4CF+ofcJTde89aOD6 yW8q2DJeasUFaVG/8j9Jnn3HbIK2uthv0Xc3fueAjXF1Rm1Zzx7i7/fIKdZRjJB42se1vz54Yp8 OqjVF+6nNRpoGA/hQ24Pqyo18yGi7es3FjqwIhwAjypte/ImVFmgqCnxnM3I9nBCiz6WgydQw6t Q8VGDb3PCNlcwe6sx020MUwfQycWRFcD7Rb9aznUZdxUb7y9ulTESrvNetN1ETMWYidwKLqx5jF WjOisY6ZcPV68TVWOx03YUfMwTG+iVQGizIHgy8g8ETB8XpQCcX2HAKxZzNebPzL4D3vQJTxL8N AldMkFKP2mRmcCDRCQxDErKR/ic6QrLrWwTZLHHaAQ36ki4wnWqxfj/68vWgp+GA2LudJxtWuC7 5DoHsWyar4eT7K1f1kya0EfSEgEdEV6Vw0gS7VGS0nX9ZIJ/CQp7yo9bUYcJGmlDmJbMEQQvzF3 ht9IpylG3sFBGmw== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 After having flushed endpoints that didn't cause the creation of new subflows, it is important to check endpoints can be re-created, re-using previously used IDs. Before the previous commit, the client would not have been able to re-create the subflow that was previously rejected. The 'Fixes' tag here below is the same as the one from the previous commit: this patch here is not fixing anything wrong in the selftests, but it validates the previous fix for an issue introduced by this commit ID. Fixes: 06faa2271034 ("mptcp: remove multi addresses and subflows in PM") Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Mat Martineau --- tools/testing/selftests/net/mptcp/mptcp_join.sh | 30 +++++++++++++++++++++= ++++ 1 file changed, 30 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testin= g/selftests/net/mptcp/mptcp_join.sh index fbb0174145ad..f609c02c6123 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -3651,6 +3651,36 @@ endpoint_tests() chk_rm_nr 2 1 invert fi =20 + # flush and re-add + if reset_with_tcp_filter "flush re-add" ns2 10.0.3.2 REJECT OUTPUT && + mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then + pm_nl_set_limits $ns1 0 2 + pm_nl_set_limits $ns2 1 2 + # broadcast IP: no packet for this address will be received on ns1 + pm_nl_add_endpoint $ns1 224.0.0.1 id 2 flags signal + pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow + test_linkfail=3D4 speed=3D20 \ + run_tests $ns1 $ns2 10.0.1.1 & + local tests_pid=3D$! + + wait_attempt_fail $ns2 + chk_subflow_nr "before flush" 1 + chk_mptcp_info subflows 0 subflows 0 + + pm_nl_flush_endpoint $ns2 + pm_nl_flush_endpoint $ns1 + wait_rm_addr $ns2 0 + ip netns exec "${ns2}" ${iptables} -D OUTPUT -s "10.0.3.2" -p tcp -j REJ= ECT + pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow + wait_mpj $ns2 + pm_nl_add_endpoint $ns1 10.0.3.1 id 2 flags signal + wait_mpj $ns2 + mptcp_lib_kill_wait $tests_pid + + chk_join_nr 2 2 2 + chk_add_nr 2 2 + chk_rm_nr 1 0 invert + fi } =20 # [$1: error message] --=20 2.45.2 From nobody Mon Sep 16 19:11:58 2024 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 266FFEEB2 for ; Fri, 26 Jul 2024 14:28:50 +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=1722004130; cv=none; b=qVp4eMSeDOWjNL0CeTTFKCnWewMVn4PZ/BfA3ZVqDXNu0jXsrRttHGnb1dZOGf8AYEKMKWUIjm+VKWeeVOpyQtfHOPxEEqnXXQupvrM2zaBmCIRTayelTlJuteyTbUQgyjZFIe9X+JBQMJ7eLqf568FPW6xtabTghR5yVZU7M9A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004130; c=relaxed/simple; bh=sPiZ4PtHi6ZHR1jkDYs/2XAKG+CEANH5UapQtJm1yuI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=vDCZTJGH5GGGXuaFOMev5VZLrSh7jVHI8Zxmdt6dQqPM/H7u+f3COvLwGoqDwg6AEeq9r9et62IN92pTaIpIvFFa2ddpL62MY+8gpCN0EbnIE+wRiFEPTcnlxkssNv+eMRKaV+N9cAugw30r6U+BSLkNpRsnKDYp/2Jflp0O38Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aBTgbonB; 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="aBTgbonB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 12A49C32786; Fri, 26 Jul 2024 14:28:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004130; bh=sPiZ4PtHi6ZHR1jkDYs/2XAKG+CEANH5UapQtJm1yuI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aBTgbonBMrTxceoGKBmZVtRRIUz5GfqEv0veeUlNLncRQE+KTsf8nsDo3SkXEXgeM CgpkEdRasb5MHyqqVTXehuxcuWlDLjwubvTsKYAQT5XUbpJ0PEUTBsN+4jAykJVx8q u4/9DY939Sv2uVmeJy1kVneRnFa8cUmGtraQj039V+K77BNjl85u/XIiwVBPjegmn1 BgoSMYU49em4PZOpSmGGxCrKMq0h06yILaxaGktMbnTG8icABuvsBqGiPOmD9EBJdx Ba8eqgq6gbjFX87wKtUG/11Hotl+VkWVMd89Rq38wD3PQTKgbI/kIVp8gALyLLtmwc k0FDNkZ5lsJJw== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:29 +0200 Subject: [PATCH mptcp-net v5 03/13] mptcp: pm: remove mptcp_pm_remove_subflow() Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-3-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=4829; i=matttbe@kernel.org; h=from:subject:message-id; bh=sPiZ4PtHi6ZHR1jkDYs/2XAKG+CEANH5UapQtJm1yuI=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7Kcsyw7drjoZHwZel80XSZ6J0LdAUF6FUEuT DMI5JnfgZWJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOynAAKCRD2t4JPQmmg c7jLD/4n6k1p7LqrGoWNstOdmYtyjly/BACT3cRM+5Zky3P2KrKQgQ5E0GK7l93X4TcHt1qyPpD BMf1NVRacuppBQ0T27x7DVYxwssZrKQG6aIjxyQE/b1Q+8Nn+e1SN9voAiKpvxQIxacWDO2ef1y UOQn+ZJXpQE5Y9VhFZg+ISm1oLjH+Gc4FzylZE0DtIE14i8dkUoFyQ6pz861/fJEVk/8SfLaMct ctHpkQsgGTPrl4Rw+WfdMGbhXPwv8dEG62NzHZ8CurjGCJSj+livRT9/HN7FgeUpl1FskF4KVyx U98UULBKvW+Y1wHV0XY/wWTtYRNQeCWwJ2zKATfw432CrXnxjFmGSxL83z/B3TbtP8OO3v4zmWz k5CdZk5TUyblU+odytYxVmYagaLwYFcblhFKCwWeL5fwLZz2l+ApOPUhGVGOx4Vwg2pTHldkeYK dp4cMuOMDRpmc2zmvfkTNlJfzZRwLRP3Qa9rBlmL0H4QiI9nzKbDCjsg9gQgqur0oHJfqwuui/n a+mPsEz4pv6+QF00XKS4ev91oWOfXlj21cr3A920a3cSJTgNoarG+CrSCzq9fsF7qOfntTYAMAJ ooKvzn62CEGfSGarsRqivpnon9WBiSx/KJJ5YfCZqd/FsQa/ilsbiBVgyliYZhKj1gC9FMN+NHi fCezhcOfsQS/7EQ== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 This helper is confusing. It is in pm.c, but it is specific to the in-kernel PM and it cannot be used by the userspace one. Also, it simply calls one in-kernel specific function with the PM lock, while the similar mptcp_pm_remove_addr() helper requires the PM lock. What's left is the pr_debug(), which is not that useful, because a similar one is present in the only function called by this helper: mptcp_pm_nl_rm_subflow_received() After these modifications, this helper can be marked as 'static', and the lock can be taken only once in mptcp_pm_flush_addrs_and_subflows(). Note that it is not a bug fix, but it will help backporting the following commits. Fixes: 0ee4261a3681 ("mptcp: implement mptcp_pm_remove_subflow") Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Mat Martineau --- Notes: - v3: - New line before 'if (remove_subflow) {' moved to patch 10 (Geliang) - One PM spin lock to remove address and subflows (Geliang) --- net/mptcp/pm.c | 10 ---------- net/mptcp/pm_netlink.c | 16 +++++++--------- net/mptcp/protocol.h | 3 --- 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 23bb89c94e90..925123e99889 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -60,16 +60,6 @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const s= truct mptcp_rm_list *rm_ return 0; } =20 -int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_= list *rm_list) -{ - pr_debug("msk=3D%p, rm_list_nr=3D%d", msk, rm_list->nr); - - spin_lock_bh(&msk->pm.lock); - mptcp_pm_nl_rm_subflow_received(msk, rm_list); - spin_unlock_bh(&msk->pm.lock); - return 0; -} - /* path manager event handlers */ =20 void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ss= k, int server_side) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 00b3184be45b..8a28fdaf3bb6 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -857,8 +857,8 @@ static void mptcp_pm_nl_rm_addr_received(struct mptcp_s= ock *msk) mptcp_pm_nl_rm_addr_or_subflow(msk, &msk->pm.rm_list_rx, MPTCP_MIB_RMADDR= ); } =20 -void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, - const struct mptcp_rm_list *rm_list) +static void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, + const struct mptcp_rm_list *rm_list) { mptcp_pm_nl_rm_addr_or_subflow(msk, rm_list, MPTCP_MIB_RMSUBFLOW); } @@ -1473,7 +1473,9 @@ static int mptcp_nl_remove_subflow_and_signal_addr(st= ruct net *net, !(entry->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT)); =20 if (remove_subflow) { - mptcp_pm_remove_subflow(msk, &list); + spin_lock_bh(&msk->pm.lock); + mptcp_pm_nl_rm_subflow_received(msk, &list); + spin_unlock_bh(&msk->pm.lock); } else if (entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) { /* If the subflow has been used, but now closed */ spin_lock_bh(&msk->pm.lock); @@ -1619,18 +1621,14 @@ static void mptcp_pm_remove_addrs_and_subflows(stru= ct mptcp_sock *msk, alist.ids[alist.nr++] =3D entry->addr.id; } =20 + spin_lock_bh(&msk->pm.lock); if (alist.nr) { - spin_lock_bh(&msk->pm.lock); msk->pm.add_addr_signaled -=3D alist.nr; mptcp_pm_remove_addr(msk, &alist); - spin_unlock_bh(&msk->pm.lock); } - if (slist.nr) - mptcp_pm_remove_subflow(msk, &slist); - + mptcp_pm_nl_rm_subflow_received(msk, &slist); /* Reset counters: maybe some subflows have been removed before */ - spin_lock_bh(&msk->pm.lock); bitmap_fill(msk->pm.id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); msk->pm.local_addr_used =3D 0; spin_unlock_bh(&msk->pm.lock); diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 23dd0ecd5fbc..fcf6983ca555 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1031,7 +1031,6 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk, const struct mptcp_addr_info *addr, bool echo); int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_lis= t *rm_list); -int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_= list *rm_list); void mptcp_pm_remove_addrs(struct mptcp_sock *msk, struct list_head *rm_li= st); =20 void mptcp_free_local_addr_list(struct mptcp_sock *msk); @@ -1138,8 +1137,6 @@ static inline u8 subflow_get_local_id(const struct mp= tcp_subflow_context *subflo =20 void __init mptcp_pm_nl_init(void); void mptcp_pm_nl_work(struct mptcp_sock *msk); -void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, - const struct mptcp_rm_list *rm_list); unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk= ); unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk= ); unsigned int mptcp_pm_get_subflows_max(const struct mptcp_sock *msk); --=20 2.45.2 From nobody Mon Sep 16 19:11:58 2024 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 77966EEB2 for ; Fri, 26 Jul 2024 14:28:51 +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=1722004131; cv=none; b=tn4+bu1yApM8ajv95PFBJIzjaG4rcDStKz3Av1qoSTJRBskY/Ip+m/tZuI/6GS1x7MD6GvloVF17ePqHW3llkza3mBAvXfkFVLnGHF780AnSps9Y195F3B2B0WfUn26O9Xp/MZhR39PPxgS4ethvvhBLsgKNMGsHMIGFc4oWDa8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004131; c=relaxed/simple; bh=7uKCkouFh7aZOTnXfxSEcsOj8l2v5R6KHktgqkOb79w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ro4X2qq2Vb6suy97QyE06cfz2uErXWV74WKe2XaYyxawSYOib+fSTsuVWKHfGay9aMldlX0uPtXsTb+a7LOVTbfws29HYRWEk5/pP8hn5LgF0Fbk8UHSQcQUtI3PKeqRzgx9U2oBNXYCC/vUta3ssXapy4/f3MEsaNMWrybm4Po= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NaCVeBjr; 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="NaCVeBjr" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6D6E2C32782; Fri, 26 Jul 2024 14:28:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004131; bh=7uKCkouFh7aZOTnXfxSEcsOj8l2v5R6KHktgqkOb79w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NaCVeBjrvW10xP4bhkA91DnyD5o0QyxOEIIsTaMsT3Ls7G8wGimwlKakKYG5aQ5Wl hsKwpduFIBxP++9dlfREdnrM6t8g6Ja/7veQnmUHELUHvxVS1Ow+jbsGYjkeC+bmDH NCyOd6pWFjcM5WjiqPEPAIvb7OjBDmMlxiDzXvf7A8xcTMMP4yMvSZrFQ1Z1YavMxV qU/M54/CcP9+2K/xOmXthLQzmvS2YDVkmRWe2ISNVDAnHRS2QsS/SiggA6nnqX41Bm 7MAxckeYhjyx0KyE5zaqbl3VhnHJll2JpVFvTb1yZNtYBdsKD1r8GoCEAZ4BNG4D9R 7xaxpOqU9GIIQ== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:30 +0200 Subject: [PATCH mptcp-net v5 04/13] mptcp: pm: only mark 'subflow' endp as available Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-4-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=4021; i=matttbe@kernel.org; h=from:subject:message-id; bh=7uKCkouFh7aZOTnXfxSEcsOj8l2v5R6KHktgqkOb79w=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7KcvA1aZ319h87q6iq9X0SLztNh8rBsJUGk+ G9G86vKpKSJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOynAAKCRD2t4JPQmmg c5/0D/9rb9zHX8//xh4e3Oc2TsQd+GROsJKvFojaF7gNCNMTK1N47ginEbhPI4+B7cDtjfZj1Sh wQoc9kA6Az038a6tvEstZmHaxkIDyfm0M9S/IgiRfHkGJosbSwnbttRcXuOyR1Iq5CRiHjbUBSA evQjLteYnBpFUPpeZuhyjkfAR7mJ5GzxAgQfp9ZcFNAdpV//G04LaZDCkYfo65+wShOcDB2RjA8 sBRXOKB8sfJfaSmbVgugFyISmKyztj0WrK91Y/2Ge/dQlJinzG4uS6xP7uSookQe/kSelZ1Ot4t um2sqAobiPc8d8I8WFS4l0xB2iFSPO9nnpWWj+OdreL/dclVHBiBm3wN4TeQ4cKAZC7nynMSVDx RouzeBFMwjNMGV3ljc1LBje7OXdrq3v7GIMchUlCJO9W02H34yJ+xxjBQ1KLpGWypqHDERIFfrg vQ4kvMJHI85ouJBQis4y93A9D7HjTYvlpvJwyohZNVaouIpzGMfgO9XVLlU1iZ0bnvon2MMMFG5 BeeQduB5oWZeUAMdlWHrDmIIJ3HAHO0WKnOvdSXXGZFFlkLR1MJ/iqHMV64V0fcPhNzZO03Gkm6 n7h5yeyTD4LB6IUYHTybF/6NPZgirSIpF5P8MtgzZ41bVRuF//PZG84X3ZHoE9wYvz8dm+fKOYg CH7Wadu8t8RRWJg== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 Adding the following warning ... WARN_ON_ONCE(msk->pm.local_addr_used =3D=3D 0) ... before decrementing the local_addr_used counter helped to find a bug when running the "remove single address" subtest from the mptcp_join.sh selftests. Removing a 'signal' endpoint will trigger the removal of all subflows linked to this endpoint via mptcp_pm_nl_rm_addr_or_subflow() with rm_type =3D=3D MPTCP_MIB_RMSUBFLOW. This will decrement the local_addr_used counter, which is wrong in this case because this counter is linked to 'subflow' endpoints, and here it is a 'signal' endpoint that is being removed. Now, the counter is decremented, only if the ID is being used outside of mptcp_pm_nl_rm_addr_or_subflow(), only for 'subflow' endpoints, and if the ID is not 0 -- local_addr_used is not taking into account these ones. This marking of the ID as being available, and the decrement is done no matter if a subflow using this ID is currently available, because the subflow could have been closed before. Fixes: 06faa2271034 ("mptcp: remove multi addresses and subflows in PM") Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Mat Martineau --- net/mptcp/pm_netlink.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 8a28fdaf3bb6..3ea417b52ff4 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -833,10 +833,10 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mpt= cp_sock *msk, if (rm_type =3D=3D MPTCP_MIB_RMSUBFLOW) __MPTCP_INC_STATS(sock_net(sk), rm_type); } - if (rm_type =3D=3D MPTCP_MIB_RMSUBFLOW) - __set_bit(rm_id ? rm_id : msk->mpc_endpoint_id, msk->pm.id_avail_bitmap= ); - else if (rm_type =3D=3D MPTCP_MIB_RMADDR) + + if (rm_type =3D=3D MPTCP_MIB_RMADDR) __MPTCP_INC_STATS(sock_net(sk), rm_type); + if (!removed) continue; =20 @@ -846,8 +846,6 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp= _sock *msk, if (rm_type =3D=3D MPTCP_MIB_RMADDR) { msk->pm.add_addr_accepted--; WRITE_ONCE(msk->pm.accept_addr, true); - } else if (rm_type =3D=3D MPTCP_MIB_RMSUBFLOW) { - msk->pm.local_addr_used--; } } } @@ -1443,6 +1441,14 @@ static bool mptcp_pm_remove_anno_addr(struct mptcp_s= ock *msk, return ret; } =20 +static void __mark_subflow_endp_available(struct mptcp_sock *msk, u8 id) +{ + /* If it was marked as used, and not ID 0, decrement local_addr_used */ + if (!__test_and_set_bit(id ? : msk->mpc_endpoint_id, msk->pm.id_avail_bit= map) && + id && !WARN_ON_ONCE(msk->pm.local_addr_used =3D=3D 0)) + msk->pm.local_addr_used--; +} + static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net, const struct mptcp_pm_addr_entry *entry) { @@ -1476,11 +1482,11 @@ static int mptcp_nl_remove_subflow_and_signal_addr(= struct net *net, spin_lock_bh(&msk->pm.lock); mptcp_pm_nl_rm_subflow_received(msk, &list); spin_unlock_bh(&msk->pm.lock); - } else if (entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) { - /* If the subflow has been used, but now closed */ + } + + if (entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) { spin_lock_bh(&msk->pm.lock); - if (!__test_and_set_bit(entry->addr.id, msk->pm.id_avail_bitmap)) - msk->pm.local_addr_used--; + __mark_subflow_endp_available(msk, entry->addr.id); spin_unlock_bh(&msk->pm.lock); } =20 @@ -1518,6 +1524,7 @@ static int mptcp_nl_remove_id_zero_address(struct net= *net, spin_lock_bh(&msk->pm.lock); mptcp_pm_remove_addr(msk, &list); mptcp_pm_nl_rm_subflow_received(msk, &list); + __mark_subflow_endp_available(msk, 0); spin_unlock_bh(&msk->pm.lock); release_sock(sk); =20 @@ -1919,6 +1926,7 @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *m= sk, =20 spin_lock_bh(&msk->pm.lock); mptcp_pm_nl_rm_subflow_received(msk, &list); + __mark_subflow_endp_available(msk, addr->id); mptcp_pm_create_subflow_or_signal_addr(msk); spin_unlock_bh(&msk->pm.lock); } --=20 2.45.2 From nobody Mon Sep 16 19:11:58 2024 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 D1A28EEB2 for ; Fri, 26 Jul 2024 14:28:52 +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=1722004132; cv=none; b=XSGjSboGTB0BSlK7aYNDBfkVE9MNHpWAZ7/JsXYOfHIv3Wzs+hQ6SRR7k6dCoKo4518rPbvdpaEB9ittR/Igqy0tr52YBw2sMNTTNRrv+XsNnPb8fIGfz2ZeB/TL7tOytkKyxPFbv/4QOwlheIgmJdlYyvz2rO52oGXn59gLaTY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004132; c=relaxed/simple; bh=mduGCcRiIBP5OAgif5NxHWNVDMa/IglXvs1M/ZW6KUg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JCxB8U0nxLZDsHKeijcxilj9HoRIT2MjJJx6+/z+eJD/E2/F8Ab8zakKPHNaIvttccr8So+Leofb6xd3rOu5B8fO1ASQHfrRxiNsBIYJ4APJhosdx4dnzo91GGPdl8rbQPeGl7gHuBjxS9aMbwPOShFvyA5bl+kO3cTGBg4FV7E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WcBPC5jA; 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="WcBPC5jA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C8AB7C4AF07; Fri, 26 Jul 2024 14:28:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004132; bh=mduGCcRiIBP5OAgif5NxHWNVDMa/IglXvs1M/ZW6KUg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=WcBPC5jA/qgwV+uuoXR6NlzX2zdtjPEhANcTFCQHtQfhlwPXfR1i2nycbqRAViWzm WcJX49VLmhwDhwgx7NDQPbBYGJW0zpqlOkMZHDvMsIbsWXptos6CsQ9DY8VNcMkHQv sOFKI0aTwWGWnVZdyEievaCaUFfu9LtlOaltPf4v0xCoe+G21e7BNG0OBTicB4ZDhM mS9S9wvKmMB4OjQQOHFlZ+jAyTzM9fWbPtXLZ8DPBvdhtTpXnSvAF2TSTCtSYwAtMD ia6Lswx+vjNt46l55uwODe3CMepdLwKifhHWoVhs60Nt7Sh6+EUlR5EYlE+cSV6ZyI dDU9Pg0knpOGQ== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:31 +0200 Subject: [PATCH mptcp-net v5 05/13] mptcp: pm: only decrement add_addr_accepted for MPJ req Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-5-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=1961; i=matttbe@kernel.org; h=from:subject:message-id; bh=mduGCcRiIBP5OAgif5NxHWNVDMa/IglXvs1M/ZW6KUg=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7KcbU1IKILfLpcRR+eMm+dE7ZCuOzCyVtPBT 5ghiWsDyIeJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOynAAKCRD2t4JPQmmg c8I0D/9pRyka/ZPynJ0zjmmFLw5RIsxKtHYG+hHPEe0NuzikXUU4zy+MIDErVFsZ1+S+ly3C/Xq 64Lj6acBd5d9B2WEn0PJ06hmFUBe7nFSPrfcOtYqPARdtoIAJnVIp3VglUsHESVC/0cAIvuOOdo Rjk6Ew2834G4u5A+qokzJ2iFyppSO2AOvW+CVAHCZHUhJ5HdEEthQYGnAhL6/a0W4By4oVV86bG Ztspfg8bdw/VRhzvbtW9a4J45Iq+284RNTnXOCNmXydnnpi8kQiUAhyF4/dv/Tu8sfrot7fhUtZ xuEACvB5UEDeG7CTeFkf84CaFNpxVwODxj1VodDSzK8CO1FFYhpgM36BVIQDGNi1yFu5GkzntO7 hXYSxAC5OLLcHGziP2QHZpRTx3wz8gTy6iUFI+hbYco8PHiHQpBnNrTaQHBAThE5o+JhUdxBUJH 4QtDMT/gONO/0MA4Sb1A12P60ab5tCgu5xw1zddPCi0qpHlP35Dyx78dT3u/SYDScuIFsgPPAiZ CB+tnDZjmPUFuEUiqpiZyPPMOyPoCyHuCjmui1G4yHKuzfz3UnCOfDq6eslf3zK4ZmT3onW9sW4 Mjj99/MQpg2mBdvwkhKT9FU1EOrqbJTvzpB5XXR+c94ZnoYUZfz/LOK77/jzBuwyvGcxtYzEiJ1 5Rr/sRt7T3w1J4Q== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 Adding the following warning ... WARN_ON_ONCE(msk->pm.add_addr_accepted =3D=3D 0) ... before decrementing the add_addr_accepted counter helped to find a bug when running the "remove single subflow" subtest from the mptcp_join.sh selftest. Removing a 'subflow' endpoint will first trigger a RM_ADDR, then the subflow closure. Before this patch, and upon the reception of the RM_ADDR, the other peer will then try to decrement this add_addr_accepted. That's not correct because the attached subflows have not been created upon the reception of an ADD_ADDR. A way to solve that is to decrement the counter only if the attached subflow was an MP_JOIN to a remote id that was not 0, and initiated by the host receiving the RM_ADDR. Fixes: d0876b2284cf ("mptcp: add the incoming RM_ADDR support") Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Mat Martineau --- 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 3ea417b52ff4..061fa3183eca 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -829,7 +829,7 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp= _sock *msk, mptcp_close_ssk(sk, ssk, subflow); spin_lock_bh(&msk->pm.lock); =20 - removed =3D true; + removed |=3D subflow->request_join; if (rm_type =3D=3D MPTCP_MIB_RMSUBFLOW) __MPTCP_INC_STATS(sock_net(sk), rm_type); } @@ -843,7 +843,11 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptc= p_sock *msk, if (!mptcp_pm_is_kernel(msk)) continue; =20 - if (rm_type =3D=3D MPTCP_MIB_RMADDR) { + if (rm_type =3D=3D MPTCP_MIB_RMADDR && rm_id && + !WARN_ON_ONCE(msk->pm.add_addr_accepted =3D=3D 0)) { + /* Note: if the subflow has been closed before, this + * add_addr_accepted counter will not be decremented. + */ msk->pm.add_addr_accepted--; WRITE_ONCE(msk->pm.accept_addr, true); } --=20 2.45.2 From nobody Mon Sep 16 19:11:58 2024 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 7647FEEB2 for ; Fri, 26 Jul 2024 14:28:54 +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=1722004134; cv=none; b=HMDTJ4eOPWZAppwfjn4ksR7D2oa5n1pIQMD27TzaAyFmU31cfrMQgkX3cTBP5wv8YhYdjKoTLOvdxtONKZDBPyZ8ym8b+usksziHRYN0lp1ig5iP5Bbp5VJ55M5BbXuyBzAx8sAu1Kjq4jdiPHF4YAQJWJdUrpk07mwwKs6/xTU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004134; c=relaxed/simple; bh=QTID3HPrjG3lfKaMKRNmiCmpVrUIWSta/TU+7EZDKz8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Hx8YzmelHWj79XwGevmsmVw74Q3cdBlh73EbtPFcdeDens4Zg6sRh5J8HCbVmtIcuzj6VIGlXLEFv8SWM7Uf2kZ8GJ6vP7A5QFPR3r39tT19GUi2irDH8UqIb2ul4B3ybXbD027a/w5QOLCa0200JnFDX9QDf1lYytiDpolpdPA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=S44MB1kA; 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="S44MB1kA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2D862C32786; Fri, 26 Jul 2024 14:28:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004134; bh=QTID3HPrjG3lfKaMKRNmiCmpVrUIWSta/TU+7EZDKz8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=S44MB1kAAUefV6VFqroSI6BYWtrbC8X3HwwWEpSuK06JuKq8jo/JMEkLvstt00KSr 0zqRvyk0bN6Rf6tldl5d6hmx6rYqZnkTFECPGBwzZFZ3tv4tjHZCH6wKTRfw+bMJEY F9AybpDHHhrQJvG8iX05DbuXXsPtFbIOKVk5ehjBVViDHUknh7kzWzDTJRYt7hv90v J5HzrjLV8pSq0ygw68NMrU90Ute7iVrPFOsDFg0JdCJyUQbpPcIkFBrzfpJDIk0rQS eR2hLHs+fDcqze+XihT3/2UGq76OQoZy3E1NmwuzjHfzPqDdNnwHEAhYUnPOYKlUVq Lfqan7so2DXWw== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:32 +0200 Subject: [PATCH mptcp-net v5 06/13] mptcp: pm: check add_addr_accept_max before accepting new ADD_ADDR Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-6-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=926; i=matttbe@kernel.org; h=from:subject:message-id; bh=QTID3HPrjG3lfKaMKRNmiCmpVrUIWSta/TU+7EZDKz8=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7KcMv+H0tU2px5aGuQTAJN4XmAcXfL6NKqOS lpHAQUorDOJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOynAAKCRD2t4JPQmmg c0qoD/4g1pvgOXLNiKkaM4Mr4RD6a9UYyKL1CCLPHXL81eJrrpwFm/ze83pM7dA5tkmQwsgsZ0Y BYDf/zO1vmBTHgVlkAl2v85pGRGEfmHJT3OMmqVS6IsEc3ITqHzDlyxRjo76zjizv819hExgY0p NbRxJvYuFuK3ENV0PKzeyq3atCFNawKM+j97aOn7nkW9bnQshEKjZJwwLGX4a5O9sVs5L5qRphF k4ppzkMI2Y+ZrRx+tX5+3Fw5QrWGGiAuL0Wx7bnGiUwfF+AMJejpd9M0HO4gs9Qd95XkwFChe8O kQ9CZREXzaj4nbAma+ZvZXYL2Wp0iQtynjzVhUAo9Q5kqUAngccxoeSv8aD6+5A6ozi5sU1JigE 2TlAvU5WN9v2wA8oAv+QxqmKh2jnFFsUYW7hgWhpj2lX+RDfoadB0eUGERV5ePnJGzSNvjJvbme oYNFVqYZ6YyhFlWFDiFIof8e6tyFD3qN1xEMQrgtJz+3Zwn/NltgYJB2Ka6V/CNw319u7iFBmeU 7jP4KyvmBSbOVnC7msRP43oD+4UDPKYMjEyQKpLBCWDpMZaoNQN0FU0+iAPhJhG3Fko3hbDyEe0 5YGv/hJfsTYV71EBMhwO1sD7i6nc9zXHg6bkTQV65s6DrVt8BUMOA52WmQzsYct91yILmTMgQBZ 8eQks4aarKie9BA== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 The limits might have changed in between, it is best to check them before accepting new ADD_ADDR. Fixes: d0876b2284cf ("mptcp: add the incoming RM_ADDR support") Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Mat Martineau --- net/mptcp/pm_netlink.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 061fa3183eca..3cb02fe359c0 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -848,8 +848,8 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp= _sock *msk, /* Note: if the subflow has been closed before, this * add_addr_accepted counter will not be decremented. */ - msk->pm.add_addr_accepted--; - WRITE_ONCE(msk->pm.accept_addr, true); + if (--msk->pm.add_addr_accepted < mptcp_pm_get_add_addr_accept_max(msk)) + WRITE_ONCE(msk->pm.accept_addr, true); } } } --=20 2.45.2 From nobody Mon Sep 16 19:11:58 2024 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 9772FEEB2 for ; Fri, 26 Jul 2024 14:28:55 +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=1722004135; cv=none; b=oeg2k3NjUBs640jxhSqcZDGJgxSfExsP/wHUcZLSXQSkg4b7tjlVe9FYjvM0VE4IEACwdZZii7fvQ1qbWNrrU9j5MbEc2SqczkX89iAOr/lNI7Ph1Ky/iGZxr/rV9IP+O2/4+y3wStoKqiUtGUNTtbEccfqDHuJkZ1FWhJ2zWK0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004135; c=relaxed/simple; bh=+d91lFsMQ1muFkSoMmSWbdY5ieuuCOxbXNJ7SGQttTs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PADL38PH4ppAtRyU+hZfEMpnL38nP6TayM/dReQeU18M3d1/o33NezX0kkzxaUecg2uDyKtp2bjj2ScaVgHotorem1QXzGvqWwsCw69uQ3PK5DOY0ddCJR5SYcJ8ucWmPlryQCJL/ZCr9ecYUxJUs7CEWKGICT3iWFkV8Bkf04U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ba/xyUTN; 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="Ba/xyUTN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 86D40C4AF07; Fri, 26 Jul 2024 14:28:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004135; bh=+d91lFsMQ1muFkSoMmSWbdY5ieuuCOxbXNJ7SGQttTs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Ba/xyUTNCi/gFT1TDPgwb0DU3l5OeZ7/gIAFKx9T3GNS2+JPY7N9v3uWVoqC0CxRC eqzY62kvITGMIHkfo5I7/VQxPFS1iPrT9y3yK0Wj1Ljjj+EmyST8MP4fBCBsb675hg BWAbxZrCoLsKnuQNEg0QTAdwJm1+GiG1SdRefYQTxxitZJDWlxUrwAvud2cZXPoZcH S1XgJZ3lgeg1ByDLEKHb/+SEiQY5ZQF9smgAnA4Y65VoQ+FwX6mNVh5W7WNzp6+aPA cvaiRZLqbp6sWQJjbbLQVHwRHJXn3Rk8OZybOHISqG0wmNt9k1J9QolT2MR+3szEtd PQD3dfICzlZPQ== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:33 +0200 Subject: [PATCH mptcp-net v5 07/13] mptcp: pm: only in-kernel cannot have entries with ID 0 Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-7-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=1493; i=matttbe@kernel.org; h=from:subject:message-id; bh=+d91lFsMQ1muFkSoMmSWbdY5ieuuCOxbXNJ7SGQttTs=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7KcfpDAWECBsroh3JLdDOwiQZvL7061ZDUsR J0UHN0qlh+JAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOynAAKCRD2t4JPQmmg c3LcEACkNIWWeEzcsUOY0SwXfx5hK6e58n2Q7/ZldDeNdQNR+NtbO/hSMLcwDSB60zhw+peHNy8 pzCmVhZ+4LKduWnf+mUON0STfFeLhllsPRXWyzHTcDQ87HBYd9WuLTpPhDO1dTMiApzjMLhGp2F ldU8fhyoOiFxf0yycaTC9wjam9qGuhZG9oeV4450vz0cAeDVHlFm+iMrRVi3VMRyx2EML761WYS VqXuk2g7sZYAppFMKE/nJYiJVkuxbDyEu/TBLlXuQ/+bRUJc71TMFLWHVvh5as0ZfU1IvHyioXR evOh9T39IlVG6ub6yhB5LlE7oz635mMguGkrVvQLv6zBzFaq0fFOZsAQICw6FW1lmz8dBDmVh/m CUIdFTHPS9L0kQNqBIYPabqPt/QKvyBv2eQAn3rk/svJx0OH4tX+dk5AfAxWvgHxzKDumziLXKi 4eh4SoZMumkOyDrxE0oC5ylDAq1TWiSzD17KdTFAY203gAXaU7EUUIMxpWkRqlYDErBxUaExwse JTP3gFDJxvfH5JqA4yJwBAQplm5tg0b0gVrMw74nVADmzrykxaj9/skLJs4f/RruaFP52oRHJN7 30r12NB6jb0MxveIZnyTCzc0xWKnDXb8Hy9TO1DynDvdbNqkQ8u/OScUTqYWEY1d8UmAF9Sz5RY WFDqP6IkNgyPe6Q== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 The ID 0 is specific per MPTCP connections. The per netns entries cannot have this special ID 0 then. But that's different for the userspace PM where the entries are per connection, they can then use this special ID 0. Fixes: f40be0db0b76 ("mptcp: unify pm get_flags_and_ifindex_by_id") Signed-off-by: Matthieu Baerts (NGI0) Acked-by: Geliang Tang Reviewed-by: Mat Martineau --- net/mptcp/pm.c | 3 --- net/mptcp/pm_netlink.c | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 925123e99889..3e6e0f5510bb 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -434,9 +434,6 @@ int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_s= ock *msk, unsigned int id *flags =3D 0; *ifindex =3D 0; =20 - if (!id) - return 0; - if (mptcp_pm_is_userspace(msk)) return mptcp_userspace_pm_get_flags_and_ifindex_by_id(msk, id, flags, if= index); return mptcp_pm_nl_get_flags_and_ifindex_by_id(msk, id, flags, ifindex); diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 3cb02fe359c0..6a1495fec7ae 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1395,6 +1395,10 @@ int mptcp_pm_nl_get_flags_and_ifindex_by_id(struct m= ptcp_sock *msk, unsigned int struct sock *sk =3D (struct sock *)msk; struct net *net =3D sock_net(sk); =20 + /* No entries with ID 0 */ + if (id =3D=3D 0) + return 0; + rcu_read_lock(); entry =3D __lookup_addr_by_id(pm_nl_get_pernet(net), id); if (entry) { --=20 2.45.2 From nobody Mon Sep 16 19:11:58 2024 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 E97F5EEB2 for ; Fri, 26 Jul 2024 14:28:56 +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=1722004137; cv=none; b=AUZ9bBYmgii72ZIUU7GP4XPO2WyFOgGu7PBtnsnkaMM+Rr/ZJXJljsJXSlgMmlxuRIzxJsxk0uaBHhBeSLI4OHl5IRFywzCU7yRzzrV9XpCnqPggS28ovnPQlWiEiXFycLRLO8Kx6Om/U0h6hVGSlKUg5vzs3ekgjOw8Wo1gckI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004137; c=relaxed/simple; bh=/cmdvJT5Gad6cPwXZd2hg71GhRcpI1wLIsFSm6YgtGU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Lie73VHFfjsJPynV40eRuMEoGuqyeVbcBaT52PHPOM4XY2V8Pr04+v5cVdRFvzhcv/nxoQBfMEyj38Ax8GfNeu56r1xqAksrl/tno6OdOFtl7UnMSqu7Npk+AtPRc5YKTEKnHPLL1xBNJh6jqBCZv1wkx2sD9sd+8AH7kI0HYDY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ag6JpCxD; 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="ag6JpCxD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E2574C4AF0E; Fri, 26 Jul 2024 14:28:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004136; bh=/cmdvJT5Gad6cPwXZd2hg71GhRcpI1wLIsFSm6YgtGU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ag6JpCxDanW68Cbk2f4YbzbtZ8pJSA9+aEBp7Tiv9D9IA4Pphix/4LyATrrxkIbV3 Kzi2KW/VMauns2kvPlByD22k+efa41gdQ3B5/QAssSgK/PVDPbkg7zCo+dnYvknnMT jqylUNWe6KsNkrxDI5NEx2ipOd/wg4ZTja/fAviLlbIgFE1COKroaqk6UM+/NC0rnv UpyMKprI0s72TAP2umWrJQkAoi4+q+5qRnnmhjUnZKAQef9a+KX1JgI+DoCxbs1oLP 4K8ZbKJJSDa55swIbHQ8IlAsbPed9Q0VfLxLdwM1DzAzwFkwIjmlUbGjsF+kE3hYsh RCkjG3BuGuP6A== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:34 +0200 Subject: [PATCH mptcp-net v5 08/13] mptcp: pm: fullmesh: select the right ID later Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-8-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=2053; i=matttbe@kernel.org; h=from:subject:message-id; bh=/cmdvJT5Gad6cPwXZd2hg71GhRcpI1wLIsFSm6YgtGU=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7Kc5GfaDGEyP5d1DD0jP4kFnhGqMgT+zPDqt +Qx49UIA7iJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOynAAKCRD2t4JPQmmg cxwKEADq+/HViBk1E2ic19pVindb8Q9BL+d6taY1DKYAX4butBUcr778cHHOkfcfxGQ+00t4W9k wa2j2BD6vLIg7KuEn6Tajkv434UKoMZH01FBtVNEVUEJ8YGFiKOV8hHnPlzuiUO2Pt+bRBfBBGg A39rP8FfEU5+wlbU/mU1mn9mhcpXH0RD+st3sgIR5Fz/ihLVGUSLOmc8Gre/WQUF+7f7f0thK+M UZrPk8+9IELXxG2Yh08Cs955hCT1QkiycuHWYLlvKAEPvXzMhIhevD3uwcn5Xc+a5/T7eCgXXhK GiiflGXini1geIKmGZMDi54iih4nl/ykcOOJm3prxEWsr3+1W5Sv3ggxIxpNP9nrNmOGjyyBdyt I3iQoCWLH65F+4bN68KRoryfAfaHbTqUlfParWiwiW4gsGTS3V0GESzbCYmTyXiAgoTVQftX94F 1zuywSGKUSsktzNHt453W/1fSL/mZCRuWwUGE2fWAPiBNxXa5V5qJsQ8LPbAw7zA2GJOwy8zgXB eMGZUIfqLOpSqb3Omojfl7JykMDh+WI5uJKfTeoIt0fEB/5db3RwjzplkK0EHm8B8Ia7oXd3N8j h7yN5eAd+IF0UZQJqDxySr3UIt8dM+nZY6DsTn9u0bT4n6LHAw+YATxeRjecmMTFIYurPrPaclG 7fbLNJQWa7/gPKQ== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 When reacting upon the reception of an ADD_ADDR, the in-kernel PM first looks for fullmesh endpoints. If there are some, it will pick them, using their entry ID. It should set the ID 0 when using the endpoint corresponding to the initial subflow, it is a special case imposed by the MPTCP specs. Note that msk->mpc_endpoint_id might not be set when receiving the first ADD_ADDR from the server. So better to compare the addresses. Fixes: 1a0d6136c5f0 ("mptcp: local addresses fullmesh") Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Mat Martineau --- Notes: - v4: - Check that msk->first is not NULL. --- net/mptcp/pm_netlink.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 6a1495fec7ae..bc9c2e40881e 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -636,6 +636,7 @@ static unsigned int fill_local_addresses_vec(struct mpt= cp_sock *msk, { struct sock *sk =3D (struct sock *)msk; struct mptcp_pm_addr_entry *entry; + struct mptcp_addr_info mpc_addr; struct pm_nl_pernet *pernet; unsigned int subflows_max; int i =3D 0; @@ -643,6 +644,9 @@ static unsigned int fill_local_addresses_vec(struct mpt= cp_sock *msk, pernet =3D pm_nl_get_pernet_from_msk(msk); subflows_max =3D mptcp_pm_get_subflows_max(msk); =20 + if (msk->first) + mptcp_local_address((struct sock_common *)msk->first, &mpc_addr); + rcu_read_lock(); list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { if (!(entry->flags & MPTCP_PM_ADDR_FLAG_FULLMESH)) @@ -653,7 +657,14 @@ static unsigned int fill_local_addresses_vec(struct mp= tcp_sock *msk, =20 if (msk->pm.subflows < subflows_max) { msk->pm.subflows++; - addrs[i++] =3D entry->addr; + addrs[i] =3D entry->addr; + + /* Special case for ID0: set the correct ID */ + if (msk->first && + mptcp_addresses_equal(&entry->addr, &mpc_addr, entry->addr.port)) + addrs[i].id =3D 0; + + i++; } } rcu_read_unlock(); --=20 2.45.2 From nobody Mon Sep 16 19:11:58 2024 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 4CFF8EEB2 for ; Fri, 26 Jul 2024 14:28:58 +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=1722004138; cv=none; b=CQcIC03ulYAjmoZqISOcxHbE4c2XDaepguiJUbGA71LMY9P5NeYdkoapjpzBwqDCyRk1TCC8Ftu34M7Q2fCcqk2Mgm7+TV8r1lZoczhvIfY1Hs+FKDBxRs2SpxSN9ZFAbTpS1Sjr56M+FfN6pbr1qB8IFfXoH+sOnnODqY89o5o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004138; c=relaxed/simple; bh=kq3y1H1/YpmOtJdHX3jLabmwtlhBIfmiwDH8AEU7GQk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XZ3mTBv8RzfgkIzHF0ozKlCiUX+4wK9nSMrWi8c6ktbhYTOr1jXelqkZfk6fTiJEHqzkFz74PfL5vAWjTg2pn1L6yrDAfxf2pi0nm9pcX1/umPHKeP0GdO/2pqrehc2e9oA2XV68H+qIOJqkhPxampE6NbToiaC8Ee84uXkoEFE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ai4qk+R3; 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="ai4qk+R3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 46D39C4AF07; Fri, 26 Jul 2024 14:28:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004138; bh=kq3y1H1/YpmOtJdHX3jLabmwtlhBIfmiwDH8AEU7GQk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ai4qk+R3kWiuFDsWdH4k/grYjnh9BBJNTHJHaqRPQJq/TAevNCl+vWNtjH7zAwTNK HFD59ab7IWmEmLU0L9YAccmm36i712MaZS7Gqll39EpERjzhThwq36nYzOU+aEmEXh fhnxmK0KfnpRkpR6D2mc+m0mIOVzUNFewmHba4/1dQP/Kt/LxHAqC2i6ujw14HAakm iZXVSX+g7WGny2XPNYuNo3DRUKwum0NXHoQHqWgyPv4heu3jG7Fuh7Ehr2Ovavk7Lr 6roKi5jqmWslt/pGYDBiLUzuv9qZ3n/O6hl5XJl8uHee9rj0Q/tNyUcXbtYotvszl8 og7lHvqtZFxKg== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:35 +0200 Subject: [PATCH mptcp-net v5 09/13] selftests: mptcp: join: validate fullmesh endp on 1st sf Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-9-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=1198; i=matttbe@kernel.org; h=from:subject:message-id; bh=kq3y1H1/YpmOtJdHX3jLabmwtlhBIfmiwDH8AEU7GQk=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7KcLN2+WFDqtTOwfI5kUJcZ73B5CCcmnV4mi SBQC6ohR3eJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOynAAKCRD2t4JPQmmg c42dEACZRQKTPuKHXMzQuMerC7r6glCEywkLqI88bmN49zd56Vg++MULARcfkS6r7RJ4BbxDet3 DVy3tYWpOtUclI+jRQZorBLBb9MmUDVooQ0lVPjFJRwgaIbPabaA0u08W+IR37FNyqPFgZLIeyk MeoiDr45rDDMdOHC+ioeVLkP35vpEkQAwH6L0OgOUu+RE8iC0GiDWg8NjhEQGK0pJcsGAr9ORcf IoUK5OgfuwgXh319hmg9B6AHJDe4UFzRbv7PaiQONK1tHz4sVUjj+xfuSsx6XEfvbsah5vPuT1A BnBqXLHZzYqA4dHXkIEzUR/XR3LHRzQZ4P44og/mFbHQ+5ydYxVF6JooYkx+zWQDnmALYaXKuNt 6b8ov2euUhGbSSIt+Bnien2YP5c4cLtr6Y9DffubqAKnOJeeW3amMRRi69Bthe7BSJJeR/GFVz/ TpZjnpSuIYtIRw6v0itY8Aa60qQiyW24n51cDP/dpHXphgDAUQKxkKlYvCgG8Mk5szdn8cdE5ND m4eFZ1ekmsvJ5jiIFZWjoc+Ayy3qeXu9+nCSZ7HU9y+F4Uh+tYikZjIIMzCkHIQYn0JhEEsxV2Y +w7wTbp4wMkflmP+44/hOCaIuqA3MunV+Mt5Q8S92flChItGb8EIZMv4/JWGS87BL342/zGv2lz haAPV3K2t66buHQ== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 This case was not covered, and the wrong ID was set before the previous commit. The rest is not modified, it is just that it will increase the code coverage. The right address ID can be verified by looking at the packet traces. We could automate that using Netfilter with some cBPF code for example, but that's always a bit cryptic. Packetdrill seems better fitted for that. Fixes: 4f49d63352da ("selftests: mptcp: add fullmesh testcases") Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Mat Martineau --- tools/testing/selftests/net/mptcp/mptcp_join.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testin= g/selftests/net/mptcp/mptcp_join.sh index f609c02c6123..e4ac275366ce 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -3058,6 +3058,7 @@ fullmesh_tests() if reset "fullmesh test 1x1"; then pm_nl_set_limits $ns1 1 3 pm_nl_set_limits $ns2 1 3 + pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,fullmesh pm_nl_add_endpoint $ns1 10.0.2.1 flags signal fullmesh=3D1 speed=3Dslow \ run_tests $ns1 $ns2 10.0.1.1 --=20 2.45.2 From nobody Mon Sep 16 19:11:58 2024 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 D683FEEB2 for ; Fri, 26 Jul 2024 14:28:59 +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=1722004139; cv=none; b=cS58upIJobgmnvF9zvEuPy+kazEc3VUtLzaLGi7CMi7A0PjntCAOqnwmtur0qzwux0LEBG38mpmS0SllMFQqeQXUUOzkk+huMdoDHcUUwPYn4E15VAFjqcEpj5vugkxFdvekNtguHY/bP/H8WR7WMckcHhx31issG7pIIfzouB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004139; c=relaxed/simple; bh=DOHoy8izdqQ/61q3Mvd3BLf7aV7oytJb0i8xgA4dX4k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WFYxPOO9K+g5o5dZWO5OL/dk/nx9Yzz6ymVxpYHr8eejRw57o9Tegy/n3dR1/r1EknaXL+aTPC5D8lOkPJBEtRd3gnQmtX60I1LKrUGXJO9nI0xw6PzPbtBEzaoNnLvwKwPS2GPGWoFwEExgKfDg9gekZKxlYMpY2poVsA9U9NA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ourX3/PV; 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="ourX3/PV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A0230C32786; Fri, 26 Jul 2024 14:28:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004139; bh=DOHoy8izdqQ/61q3Mvd3BLf7aV7oytJb0i8xgA4dX4k=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ourX3/PVP6Oq65ziT/twv+jmUHaiOhK5f+XJRogWX7zbw8rrrTuQ5tkilRDkMqVtL vQm3gXpNJGEKyGrLnos1f+o34Ue76SlO2TqztHJmAlTrk9spm0Lv0zdPHhHbkLzqt8 ymUsJ5xvaHqczXM0gcpIsdTfHQ1nBKamrZEwVSIs/gOjiwMihb5L99ckx1FnYT5Qag wQ9HkZ12TOcgtIMd6KKpnw6FO2y91rtTEs2kTP76CwrUSm2m5L17uCqwgNYfaRAhJp ycsXa2rdRTVbYjbdepFcX0uS3vvYtjS27I/mETYGoVDyOotHfPqGPGRaHSTpFolLwO fynmQRakALlrA== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:36 +0200 Subject: [PATCH mptcp-net v5 10/13] mptcp: pm: avoid possible UaF when selecting endp Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-10-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=5548; i=matttbe@kernel.org; h=from:subject:message-id; bh=DOHoy8izdqQ/61q3Mvd3BLf7aV7oytJb0i8xgA4dX4k=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7Kc6y7SoE19SQ5BkxzNeODhKiZJRUvhaKTqd nOK2Fklm4aJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOynAAKCRD2t4JPQmmg c4pID/9ZRPGgac4+FXnYUPOsVLQf/bpbfrgfSyLR26AYn3sshOWHv1t8lnG5gpoEwYh94mjbR+x ACjvlXf+RabRxfSY6yK0McMjVeIi6RyWH0swJ1Y3RhjuNBFXAyAnbkkRoryYn7n9e/slBywfjn/ 8+p73CTJoyZK/B3yz8nLw4G2QvKa4IiwOvOFanitUyZVUkZaRov9lW5VcN02/+axcYkLCBdiQ2/ GtZAmHVgonlGvAmgcl/6W3+bxbrpcoufNCeQJs1k2yl4L2C86ejRZ2wwJae3cvTR5OWSG849OlV uXHukibZBsab+2oSluuU53fqTZDnY8XJd+WlMIYq5BDnjETDQR4MpRkpFapi4fHdgVAgk4Hrhkw Ps4MCAu+qyz50vr98EhukD7zkOzApmaiix77gYqcI/EMzFZOwRD5Mylw2t57+pLozzz1mlnR7t2 1dVgxjukIpORKqaBAa3CgIDX9O4LtEtrZNJAx2UMHRA8o/oXLcj/2iPKerbgFuoxt6ja0VQnUwe qjyR0gXRuL2TQWgQE66JUEdw5e8OLAF8o58hJnOqUHGHvR6WwOrtLNRq+z7Qrwal9mqbc20jsb5 85EseFV/xVeXp2TsjYz2o/HCAXEjhtP2ROnIXV/pQv07mnlyZuSFmZ/7vj5xdTPrm9mThqMUGF4 IneA9ueSnmfm8ww== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 select_local_address() and select_signal_address() both select an endpoint entry from the list inside an RCU protected section, but return a reference to it, to be read later on. If the entry is dereferenced after the RCU unlock, reading info could cause a Use-after-Free. A simple solution is to copy the required info while inside the RCU protected section to avoid any risk of UaF later. The address ID might need to be modified later to handle the ID0 case later, so a copy seems OK to deal with. Reported-by: Paolo Abeni Closes: https://lore.kernel.org/45cd30d3-7710-491c-ae4d-a1368c00beb1@redhat= .com Fixes: 01cacb00b35c ("mptcp: add netlink-based PM") Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Mat Martineau --- Notes: - v5: - fix typo in title: s/whend/when/ (Mat) - avoid using memcpy() when not needed (Paolo) --- net/mptcp/pm_netlink.c | 64 +++++++++++++++++++++++++++-------------------= ---- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index bc9c2e40881e..0dacf16a4b53 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -143,11 +143,13 @@ static bool lookup_subflow_by_daddr(const struct list= _head *list, return false; } =20 -static struct mptcp_pm_addr_entry * +static bool select_local_address(const struct pm_nl_pernet *pernet, - const struct mptcp_sock *msk) + const struct mptcp_sock *msk, + struct mptcp_pm_addr_entry *new_entry) { - struct mptcp_pm_addr_entry *entry, *ret =3D NULL; + struct mptcp_pm_addr_entry *entry; + bool found =3D false; =20 msk_owned_by_me(msk); =20 @@ -159,17 +161,21 @@ select_local_address(const struct pm_nl_pernet *perne= t, if (!test_bit(entry->addr.id, msk->pm.id_avail_bitmap)) continue; =20 - ret =3D entry; + *new_entry =3D *entry; + found =3D true; break; } rcu_read_unlock(); - return ret; + + return found; } =20 -static struct mptcp_pm_addr_entry * -select_signal_address(struct pm_nl_pernet *pernet, const struct mptcp_sock= *msk) +static bool +select_signal_address(struct pm_nl_pernet *pernet, const struct mptcp_sock= *msk, + struct mptcp_pm_addr_entry *new_entry) { - struct mptcp_pm_addr_entry *entry, *ret =3D NULL; + struct mptcp_pm_addr_entry *entry; + bool found =3D false; =20 rcu_read_lock(); /* do not keep any additional per socket state, just signal @@ -184,11 +190,13 @@ select_signal_address(struct pm_nl_pernet *pernet, co= nst struct mptcp_sock *msk) if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) continue; =20 - ret =3D entry; + *new_entry =3D *entry; + found =3D true; break; } rcu_read_unlock(); - return ret; + + return found; } =20 unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk) @@ -512,9 +520,10 @@ __lookup_addr(struct pm_nl_pernet *pernet, const struc= t mptcp_addr_info *info) =20 static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) { - struct mptcp_pm_addr_entry *local, *signal_and_subflow =3D NULL; struct sock *sk =3D (struct sock *)msk; + struct mptcp_pm_addr_entry local; unsigned int add_addr_signal_max; + bool signal_and_subflow =3D false; unsigned int local_addr_max; struct pm_nl_pernet *pernet; unsigned int subflows_max; @@ -565,23 +574,22 @@ static void mptcp_pm_create_subflow_or_signal_addr(st= ruct mptcp_sock *msk) if (msk->pm.addr_signal & BIT(MPTCP_ADD_ADDR_SIGNAL)) return; =20 - local =3D select_signal_address(pernet, msk); - if (!local) + if (!select_signal_address(pernet, msk, &local)) goto subflow; =20 /* If the alloc fails, we are on memory pressure, not worth * continuing, and trying to create subflows. */ - if (!mptcp_pm_alloc_anno_list(msk, &local->addr)) + if (!mptcp_pm_alloc_anno_list(msk, &local.addr)) return; =20 - __clear_bit(local->addr.id, msk->pm.id_avail_bitmap); + __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); msk->pm.add_addr_signaled++; - mptcp_pm_announce_addr(msk, &local->addr, false); + mptcp_pm_announce_addr(msk, &local.addr, false); mptcp_pm_nl_addr_send_ack(msk); =20 - if (local->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) - signal_and_subflow =3D local; + if (local.flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) + signal_and_subflow =3D true; } =20 subflow: @@ -592,26 +600,22 @@ static void mptcp_pm_create_subflow_or_signal_addr(st= ruct mptcp_sock *msk) bool fullmesh; int i, nr; =20 - if (signal_and_subflow) { - local =3D signal_and_subflow; - signal_and_subflow =3D NULL; - } else { - local =3D select_local_address(pernet, msk); - if (!local) - break; - } + if (signal_and_subflow) + signal_and_subflow =3D false; + else if (!select_local_address(pernet, msk, &local)) + break; =20 - fullmesh =3D !!(local->flags & MPTCP_PM_ADDR_FLAG_FULLMESH); + fullmesh =3D !!(local.flags & MPTCP_PM_ADDR_FLAG_FULLMESH); =20 msk->pm.local_addr_used++; - __clear_bit(local->addr.id, msk->pm.id_avail_bitmap); - nr =3D fill_remote_addresses_vec(msk, &local->addr, fullmesh, addrs); + __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); + nr =3D fill_remote_addresses_vec(msk, &local.addr, fullmesh, addrs); if (nr =3D=3D 0) continue; =20 spin_unlock_bh(&msk->pm.lock); for (i =3D 0; i < nr; i++) - __mptcp_subflow_connect(sk, &local->addr, &addrs[i]); + __mptcp_subflow_connect(sk, &local.addr, &addrs[i]); spin_lock_bh(&msk->pm.lock); } mptcp_pm_nl_check_work_pending(msk); --=20 2.45.2 From nobody Mon Sep 16 19:11:58 2024 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 0BA7E17C91 for ; Fri, 26 Jul 2024 14:29:01 +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=1722004141; cv=none; b=dvrXMcdy/gXZEOeJI/SPlyOBsJA+VUnOOSXRW2yRLn58WEz0Fse/GHe8E9iwZOpJOG8Rb6bmNSvWKQXGN6KwzGPUTciNarAQ0r9s8l2DJLvlhJuC5IB3q2gP5ndWLddxUReDZbiYc6zIoZrJLisqYO/qBYLhq2TUJsTPQSuUKEY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004141; c=relaxed/simple; bh=53JW3RoFcd4yDZHUyulcX/HSTib4DOjuXZ2Hoe7xl0A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=C+TrKZ71j8/Z4gYYidZgTg6znWYGdHFii/FjCZi5tGxFduH8HZZwoG9IQWPZs8bAgPY3V4DAoXS3bBxvlgXav9EIRyKK8YcouPjLnxfq+DA7oP8wy+LDNpkqd7FE8PaxbGUCZA0qZ0Cf3IWbiUo44buWnqJrBrFIhGADsPi33CA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=AyA6zxlx; 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="AyA6zxlx" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 06F97C4AF09; Fri, 26 Jul 2024 14:28:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004140; bh=53JW3RoFcd4yDZHUyulcX/HSTib4DOjuXZ2Hoe7xl0A=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=AyA6zxlxxr/SMe/CSHzurSL+nTSmy22zi4weHUZVtVbpkziw2+CdR4I/eogJPp6Wa QrXNeF6ZccsUv6I5PYoOIKdpSVmglxRjxcuSm230Bnj73WEmXnlkZtZ7s8kkT8aIFN PQpLjazqNlgrqCvl1SATIvtPVmhT+DwFnWoalL/oJu5M/DaPg+Dm1jIoyWA/+uN+1d BCJ3OzxPRIqc9TVYgDh9Xg/jxMU5WvuE22MaMt3K05QFejxbO/ohV9k67ic8IBNPWC vzdwLI5q7mBpXC/0rR0QBBiCL49iDkoJafq5UjKPre6ZYEslBtqPuLlcGRRM2hBIVJ 1wB4FRlpMVNzA== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:37 +0200 Subject: [PATCH mptcp-net v5 11/13] mptcp: pm: reuse ID 0 after delete and re-add Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-11-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=1479; i=matttbe@kernel.org; h=from:subject:message-id; bh=53JW3RoFcd4yDZHUyulcX/HSTib4DOjuXZ2Hoe7xl0A=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7KcIMoh/rpn8k0MwK2Ap2KvK8oPDs62ngOVU Dzp448L7dyJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOynAAKCRD2t4JPQmmg cwXiEADm0qfbV7tRv+8HNDAWPmgY5VURHsaDvh0pz/waKpCzEgIDpu3/8MBpd5rPLDqXYqqnNzA PCZRdAYgpEpuywqQK0qui7D43Bw3h6i6zXbihlObpbZAmVh4LTjQw9NhTMXg6UqJqJ2RWIsXC9Q 7cB7f+zppB3qoyP1Hf3EPHzAp5NZud1leoNXBW4IVP6Katx543PmWXF4qZUYPbd1d37cYQgau20 j7H0axDziUtK/smJ5/iJDrFwML43cSrH44BFxfgqZSGzqXFrCi06K9hgi/rHIurGtf544HN++/v 4mVt5n6NZkuAMR4zkBH5qjvKs3T5g0Kc1HyimI2R1wQRIoXAFcXmHvajHIhck78izVaGBilWmg+ UaLcDDDDCZDnfVhoBw23BdpGbNQV1onOgymiDvVK+zrMdYfbYkyEQyV3wQInYdukiycotkkB+mo 73pPUOrPRu14oYvNGzUDNz4EPjqnOcmfLtMhrCf5gq2Wpt3Wfq4ASlb8KAzAN5l1fAo8vaCPjqR yPVBcyq45rgCM5oy5LZNnCGcczoaZhJgNmwnskPhcUYMbeaKUPEuIwDtST9M0qZr18D0xCUxs1R Xpj39rgSf+wPwQCej1Omv+vzFaOl7poHiSZidTJ81oxxWxCFcN+7ff86+1vd1aOHh/Tw6XcYzXs XkxdjPg34CYXoxA== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 When the endpoint used by the initial subflow is removed and re-added later, the PM has to force the ID 0, it is a special case imposed by the MPTCP specs. Note that the endpoint should then need to be re-added reusing the same ID. Fixes: 3ad14f54bd74 ("mptcp: more accurate MPC endpoint tracking") Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Mat Martineau --- Notes: - v5: - Add missing 'ID' in comment (Mat) --- net/mptcp/pm_netlink.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 0dacf16a4b53..36e179f1f888 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -585,6 +585,11 @@ static void mptcp_pm_create_subflow_or_signal_addr(str= uct mptcp_sock *msk) =20 __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); msk->pm.add_addr_signaled++; + + /* Special case for ID0: set the correct ID */ + if (local.addr.id =3D=3D msk->mpc_endpoint_id) + local.addr.id =3D 0; + mptcp_pm_announce_addr(msk, &local.addr, false); mptcp_pm_nl_addr_send_ack(msk); =20 @@ -613,6 +618,10 @@ static void mptcp_pm_create_subflow_or_signal_addr(str= uct mptcp_sock *msk) if (nr =3D=3D 0) continue; =20 + /* Special case for ID0: set the correct ID */ + if (local.addr.id =3D=3D msk->mpc_endpoint_id) + local.addr.id =3D 0; + spin_unlock_bh(&msk->pm.lock); for (i =3D 0; i < nr; i++) __mptcp_subflow_connect(sk, &local.addr, &addrs[i]); --=20 2.45.2 From nobody Mon Sep 16 19:11:58 2024 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 62CED14F98 for ; Fri, 26 Jul 2024 14:29:02 +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=1722004142; cv=none; b=fv4Dr/9pGqV3BdVT2sPdgm6XOoraCK284fE2aFCrHA3moS9LkIYKUSxjwy1Ff6mqIB6E35OeJlfAlmUXM2JTtp6Zd+7LNqy6n2LZzAUdrlhufIryPiss3tAP0+K0NR1RZdfKKMfxF/M5uAmEbWFIZKvPspvwXC8Om0pEVGr5aD0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004142; c=relaxed/simple; bh=9T+WiOCMIIVS1xBSk46oaY6QkN2fkOwPwioxV9pvQSY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ulaPfX6E0n6vW/TJI1+ely6xHLqJp6k9lR+Lm0Q+Y6YUEZBga/fYElouvoQMNZEXqy94DoWsLFOBjMEtQGs1NzZozMjTndYjIfI9N6kiCwSf6p/3Z3Ypup6dXx8zaAxkpRb21g+2dzKxSsu89nG+/myqPwrWQUPOmF3sLauvwqM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GF3xuswX; 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="GF3xuswX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5F438C4AF07; Fri, 26 Jul 2024 14:29:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004142; bh=9T+WiOCMIIVS1xBSk46oaY6QkN2fkOwPwioxV9pvQSY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=GF3xuswXet9mHXbOI+qkRAR/pV8g8VBCeSXBnCQhonPgoMIvcV8fnW2cV6VTrPIIB RbJwPfEaS1CukfN09C8IB07RVgSK/gOD8xPv2VxEL2pJHAgCAjBtptPneCstGnaQhA V/8Suq5hueUvGVyd2nmJgCXaHJiTs7SL4SnGYffVohuqFdn7XbO6SAdzDSUfp9CdEv aFbWslhi4Tm2CPwnZCDEV3VN6BDqM3O2lt5TWnMkhMnZkJhFnRAFMKzyg6a+CjvNFc ODbg/WxggCj0QuGhjBsfygPHTgvVeNezwQAunAuMWyCEdPqFrNlGNAFkEh1FsmyZ8l BoPjyAMShgEZQ== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:38 +0200 Subject: [PATCH mptcp-net v5 12/13] mptcp: pm: rename helpers linked to 'flush' Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-12-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=2363; i=matttbe@kernel.org; h=from:subject:message-id; bh=9T+WiOCMIIVS1xBSk46oaY6QkN2fkOwPwioxV9pvQSY=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7KcQcV1BaHqa+6cq+xpEkCL7yWpO/dYXBDJv Jq0wfktRXOJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOynAAKCRD2t4JPQmmg c5A3EAC8jmyV0MZoZOJNirN9GnGqpSqUj8OmBmRc33pSJuLgOVmLbvvA3rVz30B1D+699Ra9ALd fcmFMJy/LT9HIF9Zw7lSMub0EKfe+vLO4yOmQQwG9JX3XjFu4Evm1zccvCebS2MfD38kgznoeat mxMeX38hMw7cDjw/aMUjeJ830MxZMT/8b/Q8HygGc86vh1HtSpFO7H1m/GhbaOG9bVrVbok7+IU oUs88jWYO7WUNOLne4dEZMG2JZaNFQwVzNLqtUkoodUSf4RZQxaHmLrfkHEvoOgjGgK6vNCX21d TbradA4e1WQNXMh7ZWci4Q2nzGZhDJjFPkxLaREwKJOXe69Sm/dFfoDdA7vngnovFE6oYgq7FgE zbA8kE9j98FjET+uo5NpzMB/ROdyjnsDhSqKfyMsHcuDz3TgYDC83bc6RQbNFpI88THgOpf2V9Z BVe5GkkAdgvToTRqf/mOgHXQnn4PGJVk1NZpX9uuckq5f6rsICqPHF5DTgky3e2fSYjKy8vaVNW Q07lqssAXtkLQVM4IoEQf08TKQOEsfHqodVfFYGbuwTB+cxj1dL9XWiTdb1mRcfZipR56Wi0Lvw v8Hejj67Xu+KV2mI+A3v1jQ0TJQnyqIa5iOY/ndaMK3qTpYKE7K2PBrAmmCj+FV9Hl90KWjt/f1 FIBAR0dnjnnkMHg== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 Rename all the helpers specific to the flushing operations to make it clear that the intention is to flush all created subflows, and remove all announced addresses, not just a specific selection. That way, it is easier to understand why the id_avail_bitmap and local_addr_used are reset at the end. Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Mat Martineau --- Notes: - This patch is for net-next - v5: - This patch has been extracted from "mptcp: pm: re-using ID of unused flushed subflows", without any other modifications. --- net/mptcp/pm_netlink.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 36e179f1f888..53355f629846 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1644,8 +1644,8 @@ void mptcp_pm_remove_addrs(struct mptcp_sock *msk, st= ruct list_head *rm_list) } } =20 -static void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk, - struct list_head *rm_list) +static void mptcp_pm_flush_addrs_and_subflows(struct mptcp_sock *msk, + struct list_head *rm_list) { struct mptcp_rm_list alist =3D { .nr =3D 0 }, slist =3D { .nr =3D 0 }; struct mptcp_pm_addr_entry *entry; @@ -1673,8 +1673,8 @@ static void mptcp_pm_remove_addrs_and_subflows(struct= mptcp_sock *msk, spin_unlock_bh(&msk->pm.lock); } =20 -static void mptcp_nl_remove_addrs_list(struct net *net, - struct list_head *rm_list) +static void mptcp_nl_flush_addrs_list(struct net *net, + struct list_head *rm_list) { long s_slot =3D 0, s_num =3D 0; struct mptcp_sock *msk; @@ -1687,7 +1687,7 @@ static void mptcp_nl_remove_addrs_list(struct net *ne= t, =20 if (!mptcp_pm_is_userspace(msk)) { lock_sock(sk); - mptcp_pm_remove_addrs_and_subflows(msk, rm_list); + mptcp_pm_flush_addrs_and_subflows(msk, rm_list); release_sock(sk); } =20 @@ -1728,7 +1728,7 @@ int mptcp_pm_nl_flush_addrs_doit(struct sk_buff *skb,= struct genl_info *info) pernet->next_id =3D 1; bitmap_zero(pernet->id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); spin_unlock_bh(&pernet->lock); - mptcp_nl_remove_addrs_list(sock_net(skb->sk), &free_list); + mptcp_nl_flush_addrs_list(sock_net(skb->sk), &free_list); synchronize_rcu(); __flush_addrs(&free_list); return 0; --=20 2.45.2 From nobody Mon Sep 16 19:11:58 2024 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 3B882168C7 for ; Fri, 26 Jul 2024 14:29:03 +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=1722004144; cv=none; b=OGC6hsFXH3mc564yjel40yqWzGGe3AVksNo5cwWoxLfQC44iCjIes+iez1LK6x7iQ9lM1l6WjyWIeDSUp6wb2LYNEuYP+wYpT/J1fGQNwwC8LZETgIqy+0sz3+OS3C1u0jEio9xAz+4w6JnLDOXy5TOEro18rn8KVzQ9JUWK/eY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722004144; c=relaxed/simple; bh=ltDEPQl3Bb0mzx0mjYjXKhmDBtTJKwwcvGJxQ9wy/QA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ClJXLQ6YGEzNdnjqoe+eqJAgyG94qE/rw0P0CiM0nv+icotsnyOjk1uHD2RVWp174PAsVvgsUJajEAHmnC3Z8Fh7t8BbD51kwcwgdHwJzmEtpkAxBIACV5S2U040ifv8b7TzgmK6JZhXIZjXkcFMmH8ngnMQvBB3ZBpVO5rBmUg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=W81zLvgJ; 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="W81zLvgJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B944BC32786; Fri, 26 Jul 2024 14:29:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722004143; bh=ltDEPQl3Bb0mzx0mjYjXKhmDBtTJKwwcvGJxQ9wy/QA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=W81zLvgJNbU9zSilqzqSXR6/IFghI3K/AAyWMEfzKORY2hGTrjFV02S8oC9FVhM5a DllPhQ1mptRMI49C9YGUEyBXCnj6eabgeQ0UK48A13IHZ3daLU8hqP8WXNZ9gSuoNP O8xTvhtAGVmCkMKzJUEqbfxodGZPK9C7TVsG61CVP0PRX1YLArXPsfknZsWy00Vbmq 1JsqLch2s4QEkqL9d/RoTOMhjGwMlxwJGK3BZ/iFk/riIJhT7O+F5FQ2Lkh6u0U5MM LgzmRF6Jkzg+DDAfXkF7wYCbaknZABy8NBDGH0gFdOxZBD4jdfWZCwpVYumIfvTmlU LmqTMID3XIr/Q== From: "Matthieu Baerts (NGI0)" Date: Fri, 26 Jul 2024 16:28:39 +0200 Subject: [PATCH mptcp-net v5 13/13] mptcp: pm: reduce entries iterations on connect Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-mptcp-pm-avail-v5-13-fb1117ddeef6@kernel.org> References: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> In-Reply-To: <20240726-mptcp-pm-avail-v5-0-fb1117ddeef6@kernel.org> To: mptcp@lists.linux.dev Cc: Paolo Abeni , Mat Martineau , "Matthieu Baerts (NGI0)" X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=16209; i=matttbe@kernel.org; h=from:subject:message-id; bh=ltDEPQl3Bb0mzx0mjYjXKhmDBtTJKwwcvGJxQ9wy/QA=; b=owEBbQKS/ZANAwAIAfa3gk9CaaBzAcsmYgBmo7KcE7hmX9kQJQoY5K2IiN86WVTR+P4rmSdK5 8Ht04vCnMWJAjMEAAEIAB0WIQToy4X3aHcFem4n93r2t4JPQmmgcwUCZqOynAAKCRD2t4JPQmmg cx95EACl2WeRtido4r0vhv/CvrRm+n/+eP1GG9qz1tS3VFZaCvvKZOF93NNerWRw92WrRyKXIfB Uem81ffsG8pjo/ArFHau2sW1ZpMk732GzZ+6IgumaOqCeXr00QHAy7bNfG0f+qKk+KKjMmnoQuM zdBEqwR2K8rh8zjUIO2GSuU3jIdZ0IRSlxy7BllkS3HBsaNOIuBflXuQrSHmBFyFBUmZ+ElTMGu JkO+L0/Qf6qjqRplyA0mLvDC9KRTsXslDhDwU8odmRK2BQ0O0pasHCbnDPyVV/bw0W/7sqZKSU7 RRYWZAEO/H7MzhK9U/W9X6VwO0xwNJbK8Ri16x2WHPB2qmPNbVeD+f9ErpZz8TybhpNtjmqq5Xr ntKyajWx30XEf3sTj4rrdiiUsvjChN5XBr6L7Rkf9rm5CS8Sfj8lha9zIkFGTTHlCJcVFfI+fFu YhrHWPG77oHeveiI4SOHwbecuyNDP4U+h1aXvTRZMV/kGJTG8KDKAXFiIZhlOnn5Oct0wWeBUv/ m2Umamhd2+aoCxeYwWQ3eoRH+tB1HMtO68EIxGtG380svOXK93ypqH3L8EKAKxIQsvVJsql5liN JPfHB4q1f6/vzxssqJjbhoJ4JopYaxe8nKep5bGloYRnoD7guvCKSVztOjbuh+GIj4vQ92mlI2B xmz+ao+K5t8oY7A== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 __mptcp_subflow_connect() is currently called from the path-managers, which have all the required information to create subflows. No need to call the PM again to re-iterate over the list of entries with RCU lock to get more info. Instead, it is possible to pass a mptcp_pm_addr_entry structure, instead of a mptcp_addr_info one. The former contains the ifindex and the flags that are required when creating the new subflow. This is a partial revert of commit ee285257a9c1 ("mptcp: drop flags and ifindex arguments"). While at it, the local ID can also be set if it is known and 0, to avoid having to set it in the 'rebuild_header' hook, which will cause a new iteration of the endpoint entries. Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Mat Martineau --- Notes: - This patch is for net-next - v4: - Avoid multiple copies of an addr entry in fill_local_addresses_vec(). - Rebased on top of "mptcp: fix endpoints with 'signal' and 'subflow' flags", v4. - v5: - Use CONFIG_MPTCP_IPV6 instead of CONFIG_IPV6 (Intel's Kernel robot) - Use new mptcp_pm_local struct, not to use mptcp_pm_addr_entry with only half of the info we need to reduce the memory reserved on the stack needed for the fill_*_addresses_vec() helpers to handle the fullmesh case. (Paolo) Note that we could also embed 'struct mptcp_pm_local' in 'struct mptcp_pm_addr_entry', but that means adapting that in quite a few places (171). --- net/mptcp/pm.c | 11 -------- net/mptcp/pm_netlink.c | 66 ++++++++++++++++++--------------------------= ---- net/mptcp/pm_userspace.c | 40 ++++++++++------------------- net/mptcp/protocol.h | 16 +++++------- net/mptcp/subflow.c | 29 +++++++++++++-------- 5 files changed, 62 insertions(+), 100 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 3e6e0f5510bb..56c0a318e5df 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -428,17 +428,6 @@ bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct= sock_common *skc) return mptcp_pm_nl_is_backup(msk, &skc_local); } =20 -int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, unsigned = int id, - u8 *flags, int *ifindex) -{ - *flags =3D 0; - *ifindex =3D 0; - - if (mptcp_pm_is_userspace(msk)) - return mptcp_userspace_pm_get_flags_and_ifindex_by_id(msk, id, flags, if= index); - return mptcp_pm_nl_get_flags_and_ifindex_by_id(msk, id, flags, ifindex); -} - int mptcp_pm_get_addr(struct sk_buff *skb, struct genl_info *info) { if (info->attrs[MPTCP_PM_ATTR_TOKEN]) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 53355f629846..469a16326b3f 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -146,7 +146,7 @@ static bool lookup_subflow_by_daddr(const struct list_h= ead *list, static bool select_local_address(const struct pm_nl_pernet *pernet, const struct mptcp_sock *msk, - struct mptcp_pm_addr_entry *new_entry) + struct mptcp_pm_local *new_local) { struct mptcp_pm_addr_entry *entry; bool found =3D false; @@ -161,7 +161,9 @@ select_local_address(const struct pm_nl_pernet *pernet, if (!test_bit(entry->addr.id, msk->pm.id_avail_bitmap)) continue; =20 - *new_entry =3D *entry; + new_local->addr =3D entry->addr; + new_local->flags =3D entry->flags; + new_local->ifindex =3D entry->ifindex; found =3D true; break; } @@ -172,7 +174,7 @@ select_local_address(const struct pm_nl_pernet *pernet, =20 static bool select_signal_address(struct pm_nl_pernet *pernet, const struct mptcp_sock= *msk, - struct mptcp_pm_addr_entry *new_entry) + struct mptcp_pm_local *new_local) { struct mptcp_pm_addr_entry *entry; bool found =3D false; @@ -190,7 +192,9 @@ select_signal_address(struct pm_nl_pernet *pernet, cons= t struct mptcp_sock *msk, if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) continue; =20 - *new_entry =3D *entry; + new_local->addr =3D entry->addr; + new_local->flags =3D entry->flags; + new_local->ifindex =3D entry->ifindex; found =3D true; break; } @@ -521,11 +525,11 @@ __lookup_addr(struct pm_nl_pernet *pernet, const stru= ct mptcp_addr_info *info) static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) { struct sock *sk =3D (struct sock *)msk; - struct mptcp_pm_addr_entry local; unsigned int add_addr_signal_max; bool signal_and_subflow =3D false; unsigned int local_addr_max; struct pm_nl_pernet *pernet; + struct mptcp_pm_local local; unsigned int subflows_max; =20 pernet =3D pm_nl_get_pernet(sock_net(sk)); @@ -624,7 +628,7 @@ static void mptcp_pm_create_subflow_or_signal_addr(stru= ct mptcp_sock *msk) =20 spin_unlock_bh(&msk->pm.lock); for (i =3D 0; i < nr; i++) - __mptcp_subflow_connect(sk, &local.addr, &addrs[i]); + __mptcp_subflow_connect(sk, &local, &addrs[i]); spin_lock_bh(&msk->pm.lock); } mptcp_pm_nl_check_work_pending(msk); @@ -645,7 +649,7 @@ static void mptcp_pm_nl_subflow_established(struct mptc= p_sock *msk) */ static unsigned int fill_local_addresses_vec(struct mptcp_sock *msk, struct mptcp_addr_info *remote, - struct mptcp_addr_info *addrs) + struct mptcp_pm_local *locals) { struct sock *sk =3D (struct sock *)msk; struct mptcp_pm_addr_entry *entry; @@ -669,14 +673,16 @@ static unsigned int fill_local_addresses_vec(struct m= ptcp_sock *msk, continue; =20 if (msk->pm.subflows < subflows_max) { - msk->pm.subflows++; - addrs[i] =3D entry->addr; + locals[i].addr =3D entry->addr; + locals[i].flags =3D entry->flags; + locals[i].ifindex =3D entry->ifindex; =20 /* Special case for ID0: set the correct ID */ if (msk->first && - mptcp_addresses_equal(&entry->addr, &mpc_addr, entry->addr.port)) - addrs[i].id =3D 0; + mptcp_addresses_equal(&locals[i].addr, &mpc_addr, locals[i].addr.po= rt)) + locals[i].addr.id =3D 0; =20 + msk->pm.subflows++; i++; } } @@ -686,21 +692,19 @@ static unsigned int fill_local_addresses_vec(struct m= ptcp_sock *msk, * 'IPADDRANY' local address */ if (!i) { - struct mptcp_addr_info local; - - memset(&local, 0, sizeof(local)); - local.family =3D + memset(&locals[i], 0, sizeof(locals[i])); + locals[i].addr.family =3D #if IS_ENABLED(CONFIG_MPTCP_IPV6) remote->family =3D=3D AF_INET6 && ipv6_addr_v4mapped(&remote->addr6) ? AF_INET : #endif remote->family; =20 - if (!mptcp_pm_addr_families_match(sk, &local, remote)) + if (!mptcp_pm_addr_families_match(sk, &locals[i].addr, remote)) return 0; =20 msk->pm.subflows++; - addrs[i++] =3D local; + i++; } =20 return i; @@ -708,7 +712,7 @@ static unsigned int fill_local_addresses_vec(struct mpt= cp_sock *msk, =20 static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk) { - struct mptcp_addr_info addrs[MPTCP_PM_ADDR_MAX]; + struct mptcp_pm_local locals[MPTCP_PM_ADDR_MAX]; struct sock *sk =3D (struct sock *)msk; unsigned int add_addr_accept_max; struct mptcp_addr_info remote; @@ -737,13 +741,13 @@ static void mptcp_pm_nl_add_addr_received(struct mptc= p_sock *msk) /* connect to the specified remote address, using whatever * local address the routing configuration will pick. */ - nr =3D fill_local_addresses_vec(msk, &remote, addrs); + nr =3D fill_local_addresses_vec(msk, &remote, locals); if (nr =3D=3D 0) return; =20 spin_unlock_bh(&msk->pm.lock); for (i =3D 0; i < nr; i++) - if (__mptcp_subflow_connect(sk, &addrs[i], &remote) =3D=3D 0) + if (__mptcp_subflow_connect(sk, &locals[i], &remote) =3D=3D 0) sf_created =3D true; spin_lock_bh(&msk->pm.lock); =20 @@ -1412,28 +1416,6 @@ int mptcp_pm_nl_add_addr_doit(struct sk_buff *skb, s= truct genl_info *info) return ret; } =20 -int mptcp_pm_nl_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, unsign= ed int id, - u8 *flags, int *ifindex) -{ - struct mptcp_pm_addr_entry *entry; - struct sock *sk =3D (struct sock *)msk; - struct net *net =3D sock_net(sk); - - /* No entries with ID 0 */ - if (id =3D=3D 0) - return 0; - - rcu_read_lock(); - entry =3D __lookup_addr_by_id(pm_nl_get_pernet(net), id); - if (entry) { - *flags =3D entry->flags; - *ifindex =3D entry->ifindex; - } - rcu_read_unlock(); - - return 0; -} - static bool remove_anno_list_by_saddr(struct mptcp_sock *msk, const struct mptcp_addr_info *addr) { diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 8eaa9fbe3e34..2cceded3a83a 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -119,23 +119,6 @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock= *msk, unsigned int id) return NULL; } =20 -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 *match; - - spin_lock_bh(&msk->pm.lock); - match =3D mptcp_userspace_pm_lookup_addr_by_id(msk, id); - spin_unlock_bh(&msk->pm.lock); - if (match) { - *flags =3D match->flags; - *ifindex =3D match->ifindex; - } - - return 0; -} - int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc) { @@ -352,8 +335,9 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb= , struct genl_info *info) struct nlattr *raddr =3D info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; struct nlattr *laddr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; - struct mptcp_pm_addr_entry local =3D { 0 }; + struct mptcp_pm_addr_entry entry =3D { 0 }; struct mptcp_addr_info addr_r; + struct mptcp_pm_local local; struct mptcp_sock *msk; int err =3D -EINVAL; struct sock *sk; @@ -379,18 +363,18 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *s= kb, struct genl_info *info) goto create_err; } =20 - err =3D mptcp_pm_parse_entry(laddr, info, true, &local); + err =3D mptcp_pm_parse_entry(laddr, info, true, &entry); if (err < 0) { NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); goto create_err; } =20 - if (local.flags & MPTCP_PM_ADDR_FLAG_SIGNAL) { + if (entry.flags & MPTCP_PM_ADDR_FLAG_SIGNAL) { GENL_SET_ERR_MSG(info, "invalid addr flags"); err =3D -EINVAL; goto create_err; } - local.flags |=3D MPTCP_PM_ADDR_FLAG_SUBFLOW; + entry.flags |=3D MPTCP_PM_ADDR_FLAG_SUBFLOW; =20 err =3D mptcp_pm_parse_addr(raddr, info, &addr_r); if (err < 0) { @@ -398,27 +382,29 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *s= kb, struct genl_info *info) goto create_err; } =20 - if (!mptcp_pm_addr_families_match(sk, &local.addr, &addr_r)) { + if (!mptcp_pm_addr_families_match(sk, &entry.addr, &addr_r)) { GENL_SET_ERR_MSG(info, "families mismatch"); err =3D -EINVAL; goto create_err; } =20 - err =3D mptcp_userspace_pm_append_new_local_addr(msk, &local, false); + err =3D mptcp_userspace_pm_append_new_local_addr(msk, &entry, false); if (err < 0) { GENL_SET_ERR_MSG(info, "did not match address and id"); goto create_err; } =20 + local.addr =3D entry.addr; + local.flags =3D entry.flags; + local.ifindex =3D entry.ifindex; + lock_sock(sk); - - err =3D __mptcp_subflow_connect(sk, &local.addr, &addr_r); - + err =3D __mptcp_subflow_connect(sk, &local, &addr_r); release_sock(sk); =20 spin_lock_bh(&msk->pm.lock); if (err) - mptcp_userspace_pm_delete_local_addr(msk, &local); + mptcp_userspace_pm_delete_local_addr(msk, &entry); else msk->pm.subflows++; spin_unlock_bh(&msk->pm.lock); diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index fcf6983ca555..22b7eff311f5 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -236,6 +236,12 @@ struct mptcp_pm_data { struct mptcp_rm_list rm_list_rx; }; =20 +struct mptcp_pm_local { + struct mptcp_addr_info addr; + u8 flags; + int ifindex; +}; + struct mptcp_pm_addr_entry { struct list_head list; struct mptcp_addr_info addr; @@ -723,7 +729,7 @@ bool mptcp_addresses_equal(const struct mptcp_addr_info= *a, void mptcp_local_address(const struct sock_common *skc, struct mptcp_addr_= info *addr); =20 /* called with sk socket lock held */ -int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info = *loc, +int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *= local, const struct mptcp_addr_info *remote); int mptcp_subflow_create_socket(struct sock *sk, unsigned short family, struct socket **new_sock); @@ -1016,14 +1022,6 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk, struct mptcp_pm_add_entry * mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk, const struct mptcp_addr_info *addr); -int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, - unsigned int id, - u8 *flags, int *ifindex); -int mptcp_pm_nl_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, unsign= ed int id, - u8 *flags, int *ifindex); -int mptcp_userspace_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, - unsigned int id, - u8 *flags, int *ifindex); int mptcp_pm_set_flags(struct sk_buff *skb, struct genl_info *info); int mptcp_pm_nl_set_flags(struct sk_buff *skb, struct genl_info *info); int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *in= fo); diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index a21c712350c3..a7fb4d46e024 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1561,26 +1561,24 @@ void mptcp_info2sockaddr(const struct mptcp_addr_in= fo *info, #endif } =20 -int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info = *loc, +int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *= local, const struct mptcp_addr_info *remote) { struct mptcp_sock *msk =3D mptcp_sk(sk); struct mptcp_subflow_context *subflow; + int local_id =3D local->addr.id; struct sockaddr_storage addr; int remote_id =3D remote->id; - int local_id =3D loc->id; int err =3D -ENOTCONN; struct socket *sf; struct sock *ssk; u32 remote_token; int addrlen; - int ifindex; - u8 flags; =20 if (!mptcp_is_fully_established(sk)) goto err_out; =20 - err =3D mptcp_subflow_create_socket(sk, loc->family, &sf); + err =3D mptcp_subflow_create_socket(sk, local->addr.family, &sf); if (err) goto err_out; =20 @@ -1590,23 +1588,32 @@ int __mptcp_subflow_connect(struct sock *sk, const = struct mptcp_addr_info *loc, get_random_bytes(&subflow->local_nonce, sizeof(u32)); } while (!subflow->local_nonce); =20 - if (local_id) + /* if 'IPADDRANY', the ID will be set later, after the routing */ + if (local->addr.family =3D=3D AF_INET) { + if (!local->addr.addr.s_addr) + local_id =3D -1; +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + } else if (sk->sk_family =3D=3D AF_INET6) { + if (ipv6_addr_any(&local->addr.addr6)) + local_id =3D -1; +#endif + } + + if (local_id >=3D 0) subflow_set_local_id(subflow, local_id); =20 - mptcp_pm_get_flags_and_ifindex_by_id(msk, local_id, - &flags, &ifindex); subflow->remote_key_valid =3D 1; subflow->remote_key =3D READ_ONCE(msk->remote_key); subflow->local_key =3D READ_ONCE(msk->local_key); subflow->token =3D msk->token; - mptcp_info2sockaddr(loc, &addr, ssk->sk_family); + mptcp_info2sockaddr(&local->addr, &addr, ssk->sk_family); =20 addrlen =3D sizeof(struct sockaddr_in); #if IS_ENABLED(CONFIG_MPTCP_IPV6) if (addr.ss_family =3D=3D AF_INET6) addrlen =3D sizeof(struct sockaddr_in6); #endif - ssk->sk_bound_dev_if =3D ifindex; + ssk->sk_bound_dev_if =3D local->ifindex; err =3D kernel_bind(sf, (struct sockaddr *)&addr, addrlen); if (err) goto failed; @@ -1617,7 +1624,7 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, subflow->remote_token =3D remote_token; WRITE_ONCE(subflow->remote_id, remote_id); subflow->request_join =3D 1; - subflow->request_bkup =3D !!(flags & MPTCP_PM_ADDR_FLAG_BACKUP); + subflow->request_bkup =3D !!(local->flags & MPTCP_PM_ADDR_FLAG_BACKUP); subflow->subflow_id =3D msk->subflow_id++; mptcp_info2sockaddr(remote, &addr, ssk->sk_family); =20 --=20 2.45.2