All of lore.kernel.org
 help / color / mirror / Atom feed
From: Patrick McHardy <kaber@trash.net>
To: "David S. Miller" <davem@davemloft.net>,
	"Ilpo Järvinen" <ilpo.jarvinen@helsinki.fi>
Cc: Linux Netdev List <netdev@vger.kernel.org>
Subject: [TCP]: Fix shrinking windows with window scaling
Date: Fri, 14 Mar 2008 18:42:38 +0100	[thread overview]
Message-ID: <47DAB90E.40806@trash.net> (raw)

[-- Attachment #1: Type: text/plain, Size: 71 bytes --]

Please review carefully since I'm not too familiar with the
TCP code.


[-- Attachment #2: x --]
[-- Type: text/plain, Size: 2308 bytes --]

commit adced31497ffbb3fe6ffef2d05f2b8fc74f1f138
Author: Patrick McHardy <kaber@trash.net>
Date:   Fri Mar 14 17:15:20 2008 +0100

    [TCP]: Fix shrinking windows with window scaling

    When selecting a new window, tcp_select_window() tries not to shrink
    the offered window by using the maximum of the remaining offered window
    size and the newly calculated window size. The newly calculated window
    size is always a multiple of the window scaling factor, the remaining
    window size however might not be since it depends on rcv_wup/rcv_nxt.
    This means we're effectively shrinking the window when scaling it down.


    The dump below shows the problem (scaling factor 2^7):

    - Window size of 557 (71296) is advertised, up to 3111907257:

    IP 172.2.2.3.33000 > 172.2.2.2.33000: . ack 3111835961 win 557 <...>

    - New window size of 514 (65792) is advertised, up to 3111907217, 40 bytes
      below the last end:

    IP 172.2.2.3.33000 > 172.2.2.2.33000: . 3113575668:3113577116(1448) ack 3111841425 win 514 <...>

    The number 40 results from downscaling the remaining window:

    3111907257 - 3111841425 = 65832
    65832 / 2^7 = 514
    65832 % 2^7 = 40

    If the sender uses up the entire window before it is shrunk, this can have
    chaotic effects on the connection. When sending ACKs, tcp_acceptable_seq()
    will notice that the window has been shrunk since tcp_wnd_end() is before
    tp->snd_nxt, which makes it choose tcp_wnd_end() as sequence number.
    This will fail the receivers checks in tcp_sequence() however since it
    is before it's tp->rcv_wup, making it respond with a dupack.

    If both sides are in this condition, this leads to a constant flood of
    ACKs until the connection times out.


    Make sure the window is never shrunk by aligning the remaining window to
    the window scaling factor.

    Signed-off-by: Patrick McHardy <kaber@trash.net>

diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 01578f5..72b9350 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -255,7 +255,7 @@ static u16 tcp_select_window(struct sock *sk)
 		 *
 		 * Relax Will Robinson.
 		 */
-		new_win = cur_win;
+		new_win = ALIGN(cur_win, 1 << tp->rx_opt.rcv_wscale);
 	}
 	tp->rcv_wnd = new_win;
 	tp->rcv_wup = tp->rcv_nxt;

             reply	other threads:[~2008-03-14 17:51 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-14 17:42 Patrick McHardy [this message]
2008-03-20 23:12 ` [TCP]: Fix shrinking windows with window scaling David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=47DAB90E.40806@trash.net \
    --to=kaber@trash.net \
    --cc=davem@davemloft.net \
    --cc=ilpo.jarvinen@helsinki.fi \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.