[PATCH mptcp-net 05/10] mptcp: pm: fix ID 0 endp usage after multiple re-creations

Matthieu Baerts (NGI0) posted 10 patches 3 months, 1 week ago
There is a newer version of this series
[PATCH mptcp-net 05/10] mptcp: pm: fix ID 0 endp usage after multiple re-creations
Posted by Matthieu Baerts (NGI0) 3 months, 1 week ago
'local_addr_used' and 'add_addr_accepted' are decremented for addresses
not related to the initial subflow (ID0), because the source and
destination addresses of the initial subflows are known from the
beginning: they don't count as "additional local address being used" or
"ADD_ADDR being accepted".

It is then required not to increment them when the entrypoint used by
the initial subflow is removed and re-added during a connection. Without
this modification, this entrypoint cannot be removed and re-added more
than once.

Reported-by: Arınç ÜNAL <arinc.unal@arinc9.com>
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/512
Fixes: 3ad14f54bd74 ("mptcp: more accurate MPC endpoint tracking")
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
---
 net/mptcp/pm_netlink.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 7ca9dbbd5f14..e44f539e6a56 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -619,12 +619,13 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
 
 		fullmesh = !!(local.flags & MPTCP_PM_ADDR_FLAG_FULLMESH);
 
-		msk->pm.local_addr_used++;
 		__clear_bit(local.addr.id, msk->pm.id_avail_bitmap);
 
 		/* Special case for ID0: set the correct ID */
 		if (local.addr.id == msk->mpc_endpoint_id)
 			local.addr.id = 0;
+		else /* local_addr_used is not decr for ID 0 */
+			msk->pm.local_addr_used++;
 
 		nr = fill_remote_addresses_vec(msk, &local.addr, fullmesh, addrs);
 		if (nr == 0)
@@ -754,7 +755,9 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
 	spin_lock_bh(&msk->pm.lock);
 
 	if (sf_created) {
-		msk->pm.add_addr_accepted++;
+		/* add_addr_accepted is not decr for ID 0 */
+		if (remote.id)
+			msk->pm.add_addr_accepted++;
 		if (msk->pm.add_addr_accepted >= add_addr_accept_max ||
 		    msk->pm.subflows >= subflows_max)
 			WRITE_ONCE(msk->pm.accept_addr, false);

-- 
2.45.2

Re: [PATCH mptcp-net 05/10] mptcp: pm: fix ID 0 endp usage after multiple re-creations
Posted by Arınç ÜNAL 3 months, 1 week ago
On 15/08/2024 23:45, Matthieu Baerts (NGI0) wrote:
> 'local_addr_used' and 'add_addr_accepted' are decremented for addresses
> not related to the initial subflow (ID0), because the source and
> destination addresses of the initial subflows are known from the
> beginning: they don't count as "additional local address being used" or
> "ADD_ADDR being accepted".
> 
> It is then required not to increment them when the entrypoint used by
> the initial subflow is removed and re-added during a connection. Without
> this modification, this entrypoint cannot be removed and re-added more
> than once.
> 
> Reported-by: Arınç ÜNAL <arinc.unal@arinc9.com>
> Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/512
> Fixes: 3ad14f54bd74 ("mptcp: more accurate MPC endpoint tracking")
> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>

I've tested this. I confirm that it fixes the issue. However, there's a
warning being reported when removing the endpoint for the third time. I
will refrain from submitting my tested-by tag for now. Details are on the
GitHub issue mentioned.

Arınç