• Hagen Paul Pfeifer's avatar
    tcp: allow effective reduction of TCP's rcv-buffer via setsockopt · e88c64f0
    Hagen Paul Pfeifer authored
    Via setsockopt it is possible to reduce the socket RX buffer
    (SO_RCVBUF). TCP method to select the initial window and window scaling
    option in tcp_select_initial_window() currently misbehaves and do not
    consider a reduced RX socket buffer via setsockopt.
    
    Even though the server's RX buffer is reduced via setsockopt() to 256
    byte (Initial Window 384 byte => 256 * 2 - (256 * 2 / 4)) the window
    scale option is still 7:
    
    192.168.1.38.40676 > 78.47.222.210.5001: Flags [S], seq 2577214362, win 5840, options [mss 1460,sackOK,TS val 338417 ecr 0,nop,wscale 0], length 0
    78.47.222.210.5001 > 192.168.1.38.40676: Flags [S.], seq 1570631029, ack 2577214363, win 384, options [mss 1452,sackOK,TS val 2435248895 ecr 338417,nop,wscale 7], length 0
    192.168.1.38.40676 > 78.47.222.210.5001: Flags [.], ack 1, win 5840, options [nop,nop,TS val 338421 ecr 2435248895], length 0
    
    Within tcp_select_initial_window() the original space argument - a
    representation of the rx buffer size - is expanded during
    tcp_select_initial_window(). Only sysctl_tcp_rmem[2], sysctl_rmem_max
    and window_clamp are considered to calculate the initial window.
    
    This patch adjust the window_clamp argument if the user explicitly
    reduce the receive buffer.
    Signed-off-by: default avatarHagen Paul Pfeifer <hagen@jauu.net>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Patrick McHardy <kaber@trash.net>
    Cc: Eric Dumazet <eric.dumazet@gmail.com>
    Cc: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    e88c64f0
tcp_output.c 81.5 KB