mptcp: don't orphan ssk in mptcp_close()
All of the subflows of a msk will be orphaned in mptcp_close(), which means the subflows are in DEAD state. After then, DATA_FIN will be sent, and the other side will response with a DATA_ACK for this DATA_FIN. However, if the other side still has pending data, the data that received on these subflows will not be passed to the msk, as they are DEAD and subflow_data_ready() will not be called in tcp_data_ready(). Therefore, these data can't be acked, and they will be retransmitted again and again, until timeout. Fix this by setting ssk->sk_socket and ssk->sk_wq to 'NULL', instead of orphaning the subflows in __mptcp_close(), as Paolo suggested. Fixes: e16163b6e2b7 ("mptcp: refactor shutdown and close") Reviewed-by: Biao Jiang <benbjiang@tencent.com> Reviewed-by: Mengen Sun <mengensun@tencent.com> Signed-off-by: Menglong Dong <imagedong@tencent.com> Reviewed-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
39f59bca27
commit
fe94800184
@ -2354,12 +2354,7 @@ static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* if we are invoked by the msk cleanup code, the subflow is
|
||||
* already orphaned
|
||||
*/
|
||||
if (ssk->sk_socket)
|
||||
sock_orphan(ssk);
|
||||
|
||||
sock_orphan(ssk);
|
||||
subflow->disposable = 1;
|
||||
|
||||
/* if ssk hit tcp_done(), tcp_cleanup_ulp() cleared the related ops
|
||||
@ -2940,7 +2935,11 @@ cleanup:
|
||||
if (ssk == msk->first)
|
||||
subflow->fail_tout = 0;
|
||||
|
||||
sock_orphan(ssk);
|
||||
/* detach from the parent socket, but allow data_ready to
|
||||
* push incoming data into the mptcp stack, to properly ack it
|
||||
*/
|
||||
ssk->sk_socket = NULL;
|
||||
ssk->sk_wq = NULL;
|
||||
unlock_sock_fast(ssk, slow);
|
||||
}
|
||||
sock_orphan(sk);
|
||||
|
Loading…
x
Reference in New Issue
Block a user