Skip to content

Commit

Permalink
mptcp: Check connection state before attempting send
Browse files Browse the repository at this point in the history
MPTCP should wait for an active connection or skip sending depending on
the connection state, as TCP does. This happens before the possible
passthrough to a regular TCP sendmsg because the subflow's socket type
(MPTCP or TCP fallback) is not known until the connection is
complete. This is also relevent at disconnect time, where data should
not be sent in certain MPTCP-level connection states.

Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
mjmartineau authored and davem330 committed Mar 4, 2020
1 parent 0a30321 commit 1954b86
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions net/mptcp/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,15 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
return -EOPNOTSUPP;

lock_sock(sk);

timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);

if ((1 << sk->sk_state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) {
ret = sk_stream_wait_connect(sk, &timeo);
if (ret)
goto out;
}

ssock = __mptcp_tcp_fallback(msk);
if (unlikely(ssock)) {
fallback:
Expand All @@ -427,8 +436,6 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
return ret >= 0 ? ret + copied : (copied ? copied : ret);
}

timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);

ssk = mptcp_subflow_get(msk);
if (!ssk) {
release_sock(sk);
Expand Down Expand Up @@ -460,6 +467,7 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)

ssk_check_wmem(msk, ssk);
release_sock(ssk);
out:
release_sock(sk);
return ret;
}
Expand Down

0 comments on commit 1954b86

Please sign in to comment.