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: c76c695656 ("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>
This commit is contained in:
Paolo Abeni 2020-10-05 12:36:44 +02:00 коммит произвёл David S. Miller
Родитель 8b0308fe31
Коммит 717f203416
1 изменённых файлов: 4 добавлений и 2 удалений

Просмотреть файл

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