mptcp: don't skip needed ack
authorPaolo Abeni <pabeni@redhat.com>
Mon, 5 Oct 2020 10:36:44 +0000 (12:36 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 6 Oct 2020 13:08:06 +0000 (06:08 -0700)
Currently we skip calling tcp_cleanup_rbuf() when packets
are moved into the OoO queue or simply dropped. In both
cases we still increment tp->copied_seq, and we should
ask the TCP stack to check for ack.

Fixes: c76c6956566f ("mptcp: call tcp_cleanup_rbuf on subflows")
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/protocol.c

index 82b324e..f893985 100644 (file)
@@ -454,10 +454,12 @@ static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk,
        unsigned int moved = 0;
        bool more_data_avail;
        struct tcp_sock *tp;
+       u32 old_copied_seq;
        bool done = false;
 
        pr_debug("msk=%p ssk=%p", msk, ssk);
        tp = tcp_sk(ssk);
+       old_copied_seq = tp->copied_seq;
        do {
                u32 map_remaining, offset;
                u32 seq = tp->copied_seq;
@@ -516,8 +518,8 @@ static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk,
        } while (more_data_avail);
 
        *bytes += moved;
-       if (moved)
-               tcp_cleanup_rbuf(ssk, moved);
+       if (tp->copied_seq != old_copied_seq)
+               tcp_cleanup_rbuf(ssk, 1);
 
        return done;
 }