Skip to content

Commit

Permalink
mptcp: factor out __mptcp_retrans helper()
Browse files Browse the repository at this point in the history
Will simplify the following patch, no functional change
intended.

Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
  • Loading branch information
Paolo Abeni authored and jenkins-tessares committed Feb 26, 2021
1 parent 9b17fa5 commit 888b673
Showing 1 changed file with 50 additions and 43 deletions.
93 changes: 50 additions & 43 deletions net/mptcp/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -2255,59 +2255,23 @@ static void mptcp_check_fastclose(struct mptcp_sock *msk)
mptcp_close_wake_up(sk);
}

static void mptcp_worker(struct work_struct *work)
static void __mptcp_retrans(struct sock *sk)
{
struct mptcp_sock *msk = container_of(work, struct mptcp_sock, work);
struct sock *ssk, *sk = &msk->sk.icsk_inet.sk;
struct mptcp_sock *msk = mptcp_sk(sk);
struct mptcp_sendmsg_info info = {};
struct mptcp_data_frag *dfrag;
size_t copied = 0;
int state, ret;

lock_sock(sk);
state = sk->sk_state;
if (unlikely(state == TCP_CLOSE))
goto unlock;

mptcp_check_data_fin_ack(sk);
__mptcp_flush_join_list(msk);

mptcp_check_fastclose(msk);

if (msk->pm.status)
mptcp_pm_nl_work(msk);

if (test_and_clear_bit(MPTCP_WORK_EOF, &msk->flags))
mptcp_check_for_eof(msk);

__mptcp_check_send_data_fin(sk);
mptcp_check_data_fin(sk);

/* There is no point in keeping around an orphaned sk timedout or
* closed, but we need the msk around to reply to incoming DATA_FIN,
* even if it is orphaned and in FIN_WAIT2 state
*/
if (sock_flag(sk, SOCK_DEAD) &&
(mptcp_check_close_timeout(sk) || sk->sk_state == TCP_CLOSE)) {
inet_sk_state_store(sk, TCP_CLOSE);
__mptcp_destroy_sock(sk);
goto unlock;
}

if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags))
__mptcp_close_subflow(msk);

if (!test_and_clear_bit(MPTCP_WORK_RTX, &msk->flags))
goto unlock;
struct sock *ssk;
int ret;

__mptcp_clean_una(sk);
dfrag = mptcp_rtx_head(sk);
if (!dfrag)
goto unlock;
return;

ssk = mptcp_subflow_get_retrans(msk);
if (!ssk)
goto reset_unlock;
goto reset_timer;

lock_sock(ssk);

Expand All @@ -2333,9 +2297,52 @@ static void mptcp_worker(struct work_struct *work)
mptcp_set_timeout(sk, ssk);
release_sock(ssk);

reset_unlock:
reset_timer:
if (!mptcp_timer_pending(sk))
mptcp_reset_timer(sk);
}

static void mptcp_worker(struct work_struct *work)
{
struct mptcp_sock *msk = container_of(work, struct mptcp_sock, work);
struct sock *sk = &msk->sk.icsk_inet.sk;
int state;

lock_sock(sk);
state = sk->sk_state;
if (unlikely(state == TCP_CLOSE))
goto unlock;

mptcp_check_data_fin_ack(sk);
__mptcp_flush_join_list(msk);

mptcp_check_fastclose(msk);

if (msk->pm.status)
mptcp_pm_nl_work(msk);

if (test_and_clear_bit(MPTCP_WORK_EOF, &msk->flags))
mptcp_check_for_eof(msk);

__mptcp_check_send_data_fin(sk);
mptcp_check_data_fin(sk);

/* There is no point in keeping around an orphaned sk timedout or
* closed, but we need the msk around to reply to incoming DATA_FIN,
* even if it is orphaned and in FIN_WAIT2 state
*/
if (sock_flag(sk, SOCK_DEAD) &&
(mptcp_check_close_timeout(sk) || sk->sk_state == TCP_CLOSE)) {
inet_sk_state_store(sk, TCP_CLOSE);
__mptcp_destroy_sock(sk);
goto unlock;
}

if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags))
__mptcp_close_subflow(msk);

if (test_and_clear_bit(MPTCP_WORK_RTX, &msk->flags))
__mptcp_retrans(sk);

unlock:
release_sock(sk);
Expand Down

0 comments on commit 888b673

Please sign in to comment.