From patchwork Tue May 31 15:02:36 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrei Vagin X-Patchwork-Id: 628277 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3rJxZP0J8Dz9t42 for ; Wed, 1 Jun 2016 01:03:25 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=c5jAewIx; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754558AbcEaPC5 (ORCPT ); Tue, 31 May 2016 11:02:57 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:33679 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753914AbcEaPCz (ORCPT ); Tue, 31 May 2016 11:02:55 -0400 Received: by mail-pf0-f195.google.com with SMTP id b124so25654463pfb.0; Tue, 31 May 2016 08:02:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id; bh=JDBoheKRI1gK+O+dcvfs2Zapxxj0wo9ul3DdA1aN2Uk=; b=c5jAewIxrpQAWT9su9cURvokTKLJf+aDkbmkdSJzQF7wRj+gQ+rmkQOPcLPmzsdaE+ n8E5cJTH5hCm/B0GODSipYZEsZd1qsK05dax5okxG+iUYcK0iOpxcrlTStF65mLRVp3C Shh1AAtuImk6t5Nf+q3gOnMnf3F8coMs3y5DZqqGqJ/rzKgEVyOU/LMONNopSG42NyV+ GVIjt6xMMFy1tiaCVrZobyV6qZu2NrhxgCCsKvvv7yVD5tPEMXoXrHx7JpaRYOxLS0eg Ly/iRnqnCaDRCCnvBBwy/ZMDAi4pcXACpd3o4uSmw1Sx+oXrC2hS23FH7Al+mZgd4qqY eRkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=JDBoheKRI1gK+O+dcvfs2Zapxxj0wo9ul3DdA1aN2Uk=; b=WOrD7ddBnGScPzp38L19WN3aziEu69eFZd9kbWUS+1n7zvP7GxSMH6BKuZ8SN5/DgS aOqIQ4LalOqhIh4FBdf/yxrpluqm2lGoX4w8W/ZhS6xER9nWMT3ELU3tXMNiKAszZmF3 MVHRmkFi6h1oe99YsRSHtTTA/kzXFdUTlODEnYydTgf89lVLqMFlLbCl5zJ/OPFj7c31 6y4sj0dmxxTYHPRk5eMbKYVOXEbhy2rqSkfLugtsOF/sMX0OYNc0gUP8IXqsY9j4RNeN ug8GmzYx7WVR/dcFBEuSS31NUNq14xqbOucYpGfVOn9GXZa5Q90UuxoEjSiTTP0ihlXm iFCw== X-Gm-Message-State: ALyK8tJaNJOa6HzynB4DG0rOYf22rPS56G6eEOhthcxz8+oxq2jmUy2ZR0prXLiUWcLYgA== X-Received: by 10.98.89.207 with SMTP id k76mr56463303pfj.166.1464706974447; Tue, 31 May 2016 08:02:54 -0700 (PDT) Received: from laptop.vz.com ([162.246.95.100]) by smtp.gmail.com with ESMTPSA id b188sm40396010pfa.87.2016.05.31.08.02.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 31 May 2016 08:02:53 -0700 (PDT) From: Andrey Vagin To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, criu@openvz.org, Andrey Vagin , Pavel Emelyanov , "David S. Miller" , Alexey Kuznetsov , James Morris , Hideaki YOSHIFUJI , Patrick McHardy Subject: [PATCH] tcp: extend window to fit all restored unacked data in a send queue Date: Tue, 31 May 2016 08:02:36 -0700 Message-Id: <1464706956-29291-1-git-send-email-avagin@openvz.org> X-Mailer: git-send-email 2.5.5 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Data from a send queue is sent only if there is enough space in a window, so when we restore unacked data, we need to expand a window to fit this data. Currently we don't do this and tcp_acceptable_seq() returns tcp_wnd_end(tp) instead of tp->snd_nxt. The other side drops packets with this seq, becuse tcp_sequence() returns false (seq < tp->rcv_nxt). Cc: Pavel Emelyanov Cc: "David S. Miller" Cc: Alexey Kuznetsov Cc: James Morris Cc: Hideaki YOSHIFUJI Cc: Patrick McHardy Signed-off-by: Andrey Vagin --- net/ipv4/tcp_output.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 79a03b8..b36f968 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -75,6 +75,10 @@ static void tcp_event_new_data_sent(struct sock *sk, const struct sk_buff *skb) tcp_advance_send_head(sk, skb); tp->snd_nxt = TCP_SKB_CB(skb)->end_seq; + /* All sent data have to fit into the window */ + if (unlikely(tp->repair) && before(tcp_wnd_end(tp), tp->snd_nxt)) + tp->snd_wnd = tp->snd_nxt - tp->snd_una; + tp->packets_out += tcp_skb_pcount(skb); if (!prior_packets || icsk->icsk_pending == ICSK_TIME_EARLY_RETRANS || icsk->icsk_pending == ICSK_TIME_LOSS_PROBE) {