]> www.infradead.org Git - users/willy/linux.git/commitdiff
mptcp: Check connection state before attempting send
authorMat Martineau <mathew.j.martineau@linux.intel.com>
Fri, 28 Feb 2020 23:47:39 +0000 (15:47 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 4 Mar 2020 01:01:42 +0000 (17:01 -0800)
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>
net/mptcp/protocol.c

index a8445407d25add280ce894ab7ad69dd8d39f59ee..07559b45eec5190957697f8a5de357eab78f5e01 100644 (file)
@@ -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:
@@ -427,8 +436,6 @@ fallback:
                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);
@@ -460,6 +467,7 @@ fallback:
 
        ssk_check_wmem(msk, ssk);
        release_sock(ssk);
+out:
        release_sock(sk);
        return ret;
 }