mptcp: tune re-injections for csum enabled mode
authorPaolo Abeni <pabeni@redhat.com>
Thu, 17 Jun 2021 23:46:17 +0000 (16:46 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 Jun 2021 18:40:11 +0000 (11:40 -0700)
If the MPTCP-level checksum is enabled, on re-injections we
must spool a complete DSS, or the receive side will not be
able to compute the csum and process any data.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
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 b6e5c09..42fc718 100644 (file)
@@ -2375,8 +2375,8 @@ static void __mptcp_retrans(struct sock *sk)
 
        /* limit retransmission to the bytes already sent on some subflows */
        info.sent = 0;
-       info.limit = dfrag->already_sent;
-       while (info.sent < dfrag->already_sent) {
+       info.limit = READ_ONCE(msk->csum_enabled) ? dfrag->data_len : dfrag->already_sent;
+       while (info.sent < info.limit) {
                if (!mptcp_alloc_tx_skb(sk, ssk))
                        break;
 
@@ -2388,9 +2388,11 @@ static void __mptcp_retrans(struct sock *sk)
                copied += ret;
                info.sent += ret;
        }
-       if (copied)
+       if (copied) {
+               dfrag->already_sent = max(dfrag->already_sent, info.sent);
                tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle,
                         info.size_goal);
+       }
 
        mptcp_set_timeout(sk, ssk);
        release_sock(ssk);