lkml.org 
[lkml]   [2016]   [Aug]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 049/100] tcp: consider recv buf for the initial window scale
    Date
    From: Soheil Hassas Yeganeh <soheil@google.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    [ Upstream commit f626300a3e776ccc9671b0dd94698fb3aa315966 ]

    tcp_select_initial_window() intends to advertise a window
    scaling for the maximum possible window size. To do so,
    it considers the maximum of net.ipv4.tcp_rmem[2] and
    net.core.rmem_max as the only possible upper-bounds.
    However, users with CAP_NET_ADMIN can use SO_RCVBUFFORCE
    to set the socket's receive buffer size to values
    larger than net.ipv4.tcp_rmem[2] and net.core.rmem_max.
    Thus, SO_RCVBUFFORCE is effectively ignored by
    tcp_select_initial_window().

    To fix this, consider the maximum of net.ipv4.tcp_rmem[2],
    net.core.rmem_max and socket's initial buffer space.

    Fixes: b0573dea1fb3 ("[NET]: Introduce SO_{SND,RCV}BUFFORCE socket options")
    Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
    Suggested-by: Neal Cardwell <ncardwell@google.com>
    Acked-by: Neal Cardwell <ncardwell@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    net/ipv4/tcp_output.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
    index 47b27e9dd8cc..aa72c9d604a0 100644
    --- a/net/ipv4/tcp_output.c
    +++ b/net/ipv4/tcp_output.c
    @@ -242,7 +242,8 @@ void tcp_select_initial_window(int __space, __u32 mss,
    /* Set window scaling on max possible window
    * See RFC1323 for an explanation of the limit to 14
    */
    - space = max_t(u32, sysctl_tcp_rmem[2], sysctl_rmem_max);
    + space = max_t(u32, space, sysctl_tcp_rmem[2]);
    + space = max_t(u32, space, sysctl_rmem_max);
    space = min_t(u32, space, *window_clamp);
    while (space > 65535 && (*rcv_wscale) < 14) {
    space >>= 1;
    --
    2.9.3
    \
     
     \ /
      Last update: 2016-09-17 09:57    [W:4.427 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site