[MPTCP next v3 08/12] mptcp: cleanup fallback data fin reception

Paolo Abeni posted 12 patches 3 weeks ago
[MPTCP next v3 08/12] mptcp: cleanup fallback data fin reception
Posted by Paolo Abeni 3 weeks ago
MPTCP currently generate a dummy data_fin for fallback socket
when the fallback subflow has completed data reception using
the current ack_seq.

We are going to introduce backlog usage for the msk soon, even
for fallback sockets: the ack_seq value will not match the most recent
sequence number seen by the fallback subflow socket, as it will ignore
data_seq sitting in the backlog.

Instead use the last map sequence number to set the data_fin,
as fallback (dummy) map sequences are always in sequence.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
v2 -> v3:
  - keep the close check in subflow_sched_work_if_closed, fix
    CI failures
---
 net/mptcp/subflow.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index e8325890a3223..b9455c04e8a46 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -1285,6 +1285,7 @@ static bool subflow_is_done(const struct sock *sk)
 /* sched mptcp worker for subflow cleanup if no more data is pending */
 static void subflow_sched_work_if_closed(struct mptcp_sock *msk, struct sock *ssk)
 {
+	const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
 	struct sock *sk = (struct sock *)msk;
 
 	if (likely(ssk->sk_state != TCP_CLOSE &&
@@ -1303,7 +1304,8 @@ static void subflow_sched_work_if_closed(struct mptcp_sock *msk, struct sock *ss
 	 */
 	if (__mptcp_check_fallback(msk) && subflow_is_done(ssk) &&
 	    msk->first == ssk &&
-	    mptcp_update_rcv_data_fin(msk, READ_ONCE(msk->ack_seq), true))
+	    mptcp_update_rcv_data_fin(msk, subflow->map_seq +
+				      subflow->map_data_len, true))
 		mptcp_schedule_work(sk);
 }
 
-- 
2.51.0
Re: [MPTCP next v3 08/12] mptcp: cleanup fallback data fin reception
Posted by Geliang Tang 3 weeks ago
On Fri, 2025-09-19 at 17:53 +0200, Paolo Abeni wrote:
> MPTCP currently generate a dummy data_fin for fallback socket
> when the fallback subflow has completed data reception using
> the current ack_seq.
> 
> We are going to introduce backlog usage for the msk soon, even
> for fallback sockets: the ack_seq value will not match the most
> recent
> sequence number seen by the fallback subflow socket, as it will
> ignore
> data_seq sitting in the backlog.
> 
> Instead use the last map sequence number to set the data_fin,
> as fallback (dummy) map sequences are always in sequence.
> 
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>

LGTM.

Reviewed-by: Geliang Tang <geliang@kernel.org>
Tested-by: Geliang Tang <geliang@kernel.org>

Thanks,
-Geliang

> ---
> v2 -> v3:
>   - keep the close check in subflow_sched_work_if_closed, fix
>     CI failures
> ---
>  net/mptcp/subflow.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
> index e8325890a3223..b9455c04e8a46 100644
> --- a/net/mptcp/subflow.c
> +++ b/net/mptcp/subflow.c
> @@ -1285,6 +1285,7 @@ static bool subflow_is_done(const struct sock
> *sk)
>  /* sched mptcp worker for subflow cleanup if no more data is pending
> */
>  static void subflow_sched_work_if_closed(struct mptcp_sock *msk,
> struct sock *ssk)
>  {
> +	const struct mptcp_subflow_context *subflow =
> mptcp_subflow_ctx(ssk);
>  	struct sock *sk = (struct sock *)msk;
>  
>  	if (likely(ssk->sk_state != TCP_CLOSE &&
> @@ -1303,7 +1304,8 @@ static void subflow_sched_work_if_closed(struct
> mptcp_sock *msk, struct sock *ss
>  	 */
>  	if (__mptcp_check_fallback(msk) && subflow_is_done(ssk) &&
>  	    msk->first == ssk &&
> -	    mptcp_update_rcv_data_fin(msk, READ_ONCE(msk->ack_seq),
> true))
> +	    mptcp_update_rcv_data_fin(msk, subflow->map_seq +
> +				      subflow->map_data_len, true))
>  		mptcp_schedule_work(sk);
>  }
>